oidc-client
Version:
OpenID Connect (OIDC) & OAuth2 client library
12,253 lines • 1.56 MB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else {
var a = factory();
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./index.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./index.js":
/*!******************!*\
!*** ./index.js ***!
\******************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(/*! ./src/Log.js */ "./src/Log.js");
var _OidcClient = __webpack_require__(/*! ./src/OidcClient.js */ "./src/OidcClient.js");
var _OidcClientSettings = __webpack_require__(/*! ./src/OidcClientSettings.js */ "./src/OidcClientSettings.js");
var _WebStorageStateStore = __webpack_require__(/*! ./src/WebStorageStateStore.js */ "./src/WebStorageStateStore.js");
var _InMemoryWebStorage = __webpack_require__(/*! ./src/InMemoryWebStorage.js */ "./src/InMemoryWebStorage.js");
var _UserManager = __webpack_require__(/*! ./src/UserManager.js */ "./src/UserManager.js");
var _AccessTokenEvents = __webpack_require__(/*! ./src/AccessTokenEvents.js */ "./src/AccessTokenEvents.js");
var _MetadataService = __webpack_require__(/*! ./src/MetadataService.js */ "./src/MetadataService.js");
var _CordovaPopupNavigator = __webpack_require__(/*! ./src/CordovaPopupNavigator.js */ "./src/CordovaPopupNavigator.js");
var _CordovaIFrameNavigator = __webpack_require__(/*! ./src/CordovaIFrameNavigator.js */ "./src/CordovaIFrameNavigator.js");
var _CheckSessionIFrame = __webpack_require__(/*! ./src/CheckSessionIFrame.js */ "./src/CheckSessionIFrame.js");
var _TokenRevocationClient = __webpack_require__(/*! ./src/TokenRevocationClient.js */ "./src/TokenRevocationClient.js");
var _SessionMonitor = __webpack_require__(/*! ./src/SessionMonitor.js */ "./src/SessionMonitor.js");
var _Global = __webpack_require__(/*! ./src/Global.js */ "./src/Global.js");
var _User = __webpack_require__(/*! ./src/User.js */ "./src/User.js");
exports.default = {
Log: _Log.Log,
OidcClient: _OidcClient.OidcClient,
OidcClientSettings: _OidcClientSettings.OidcClientSettings,
WebStorageStateStore: _WebStorageStateStore.WebStorageStateStore,
InMemoryWebStorage: _InMemoryWebStorage.InMemoryWebStorage,
UserManager: _UserManager.UserManager,
AccessTokenEvents: _AccessTokenEvents.AccessTokenEvents,
MetadataService: _MetadataService.MetadataService,
CordovaPopupNavigator: _CordovaPopupNavigator.CordovaPopupNavigator,
CordovaIFrameNavigator: _CordovaIFrameNavigator.CordovaIFrameNavigator,
CheckSessionIFrame: _CheckSessionIFrame.CheckSessionIFrame,
TokenRevocationClient: _TokenRevocationClient.TokenRevocationClient,
SessionMonitor: _SessionMonitor.SessionMonitor,
Global: _Global.Global,
User: _User.User
}; // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
module.exports = exports['default'];
/***/ }),
/***/ "./jsrsasign/dist/jsrsasign.js":
/*!*************************************!*\
!*** ./jsrsasign/dist/jsrsasign.js ***!
\*************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(Buffer) {
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/*
* jsrsasign(all) 8.0.12 (2018-04-22) (c) 2010-2018 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var navigator = {};
navigator.userAgent = false;
var window = {};
/*!
Copyright (c) 2011, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.com/yui/license.html
version: 2.9.0
*/
if (YAHOO === undefined) {
var YAHOO = {};
}YAHOO.lang = { extend: function extend(g, h, f) {
if (!h || !g) {
throw new Error("YAHOO.lang.extend failed, please check that all dependencies are included.");
}var d = function d() {};d.prototype = h.prototype;g.prototype = new d();g.prototype.constructor = g;g.superclass = h.prototype;if (h.prototype.constructor == Object.prototype.constructor) {
h.prototype.constructor = h;
}if (f) {
var b;for (b in f) {
g.prototype[b] = f[b];
}var e = function e() {},
c = ["toString", "valueOf"];try {
if (/MSIE/.test(navigator.userAgent)) {
e = function e(j, i) {
for (b = 0; b < c.length; b = b + 1) {
var l = c[b],
k = i[l];if (typeof k === "function" && k != Object.prototype[l]) {
j[l] = k;
}
}
};
}
} catch (a) {}e(g.prototype, f);
}
} };
/*! CryptoJS v3.1.2 core-fix.js
* code.google.com/p/crypto-js
* (c) 2009-2013 by Jeff Mott. All rights reserved.
* code.google.com/p/crypto-js/wiki/License
* THIS IS FIX of 'core.js' to fix Hmac issue.
* https://code.google.com/p/crypto-js/issues/detail?id=84
* https://crypto-js.googlecode.com/svn-history/r667/branches/3.x/src/core.js
*/
var CryptoJS = CryptoJS || function (e, g) {
var a = {};var b = a.lib = {};var j = b.Base = function () {
function n() {}return { extend: function extend(p) {
n.prototype = this;var o = new n();if (p) {
o.mixIn(p);
}if (!o.hasOwnProperty("init")) {
o.init = function () {
o.$super.init.apply(this, arguments);
};
}o.init.prototype = o;o.$super = this;return o;
}, create: function create() {
var o = this.extend();o.init.apply(o, arguments);return o;
}, init: function init() {}, mixIn: function mixIn(p) {
for (var o in p) {
if (p.hasOwnProperty(o)) {
this[o] = p[o];
}
}if (p.hasOwnProperty("toString")) {
this.toString = p.toString;
}
}, clone: function clone() {
return this.init.prototype.extend(this);
} };
}();var l = b.WordArray = j.extend({ init: function init(o, n) {
o = this.words = o || [];if (n != g) {
this.sigBytes = n;
} else {
this.sigBytes = o.length * 4;
}
}, toString: function toString(n) {
return (n || h).stringify(this);
}, concat: function concat(t) {
var q = this.words;var p = t.words;var n = this.sigBytes;var s = t.sigBytes;this.clamp();if (n % 4) {
for (var r = 0; r < s; r++) {
var o = p[r >>> 2] >>> 24 - r % 4 * 8 & 255;q[n + r >>> 2] |= o << 24 - (n + r) % 4 * 8;
}
} else {
for (var r = 0; r < s; r += 4) {
q[n + r >>> 2] = p[r >>> 2];
}
}this.sigBytes += s;return this;
}, clamp: function clamp() {
var o = this.words;var n = this.sigBytes;o[n >>> 2] &= 4294967295 << 32 - n % 4 * 8;o.length = e.ceil(n / 4);
}, clone: function clone() {
var n = j.clone.call(this);n.words = this.words.slice(0);return n;
}, random: function random(p) {
var o = [];for (var n = 0; n < p; n += 4) {
o.push(e.random() * 4294967296 | 0);
}return new l.init(o, p);
} });var m = a.enc = {};var h = m.Hex = { stringify: function stringify(p) {
var r = p.words;var o = p.sigBytes;var q = [];for (var n = 0; n < o; n++) {
var s = r[n >>> 2] >>> 24 - n % 4 * 8 & 255;q.push((s >>> 4).toString(16));q.push((s & 15).toString(16));
}return q.join("");
}, parse: function parse(p) {
var n = p.length;var q = [];for (var o = 0; o < n; o += 2) {
q[o >>> 3] |= parseInt(p.substr(o, 2), 16) << 24 - o % 8 * 4;
}return new l.init(q, n / 2);
} };var d = m.Latin1 = { stringify: function stringify(q) {
var r = q.words;var p = q.sigBytes;var n = [];for (var o = 0; o < p; o++) {
var s = r[o >>> 2] >>> 24 - o % 4 * 8 & 255;n.push(String.fromCharCode(s));
}return n.join("");
}, parse: function parse(p) {
var n = p.length;var q = [];for (var o = 0; o < n; o++) {
q[o >>> 2] |= (p.charCodeAt(o) & 255) << 24 - o % 4 * 8;
}return new l.init(q, n);
} };var c = m.Utf8 = { stringify: function stringify(n) {
try {
return decodeURIComponent(escape(d.stringify(n)));
} catch (o) {
throw new Error("Malformed UTF-8 data");
}
}, parse: function parse(n) {
return d.parse(unescape(encodeURIComponent(n)));
} };var i = b.BufferedBlockAlgorithm = j.extend({ reset: function reset() {
this._data = new l.init();this._nDataBytes = 0;
}, _append: function _append(n) {
if (typeof n == "string") {
n = c.parse(n);
}this._data.concat(n);this._nDataBytes += n.sigBytes;
}, _process: function _process(w) {
var q = this._data;var x = q.words;var n = q.sigBytes;var t = this.blockSize;var v = t * 4;var u = n / v;if (w) {
u = e.ceil(u);
} else {
u = e.max((u | 0) - this._minBufferSize, 0);
}var s = u * t;var r = e.min(s * 4, n);if (s) {
for (var p = 0; p < s; p += t) {
this._doProcessBlock(x, p);
}var o = x.splice(0, s);q.sigBytes -= r;
}return new l.init(o, r);
}, clone: function clone() {
var n = j.clone.call(this);n._data = this._data.clone();return n;
}, _minBufferSize: 0 });var f = b.Hasher = i.extend({ cfg: j.extend(), init: function init(n) {
this.cfg = this.cfg.extend(n);this.reset();
}, reset: function reset() {
i.reset.call(this);this._doReset();
}, update: function update(n) {
this._append(n);this._process();return this;
}, finalize: function finalize(n) {
if (n) {
this._append(n);
}var o = this._doFinalize();return o;
}, blockSize: 512 / 32, _createHelper: function _createHelper(n) {
return function (p, o) {
return new n.init(o).finalize(p);
};
}, _createHmacHelper: function _createHmacHelper(n) {
return function (p, o) {
return new k.HMAC.init(n, o).finalize(p);
};
} });var k = a.algo = {};return a;
}(Math);
/*
CryptoJS v3.1.2 x64-core-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function (g) {
var a = CryptoJS,
f = a.lib,
e = f.Base,
h = f.WordArray,
a = a.x64 = {};a.Word = e.extend({ init: function init(b, c) {
this.high = b;this.low = c;
} });a.WordArray = e.extend({ init: function init(b, c) {
b = this.words = b || [];this.sigBytes = c != g ? c : 8 * b.length;
}, toX32: function toX32() {
for (var b = this.words, c = b.length, a = [], d = 0; d < c; d++) {
var e = b[d];a.push(e.high);a.push(e.low);
}return h.create(a, this.sigBytes);
}, clone: function clone() {
for (var b = e.clone.call(this), c = b.words = this.words.slice(0), a = c.length, d = 0; d < a; d++) {
c[d] = c[d].clone();
}return b;
} });
})();
/*
CryptoJS v3.1.2 enc-base64.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function () {
var h = CryptoJS,
j = h.lib.WordArray;h.enc.Base64 = { stringify: function stringify(b) {
var e = b.words,
f = b.sigBytes,
c = this._map;b.clamp();b = [];for (var a = 0; a < f; a += 3) {
for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) {
b.push(c.charAt(d >>> 6 * (3 - g) & 63));
}
}if (e = c.charAt(64)) for (; b.length % 4;) {
b.push(e);
}return b.join("");
}, parse: function parse(b) {
var e = b.length,
f = this._map,
c = f.charAt(64);c && (c = b.indexOf(c), -1 != c && (e = c));for (var c = [], a = 0, d = 0; d < e; d++) {
if (d % 4) {
var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4),
h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4);c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4);a++;
}
}return j.create(c, a);
}, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" };
})();
/*
CryptoJS v3.1.2 sha256-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function (k) {
for (var g = CryptoJS, h = g.lib, v = h.WordArray, j = h.Hasher, h = g.algo, s = [], t = [], u = function u(q) {
return 4294967296 * (q - (q | 0)) | 0;
}, l = 2, b = 0; 64 > b;) {
var d;a: {
d = l;for (var w = k.sqrt(d), r = 2; r <= w; r++) {
if (!(d % r)) {
d = !1;break a;
}
}d = !0;
}d && (8 > b && (s[b] = u(k.pow(l, 0.5))), t[b] = u(k.pow(l, 1 / 3)), b++);l++;
}var n = [],
h = h.SHA256 = j.extend({ _doReset: function _doReset() {
this._hash = new v.init(s.slice(0));
}, _doProcessBlock: function _doProcessBlock(q, h) {
for (var a = this._hash.words, c = a[0], d = a[1], b = a[2], k = a[3], f = a[4], g = a[5], j = a[6], l = a[7], e = 0; 64 > e; e++) {
if (16 > e) n[e] = q[h + e] | 0;else {
var m = n[e - 15],
p = n[e - 2];n[e] = ((m << 25 | m >>> 7) ^ (m << 14 | m >>> 18) ^ m >>> 3) + n[e - 7] + ((p << 15 | p >>> 17) ^ (p << 13 | p >>> 19) ^ p >>> 10) + n[e - 16];
}m = l + ((f << 26 | f >>> 6) ^ (f << 21 | f >>> 11) ^ (f << 7 | f >>> 25)) + (f & g ^ ~f & j) + t[e] + n[e];p = ((c << 30 | c >>> 2) ^ (c << 19 | c >>> 13) ^ (c << 10 | c >>> 22)) + (c & d ^ c & b ^ d & b);l = j;j = g;g = f;f = k + m | 0;k = b;b = d;d = c;c = m + p | 0;
}a[0] = a[0] + c | 0;a[1] = a[1] + d | 0;a[2] = a[2] + b | 0;a[3] = a[3] + k | 0;a[4] = a[4] + f | 0;a[5] = a[5] + g | 0;a[6] = a[6] + j | 0;a[7] = a[7] + l | 0;
}, _doFinalize: function _doFinalize() {
var d = this._data,
b = d.words,
a = 8 * this._nDataBytes,
c = 8 * d.sigBytes;
b[c >>> 5] |= 128 << 24 - c % 32;b[(c + 64 >>> 9 << 4) + 14] = k.floor(a / 4294967296);b[(c + 64 >>> 9 << 4) + 15] = a;d.sigBytes = 4 * b.length;this._process();return this._hash;
}, clone: function clone() {
var b = j.clone.call(this);b._hash = this._hash.clone();return b;
} });g.SHA256 = j._createHelper(h);g.HmacSHA256 = j._createHmacHelper(h);
})(Math);
/*
CryptoJS v3.1.2 sha512-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function () {
function a() {
return d.create.apply(d, arguments);
}for (var n = CryptoJS, r = n.lib.Hasher, e = n.x64, d = e.Word, T = e.WordArray, e = n.algo, ea = [a(1116352408, 3609767458), a(1899447441, 602891725), a(3049323471, 3964484399), a(3921009573, 2173295548), a(961987163, 4081628472), a(1508970993, 3053834265), a(2453635748, 2937671579), a(2870763221, 3664609560), a(3624381080, 2734883394), a(310598401, 1164996542), a(607225278, 1323610764), a(1426881987, 3590304994), a(1925078388, 4068182383), a(2162078206, 991336113), a(2614888103, 633803317), a(3248222580, 3479774868), a(3835390401, 2666613458), a(4022224774, 944711139), a(264347078, 2341262773), a(604807628, 2007800933), a(770255983, 1495990901), a(1249150122, 1856431235), a(1555081692, 3175218132), a(1996064986, 2198950837), a(2554220882, 3999719339), a(2821834349, 766784016), a(2952996808, 2566594879), a(3210313671, 3203337956), a(3336571891, 1034457026), a(3584528711, 2466948901), a(113926993, 3758326383), a(338241895, 168717936), a(666307205, 1188179964), a(773529912, 1546045734), a(1294757372, 1522805485), a(1396182291, 2643833823), a(1695183700, 2343527390), a(1986661051, 1014477480), a(2177026350, 1206759142), a(2456956037, 344077627), a(2730485921, 1290863460), a(2820302411, 3158454273), a(3259730800, 3505952657), a(3345764771, 106217008), a(3516065817, 3606008344), a(3600352804, 1432725776), a(4094571909, 1467031594), a(275423344, 851169720), a(430227734, 3100823752), a(506948616, 1363258195), a(659060556, 3750685593), a(883997877, 3785050280), a(958139571, 3318307427), a(1322822218, 3812723403), a(1537002063, 2003034995), a(1747873779, 3602036899), a(1955562222, 1575990012), a(2024104815, 1125592928), a(2227730452, 2716904306), a(2361852424, 442776044), a(2428436474, 593698344), a(2756734187, 3733110249), a(3204031479, 2999351573), a(3329325298, 3815920427), a(3391569614, 3928383900), a(3515267271, 566280711), a(3940187606, 3454069534), a(4118630271, 4000239992), a(116418474, 1914138554), a(174292421, 2731055270), a(289380356, 3203993006), a(460393269, 320620315), a(685471733, 587496836), a(852142971, 1086792851), a(1017036298, 365543100), a(1126000580, 2618297676), a(1288033470, 3409855158), a(1501505948, 4234509866), a(1607167915, 987167468), a(1816402316, 1246189591)], v = [], w = 0; 80 > w; w++) {
v[w] = a();
}e = e.SHA512 = r.extend({ _doReset: function _doReset() {
this._hash = new T.init([new d.init(1779033703, 4089235720), new d.init(3144134277, 2227873595), new d.init(1013904242, 4271175723), new d.init(2773480762, 1595750129), new d.init(1359893119, 2917565137), new d.init(2600822924, 725511199), new d.init(528734635, 4215389547), new d.init(1541459225, 327033209)]);
}, _doProcessBlock: function _doProcessBlock(a, d) {
for (var f = this._hash.words, F = f[0], e = f[1], n = f[2], r = f[3], G = f[4], H = f[5], I = f[6], f = f[7], w = F.high, J = F.low, X = e.high, K = e.low, Y = n.high, L = n.low, Z = r.high, M = r.low, $ = G.high, N = G.low, aa = H.high, O = H.low, ba = I.high, P = I.low, ca = f.high, Q = f.low, k = w, g = J, z = X, x = K, A = Y, y = L, U = Z, B = M, l = $, h = N, R = aa, C = O, S = ba, D = P, V = ca, E = Q, m = 0; 80 > m; m++) {
var s = v[m];if (16 > m) var j = s.high = a[d + 2 * m] | 0,
b = s.low = a[d + 2 * m + 1] | 0;else {
var j = v[m - 15],
b = j.high,
p = j.low,
j = (b >>> 1 | p << 31) ^ (b >>> 8 | p << 24) ^ b >>> 7,
p = (p >>> 1 | b << 31) ^ (p >>> 8 | b << 24) ^ (p >>> 7 | b << 25),
u = v[m - 2],
b = u.high,
c = u.low,
u = (b >>> 19 | c << 13) ^ (b << 3 | c >>> 29) ^ b >>> 6,
c = (c >>> 19 | b << 13) ^ (c << 3 | b >>> 29) ^ (c >>> 6 | b << 26),
b = v[m - 7],
W = b.high,
t = v[m - 16],
q = t.high,
t = t.low,
b = p + b.low,
j = j + W + (b >>> 0 < p >>> 0 ? 1 : 0),
b = b + c,
j = j + u + (b >>> 0 < c >>> 0 ? 1 : 0),
b = b + t,
j = j + q + (b >>> 0 < t >>> 0 ? 1 : 0);s.high = j;s.low = b;
}var W = l & R ^ ~l & S,
t = h & C ^ ~h & D,
s = k & z ^ k & A ^ z & A,
T = g & x ^ g & y ^ x & y,
p = (k >>> 28 | g << 4) ^ (k << 30 | g >>> 2) ^ (k << 25 | g >>> 7),
u = (g >>> 28 | k << 4) ^ (g << 30 | k >>> 2) ^ (g << 25 | k >>> 7),
c = ea[m],
fa = c.high,
da = c.low,
c = E + ((h >>> 14 | l << 18) ^ (h >>> 18 | l << 14) ^ (h << 23 | l >>> 9)),
q = V + ((l >>> 14 | h << 18) ^ (l >>> 18 | h << 14) ^ (l << 23 | h >>> 9)) + (c >>> 0 < E >>> 0 ? 1 : 0),
c = c + t,
q = q + W + (c >>> 0 < t >>> 0 ? 1 : 0),
c = c + da,
q = q + fa + (c >>> 0 < da >>> 0 ? 1 : 0),
c = c + b,
q = q + j + (c >>> 0 < b >>> 0 ? 1 : 0),
b = u + T,
s = p + s + (b >>> 0 < u >>> 0 ? 1 : 0),
V = S,
E = D,
S = R,
D = C,
R = l,
C = h,
h = B + c | 0,
l = U + q + (h >>> 0 < B >>> 0 ? 1 : 0) | 0,
U = A,
B = y,
A = z,
y = x,
z = k,
x = g,
g = c + b | 0,
k = q + s + (g >>> 0 < c >>> 0 ? 1 : 0) | 0;
}J = F.low = J + g;F.high = w + k + (J >>> 0 < g >>> 0 ? 1 : 0);K = e.low = K + x;e.high = X + z + (K >>> 0 < x >>> 0 ? 1 : 0);L = n.low = L + y;n.high = Y + A + (L >>> 0 < y >>> 0 ? 1 : 0);M = r.low = M + B;r.high = Z + U + (M >>> 0 < B >>> 0 ? 1 : 0);N = G.low = N + h;G.high = $ + l + (N >>> 0 < h >>> 0 ? 1 : 0);O = H.low = O + C;H.high = aa + R + (O >>> 0 < C >>> 0 ? 1 : 0);P = I.low = P + D;
I.high = ba + S + (P >>> 0 < D >>> 0 ? 1 : 0);Q = f.low = Q + E;f.high = ca + V + (Q >>> 0 < E >>> 0 ? 1 : 0);
}, _doFinalize: function _doFinalize() {
var a = this._data,
d = a.words,
f = 8 * this._nDataBytes,
e = 8 * a.sigBytes;d[e >>> 5] |= 128 << 24 - e % 32;d[(e + 128 >>> 10 << 5) + 30] = Math.floor(f / 4294967296);d[(e + 128 >>> 10 << 5) + 31] = f;a.sigBytes = 4 * d.length;this._process();return this._hash.toX32();
}, clone: function clone() {
var a = r.clone.call(this);a._hash = this._hash.clone();return a;
}, blockSize: 32 });n.SHA512 = r._createHelper(e);n.HmacSHA512 = r._createHmacHelper(e);
})();
/*
CryptoJS v3.1.2 sha384-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function () {
var c = CryptoJS,
a = c.x64,
b = a.Word,
e = a.WordArray,
a = c.algo,
d = a.SHA512,
a = a.SHA384 = d.extend({ _doReset: function _doReset() {
this._hash = new e.init([new b.init(3418070365, 3238371032), new b.init(1654270250, 914150663), new b.init(2438529370, 812702999), new b.init(355462360, 4144912697), new b.init(1731405415, 4290775857), new b.init(2394180231, 1750603025), new b.init(3675008525, 1694076839), new b.init(1203062813, 3204075428)]);
}, _doFinalize: function _doFinalize() {
var a = d._doFinalize.call(this);a.sigBytes -= 16;return a;
} });c.SHA384 = d._createHelper(a);c.HmacSHA384 = d._createHmacHelper(a);
})();
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64pad = "=";function hex2b64(d) {
var b;var e;var a = "";for (b = 0; b + 3 <= d.length; b += 3) {
e = parseInt(d.substring(b, b + 3), 16);a += b64map.charAt(e >> 6) + b64map.charAt(e & 63);
}if (b + 1 == d.length) {
e = parseInt(d.substring(b, b + 1), 16);a += b64map.charAt(e << 2);
} else {
if (b + 2 == d.length) {
e = parseInt(d.substring(b, b + 2), 16);a += b64map.charAt(e >> 2) + b64map.charAt((e & 3) << 4);
}
}if (b64pad) {
while ((a.length & 3) > 0) {
a += b64pad;
}
}return a;
}function b64tohex(f) {
var d = "";var e;var b = 0;var c;var a;for (e = 0; e < f.length; ++e) {
if (f.charAt(e) == b64pad) {
break;
}a = b64map.indexOf(f.charAt(e));if (a < 0) {
continue;
}if (b == 0) {
d += int2char(a >> 2);c = a & 3;b = 1;
} else {
if (b == 1) {
d += int2char(c << 2 | a >> 4);c = a & 15;b = 2;
} else {
if (b == 2) {
d += int2char(c);d += int2char(a >> 2);c = a & 3;b = 3;
} else {
d += int2char(c << 2 | a >> 4);d += int2char(a & 15);b = 0;
}
}
}
}if (b == 1) {
d += int2char(c << 2);
}return d;
}function b64toBA(e) {
var d = b64tohex(e);var c;var b = new Array();for (c = 0; 2 * c < d.length; ++c) {
b[c] = parseInt(d.substring(2 * c, 2 * c + 2), 16);
}return b;
};
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
var dbits;var canary = 244837814094590;var j_lm = (canary & 16777215) == 15715070;function BigInteger(e, d, f) {
if (e != null) {
if ("number" == typeof e) {
this.fromNumber(e, d, f);
} else {
if (d == null && "string" != typeof e) {
this.fromString(e, 256);
} else {
this.fromString(e, d);
}
}
}
}function nbi() {
return new BigInteger(null);
}function am1(f, a, b, e, h, g) {
while (--g >= 0) {
var d = a * this[f++] + b[e] + h;h = Math.floor(d / 67108864);b[e++] = d & 67108863;
}return h;
}function am2(f, q, r, e, o, a) {
var k = q & 32767,
p = q >> 15;while (--a >= 0) {
var d = this[f] & 32767;var g = this[f++] >> 15;var b = p * d + g * k;d = k * d + ((b & 32767) << 15) + r[e] + (o & 1073741823);o = (d >>> 30) + (b >>> 15) + p * g + (o >>> 30);r[e++] = d & 1073741823;
}return o;
}function am3(f, q, r, e, o, a) {
var k = q & 16383,
p = q >> 14;while (--a >= 0) {
var d = this[f] & 16383;var g = this[f++] >> 14;var b = p * d + g * k;d = k * d + ((b & 16383) << 14) + r[e] + o;o = (d >> 28) + (b >> 14) + p * g;r[e++] = d & 268435455;
}return o;
}if (j_lm && navigator.appName == "Microsoft Internet Explorer") {
BigInteger.prototype.am = am2;dbits = 30;
} else {
if (j_lm && navigator.appName != "Netscape") {
BigInteger.prototype.am = am1;dbits = 26;
} else {
BigInteger.prototype.am = am3;dbits = 28;
}
}BigInteger.prototype.DB = dbits;BigInteger.prototype.DM = (1 << dbits) - 1;BigInteger.prototype.DV = 1 << dbits;var BI_FP = 52;BigInteger.prototype.FV = Math.pow(2, BI_FP);BigInteger.prototype.F1 = BI_FP - dbits;BigInteger.prototype.F2 = 2 * dbits - BI_FP;var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";var BI_RC = new Array();var rr, vv;rr = "0".charCodeAt(0);for (vv = 0; vv <= 9; ++vv) {
BI_RC[rr++] = vv;
}rr = "a".charCodeAt(0);for (vv = 10; vv < 36; ++vv) {
BI_RC[rr++] = vv;
}rr = "A".charCodeAt(0);for (vv = 10; vv < 36; ++vv) {
BI_RC[rr++] = vv;
}function int2char(a) {
return BI_RM.charAt(a);
}function intAt(b, a) {
var d = BI_RC[b.charCodeAt(a)];return d == null ? -1 : d;
}function bnpCopyTo(b) {
for (var a = this.t - 1; a >= 0; --a) {
b[a] = this[a];
}b.t = this.t;b.s = this.s;
}function bnpFromInt(a) {
this.t = 1;this.s = a < 0 ? -1 : 0;if (a > 0) {
this[0] = a;
} else {
if (a < -1) {
this[0] = a + this.DV;
} else {
this.t = 0;
}
}
}function nbv(a) {
var b = nbi();b.fromInt(a);return b;
}function bnpFromString(h, c) {
var e;if (c == 16) {
e = 4;
} else {
if (c == 8) {
e = 3;
} else {
if (c == 256) {
e = 8;
} else {
if (c == 2) {
e = 1;
} else {
if (c == 32) {
e = 5;
} else {
if (c == 4) {
e = 2;
} else {
this.fromRadix(h, c);return;
}
}
}
}
}
}this.t = 0;this.s = 0;var g = h.length,
d = false,
f = 0;while (--g >= 0) {
var a = e == 8 ? h[g] & 255 : intAt(h, g);if (a < 0) {
if (h.charAt(g) == "-") {
d = true;
}continue;
}d = false;if (f == 0) {
this[this.t++] = a;
} else {
if (f + e > this.DB) {
this[this.t - 1] |= (a & (1 << this.DB - f) - 1) << f;this[this.t++] = a >> this.DB - f;
} else {
this[this.t - 1] |= a << f;
}
}f += e;if (f >= this.DB) {
f -= this.DB;
}
}if (e == 8 && (h[0] & 128) != 0) {
this.s = -1;if (f > 0) {
this[this.t - 1] |= (1 << this.DB - f) - 1 << f;
}
}this.clamp();if (d) {
BigInteger.ZERO.subTo(this, this);
}
}function bnpClamp() {
var a = this.s & this.DM;while (this.t > 0 && this[this.t - 1] == a) {
--this.t;
}
}function bnToString(c) {
if (this.s < 0) {
return "-" + this.negate().toString(c);
}var e;if (c == 16) {
e = 4;
} else {
if (c == 8) {
e = 3;
} else {
if (c == 2) {
e = 1;
} else {
if (c == 32) {
e = 5;
} else {
if (c == 4) {
e = 2;
} else {
return this.toRadix(c);
}
}
}
}
}var g = (1 << e) - 1,
l,
a = false,
h = "",
f = this.t;var j = this.DB - f * this.DB % e;if (f-- > 0) {
if (j < this.DB && (l = this[f] >> j) > 0) {
a = true;h = int2char(l);
}while (f >= 0) {
if (j < e) {
l = (this[f] & (1 << j) - 1) << e - j;l |= this[--f] >> (j += this.DB - e);
} else {
l = this[f] >> (j -= e) & g;if (j <= 0) {
j += this.DB;--f;
}
}if (l > 0) {
a = true;
}if (a) {
h += int2char(l);
}
}
}return a ? h : "0";
}function bnNegate() {
var a = nbi();BigInteger.ZERO.subTo(this, a);return a;
}function bnAbs() {
return this.s < 0 ? this.negate() : this;
}function bnCompareTo(b) {
var d = this.s - b.s;if (d != 0) {
return d;
}var c = this.t;d = c - b.t;if (d != 0) {
return this.s < 0 ? -d : d;
}while (--c >= 0) {
if ((d = this[c] - b[c]) != 0) {
return d;
}
}return 0;
}function nbits(a) {
var c = 1,
b;if ((b = a >>> 16) != 0) {
a = b;c += 16;
}if ((b = a >> 8) != 0) {
a = b;c += 8;
}if ((b = a >> 4) != 0) {
a = b;c += 4;
}if ((b = a >> 2) != 0) {
a = b;c += 2;
}if ((b = a >> 1) != 0) {
a = b;c += 1;
}return c;
}function bnBitLength() {
if (this.t <= 0) {
return 0;
}return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM);
}function bnpDLShiftTo(c, b) {
var a;for (a = this.t - 1; a >= 0; --a) {
b[a + c] = this[a];
}for (a = c - 1; a >= 0; --a) {
b[a] = 0;
}b.t = this.t + c;b.s = this.s;
}function bnpDRShiftTo(c, b) {
for (var a = c; a < this.t; ++a) {
b[a - c] = this[a];
}b.t = Math.max(this.t - c, 0);b.s = this.s;
}function bnpLShiftTo(j, e) {
var b = j % this.DB;var a = this.DB - b;var g = (1 << a) - 1;var f = Math.floor(j / this.DB),
h = this.s << b & this.DM,
d;for (d = this.t - 1; d >= 0; --d) {
e[d + f + 1] = this[d] >> a | h;h = (this[d] & g) << b;
}for (d = f - 1; d >= 0; --d) {
e[d] = 0;
}e[f] = h;e.t = this.t + f + 1;e.s = this.s;e.clamp();
}function bnpRShiftTo(g, d) {
d.s = this.s;var e = Math.floor(g / this.DB);if (e >= this.t) {
d.t = 0;return;
}var b = g % this.DB;var a = this.DB - b;var f = (1 << b) - 1;d[0] = this[e] >> b;for (var c = e + 1; c < this.t; ++c) {
d[c - e - 1] |= (this[c] & f) << a;d[c - e] = this[c] >> b;
}if (b > 0) {
d[this.t - e - 1] |= (this.s & f) << a;
}d.t = this.t - e;d.clamp();
}function bnpSubTo(d, f) {
var e = 0,
g = 0,
b = Math.min(d.t, this.t);while (e < b) {
g += this[e] - d[e];f[e++] = g & this.DM;g >>= this.DB;
}if (d.t < this.t) {
g -= d.s;while (e < this.t) {
g += this[e];f[e++] = g & this.DM;g >>= this.DB;
}g += this.s;
} else {
g += this.s;while (e < d.t) {
g -= d[e];f[e++] = g & this.DM;g >>= this.DB;
}g -= d.s;
}f.s = g < 0 ? -1 : 0;if (g < -1) {
f[e++] = this.DV + g;
} else {
if (g > 0) {
f[e++] = g;
}
}f.t = e;f.clamp();
}function bnpMultiplyTo(c, e) {
var b = this.abs(),
f = c.abs();var d = b.t;e.t = d + f.t;while (--d >= 0) {
e[d] = 0;
}for (d = 0; d < f.t; ++d) {
e[d + b.t] = b.am(0, f[d], e, d, 0, b.t);
}e.s = 0;e.clamp();if (this.s != c.s) {
BigInteger.ZERO.subTo(e, e);
}
}function bnpSquareTo(d) {
var a = this.abs();var b = d.t = 2 * a.t;while (--b >= 0) {
d[b] = 0;
}for (b = 0; b < a.t - 1; ++b) {
var e = a.am(b, a[b], d, 2 * b, 0, 1);if ((d[b + a.t] += a.am(b + 1, 2 * a[b], d, 2 * b + 1, e, a.t - b - 1)) >= a.DV) {
d[b + a.t] -= a.DV;d[b + a.t + 1] = 1;
}
}if (d.t > 0) {
d[d.t - 1] += a.am(b, a[b], d, 2 * b, 0, 1);
}d.s = 0;d.clamp();
}function bnpDivRemTo(n, h, g) {
var w = n.abs();if (w.t <= 0) {
return;
}var k = this.abs();if (k.t < w.t) {
if (h != null) {
h.fromInt(0);
}if (g != null) {
this.copyTo(g);
}return;
}if (g == null) {
g = nbi();
}var d = nbi(),
a = this.s,
l = n.s;var v = this.DB - nbits(w[w.t - 1]);if (v > 0) {
w.lShiftTo(v, d);k.lShiftTo(v, g);
} else {
w.copyTo(d);k.copyTo(g);
}var p = d.t;var b = d[p - 1];if (b == 0) {
return;
}var o = b * (1 << this.F1) + (p > 1 ? d[p - 2] >> this.F2 : 0);var A = this.FV / o,
z = (1 << this.F1) / o,
x = 1 << this.F2;var u = g.t,
s = u - p,
f = h == null ? nbi() : h;d.dlShiftTo(s, f);if (g.compareTo(f) >= 0) {
g[g.t++] = 1;g.subTo(f, g);
}BigInteger.ONE.dlShiftTo(p, f);f.subTo(d, d);while (d.t < p) {
d[d.t++] = 0;
}while (--s >= 0) {
var c = g[--u] == b ? this.DM : Math.floor(g[u] * A + (g[u - 1] + x) * z);if ((g[u] += d.am(0, c, g, s, 0, p)) < c) {
d.dlShiftTo(s, f);g.subTo(f, g);while (g[u] < --c) {
g.subTo(f, g);
}
}
}if (h != null) {
g.drShiftTo(p, h);if (a != l) {
BigInteger.ZERO.subTo(h, h);
}
}g.t = p;g.clamp();if (v > 0) {
g.rShiftTo(v, g);
}if (a < 0) {
BigInteger.ZERO.subTo(g, g);
}
}function bnMod(b) {
var c = nbi();this.abs().divRemTo(b, null, c);if (this.s < 0 && c.compareTo(BigInteger.ZERO) > 0) {
b.subTo(c, c);
}return c;
}function Classic(a) {
this.m = a;
}function cConvert(a) {
if (a.s < 0 || a.compareTo(this.m) >= 0) {
return a.mod(this.m);
} else {
return a;
}
}function cRevert(a) {
return a;
}function cReduce(a) {
a.divRemTo(this.m, null, a);
}function cMulTo(a, c, b) {
a.multiplyTo(c, b);this.reduce(b);
}function cSqrTo(a, b) {
a.squareTo(b);this.reduce(b);
}Classic.prototype.convert = cConvert;Classic.prototype.revert = cRevert;Classic.prototype.reduce = cReduce;Classic.prototype.mulTo = cMulTo;Classic.prototype.sqrTo = cSqrTo;function bnpInvDigit() {
if (this.t < 1) {
return 0;
}var a = this[0];if ((a & 1) == 0) {
return 0;
}var b = a & 3;b = b * (2 - (a & 15) * b) & 15;b = b * (2 - (a & 255) * b) & 255;b = b * (2 - ((a & 65535) * b & 65535)) & 65535;b = b * (2 - a * b % this.DV) % this.DV;return b > 0 ? this.DV - b : -b;
}function Montgomery(a) {
this.m = a;this.mp = a.invDigit();this.mpl = this.mp & 32767;this.mph = this.mp >> 15;this.um = (1 << a.DB - 15) - 1;this.mt2 = 2 * a.t;
}function montConvert(a) {
var b = nbi();a.abs().dlShiftTo(this.m.t, b);b.divRemTo(this.m, null, b);if (a.s < 0 && b.compareTo(BigInteger.ZERO) > 0) {
this.m.subTo(b, b);
}return b;
}function montRevert(a) {
var b = nbi();a.copyTo(b);this.reduce(b);return b;
}function montReduce(a) {
while (a.t <= this.mt2) {
a[a.t++] = 0;
}for (var c = 0; c < this.m.t; ++c) {
var b = a[c] & 32767;var d = b * this.mpl + ((b * this.mph + (a[c] >> 15) * this.mpl & this.um) << 15) & a.DM;b = c + this.m.t;a[b] += this.m.am(0, d, a, c, 0, this.m.t);while (a[b] >= a.DV) {
a[b] -= a.DV;a[++b]++;
}
}a.clamp();a.drShiftTo(this.m.t, a);if (a.compareTo(this.m) >= 0) {
a.subTo(this.m, a);
}
}function montSqrTo(a, b) {
a.squareTo(b);this.reduce(b);
}function montMulTo(a, c, b) {
a.multiplyTo(c, b);this.reduce(b);
}Montgomery.prototype.convert = montConvert;Montgomery.prototype.revert = montRevert;Montgomery.prototype.reduce = montReduce;Montgomery.prototype.mulTo = montMulTo;Montgomery.prototype.sqrTo = montSqrTo;function bnpIsEven() {
return (this.t > 0 ? this[0] & 1 : this.s) == 0;
}function bnpExp(h, j) {
if (h > 4294967295 || h < 1) {
return BigInteger.ONE;
}var f = nbi(),
a = nbi(),
d = j.convert(this),
c = nbits(h) - 1;d.copyTo(f);while (--c >= 0) {
j.sqrTo(f, a);if ((h & 1 << c) > 0) {
j.mulTo(a, d, f);
} else {
var b = f;f = a;a = b;
}
}return j.revert(f);
}function bnModPowInt(b, a) {
var c;if (b < 256 || a.isEven()) {
c = new Classic(a);
} else {
c = new Montgomery(a);
}return this.exp(b, c);
}BigInteger.prototype.copyTo = bnpCopyTo;BigInteger.prototype.fromInt = bnpFromInt;BigInteger.prototype.fromString = bnpFromString;BigInteger.prototype.clamp = bnpClamp;BigInteger.prototype.dlShiftTo = bnpDLShiftTo;BigInteger.prototype.drShiftTo = bnpDRShiftTo;BigInteger.prototype.lShiftTo = bnpLShiftTo;BigInteger.prototype.rShiftTo = bnpRShiftTo;BigInteger.prototype.subTo = bnpSubTo;BigInteger.prototype.multiplyTo = bnpMultiplyTo;BigInteger.prototype.squareTo = bnpSquareTo;BigInteger.prototype.divRemTo = bnpDivRemTo;BigInteger.prototype.invDigit = bnpInvDigit;BigInteger.prototype.isEven = bnpIsEven;BigInteger.prototype.exp = bnpExp;BigInteger.prototype.toString = bnToString;BigInteger.prototype.negate = bnNegate;BigInteger.prototype.abs = bnAbs;BigInteger.prototype.compareTo = bnCompareTo;BigInteger.prototype.bitLength = bnBitLength;BigInteger.prototype.mod = bnMod;BigInteger.prototype.modPowInt = bnModPowInt;BigInteger.ZERO = nbv(0);BigInteger.ONE = nbv(1);
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function bnClone() {
var a = nbi();this.copyTo(a);return a;
}function bnIntValue() {
if (this.s < 0) {
if (this.t == 1) {
return this[0] - this.DV;
} else {
if (this.t == 0) {
return -1;
}
}
} else {
if (this.t == 1) {
return this[0];
} else {
if (this.t == 0) {
return 0;
}
}
}return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0];
}function bnByteValue() {
return this.t == 0 ? this.s : this[0] << 24 >> 24;
}function bnShortValue() {
return this.t == 0 ? this.s : this[0] << 16 >> 16;
}function bnpChunkSize(a) {
return Math.floor(Math.LN2 * this.DB / Math.log(a));
}function bnSigNum() {
if (this.s < 0) {
return -1;
} else {
if (this.t <= 0 || this.t == 1 && this[0] <= 0) {
return 0;
} else {
return 1;
}
}
}function bnpToRadix(c) {
if (c == null) {
c = 10;
}if (this.signum() == 0 || c < 2 || c > 36) {
return "0";
}var f = this.chunkSize(c);var e = Math.pow(c, f);var i = nbv(e),
j = nbi(),
h = nbi(),
g = "";this.divRemTo(i, j, h);while (j.signum() > 0) {
g = (e + h.intValue()).toString(c).substr(1) + g;j.divRemTo(i, j, h);
}return h.intValue().toString(c) + g;
}function bnpFromRadix(m, h) {
this.fromInt(0);if (h == null) {
h = 10;
}var f = this.chunkSize(h);var g = Math.pow(h, f),
e = false,
a = 0,
l = 0;for (var c = 0; c < m.length; ++c) {
var k = intAt(m, c);if (k < 0) {
if (m.charAt(c) == "-" && this.signum() == 0) {
e = true;
}continue;
}l = h * l + k;if (++a >= f) {
this.dMultiply(g);this.dAddOffset(l, 0);a = 0;l = 0;
}
}if (a > 0) {
this.dMultiply(Math.pow(h, a));this.dAddOffset(l, 0);
}if (e) {
BigInteger.ZERO.subTo(this, this);
}
}function bnpFromNumber(f, e, h) {
if ("number" == typeof e) {
if (f < 2) {
this.fromInt(1);
} else {
this.fromNumber(f, h);if (!this.testBit(f - 1)) {
this.bitwiseTo(BigInteger.ONE.shiftLeft(f - 1), op_or, this);
}if (this.isEven()) {
this.dAddOffset(1, 0);
}while (!this.isProbablePrime(e)) {
this.dAddOffset(2, 0);if (this.bitLength() > f) {
this.subTo(BigInteger.ONE.shiftLeft(f - 1), this);
}
}
}
} else {
var d = new Array(),
g = f & 7;d.length = (f >> 3) + 1;e.nextBytes(d);if (g > 0) {
d[0] &= (1 << g) - 1;
} else {
d[0] = 0;
}this.fromString(d, 256);
}
}function bnToByteArray() {
var b = this.t,
c = new Array();c[0] = this.s;var e = this.DB - b * this.DB % 8,
f,
a = 0;if (b-- > 0) {
if (e < this.DB && (f = this[b] >> e) != (this.s & this.DM) >> e) {
c[a++] = f | this.s << this.DB - e;
}while (b >= 0) {
if (e < 8) {
f = (this[b] & (1 << e) - 1) << 8 - e;f |= this[--b] >> (e += this.DB - 8);
} else {
f = this[b] >> (e -= 8) & 255;if (e <= 0) {
e += this.DB;--b;
}
}if ((f & 128) != 0) {
f |= -256;
}if (a == 0 && (this.s & 128) != (f & 128)) {
++a;
}if (a > 0 || f != this.s) {
c[a++] = f;
}
}
}return c;
}function bnEquals(b) {
return this.compareTo(b) == 0;
}function bnMin(b) {
return this.compareTo(b) < 0 ? this : b;
}function bnMax(b) {
return this.compareTo(b) > 0 ? this : b;
}function bnpBitwiseTo(c, h, e) {
var d,
g,
b = Math.min(c.t, this.t);for (d = 0; d < b; ++d) {
e[d] = h(this[d], c[d]);
}if (c.t < this.t) {
g = c.s & this.DM;for (d = b; d < this.t; ++d) {
e[d] = h(this[d], g);
}e.t = this.t;
} else {
g = this.s & this.DM;for (d = b; d < c.t; ++d) {
e[d] = h(g, c[d]);
}e.t = c.t;
}e.s = h(this.s, c.s);e.clamp();
}function op_and(a, b) {
return a & b;
}function bnAnd(b) {
var c = nbi();this.bitwiseTo(b, op_and, c);return c;
}function op_or(a, b) {
return a | b;
}function bnOr(b) {
var c = nbi();this.bitwiseTo(b, op_or, c);return c;
}function op_xor(a, b) {
return a ^ b;
}function bnXor(b) {
var c = nbi();this.bitwiseTo(b, op_xor, c);return c;
}function op_andnot(a, b) {
return a & ~b;
}function bnAndNot(b) {
var c = nbi();this.bitwiseTo(b, op_andnot, c);return c;
}function bnNot() {
var b = nbi();for (var a = 0; a < this.t; ++a) {
b[a] = this.DM & ~this[a];
}b.t = this.t;b.s = ~this.s;return b;
}function bnShiftLeft(b) {
var a = nbi();if (b < 0) {
this.rShiftTo(-b, a);
} else {
this.lShiftTo(b, a);
}return a;
}function bnShiftRight(b) {
var a = nbi();if (b < 0) {
this.lShiftTo(-b, a);
} else {
this.rShiftTo(b, a);
}return a;
}function lbit(a) {
if (a == 0) {
return -1;
}var b = 0;if ((a & 65535) == 0) {
a >>= 16;b += 16;
}if ((a & 255) == 0) {
a >>= 8;b += 8;
}if ((a & 15) == 0) {
a >>= 4;b += 4;
}if ((a & 3) == 0) {
a >>= 2;b += 2;
}if ((a & 1) == 0) {
++b;
}return b;
}function bnGetLowestSetBit() {
for (var a = 0; a < this.t; ++a) {
if (this[a] != 0) {
return a * this.DB + lbit(this[a]);
}
}if (this.s < 0) {
return this.t * this.DB;
}return -1;
}function cbit(a) {
var b = 0;while (a != 0) {
a &= a - 1;++b;
}return b;
}function bnBitCount() {
var c = 0,
a = this.s & this.DM;for (var b = 0; b < this.t; ++b) {
c += cbit(this[b] ^ a);
}return c;
}function bnTestBit(b) {
var a = Math.floor(b / this.DB);if (a >= this.t) {
return this.s != 0;
}return (this[a] & 1 << b % this.DB) != 0;
}function bnpChangeBit(c, b) {
var a = BigInteger.ONE.shiftLeft(c);this.bitwiseTo(a, b, a);return a;
}function bnSetBit(a) {
return this.changeBit(a, op_or);
}function bnClearBit(a) {
return this.changeBit(a, op_andnot);
}function bnFlipBit(a) {
return this.changeBit(a, op_xor);
}function bnpAddTo(d, f) {
var e = 0,
g = 0,
b = Math.min(d.t, this.t);while (e < b) {
g += this[e] + d[e];f[e++] = g & this.DM;g >>= this.DB;
}if (d.t < this.t) {
g += d.s;while (e < this.t) {
g += this[e];f[e++] = g & this.DM;g >>= this.DB;
}g += this.s;
} else {
g += this.s;while (e < d.t) {
g += d[e];f[e++] = g & this.DM;g >>= this.DB;
}g += d.s;
}f.s = g < 0 ? -1 : 0;if (g > 0) {
f[e++] = g;
} else {
if (g < -1) {
f[e++] = this.DV + g;
}
}f.t = e;f.clamp();
}function bnAdd(b) {
var c = nbi();this.addTo(b, c);return c;
}function bnSubtract(b) {
var c = nbi();this.subTo(b, c);return c;
}function bnMultiply(b) {
var c = nbi();this.multiplyTo(b, c);return c;
}function bnSquare() {
var a = nbi();this.squareTo(a);return a;
}function bnDivide(b) {
var c = nbi();this.divRemTo(b, c, null);return c;
}function bnRemainder(b) {
var c = nbi();this.divRemTo(b, null, c);return c;
}function bnDivideAndRemainder(b) {
var d = nbi(),
c = nbi();this.divRemTo(b, d, c);return new Array(d, c);
}function bnpDMultiply(a) {
this[this.t] = this.am(0, a - 1, this, 0, 0, this.t);++this.t;this.clamp();
}function bnpDAddOffset(b, a) {
if (b == 0) {
return;
}while (this.t <= a) {
this[this.t++] = 0;
}this[a] += b;while (this[a] >= this.DV) {
this[a] -= this.DV;if (++a >= this.t) {
this[this.t++] = 0;
}++this[a];
}
}function NullExp() {}function nNop(a) {
return a;
}function nMulTo(a, c, b) {
a.multiplyTo(c, b);
}function nSqrTo(a, b) {
a.squareTo(b);
}NullExp.prototype.convert = nNop;NullExp.prototype.revert = nNop;NullExp.prototype.mulTo = nMulTo;NullExp.prototype.sqrTo = nSqrTo;function bnPow(a) {
return this.exp(a, new NullExp());
}function bnpMultiplyLowerTo(b, f, e) {
var d = Math.min(this.t + b.t, f);e.s = 0;e.t = d;while (d > 0) {
e[--d] = 0;
}var c;for (c = e.t - this.t; d < c; ++d) {
e[d + this.t] = this.am(0, b[d], e, d, 0, this.t);
}for (c = Math.min(b.t, f); d < c; ++d) {
this.am(0, b[d], e, d, 0, f - d);
}e.clamp();
}function bnpMultiplyUpperTo(b, e, d) {
--e;var c = d.t = this.t + b.t - e;d.s = 0;while (--c >= 0) {
d[c] = 0;
}for (c = Math.max(e - this.t, 0); c < b.t; ++c) {
d[this.t + c - e] = this.am(e - c, b[c], d, 0, 0, this.t + c - e);
}d.clamp();d.drShiftTo(1, d);
}function Barrett(a) {
this.r2 = nbi();this.q3 = nbi();BigInteger.ONE.dlShiftTo(2 * a.t, this.r2);this.mu = this.r2.divide(a);this.m = a;
}function barrettConvert(a) {
if (a.s < 0 || a.t > 2 * this.m.t) {
return a.mod(this.m);
} else {
if (a.compareTo(this.m) < 0) {
return a;
} else {
var b = nbi();a.copyTo(b);this.reduce(b);return b;
}
}
}function barrettRevert(a) {
return a;
}function barrettReduce(a) {
a.drShiftTo(this.m.t - 1, this.r2);if (a.t > this.m.t + 1) {
a.t = this.m.t + 1;a.clamp();
}this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);while (a.compareTo(this.r2) < 0) {
a.dAddOffset(1, this.m.t + 1);
}a.subTo(this.r2, a);while (a.compareTo(this.m) >= 0) {
a.subTo(this.m, a);
}
}function barrettSqrTo(a, b) {
a.squareTo(b);this.reduce(b);
}function barrettMulTo(a, c, b) {
a.multiplyTo(c, b);this.reduce(b);
}Barrett.prototype.convert = barrettConvert;Barrett.prototype.revert = barrettRevert;Barrett.prototype.reduce = barrettReduce;Barrett.prototype.mulTo = barrettMulTo;Barrett.prototype.sqrTo = barrettSqrTo;function bnModPow(q, f) {
var o = q.bitLength(),
h,
b = nbv(1),
v;if (o <= 0) {
return b;
} else {
if (o < 18) {
h = 1;
} else {
if (o < 48) {
h = 3;
} else {
if (o < 144) {
h = 4;
} else {
if (o < 768) {
h = 5;
} else {
h = 6;
}
}
}
}
}if (o < 8) {
v = new Classic(f);
} else {
if (f.isEven()) {
v = new Barrett(f);
} else {
v = new Montgomery(f);
}
}var p = new Array(),
d = 3,
s = h - 1,
a = (1 << h) - 1;p[1] = v.convert(this);if (h > 1) {
var A = nbi();v.sqrTo(p[1], A);while (d <= a) {
p[d] = nbi();v.mulTo(A, p[d - 2], p[d]);d += 2;
}
}var l = q.t - 1,
x,
u = true,
c = nbi(),
y;o = nbits(q[l]) - 1;while (l >= 0) {
if (o >= s) {
x = q[l] >> o - s & a;
} else {
x = (q[l] & (1 << o + 1) - 1) << s - o;if (l > 0) {
x |= q[l - 1] >> this.DB + o - s;
}
}d = h;while ((x & 1) == 0) {
x >>= 1;--d;
}if ((o -= d) < 0) {
o += this.DB;--l;
}if (u) {
p[x].copyTo(b);u = false;
} else {
while (d > 1) {
v.sqrTo(b, c);v.sqrTo(c, b);d -= 2;
}if (d > 0) {
v.sqrTo(b, c);
} else {
y = b;b = c;c = y;
}v.mulTo(c, p[x], b);
}while (l >= 0 && (q[l] & 1 << o) == 0) {
v.sqrTo(b, c);y = b;b = c;c = y;if (--o < 0) {
o = this.DB - 1;--l;
}
}
}return v.revert(b);
}function bnGCD(c) {
var b = this.s < 0 ? this.negate() : this.clone();var h = c.s < 0 ? c.negate() : c.clone();if (b.compareTo(h) < 0) {
var e = b;b = h;h = e;
}var d = b.getLowestSetBit(),
f = h.getLowestSetBit();if (f < 0) {
return b;
}if (d < f) {
f = d;
}if (f > 0) {
b.rShiftTo(f, b);h.rShiftTo(f, h);
}while (b.signum() > 0) {
if ((d = b.getLowestSetBit()) > 0) {
b.rShiftTo(d, b);
}if ((d = h.getLowestSetBit()) > 0) {
h.rShiftTo(d, h);
}if (b.compareTo(h) >= 0) {
b.subTo(h, b);b.rShiftTo(1, b);
} else {
h.subTo(b, h);h.rShiftTo(1, h);
}
}if (f > 0) {
h.lShiftTo(f, h);
}return h;
}function bnpModInt(e) {
if (e <= 0) {
return 0;
}var c = this.DV % e,
b = this.s < 0 ? e - 1 : 0;if (this.t > 0) {
if (c == 0) {
b = this[0] % e;
} else {
for (var a = this.t - 1; a >= 0; --a) {
b = (c * b + this[a]) % e;
}
}
}return b;
}function bnModInverse(f) {
var j = f.isEven();if (this.isEven() && j || f.signum() == 0) {
return BigInteger.ZERO;
}var i = f.clone(),
h = this.clone();var g = nbv(1),
e = nbv(0),
l = nbv(0),
k = nbv(1);while (i.signum() != 0) {
while (i.isEven()) {
i.rShiftTo(1, i);if (j) {
if (!g.isEven() || !e.isEven()) {
g.addTo(this, g);e.subTo(f, e);
}g.rShiftTo(1, g);
} else {
if (!e.isEven()) {
e.subTo(f, e);
}
}e.rShiftTo(1, e);
}while (h.isEven()) {
h.rShiftTo(1, h);if (j) {
if (!l.isEven() || !k.isEven()) {
l.addTo(this, l);k.subTo(f, k);
}l.rShiftTo(1, l);
} else {
if (!k.isEven()) {
k.subTo(f, k);
}
}k.rShiftTo(1, k);
}if (i.compareTo(h) >= 0) {
i.subTo(h, i);if (j) {
g.subTo(l, g);
}e.subTo(k, e);
} else {
h.subTo(i, h);if (j) {
l.subTo(g, l);
}k.subTo(e, k);
}
}if (h.compareTo(BigInteger.ONE) != 0) {
return BigInteger.ZERO;
}if (k.compareTo(f) >= 0) {
return k.subtract(f);
}if (k.signum() < 0) {
k.addTo(f, k);
} else {
return k;
}if (k.signum() < 0) {
return k.add(f);
} else {
return k;
}
}var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];function bnIsProbablePrime(e) {
var d,
b = this.abs();if (b.t == 1 && b[0] <= lowprimes[lowprimes.length - 1]) {
for (d = 0; d < lowprimes.length; ++d) {
if (b[0] == lowprimes[d]) {
return true;
}
}return false;
}if (b.isEven()) {
return false;
}d = 1;while (d < lowprimes.length) {
var a = lowprimes[d],
c = d + 1;while (c < lowprimes.length && a < lplim) {
a *= lowprimes[c++];
}a = b.modInt(a);while (d < c) {
if (a % lowprimes[d++] == 0) {
return false;
}
}
}return b.millerRabin(e);
}function bnpMillerRabin(f) {
var g = this.subtract(BigInteger.ONE);var c = g.getLowestSetBit();if (c <= 0) {
return false;
}var h = g.shiftRight(c);f = f + 1 >> 1;if (f > lowprimes.length) {
f = lowprimes.length;
}var b = nbi();for (var e = 0; e < f; ++e) {
b.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);var l = b.modPow(h, this);if (l.compareTo(BigInteger.ONE) != 0 && l.compareTo(g) != 0) {
var d = 1;while (d++ < c && l.compareTo(g) != 0) {
l = l.modPowInt(2, this);if (l.compareTo(BigInteger.ONE) == 0) {
return false;
}
}if (l.compareTo(g) != 0) {
return false;
}
}
}return true;
}BigInteger.prototype.chunkSize = bnpChunkSize;BigInteger.prototype.toRadix = bnpToRadix;BigInteger.prototype.fromRadix = bnpFromRadix;BigInteger.prototype.fromNumber = bnpFromNumber;BigInteger.prototype.bitwiseTo = bnpBitwiseTo;BigInteger.prototype.changeBit = bnpChangeBit;BigInteger.prototype.addTo = bnpAddTo;BigInteger.prototype.dMultiply = bnpDMultiply;BigInteger.prototype.dAddOffset = bnpDAddOffset;BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;BigInteger.prototype.modInt = bnpModInt;BigInteger.prototype.millerRabin = bnpMillerRabin;BigInteger.prototype.clone = bnClone;BigInteger.prototype.intValue = bnIntValue;BigInteger.prototype.byteValue = bnByteValue;BigInteger.prototype.shortValue = bnShortValue;BigInteger.prototype.signum = bnSigNum;BigInteger.prototype.toByteArray = bnToByteArray;BigInteger.prototype.equals = bnEquals;BigInteger.prototype.min = bnMin;BigInteger.prototype.max = bnMax;BigInteger.prototype.and = bnAnd;BigInteger.prototype.or = bnOr;BigInteger.prototype.xor = bnXor;BigInteger.prototype.andNot = bnAndNot;BigInteger.prototype.not = bnNot;BigInteger.prototype.shiftLeft = bnShiftLeft;BigInteger.prototype.shiftRight = bnShiftRight;BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;BigInteger.prototype.bitCount = bnBitCount;BigInteger.prototype.testBit = bnTestBit;BigInteger.prototype.setBit = bnSetBit;BigInteger.prototype.clearBit = bnClearBit;BigInteger.prototype.flipBit = bnFlipBit;BigInteger.prototype.add = bnAdd;BigInteger.prototype.subtract = bnSubtract;BigInteger.prototype.multiply = bnMultiply;BigInteger.prototype.divide = bnDivide;BigInteger.prototype.remainder = bnRemainder;BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;BigInteger.prototype.modPow = bnModPow;BigInteger.prototype.modInverse = bnModInverse;BigInteger.prototype.pow = bnPow;BigInteger.prototype.gcd = bnGCD;BigInteger.prototype.isProbablePrime = bnIsProbablePrime;BigInteger.prototype.square = bnSquare;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function Arcfour() {
this.i = 0;this.j = 0;this.S = new Array();
}function ARC4init(d) {
var c, a, b;for (c = 0; c < 256; ++c) {
this.S[c] = c;
}a = 0;for (c = 0; c < 256; ++c) {
a = a + this.S[c] + d[c % d.length] & 255;b = this.S[c];this.S[c] = this.S[a];this.S[a] = b;
}this.i = 0;this.j = 0;
}function ARC4next() {
var a;this.i = this.i + 1 & 255;this.j = this.j + this.S[this.i] & 255;a = this.S[this.i];this.S[this.i] = this.S[this.j];this.S[this.j] = a;return this.S[a + this.S[this.i] & 255];
}Arcfour.prototype.init = ARC4init;Arcfour.prototype.next = ARC4next;function prng_newstate() {
return new Arcfour();
}var rng_psize = 256;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
var rng_state;var rng_pool;var rng_pptr;function rng_seed_int(a) {
rng_pool[rng_pptr++] ^= a & 255;rng_pool[rng_pptr++] ^= a >> 8 & 255;rng_pool[rng_pptr++] ^= a >> 16 & 255;rng_pool[rng_pptr++] ^= a >> 24 & 255;if (rng_pptr >= rng_psize) {
rng_pptr -= rng_psize;
}
}function rng_seed_time() {
rng_seed_int(new Date().getTime());
}if (rng_pool == null) {
rng_pool = new Array();rng_pptr = 0;var t;if (window !== undefined && (window.crypto !== undefined || window.msCrypto !== undefined)) {
var crypto = window.crypto || window.msCrypto;if (crypto.getRandomValues) {
var ua = new Uint8Array(32);crypto.getRandomValues(ua);for (t = 0; t < 32; ++t) {
rng_pool[rng_pptr++] = ua[t];
}
} else {
if (navigator.appName == "Netscape" && navigator.appVersion < "5") {
var z = window.crypto.random(32);for (t = 0; t < z.length; ++t) {
rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;
}
}
}
}while (rng_pptr < rng_psize) {
t = Math.floor(65536 * Math.random());rng_pool[rng_pptr++] = t >>> 8;rng_pool[rng_pptr++] = t & 255;
}rng_pptr = 0;rng_seed_time();
}function rng_get_byte() {
if (rng_state == null) {
rng_seed_time();rng_state = prng_newstate();rng_state.init(rng_pool);for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
rng_pool[rng_pptr] = 0;
}rng_pptr = 0;
}return rng_state.next();
}function rng_get_bytes(b) {
var a;for (a = 0; a < b.length; ++a) {
b[a] = rng_get_byte();
}
}function SecureRandom() {}SecureRandom.prototype.nextBytes = rng_get_bytes;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function parseBigInt(b, a) {
return new BigInteger(b, a);
}function linebrk(c, d) {
var a = "";var b = 0;while (b + d < c.length) {
a += c.substring(b, b + d) + "\n";b += d;
}return a + c.substring(b, c.length);
}function byte2Hex(a) {
if (a < 16) {
return "0" + a.toString(16);
} else {
return a.toString(16);
}
}function pkcs1pad2(e, h) {
if (h < e.length + 11) {
throw "Message too long for RSA";return null;
}var g = new Array();var d = e.length - 1;while (d >= 0 && h > 0) {
var f = e.charCodeAt(d--);if (f < 128) {
g[--h] = f;
} else {
if (f > 127 && f < 2048) {
g[--h] = f & 63 | 128;g[--h] = f >> 6 | 192;
} else {
g[--h] = f & 63 | 128;g[--h] = f >> 6 & 63 | 128;g[--h] = f >> 12 | 224;
}
}
}g[--h] = 0;var b = new SecureRandom();var a = new Array();while (h > 2) {
a[0] = 0;while (a[0] == 0) {
b.nextBytes(a);
}g[--h] = a[0];
}g[--h] = 2;g[--h] = 0;return new BigInteger(g);
}function oaep_mgf1_arr(c, a, e) {
var b = "",
d = 0;while (b.length < a) {
b += e(String.fromCharCode.apply(String, c.concat([(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255])));d += 1;
}return b;
}function oaep_pad(q, a, f, l) {
var c = KJUR.crypto.MessageDigest;var o = KJUR.crypto.Util;var b = null;if (!f) {
f = "sha1";
}if (typeof f === "string") {
b = c.getCanonicalAlgName(f);l = c.getHashLength(b);f = function f(i) {
return hextorstr(o.hashHex(rstrtohex(i), b));
};
}if (q.length + 2 * l + 2 > a) {
throw "Message too long for RSA";
}var k = "",
e;for (e = 0; e < a - q.length - 2 * l - 2; e += 1) {
k += "\x00";
}var h = f("") + k + "\x01" + q;var g = new Array(l);new SecureRandom().nextBytes(g);var j = oaep_mgf1_arr(g, h.length, f);var p = [];for (e = 0; e < h.length; e += 1) {
p[e] = h.charCodeAt(e) ^ j.charCodeAt(e);
}var m = oaep_mgf1_arr(p, g.length, f);var d = [0];for (e = 0; e < g.length; e += 1) {
d[e + 1] = g[e] ^ m.charCodeAt(e);
}return new BigInteger(d.concat(p));
}function RSAKey() {
this.n = null;this.e = 0;this.d = null;this.p = null;this.q = null;this.dmp1 = null;this.dmq1 = null;this.coeff = null;
}function RSASetPublic(b, a) {
this.isPublic = true;this.isPrivate = false;if (typeof b !== "string") {
this.n = b;this.e = a;
} else {
if (b != null && a != null && b.length > 0 && a.length > 0) {
this.n = parseBigInt(b, 16);this.e = parseInt(a, 16);
} else {
throw "Invalid RSA public key";
}
}
}function RSADoPublic(a) {
return a.modPowInt(this.e, this.n);
}function RSAEncrypt(d) {
var a = pkcs1pad2(d, this.n.bitLength() + 7 >> 3);if (a == null) {
return null;
}var e = this.doPublic(a);if (e == null) {
return null;
}var b = e.toString(16);if ((b.length & 1) == 0) {
return b;
} else {
return "0" + b;
}
}function RSAEncryptOAEP(f, e, b) {
var a = oaep_pad(f, this.n.bitLength() + 7 >> 3, e, b);if (a == null) {
return null;
}var g = this.doPublic(a);if (g == null) {
return null;
}var d = g.toString(16);if ((d.length & 1) == 0) {
return d;
} else {
return "0" + d;
}
}RSAKey.prototype.doPublic = RSADoPublic;RSAKey.prototype.setPublic = RSASetPublic;RSAKey.prototype.encrypt = RSAEncrypt;RSAKey.prototype.encryptOAEP = RSAEncryptOAEP;RSAKey.prototype.type = "RSA";
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function ECFieldElementFp(b, a) {
this.x = a;this.q = b;
}function feFpEquals(a) {
if (a == this) {
return true;
}return this.q.equals(a.q) && this.x.equals(a.x);
}function feFpToBigInteger() {
return this.x;
}function feFpNegate() {
return new ECFieldElementFp(this.q, this.x.negate().mod(this.q));
}function feFpAdd(a) {
return new ECFieldElementFp(this.q, this.x.add(a.toBigInteger()).mod(this.q));
}function feFpSubtract(a) {
return new ECFieldElementFp(this.q, this.x.subtract(a.toBigInteger()).mod(this.q));
}function feFpMultiply(a) {
return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger()).mod(this.q));
}function feFpSquare() {
return new ECFieldElementFp(this.q, this.x.square().mod(this.q));
}function feFpDivide(a) {
return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q));
}ECFieldElementFp.prototype.equals = feFpEquals;ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;ECFieldElementFp.prototype.negate = feFpNegate;ECFieldElementFp.prototype.add = feFpAdd;ECFieldElementFp.prototype.subtract = feFpSubtract;ECFieldElementFp.prototype.multiply = feFpMultiply;ECFieldElementFp.prototype.square = feFpSquare;ECFieldElementFp.prototype.divide = feFpDivide;function ECPointFp(c, a, d, b) {
this.curve = c;this.x = a;this.y = d;if (b == null) {
this.z = BigInteger.ONE;
} else {
this.z = b;
}this.zinv = null;
}function pointFpGetX() {
if (this.zinv == null) {
this.zinv = this.z.modInverse(this.curve.q);
}return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q));
}function pointFpGetY() {
if (this.zinv == null) {
this.zinv = this.z.modInverse(this.curve.q);
}return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q));
}function pointFpEquals(a) {
if (a == this) {
return true;
}if (this.isInfinity()) {
return a.isInfinity();
}if (a.isInfinity()) {
return this.isInfinity();
}var c, b;c = a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);if (!c.equals(BigInteger.ZERO)) {
return false;
}b = a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);return b.equals(BigInteger.ZERO);
}function pointFpIsInfinity() {
if (this.x == null && this.y == null) {
return true;
}return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
}function pointFpNegate() {
return new ECPointFp(this.curve, this.x, this.y.negate(), this.z);
}function pointFpAdd(l) {
if (this.isInfinity()) {
return l;
}if (l.isInfinity()) {
return this;
}var p = l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);var o = l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);if (BigInteger.ZERO.equals(o)) {
if (BigInteger.ZERO.equals(p)) {
return this.twice();
}return this.curve.getInfinity();
}var j = new BigInteger("3");var e = this.x.toBigInteger();var n = this.y.toBigInteger();var c = l.x.toBigInteger();var k = l.y.toBigInteger();var m = o.square();var i = m.multiply(o);var d = e.multiply(m);var g = p.square().multiply(this.z);var a = g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);var h = d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);var f = i.multiply(this.z).multiply(l.z).mod(this.curve.q);return new ECPointFp(this.curve, this.curve.fromBigInteger(a), this.curve.fromBigInteger(h), f);
}function pointFpTwice() {
if (this.isInfinity()) {
return this;
}if (this.y.toBigInteger().signum() == 0) {
return this.curve.getInfinity();
}var g = new BigInteger("3");var c = this.x.toBigInteger();var h = this.y.toBigInteger();var e = h.multiply(this.z);var j = e.multiply(h).mod(this.curve.q);var i = this.curve.a.toBigInteger();var k = c.square().multiply(g);if (!BigInteger.ZERO.equals(i)) {
k = k.add(this.z.square().multiply(i));
}k = k.mod(this.curve.q);var b = k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);var f = k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);var d = e.square().multiply(e).shiftLeft(3).mod(this.curve.q);return new ECPointFp(this.curve, this.curve.fromBigInteger(b), this.curve.fromBigInteger(f), d);
}function pointFpMultiply(b) {
if (this.isInfinity()) {
return this;
}if (b.signum() == 0) {
return this.curve.getInfinity();
}var g = b;var f = g.multiply(new BigInteger("3"));var l = this.negate();var d = this;var c;for (c = f.bitLength() - 2; c > 0; --c) {
d = d.twice();var a = f.testBit(c);var j = g.testBit(c);if (a != j) {
d = d.add(a ? this : l);
}
}return d;
}function pointFpMultiplyTwo(c, a, b) {
var d;if (c.bitLength() > b.bitLength()) {
d = c.bitLength() - 1;
} else {
d = b.bitLength() - 1;
}var f = this.curve.getInfinity();var e = this.add(a);while (d >= 0) {
f = f.twice();if (c.testBit(d)) {
if (b.testBit(d)) {
f = f.add(e);
} else {
f = f.add(this);
}
} else {
if (b.testBit(d)) {
f = f.add(a);
}
}--d;
}return f;
}ECPointFp.prototype.getX = pointFpGetX;ECPointFp.prototype.getY = pointFpGetY;ECPointFp.prototype.equals = pointFpEquals;ECPointFp.prototype.isInfinity = pointFpIsInfinity;ECPointFp.prototype.negate = pointFpNegate;ECPointFp.prototype.add = pointFpAdd;ECPointFp.prototype.twice = pointFpTwice;ECPointFp.prototype.multiply = pointFpMultiply;ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;function ECCurveFp(e, d, c) {
this.q = e;this.a = this.fromBigInteger(d);this.b = this.fromBigInteger(c);this.infinity = new ECPointFp(this, null, null);
}function curveFpGetQ() {
return this.q;
}function curveFpGetA() {
return this.a;
}function curveFpGetB() {
return this.b;
}function curveFpEquals(a) {
if (a == this) {
return true;
}return this.q.equals(a.q) && this.a.equals(a.a) && this.b.equals(a.b);
}function curveFpGetInfinity() {
return this.infinity;
}function curveFpFromBigInteger(a) {
return new ECFieldElementFp(this.q, a);
}function curveFpDecodePointHex(d) {
switch (parseInt(d.substr(0, 2), 16)) {case 0:
return this.infinity;case 2:case 3:
return null;case 4:case 6:case 7:
var a = (d.length - 2) / 2;var c = d.substr(2, a);var b = d.substr(a + 2, a);return new ECPointFp(this, this.fromBigInteger(new BigInteger(c, 16)), this.fromBigInteger(new BigInteger(b, 16)));default:
return null;}
}ECCurveFp.prototype.getQ = curveFpGetQ;ECCurveFp.prototype.getA = curveFpGetA;ECCurveFp.prototype.getB = curveFpGetB;ECCurveFp.prototype.equals = curveFpEquals;ECCurveFp.prototype.getInfinity = curveFpGetInfinity;ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;
/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib
*/
ECFieldElementFp.prototype.getByteLength = function () {
return Math.floor((this.toBigInteger().bitLength() + 7) / 8);
};ECPointFp.prototype.getEncoded = function (c) {
var d = function d(h, f) {
var g = h.toByteArrayUnsigned();if (f < g.length) {
g = g.slice(g.length - f);
} else {
while (f > g.length) {
g.unshift(0);
}
}return g;
};var a = this.getX().toBigInteger();var e = this.getY().toBigInteger();var b = d(a, 32);if (c) {
if (e.isEven()) {
b.unshift(2);
} else {
b.unshift(3);
}
} else {
b.unshift(4);b = b.concat(d(e, 32));
}return b;
};ECPointFp.decodeFrom = function (g, c) {
var f = c[0];var e = c.length - 1;var d = c.slice(1, 1 + e / 2);var b = c.slice(1 + e / 2, 1 + e);d.unshift(0);b.unshift(0);var a = new BigInteger(d);var h = new BigInteger(b);return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h));
};ECPointFp.decodeFromHex = function (g, c) {
var f = c.substr(0, 2);var e = c.length - 2;var d = c.substr(2, e / 2);var b = c.substr(2 + e / 2, e / 2);var a = new BigInteger(d, 16);var h = new BigInteger(b, 16);return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h));
};ECPointFp.prototype.add2D = function (c) {
if (this.isInfinity()) {
return c;
}if (c.isInfinity()) {
return this;
}if (this.x.equals(c.x)) {
if (this.y.equals(c.y)) {
return this.twice();
}return this.curve.getInfinity();
}var g = c.x.subtract(this.x);var e = c.y.subtract(this.y);var a = e.divide(g);var d = a.square().subtract(this.x).subtract(c.x);var f = a.multiply(this.x.subtract(d)).subtract(this.y);return new ECPointFp(this.curve, d, f);
};ECPointFp.prototype.twice2D = function () {
if (this.isInfinity()) {
return this;
}if (this.y.toBigInteger().signum() == 0) {
return this.curve.getInfinity();
}var b = this.curve.fromBigInteger(BigInteger.valueOf(2));var e = this.curve.fromBigInteger(BigInteger.valueOf(3));var a = this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));var c = a.square().subtract(this.x.multiply(b));var d = a.multiply(this.x.subtract(c)).subtract(this.y);return new ECPointFp(this.curve, c, d);
};ECPointFp.prototype.multiply2D = function (b) {
if (this.isInfinity()) {
return this;
}if (b.signum() == 0) {
return this.curve.getInfinity();
}var g = b;var f = g.multiply(new BigInteger("3"));var l = this.negate();var d = this;var c;for (c = f.bitLength() - 2; c > 0; --c) {
d = d.twice();var a = f.testBit(c);var j = g.testBit(c);if (a != j) {
d = d.add2D(a ? this : l);
}
}return d;
};ECPointFp.prototype.isOnCurve = function () {
var d = this.getX().toBigInteger();var i = this.getY().toBigInteger();var f = this.curve.getA().toBigInteger();var c = this.curve.getB().toBigInteger();var h = this.curve.getQ();var e = i.multiply(i).mod(h);var g = d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);return e.equals(g);
};ECPointFp.prototype.toString = function () {
return "(" + this.getX().toBigInteger().toString() + "," + this.getY().toBigInteger().toString() + ")";
};ECPointFp.prototype.validate = function () {
var c = this.curve.getQ();if (this.isInfinity()) {
throw new Error("Point is at infinity.");
}var a = this.getX().toBigInteger();var b = this.getY().toBigInteger();if (a.compareTo(BigInteger.ONE) < 0 || a.compareTo(c.subtract(BigInteger.ONE)) > 0) {
throw new Error("x coordinate out of bounds");
}if (b.compareTo(BigInteger.ONE) < 0 || b.compareTo(c.subtract(BigInteger.ONE)) > 0) {
throw new Error("y coordinate out of bounds");
}if (!this.isOnCurve()) {
throw new Error("Point is not on the curve.");
}if (this.multiply(c).isInfinity()) {
throw new Error("Point is not a scalar multiple of G.");
}return true;
};
/*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval
*/
var jsonParse = function () {
var e = "(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)";var j = '(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';var i = '(?:"' + j + '*")';var d = new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|" + e + "|" + i + ")", "g");var k = new RegExp("\\\\(?:([^u])|u(.{4}))", "g");var g = { '"': '"', "/": "/", "\\": "\\", b: "\b", f: "\f", n: "\n", r: "\r", t: "\t" };function h(l, m, n) {
return m ? g[m] : String.fromCharCode(parseInt(n, 16));
}var c = new String("");var a = "\\";var f = { "{": Object, "[": Array };var b = Object.hasOwnProperty;return function (u, q) {
var p = u.match(d);var x;var v = p[0];var l = false;if ("{" === v) {
x = {};
} else {
if ("[" === v) {
x = [];
} else {
x = [];l = true;
}
}var t;var r = [x];for (var o = 1 - l, m = p.length; o < m; ++o) {
v = p[o];var w;switch (v.charCodeAt(0)) {default:
w = r[0];w[t || w.length] = +v;t = void 0;break;case 34:
v = v.substring(1, v.length - 1);if (v.indexOf(a) !== -1) {
v = v.replace(k, h);
}w = r[0];if (!t) {
if (w instanceof Array) {
t = w.length;
} else {
t = v || c;break;
}
}w[t] = v;t = void 0;break;case 91:
w = r[0];r.unshift(w[t || w.length] = []);t = void 0;break;case 93:
r.shift();break;case 102:
w = r[0];w[t || w.length] = false;t = void 0;break;case 110:
w = r[0];w[t || w.length] = null;t = void 0;break;case 116:
w = r[0];w[t || w.length] = true;t = void 0;break;case 123:
w = r[0];r.unshift(w[t || w.length] = {});t = void 0;break;case 125:
r.shift();break;}
}if (l) {
if (r.length !== 1) {
throw new Error();
}x = x[0];
} else {
if (r.length) {
throw new Error();
}
}if (q) {
var s = function s(C, B) {
var D = C[B];if (D && (typeof D === "undefined" ? "undefined" : _typeof(D)) === "object") {
var n = null;for (var z in D) {
if (b.call(D, z) && D !== C) {
var y = s(D, z);if (y !== void 0) {
D[z] = y;
} else {
if (!n) {
n = [];
}n.push(z);
}
}
}if (n) {
for (var A = n.length; --A >= 0;) {
delete D[n[A]];
}
}
}return q.call(C, B, D);
};x = s({ "": x }, "");
}return x;
};
}();
if (typeof KJUR == "undefined" || !KJUR) {
exports.KJUR = KJUR = {};
}if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
KJUR.asn1 = {};
}KJUR.asn1.ASN1Util = new function () {
this.integerToByteHex = function (a) {
var b = a.toString(16);if (b.length % 2 == 1) {
b = "0" + b;
}return b;
};this.bigIntToMinTwosComplementsHex = function (j) {
var f = j.toString(16);if (f.substr(0, 1) != "-") {
if (f.length % 2 == 1) {
f = "0" + f;
} else {
if (!f.match(/^[0-7]/)) {
f = "00" + f;
}
}
} else {
var a = f.substr(1);var e = a.length;if (e % 2 == 1) {
e += 1;
} else {
if (!f.match(/^[0-7]/)) {
e += 2;
}
}var g = "";for (var d = 0; d < e; d++) {
g += "f";
}var c = new BigInteger(g, 16);var b = c.xor(j).add(BigInteger.ONE);f = b.toString(16).replace(/^-/, "");
}return f;
};this.getPEMStringFromHex = function (a, b) {
return hextopem(a, b);
};this.newObject = function (k) {
var D = KJUR,
n = D.asn1,
z = n.DERBoolean,
e = n.DERInteger,
s = n.DERBitString,
h = n.DEROctetString,
v = n.DERNull,
w = n.DERObjectIdentifier,
l = n.DEREnumerated,
g = n.DERUTF8String,
f = n.DERNumericString,
y = n.DERPrintableString,
u = n.DERTeletexString,
p = n.DERIA5String,
C = n.DERUTCTime,
j = n.DERGeneralizedTime,
m = n.DERSequence,
c = n.DERSet,
r = n.DERTaggedObject,
o = n.ASN1Util.newObject;var t = Object.keys(k);if (t.length != 1) {
throw "key of param shall be only one.";
}var F = t[0];if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + F + ":") == -1) {
throw "undefined key: " + F;
}if (F == "bool") {
return new z(k[F]);
}if (F == "int") {
return new e(k[F]);
}if (F == "bitstr") {
return new s(k[F]);
}if (F == "octstr") {
return new h(k[F]);
}if (F == "null") {
return new v(k[F]);
}if (F == "oid") {
return new w(k[F]);
}if (F == "enum") {
return new l(k[F]);
}if (F == "utf8str") {
return new g(k[F]);
}if (F == "numstr") {
return new f(k[F]);
}if (F == "prnstr") {
return new y(k[F]);
}if (F == "telstr") {
return new u(k[F]);
}if (F == "ia5str") {
return new p(k[F]);
}if (F == "utctime") {
return new C(k[F]);
}if (F == "gentime") {
return new j(k[F]);
}if (F == "seq") {
var d = k[F];var E = [];for (var x = 0; x < d.length; x++) {
var B = o(d[x]);E.push(B);
}return new m({ array: E });
}if (F == "set") {
var d = k[F];var E = [];for (var x = 0; x < d.length; x++) {
var B = o(d[x]);E.push(B);
}return new c({ array: E });
}if (F == "tag") {
var A = k[F];if (Object.prototype.toString.call(A) === "[object Array]" && A.length == 3) {
var q = o(A[2]);return new r({ tag: A[0], explicit: A[1], obj: q });
} else {
var b = {};if (A.explicit !== undefined) {
b.explicit = A.explicit;
}if (A.tag !== undefined) {
b.tag = A.tag;
}if (A.obj === undefined) {
throw "obj shall be specified for 'tag'.";
}b.obj = o(A.obj);return new r(b);
}
}
};this.jsonToASN1HEX = function (b) {
var a = this.newObject(b);return a.getEncodedHex();
};
}();KJUR.asn1.ASN1Util.oidHexToInt = function (a) {
var j = "";var k = parseInt(a.substr(0, 2), 16);var d = Math.floor(k / 40);var c = k % 40;var j = d + "." + c;var e = "";for (var f = 2; f < a.length; f += 2) {
var g = parseInt(a.substr(f, 2), 16);var h = ("00000000" + g.toString(2)).slice(-8);e = e + h.substr(1, 7);if (h.substr(0, 1) == "0") {
var b = new BigInteger(e, 2);j = j + "." + b.toString(10);e = "";
}
}return j;
};KJUR.asn1.ASN1Util.oidIntToHex = function (f) {
var e = function e(a) {
var k = a.toString(16);if (k.length == 1) {
k = "0" + k;
}return k;
};var d = function d(o) {
var n = "";var k = new BigInteger(o, 10);var a = k.toString(2);var l = 7 - a.length % 7;if (l == 7) {
l = 0;
}var q = "";for (var m = 0; m < l; m++) {
q += "0";
}a = q + a;for (var m = 0; m < a.length - 1; m += 7) {
var p = a.substr(m, 7);if (m != a.length - 7) {
p = "1" + p;
}n += e(parseInt(p, 2));
}return n;
};if (!f.match(/^[0-9.]+$/)) {
throw "malformed oid string: " + f;
}var g = "";var b = f.split(".");var j = parseInt(b[0]) * 40 + parseInt(b[1]);g += e(j);b.splice(0, 2);for (var c = 0; c < b.length; c++) {
g += d(b[c]);
}return g;
};KJUR.asn1.ASN1Object = function () {
var c = true;var b = null;var d = "00";var e = "00";var a = "";this.getLengthHexFromValue = function () {
if (typeof this.hV == "undefined" || this.hV == null) {
throw "this.hV is null or undefined.";
}if (this.hV.length % 2 == 1) {
throw "value hex must be even length: n=" + a.length + ",v=" + this.hV;
}var i = this.hV.length / 2;var h = i.toString(16);if (h.length % 2 == 1) {
h = "0" + h;
}if (i < 128) {
return h;
} else {
var g = h.length / 2;if (g > 15) {
throw "ASN.1 length too long to represent by 8x: n = " + i.toString(16);
}var f = 128 + g;return f.toString(16) + h;
}
};this.getEncodedHex = function () {
if (this.hTLV == null || this.isModified) {
this.hV = this.getFreshValueHex();this.hL = this.getLengthHexFromValue();this.hTLV = this.hT + this.hL + this.hV;this.isModified = false;
}return this.hTLV;
};this.getValueHex = function () {
this.getEncodedHex();return this.hV;
};this.getFreshValueHex = function () {
return "";
};
};KJUR.asn1.DERAbstractString = function (c) {
KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var b = null;var a = null;this.getString = function () {
return this.s;
};this.setString = function (d) {
this.hTLV = null;this.isModified = true;this.s = d;this.hV = utf8tohex(this.s).toLowerCase();
};this.setStringHex = function (d) {
this.hTLV = null;this.isModified = true;this.s = null;this.hV = d;
};this.getFreshValueHex = function () {
return this.hV;
};if (typeof c != "undefined") {
if (typeof c == "string") {
this.setString(c);
} else {
if (typeof c.str != "undefined") {
this.setString(c.str);
} else {
if (typeof c.hex != "undefined") {
this.setStringHex(c.hex);
}
}
}
}
};YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractTime = function (c) {
KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);var b = null;var a = null;this.localDateToUTC = function (f) {
utc = f.getTime() + f.getTimezoneOffset() * 60000;var e = new Date(utc);return e;
};this.formatDate = function (m, o, e) {
var g = this.zeroPadding;var n = this.localDateToUTC(m);var p = String(n.getFullYear());if (o == "utc") {
p = p.substr(2, 2);
}var l = g(String(n.getMonth() + 1), 2);var q = g(String(n.getDate()), 2);var h = g(String(n.getHours()), 2);var i = g(String(n.getMinutes()), 2);var j = g(String(n.getSeconds()), 2);var r = p + l + q + h + i + j;if (e === true) {
var f = n.getMilliseconds();if (f != 0) {
var k = g(String(f), 3);k = k.replace(/[0]+$/, "");r = r + "." + k;
}
}return r + "Z";
};this.zeroPadding = function (e, d) {
if (e.length >= d) {
return e;
}return new Array(d - e.length + 1).join("0") + e;
};this.getString = function () {
return this.s;
};this.setString = function (d) {
this.hTLV = null;this.isModified = true;this.s = d;this.hV = stohex(d);
};this.setByDateValue = function (h, j, e, d, f, g) {
var i = new Date(Date.UTC(h, j - 1, e, d, f, g, 0));this.setByDate(i);
};this.getFreshValueHex = function () {
return this.hV;
};
};YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractStructured = function (b) {
KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var a = null;this.setByASN1ObjectArray = function (c) {
this.hTLV = null;this.isModified = true;this.asn1Array = c;
};this.appendASN1Object = function (c) {
this.hTLV = null;this.isModified = true;this.asn1Array.push(c);
};this.asn1Array = new Array();if (typeof b != "undefined") {
if (typeof b.array != "undefined") {
this.asn1Array = b.array;
}
}
};YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);KJUR.asn1.DERBoolean = function () {
KJUR.asn1.DERBoolean.superclass.constructor.call(this);this.hT = "01";this.hTLV = "0101ff";
};YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);KJUR.asn1.DERInteger = function (a) {
KJUR.asn1.DERInteger.superclass.constructor.call(this);this.hT = "02";this.setByBigInteger = function (b) {
this.hTLV = null;this.isModified = true;this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b);
};this.setByInteger = function (c) {
var b = new BigInteger(String(c), 10);this.setByBigInteger(b);
};this.setValueHex = function (b) {
this.hV = b;
};this.getFreshValueHex = function () {
return this.hV;
};if (typeof a != "undefined") {
if (typeof a.bigint != "undefined") {
this.setByBigInteger(a.bigint);
} else {
if (typeof a["int"] != "undefined") {
this.setByInteger(a["int"]);
} else {
if (typeof a == "number") {
this.setByInteger(a);
} else {
if (typeof a.hex != "undefined") {
this.setValueHex(a.hex);
}
}
}
}
}
};YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);KJUR.asn1.DERBitString = function (b) {
if (b !== undefined && typeof b.obj !== "undefined") {
var a = KJUR.asn1.ASN1Util.newObject(b.obj);b.hex = "00" + a.getEncodedHex();
}KJUR.asn1.DERBitString.superclass.constructor.call(this);this.hT = "03";this.setHexValueIncludingUnusedBits = function (c) {
this.hTLV = null;this.isModified = true;this.hV = c;
};this.setUnusedBitsAndHexValue = function (c, e) {
if (c < 0 || 7 < c) {
throw "unused bits shall be from 0 to 7: u = " + c;
}var d = "0" + c;this.hTLV = null;this.isModified = true;this.hV = d + e;
};this.setByBinaryString = function (e) {
e = e.replace(/0+$/, "");var f = 8 - e.length % 8;if (f == 8) {
f = 0;
}for (var g = 0; g <= f; g++) {
e += "0";
}var j = "";for (var g = 0; g < e.length - 1; g += 8) {
var d = e.substr(g, 8);var c = parseInt(d, 2).toString(16);if (c.length == 1) {
c = "0" + c;
}j += c;
}this.hTLV = null;this.isModified = true;this.hV = "0" + f + j;
};this.setByBooleanArray = function (e) {
var d = "";for (var c = 0; c < e.length; c++) {
if (e[c] == true) {
d += "1";
} else {
d += "0";
}
}this.setByBinaryString(d);
};this.newFalseArray = function (e) {
var c = new Array(e);for (var d = 0; d < e; d++) {
c[d] = false;
}return c;
};this.getFreshValueHex = function () {
return this.hV;
};if (typeof b != "undefined") {
if (typeof b == "string" && b.toLowerCase().match(/^[0-9a-f]+$/)) {
this.setHexValueIncludingUnusedBits(b);
} else {
if (typeof b.hex != "undefined") {
this.setHexValueIncludingUnusedBits(b.hex);
} else {
if (typeof b.bin != "undefined") {
this.setByBinaryString(b.bin);
} else {
if (typeof b.array != "undefined") {
this.setByBooleanArray(b.array);
}
}
}
}
}
};YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);KJUR.asn1.DEROctetString = function (b) {
if (b !== undefined && typeof b.obj !== "undefined") {
var a = KJUR.asn1.ASN1Util.newObject(b.obj);b.hex = a.getEncodedHex();
}KJUR.asn1.DEROctetString.superclass.constructor.call(this, b);this.hT = "04";
};YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERNull = function () {
KJUR.asn1.DERNull.superclass.constructor.call(this);this.hT = "05";this.hTLV = "0500";
};YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);KJUR.asn1.DERObjectIdentifier = function (c) {
var b = function b(d) {
var e = d.toString(16);if (e.length == 1) {
e = "0" + e;
}return e;
};var a = function a(k) {
var j = "";var e = new BigInteger(k, 10);var d = e.toString(2);var f = 7 - d.length % 7;if (f == 7) {
f = 0;
}var m = "";for (var g = 0; g < f; g++) {
m += "0";
}d = m + d;for (var g = 0; g < d.length - 1; g += 7) {
var l = d.substr(g, 7);if (g != d.length - 7) {
l = "1" + l;
}j += b(parseInt(l, 2));
}return j;
};KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);this.hT = "06";this.setValueHex = function (d) {
this.hTLV = null;this.isModified = true;this.s = null;this.hV = d;
};this.setValueOidString = function (f) {
if (!f.match(/^[0-9.]+$/)) {
throw "malformed oid string: " + f;
}var g = "";var d = f.split(".");var j = parseInt(d[0]) * 40 + parseInt(d[1]);g += b(j);d.splice(0, 2);for (var e = 0; e < d.length; e++) {
g += a(d[e]);
}this.hTLV = null;this.isModified = true;this.s = null;this.hV = g;
};this.setValueName = function (e) {
var d = KJUR.asn1.x509.OID.name2oid(e);if (d !== "") {
this.setValueOidString(d);
} else {
throw "DERObjectIdentifier oidName undefined: " + e;
}
};this.getFreshValueHex = function () {
return this.hV;
};if (c !== undefined) {
if (typeof c === "string") {
if (c.match(/^[0-2].[0-9.]+$/)) {
this.setValueOidString(c);
} else {
this.setValueName(c);
}
} else {
if (c.oid !== undefined) {
this.setValueOidString(c.oid);
} else {
if (c.hex !== undefined) {
this.setValueHex(c.hex);
} else {
if (c.name !== undefined) {
this.setValueName(c.name);
}
}
}
}
}
};YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);KJUR.asn1.DEREnumerated = function (a) {
KJUR.asn1.DEREnumerated.superclass.constructor.call(this);this.hT = "0a";this.setByBigInteger = function (b) {
this.hTLV = null;this.isModified = true;this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b);
};this.setByInteger = function (c) {
var b = new BigInteger(String(c), 10);this.setByBigInteger(b);
};this.setValueHex = function (b) {
this.hV = b;
};this.getFreshValueHex = function () {
return this.hV;
};if (typeof a != "undefined") {
if (typeof a["int"] != "undefined") {
this.setByInteger(a["int"]);
} else {
if (typeof a == "number") {
this.setByInteger(a);
} else {
if (typeof a.hex != "undefined") {
this.setValueHex(a.hex);
}
}
}
}
};YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);KJUR.asn1.DERUTF8String = function (a) {
KJUR.asn1.DERUTF8String.superclass.constructor.call(this, a);this.hT = "0c";
};YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);KJUR.asn1.DERNumericString = function (a) {
KJUR.asn1.DERNumericString.superclass.constructor.call(this, a);this.hT = "12";
};YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERPrintableString = function (a) {
KJUR.asn1.DERPrintableString.superclass.constructor.call(this, a);this.hT = "13";
};YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERTeletexString = function (a) {
KJUR.asn1.DERTeletexString.superclass.constructor.call(this, a);this.hT = "14";
};YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);KJUR.asn1.DERIA5String = function (a) {
KJUR.asn1.DERIA5String.superclass.constructor.call(this, a);this.hT = "16";
};YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);KJUR.asn1.DERUTCTime = function (a) {
KJUR.asn1.DERUTCTime.superclass.constructor.call(this, a);this.hT = "17";this.setByDate = function (b) {
this.hTLV = null;this.isModified = true;this.date = b;this.s = this.formatDate(this.date, "utc");this.hV = stohex(this.s);
};this.getFreshValueHex = function () {
if (typeof this.date == "undefined" && typeof this.s == "undefined") {
this.date = new Date();this.s = this.formatDate(this.date, "utc");this.hV = stohex(this.s);
}return this.hV;
};if (a !== undefined) {
if (a.str !== undefined) {
this.setString(a.str);
} else {
if (typeof a == "string" && a.match(/^[0-9]{12}Z$/)) {
this.setString(a);
} else {
if (a.hex !== undefined) {
this.setStringHex(a.hex);
} else {
if (a.date !== undefined) {
this.setByDate(a.date);
}
}
}
}
}
};YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);KJUR.asn1.DERGeneralizedTime = function (a) {
KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, a);this.hT = "18";this.withMillis = false;this.setByDate = function (b) {
this.hTLV = null;this.isModified = true;this.date = b;this.s = this.formatDate(this.date, "gen", this.withMillis);this.hV = stohex(this.s);
};this.getFreshValueHex = function () {
if (this.date === undefined && this.s === undefined) {
this.date = new Date();this.s = this.formatDate(this.date, "gen", this.withMillis);this.hV = stohex(this.s);
}return this.hV;
};if (a !== undefined) {
if (a.str !== undefined) {
this.setString(a.str);
} else {
if (typeof a == "string" && a.match(/^[0-9]{14}Z$/)) {
this.setString(a);
} else {
if (a.hex !== undefined) {
this.setStringHex(a.hex);
} else {
if (a.date !== undefined) {
this.setByDate(a.date);
}
}
}
}if (a.millis === true) {
this.withMillis = true;
}
}
};YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);KJUR.asn1.DERSequence = function (a) {
KJUR.asn1.DERSequence.superclass.constructor.call(this, a);this.hT = "30";this.getFreshValueHex = function () {
var c = "";for (var b = 0; b < this.asn1Array.length; b++) {
var d = this.asn1Array[b];c += d.getEncodedHex();
}this.hV = c;return this.hV;
};
};YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);KJUR.asn1.DERSet = function (a) {
KJUR.asn1.DERSet.superclass.constructor.call(this, a);this.hT = "31";this.sortFlag = true;this.getFreshValueHex = function () {
var b = new Array();for (var c = 0; c < this.asn1Array.length; c++) {
var d = this.asn1Array[c];b.push(d.getEncodedHex());
}if (this.sortFlag == true) {
b.sort();
}this.hV = b.join("");return this.hV;
};if (typeof a != "undefined") {
if (typeof a.sortflag != "undefined" && a.sortflag == false) {
this.sortFlag = false;
}
}
};YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);KJUR.asn1.DERTaggedObject = function (a) {
KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);this.hT = "a0";this.hV = "";this.isExplicit = true;this.asn1Object = null;this.setASN1Object = function (b, c, d) {
this.hT = c;this.isExplicit = b;this.asn1Object = d;if (this.isExplicit) {
this.hV = this.asn1Object.getEncodedHex();this.hTLV = null;this.isModified = true;
} else {
this.hV = null;this.hTLV = d.getEncodedHex();this.hTLV = this.hTLV.replace(/^../, c);this.isModified = false;
}
};this.getFreshValueHex = function () {
return this.hV;
};if (typeof a != "undefined") {
if (typeof a.tag != "undefined") {
this.hT = a.tag;
}if (typeof a.explicit != "undefined") {
this.isExplicit = a.explicit;
}if (typeof a.obj != "undefined") {
this.asn1Object = a.obj;this.setASN1Object(this.isExplicit, this.hT, this.asn1Object);
}
}
};YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
var ASN1HEX = new function () {}();ASN1HEX.getLblen = function (c, a) {
if (c.substr(a + 2, 1) != "8") {
return 1;
}var b = parseInt(c.substr(a + 3, 1));if (b == 0) {
return -1;
}if (0 < b && b < 10) {
return b + 1;
}return -2;
};ASN1HEX.getL = function (c, b) {
var a = ASN1HEX.getLblen(c, b);if (a < 1) {
return "";
}return c.substr(b + 2, a * 2);
};ASN1HEX.getVblen = function (d, a) {
var c, b;c = ASN1HEX.getL(d, a);if (c == "") {
return -1;
}if (c.substr(0, 1) === "8") {
b = new BigInteger(c.substr(2), 16);
} else {
b = new BigInteger(c, 16);
}return b.intValue();
};ASN1HEX.getVidx = function (c, b) {
var a = ASN1HEX.getLblen(c, b);if (a < 0) {
return a;
}return b + (a + 1) * 2;
};ASN1HEX.getV = function (d, a) {
var c = ASN1HEX.getVidx(d, a);var b = ASN1HEX.getVblen(d, a);return d.substr(c, b * 2);
};ASN1HEX.getTLV = function (b, a) {
return b.substr(a, 2) + ASN1HEX.getL(b, a) + ASN1HEX.getV(b, a);
};ASN1HEX.getNextSiblingIdx = function (d, a) {
var c = ASN1HEX.getVidx(d, a);var b = ASN1HEX.getVblen(d, a);return c + b * 2;
};ASN1HEX.getChildIdx = function (e, f) {
var j = ASN1HEX;var g = new Array();var i = j.getVidx(e, f);if (e.substr(f, 2) == "03") {
g.push(i + 2);
} else {
g.push(i);
}var l = j.getVblen(e, f);var c = i;var d = 0;while (1) {
var b = j.getNextSiblingIdx(e, c);if (b == null || b - i >= l * 2) {
break;
}if (d >= 200) {
break;
}g.push(b);c = b;d++;
}return g;
};ASN1HEX.getNthChildIdx = function (d, b, e) {
var c = ASN1HEX.getChildIdx(d, b);return c[e];
};ASN1HEX.getIdxbyList = function (e, d, c, i) {
var g = ASN1HEX;var f, b;if (c.length == 0) {
if (i !== undefined) {
if (e.substr(d, 2) !== i) {
throw "checking tag doesn't match: " + e.substr(d, 2) + "!=" + i;
}
}return d;
}f = c.shift();b = g.getChildIdx(e, d);return g.getIdxbyList(e, b[f], c, i);
};ASN1HEX.getTLVbyList = function (d, c, b, f) {
var e = ASN1HEX;var a = e.getIdxbyList(d, c, b);if (a === undefined) {
throw "can't find nthList object";
}if (f !== undefined) {
if (d.substr(a, 2) != f) {
throw "checking tag doesn't match: " + d.substr(a, 2) + "!=" + f;
}
}return e.getTLV(d, a);
};ASN1HEX.getVbyList = function (e, c, b, g, i) {
var f = ASN1HEX;var a, d;a = f.getIdxbyList(e, c, b, g);if (a === undefined) {
throw "can't find nthList object";
}d = f.getV(e, a);if (i === true) {
d = d.substr(2);
}return d;
};ASN1HEX.hextooidstr = function (e) {
var h = function h(b, a) {
if (b.length >= a) {
return b;
}return new Array(a - b.length + 1).join("0") + b;
};var l = [];var o = e.substr(0, 2);var f = parseInt(o, 16);l[0] = new String(Math.floor(f / 40));l[1] = new String(f % 40);var m = e.substr(2);var k = [];for (var g = 0; g < m.length / 2; g++) {
k.push(parseInt(m.substr(g * 2, 2), 16));
}var j = [];var d = "";for (var g = 0; g < k.length; g++) {
if (k[g] & 128) {
d = d + h((k[g] & 127).toString(2), 7);
} else {
d = d + h((k[g] & 127).toString(2), 7);j.push(new String(parseInt(d, 2)));d = "";
}
}var n = l.join(".");if (j.length > 0) {
n = n + "." + j.join(".");
}return n;
};ASN1HEX.dump = function (t, c, l, g) {
var p = ASN1HEX;var j = p.getV;var y = p.dump;var w = p.getChildIdx;var e = t;if (t instanceof KJUR.asn1.ASN1Object) {
e = t.getEncodedHex();
}var q = function q(A, i) {
if (A.length <= i * 2) {
return A;
} else {
var v = A.substr(0, i) + "..(total " + A.length / 2 + "bytes).." + A.substr(A.length - i, i);return v;
}
};if (c === undefined) {
c = { ommit_long_octet: 32 };
}if (l === undefined) {
l = 0;
}if (g === undefined) {
g = "";
}var x = c.ommit_long_octet;if (e.substr(l, 2) == "01") {
var h = j(e, l);if (h == "00") {
return g + "BOOLEAN FALSE\n";
} else {
return g + "BOOLEAN TRUE\n";
}
}if (e.substr(l, 2) == "02") {
var h = j(e, l);return g + "INTEGER " + q(h, x) + "\n";
}if (e.substr(l, 2) == "03") {
var h = j(e, l);return g + "BITSTRING " + q(h, x) + "\n";
}if (e.substr(l, 2) == "04") {
var h = j(e, l);if (p.isASN1HEX(h)) {
var k = g + "OCTETSTRING, encapsulates\n";k = k + y(h, c, 0, g + " ");return k;
} else {
return g + "OCTETSTRING " + q(h, x) + "\n";
}
}if (e.substr(l, 2) == "05") {
return g + "NULL\n";
}if (e.substr(l, 2) == "06") {
var m = j(e, l);var a = KJUR.asn1.ASN1Util.oidHexToInt(m);var o = KJUR.asn1.x509.OID.oid2name(a);var b = a.replace(/\./g, " ");if (o != "") {
return g + "ObjectIdentifier " + o + " (" + b + ")\n";
} else {
return g + "ObjectIdentifier (" + b + ")\n";
}
}if (e.substr(l, 2) == "0c") {
return g + "UTF8String '" + hextoutf8(j(e, l)) + "'\n";
}if (e.substr(l, 2) == "13") {
return g + "PrintableString '" + hextoutf8(j(e, l)) + "'\n";
}if (e.substr(l, 2) == "14") {
return g + "TeletexString '" + hextoutf8(j(e, l)) + "'\n";
}if (e.substr(l, 2) == "16") {
return g + "IA5String '" + hextoutf8(j(e, l)) + "'\n";
}if (e.substr(l, 2) == "17") {
return g + "UTCTime " + hextoutf8(j(e, l)) + "\n";
}if (e.substr(l, 2) == "18") {
return g + "GeneralizedTime " + hextoutf8(j(e, l)) + "\n";
}if (e.substr(l, 2) == "30") {
if (e.substr(l, 4) == "3000") {
return g + "SEQUENCE {}\n";
}var k = g + "SEQUENCE\n";var d = w(e, l);var f = c;if ((d.length == 2 || d.length == 3) && e.substr(d[0], 2) == "06" && e.substr(d[d.length - 1], 2) == "04") {
var o = p.oidname(j(e, d[0]));var r = JSON.parse(JSON.stringify(c));r.x509ExtName = o;f = r;
}for (var u = 0; u < d.length; u++) {
k = k + y(e, f, d[u], g + " ");
}return k;
}if (e.substr(l, 2) == "31") {
var k = g + "SET\n";var d = w(e, l);for (var u = 0; u < d.length; u++) {
k = k + y(e, c, d[u], g + " ");
}return k;
}var z = parseInt(e.substr(l, 2), 16);if ((z & 128) != 0) {
var n = z & 31;if ((z & 32) != 0) {
var k = g + "[" + n + "]\n";var d = w(e, l);for (var u = 0; u < d.length; u++) {
k = k + y(e, c, d[u], g + " ");
}return k;
} else {
var h = j(e, l);if (h.substr(0, 8) == "68747470") {
h = hextoutf8(h);
}if (c.x509ExtName === "subjectAltName" && n == 2) {
h = hextoutf8(h);
}var k = g + "[" + n + "] " + h + "\n";return k;
}
}return g + "UNKNOWN(" + e.substr(l, 2) + ") " + j(e, l) + "\n";
};ASN1HEX.isASN1HEX = function (e) {
var d = ASN1HEX;if (e.length % 2 == 1) {
return false;
}var c = d.getVblen(e, 0);var b = e.substr(0, 2);var f = d.getL(e, 0);var a = e.length - b.length - f.length;if (a == c * 2) {
return true;
}return false;
};ASN1HEX.oidname = function (a) {
var c = KJUR.asn1;if (KJUR.lang.String.isHex(a)) {
a = c.ASN1Util.oidHexToInt(a);
}var b = c.x509.OID.oid2name(a);if (b === "") {
b = a;
}return b;
};
var KJUR;if (typeof KJUR == "undefined" || !KJUR) {
exports.KJUR = KJUR = {};
}if (typeof KJUR.lang == "undefined" || !KJUR.lang) {
KJUR.lang = {};
}KJUR.lang.String = function () {};function Base64x() {}function stoBA(d) {
var b = new Array();for (var c = 0; c < d.length; c++) {
b[c] = d.charCodeAt(c);
}return b;
}function BAtos(b) {
var d = "";for (var c = 0; c < b.length; c++) {
d = d + String.fromCharCode(b[c]);
}return d;
}function BAtohex(b) {
var e = "";for (var d = 0; d < b.length; d++) {
var c = b[d].toString(16);if (c.length == 1) {
c = "0" + c;
}e = e + c;
}return e;
}function stohex(a) {
return BAtohex(stoBA(a));
}function stob64(a) {
return hex2b64(stohex(a));
}function stob64u(a) {
return b64tob64u(hex2b64(stohex(a)));
}function b64utos(a) {
return BAtos(b64toBA(b64utob64(a)));
}function b64tob64u(a) {
a = a.replace(/\=/g, "");a = a.replace(/\+/g, "-");a = a.replace(/\//g, "_");return a;
}function b64utob64(a) {
if (a.length % 4 == 2) {
a = a + "==";
} else {
if (a.length % 4 == 3) {
a = a + "=";
}
}a = a.replace(/-/g, "+");a = a.replace(/_/g, "/");return a;
}function hextob64u(a) {
if (a.length % 2 == 1) {
a = "0" + a;
}return b64tob64u(hex2b64(a));
}function b64utohex(a) {
return b64tohex(b64utob64(a));
}var utf8tob64u, b64utoutf8;if (typeof Buffer === "function") {
exports.utf8tob64u = utf8tob64u = function utf8tob64u(a) {
return b64tob64u(new Buffer(a, "utf8").toString("base64"));
};exports.b64utoutf8 = b64utoutf8 = function b64utoutf8(a) {
return new Buffer(b64utob64(a), "base64").toString("utf8");
};
} else {
exports.utf8tob64u = utf8tob64u = function utf8tob64u(a) {
return hextob64u(uricmptohex(encodeURIComponentAll(a)));
};exports.b64utoutf8 = b64utoutf8 = function b64utoutf8(a) {
return decodeURIComponent(hextouricmp(b64utohex(a)));
};
}function utf8tob64(a) {
return hex2b64(uricmptohex(encodeURIComponentAll(a)));
}function b64toutf8(a) {
return decodeURIComponent(hextouricmp(b64tohex(a)));
}function utf8tohex(a) {
return uricmptohex(encodeURIComponentAll(a));
}function hextoutf8(a) {
return decodeURIComponent(hextouricmp(a));
}function hextorstr(c) {
var b = "";for (var a = 0; a < c.length - 1; a += 2) {
b += String.fromCharCode(parseInt(c.substr(a, 2), 16));
}return b;
}function rstrtohex(c) {
var a = "";for (var b = 0; b < c.length; b++) {
a += ("0" + c.charCodeAt(b).toString(16)).slice(-2);
}return a;
}function hextob64(a) {
return hex2b64(a);
}function hextob64nl(b) {
var a = hextob64(b);var c = a.replace(/(.{64})/g, "$1\r\n");c = c.replace(/\r\n$/, "");return c;
}function b64nltohex(b) {
var a = b.replace(/[^0-9A-Za-z\/+=]*/g, "");var c = b64tohex(a);return c;
}function hextopem(a, b) {
var c = hextob64nl(a);return "-----BEGIN " + b + "-----\r\n" + c + "\r\n-----END " + b + "-----\r\n";
}function pemtohex(a, b) {
if (a.indexOf("-----BEGIN ") == -1) {
throw "can't find PEM header: " + b;
}if (b !== undefined) {
a = a.replace("-----BEGIN " + b + "-----", "");a = a.replace("-----END " + b + "-----", "");
} else {
a = a.replace(/-----BEGIN [^-]+-----/, "");a = a.replace(/-----END [^-]+-----/, "");
}return b64nltohex(a);
}function hextoArrayBuffer(d) {
if (d.length % 2 != 0) {
throw "input is not even length";
}if (d.match(/^[0-9A-Fa-f]+$/) == null) {
throw "input is not hexadecimal";
}var b = new ArrayBuffer(d.length / 2);var a = new DataView(b);for (var c = 0; c < d.length / 2; c++) {
a.setUint8(c, parseInt(d.substr(c * 2, 2), 16));
}return b;
}function ArrayBuffertohex(b) {
var d = "";var a = new DataView(b);for (var c = 0; c < b.byteLength; c++) {
d += ("00" + a.getUint8(c).toString(16)).slice(-2);
}return d;
}function zulutomsec(n) {
var l, j, m, e, f, i, b, k;var a, h, g, c;c = n.match(/^(\d{2}|\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(|\.\d+)Z$/);if (c) {
a = c[1];l = parseInt(a);if (a.length === 2) {
if (50 <= l && l < 100) {
l = 1900 + l;
} else {
if (0 <= l && l < 50) {
l = 2000 + l;
}
}
}j = parseInt(c[2]) - 1;m = parseInt(c[3]);e = parseInt(c[4]);f = parseInt(c[5]);i = parseInt(c[6]);b = 0;h = c[7];if (h !== "") {
g = (h.substr(1) + "00").substr(0, 3);b = parseInt(g);
}return Date.UTC(l, j, m, e, f, i, b);
}throw "unsupported zulu format: " + n;
}function zulutosec(a) {
var b = zulutomsec(a);return ~~(b / 1000);
}function zulutodate(a) {
return new Date(zulutomsec(a));
}function datetozulu(g, e, f) {
var b;var a = g.getUTCFullYear();if (e) {
if (a < 1950 || 2049 < a) {
throw "not proper year for UTCTime: " + a;
}b = ("" + a).slice(-2);
} else {
b = ("000" + a).slice(-4);
}b += ("0" + (g.getUTCMonth() + 1)).slice(-2);b += ("0" + g.getUTCDate()).slice(-2);b += ("0" + g.getUTCHours()).slice(-2);b += ("0" + g.getUTCMinutes()).slice(-2);b += ("0" + g.getUTCSeconds()).slice(-2);if (f) {
var c = g.getUTCMilliseconds();if (c !== 0) {
c = ("00" + c).slice(-3);c = c.replace(/0+$/g, "");b += "." + c;
}
}b += "Z";return b;
}function uricmptohex(a) {
return a.replace(/%/g, "");
}function hextouricmp(a) {
return a.replace(/(..)/g, "%$1");
}function ipv6tohex(g) {
var b = "malformed IPv6 address";if (!g.match(/^[0-9A-Fa-f:]+$/)) {
throw b;
}g = g.toLowerCase();var d = g.split(":").length - 1;if (d < 2) {
throw b;
}var e = ":".repeat(7 - d + 2);g = g.replace("::", e);var c = g.split(":");if (c.length != 8) {
throw b;
}for (var f = 0; f < 8; f++) {
c[f] = ("0000" + c[f]).slice(-4);
}return c.join("");
}function hextoipv6(e) {
if (!e.match(/^[0-9A-Fa-f]{32}$/)) {
throw "malformed IPv6 address octet";
}e = e.toLowerCase();var b = e.match(/.{1,4}/g);for (var d = 0; d < 8; d++) {
b[d] = b[d].replace(/^0+/, "");if (b[d] == "") {
b[d] = "0";
}
}e = ":" + b.join(":") + ":";var c = e.match(/:(0:){2,}/g);if (c === null) {
return e.slice(1, -1);
}var f = "";for (var d = 0; d < c.length; d++) {
if (c[d].length > f.length) {
f = c[d];
}
}e = e.replace(f, "::");return e.slice(1, -1);
}function hextoip(b) {
var d = "malformed hex value";if (!b.match(/^([0-9A-Fa-f][0-9A-Fa-f]){1,}$/)) {
throw d;
}if (b.length == 8) {
var c;try {
c = parseInt(b.substr(0, 2), 16) + "." + parseInt(b.substr(2, 2), 16) + "." + parseInt(b.substr(4, 2), 16) + "." + parseInt(b.substr(6, 2), 16);return c;
} catch (a) {
throw d;
}
} else {
if (b.length == 32) {
return hextoipv6(b);
} else {
return b;
}
}
}function iptohex(f) {
var j = "malformed IP address";f = f.toLowerCase(f);if (f.match(/^[0-9.]+$/)) {
var b = f.split(".");if (b.length !== 4) {
throw j;
}var g = "";try {
for (var e = 0; e < 4; e++) {
var h = parseInt(b[e]);g += ("0" + h.toString(16)).slice(-2);
}return g;
} catch (c) {
throw j;
}
} else {
if (f.match(/^[0-9a-f:]+$/) && f.indexOf(":") !== -1) {
return ipv6tohex(f);
} else {
throw j;
}
}
}function encodeURIComponentAll(a) {
var d = encodeURIComponent(a);var b = "";for (var c = 0; c < d.length; c++) {
if (d[c] == "%") {
b = b + d.substr(c, 3);c = c + 2;
} else {
b = b + "%" + stohex(d[c]);
}
}return b;
}function newline_toUnix(a) {
a = a.replace(/\r\n/mg, "\n");return a;
}function newline_toDos(a) {
a = a.replace(/\r\n/mg, "\n");a = a.replace(/\n/mg, "\r\n");return a;
}KJUR.lang.String.isInteger = function (a) {
if (a.match(/^[0-9]+$/)) {
return true;
} else {
if (a.match(/^-[0-9]+$/)) {
return true;
} else {
return false;
}
}
};KJUR.lang.String.isHex = function (a) {
if (a.length % 2 == 0 && (a.match(/^[0-9a-f]+$/) || a.match(/^[0-9A-F]+$/))) {
return true;
} else {
return false;
}
};KJUR.lang.String.isBase64 = function (a) {
a = a.replace(/\s+/g, "");if (a.match(/^[0-9A-Za-z+\/]+={0,3}$/) && a.length % 4 == 0) {
return true;
} else {
return false;
}
};KJUR.lang.String.isBase64URL = function (a) {
if (a.match(/[+/=]/)) {
return false;
}a = b64utob64(a);return KJUR.lang.String.isBase64(a);
};KJUR.lang.String.isIntegerArray = function (a) {
a = a.replace(/\s+/g, "");if (a.match(/^\[[0-9,]+\]$/)) {
return true;
} else {
return false;
}
};function hextoposhex(a) {
if (a.length % 2 == 1) {
return "0" + a;
}if (a.substr(0, 1) > "7") {
return "00" + a;
}return a;
}function intarystrtohex(b) {
b = b.replace(/^\s*\[\s*/, "");b = b.replace(/\s*\]\s*$/, "");b = b.replace(/\s*/g, "");try {
var c = b.split(/,/).map(function (g, e, h) {
var f = parseInt(g);if (f < 0 || 255 < f) {
throw "integer not in range 0-255";
}var d = ("00" + f.toString(16)).slice(-2);return d;
}).join("");return c;
} catch (a) {
throw "malformed integer array string: " + a;
}
}var strdiffidx = function strdiffidx(c, a) {
var d = c.length;if (c.length > a.length) {
d = a.length;
}for (var b = 0; b < d; b++) {
if (c.charCodeAt(b) != a.charCodeAt(b)) {
return b;
}
}if (c.length != a.length) {
return d;
}return -1;
};
if (typeof KJUR == "undefined" || !KJUR) {
exports.KJUR = KJUR = {};
}if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
KJUR.crypto = {};
}KJUR.crypto.Util = new function () {
this.DIGESTINFOHEAD = { sha1: "3021300906052b0e03021a05000414", sha224: "302d300d06096086480165030402040500041c", sha256: "3031300d060960864801650304020105000420", sha384: "3041300d060960864801650304020205000430", sha512: "3051300d060960864801650304020305000440", md2: "3020300c06082a864886f70d020205000410", md5: "3020300c06082a864886f70d020505000410", ripemd160: "3021300906052b2403020105000414" };this.DEFAULTPROVIDER = { md5: "cryptojs", sha1: "cryptojs", sha224: "cryptojs", sha256: "cryptojs", sha384: "cryptojs", sha512: "cryptojs", ripemd160: "cryptojs", hmacmd5: "cryptojs", hmacsha1: "cryptojs", hmacsha224: "cryptojs", hmacsha256: "cryptojs", hmacsha384: "cryptojs", hmacsha512: "cryptojs", hmacripemd160: "cryptojs", MD5withRSA: "cryptojs/jsrsa", SHA1withRSA: "cryptojs/jsrsa", SHA224withRSA: "cryptojs/jsrsa", SHA256withRSA: "cryptojs/jsrsa", SHA384withRSA: "cryptojs/jsrsa", SHA512withRSA: "cryptojs/jsrsa", RIPEMD160withRSA: "cryptojs/jsrsa", MD5withECDSA: "cryptojs/jsrsa", SHA1withECDSA: "cryptojs/jsrsa", SHA224withECDSA: "cryptojs/jsrsa", SHA256withECDSA: "cryptojs/jsrsa", SHA384withECDSA: "cryptojs/jsrsa", SHA512withECDSA: "cryptojs/jsrsa", RIPEMD160withECDSA: "cryptojs/jsrsa", SHA1withDSA: "cryptojs/jsrsa", SHA224withDSA: "cryptojs/jsrsa", SHA256withDSA: "cryptojs/jsrsa", MD5withRSAandMGF1: "cryptojs/jsrsa", SHA1withRSAandMGF1: "cryptojs/jsrsa", SHA224withRSAandMGF1: "cryptojs/jsrsa", SHA256withRSAandMGF1: "cryptojs/jsrsa", SHA384withRSAandMGF1: "cryptojs/jsrsa", SHA512withRSAandMGF1: "cryptojs/jsrsa", RIPEMD160withRSAandMGF1: "cryptojs/jsrsa" };this.CRYPTOJSMESSAGEDIGESTNAME = { md5: CryptoJS.algo.MD5, sha1: CryptoJS.algo.SHA1, sha224: CryptoJS.algo.SHA224, sha256: CryptoJS.algo.SHA256, sha384: CryptoJS.algo.SHA384, sha512: CryptoJS.algo.SHA512, ripemd160: CryptoJS.algo.RIPEMD160 };this.getDigestInfoHex = function (a, b) {
if (typeof this.DIGESTINFOHEAD[b] == "undefined") {
throw "alg not supported in Util.DIGESTINFOHEAD: " + b;
}return this.DIGESTINFOHEAD[b] + a;
};this.getPaddedDigestInfoHex = function (h, a, j) {
var c = this.getDigestInfoHex(h, a);var d = j / 4;if (c.length + 22 > d) {
throw "key is too short for SigAlg: keylen=" + j + "," + a;
}var b = "0001";var k = "00" + c;var g = "";var l = d - b.length - k.length;for (var f = 0; f < l; f += 2) {
g += "ff";
}var e = b + g + k;return e;
};this.hashString = function (a, c) {
var b = new KJUR.crypto.MessageDigest({ alg: c });return b.digestString(a);
};this.hashHex = function (b, c) {
var a = new KJUR.crypto.MessageDigest({ alg: c });return a.digestHex(b);
};this.sha1 = function (a) {
var b = new KJUR.crypto.MessageDigest({ alg: "sha1", prov: "cryptojs" });return b.digestString(a);
};this.sha256 = function (a) {
var b = new KJUR.crypto.MessageDigest({ alg: "sha256", prov: "cryptojs" });return b.digestString(a);
};this.sha256Hex = function (a) {
var b = new KJUR.crypto.MessageDigest({ alg: "sha256", prov: "cryptojs" });return b.digestHex(a);
};this.sha512 = function (a) {
var b = new KJUR.crypto.MessageDigest({ alg: "sha512", prov: "cryptojs" });return b.digestString(a);
};this.sha512Hex = function (a) {
var b = new KJUR.crypto.MessageDigest({ alg: "sha512", prov: "cryptojs" });return b.digestHex(a);
};
}();KJUR.crypto.Util.md5 = function (a) {
var b = new KJUR.crypto.MessageDigest({ alg: "md5", prov: "cryptojs" });return b.digestString(a);
};KJUR.crypto.Util.ripemd160 = function (a) {
var b = new KJUR.crypto.MessageDigest({ alg: "ripemd160", prov: "cryptojs" });return b.digestString(a);
};KJUR.crypto.Util.SECURERANDOMGEN = new SecureRandom();KJUR.crypto.Util.getRandomHexOfNbytes = function (b) {
var a = new Array(b);KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(a);return BAtohex(a);
};KJUR.crypto.Util.getRandomBigIntegerOfNbytes = function (a) {
return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbytes(a), 16);
};KJUR.crypto.Util.getRandomHexOfNbits = function (d) {
var c = d % 8;var a = (d - c) / 8;var b = new Array(a + 1);KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(b);b[0] = (255 << c & 255 ^ 255) & b[0];return BAtohex(b);
};KJUR.crypto.Util.getRandomBigIntegerOfNbits = function (a) {
return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbits(a), 16);
};KJUR.crypto.Util.getRandomBigIntegerZeroToMax = function (b) {
var a = b.bitLength();while (1) {
var c = KJUR.crypto.Util.getRandomBigIntegerOfNbits(a);if (b.compareTo(c) != -1) {
return c;
}
}
};KJUR.crypto.Util.getRandomBigIntegerMinToMax = function (e, b) {
var c = e.compareTo(b);if (c == 1) {
throw "biMin is greater than biMax";
}if (c == 0) {
return e;
}var a = b.subtract(e);var d = KJUR.crypto.Util.getRandomBigIntegerZeroToMax(a);return d.add(e);
};KJUR.crypto.MessageDigest = function (c) {
var b = null;var a = null;var d = null;this.setAlgAndProvider = function (g, f) {
g = KJUR.crypto.MessageDigest.getCanonicalAlgName(g);if (g !== null && f === undefined) {
f = KJUR.crypto.Util.DEFAULTPROVIDER[g];
}if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && f == "cryptojs") {
try {
this.md = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g].create();
} catch (e) {
throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e;
}this.updateString = function (h) {
this.md.update(h);
};this.updateHex = function (h) {
var i = CryptoJS.enc.Hex.parse(h);this.md.update(i);
};this.digest = function () {
var h = this.md.finalize();return h.toString(CryptoJS.enc.Hex);
};this.digestString = function (h) {
this.updateString(h);return this.digest();
};this.digestHex = function (h) {
this.updateHex(h);return this.digest();
};
}if (":sha256:".indexOf(g) != -1 && f == "sjcl") {
try {
this.md = new sjcl.hash.sha256();
} catch (e) {
throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e;
}this.updateString = function (h) {
this.md.update(h);
};this.updateHex = function (i) {
var h = sjcl.codec.hex.toBits(i);this.md.update(h);
};this.digest = function () {
var h = this.md.finalize();return sjcl.codec.hex.fromBits(h);
};this.digestString = function (h) {
this.updateString(h);return this.digest();
};this.digestHex = function (h) {
this.updateHex(h);return this.digest();
};
}
};this.updateString = function (e) {
throw "updateString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName;
};this.updateHex = function (e) {
throw "updateHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName;
};this.digest = function () {
throw "digest() not supported for this alg/prov: " + this.algName + "/" + this.provName;
};this.digestString = function (e) {
throw "digestString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName;
};this.digestHex = function (e) {
throw "digestHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName;
};if (c !== undefined) {
if (c.alg !== undefined) {
this.algName = c.alg;if (c.prov === undefined) {
this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName];
}this.setAlgAndProvider(this.algName, this.provName);
}
}
};KJUR.crypto.MessageDigest.getCanonicalAlgName = function (a) {
if (typeof a === "string") {
a = a.toLowerCase();a = a.replace(/-/, "");
}return a;
};KJUR.crypto.MessageDigest.getHashLength = function (c) {
var b = KJUR.crypto.MessageDigest;var a = b.getCanonicalAlgName(c);if (b.HASHLENGTH[a] === undefined) {
throw "not supported algorithm: " + c;
}return b.HASHLENGTH[a];
};KJUR.crypto.MessageDigest.HASHLENGTH = { md5: 16, sha1: 20, sha224: 28, sha256: 32, sha384: 48, sha512: 64, ripemd160: 20 };KJUR.crypto.Mac = function (d) {
var f = null;var c = null;var a = null;var e = null;var b = null;this.setAlgAndProvider = function (k, i) {
k = k.toLowerCase();if (k == null) {
k = "hmacsha1";
}k = k.toLowerCase();if (k.substr(0, 4) != "hmac") {
throw "setAlgAndProvider unsupported HMAC alg: " + k;
}if (i === undefined) {
i = KJUR.crypto.Util.DEFAULTPROVIDER[k];
}this.algProv = k + "/" + i;var g = k.substr(4);if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && i == "cryptojs") {
try {
var j = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g];this.mac = CryptoJS.algo.HMAC.create(j, this.pass);
} catch (h) {
throw "setAlgAndProvider hash alg set fail hashAlg=" + g + "/" + h;
}this.updateString = function (l) {
this.mac.update(l);
};this.updateHex = function (l) {
var m = CryptoJS.enc.Hex.parse(l);this.mac.update(m);
};this.doFinal = function () {
var l = this.mac.finalize();return l.toString(CryptoJS.enc.Hex);
};this.doFinalString = function (l) {
this.updateString(l);return this.doFinal();
};this.doFinalHex = function (l) {
this.updateHex(l);return this.doFinal();
};
}
};this.updateString = function (g) {
throw "updateString(str) not supported for this alg/prov: " + this.algProv;
};this.updateHex = function (g) {
throw "updateHex(hex) not supported for this alg/prov: " + this.algProv;
};this.doFinal = function () {
throw "digest() not supported for this alg/prov: " + this.algProv;
};this.doFinalString = function (g) {
throw "digestString(str) not supported for this alg/prov: " + this.algProv;
};this.doFinalHex = function (g) {
throw "digestHex(hex) not supported for this alg/prov: " + this.algProv;
};this.setPassword = function (h) {
if (typeof h == "string") {
var g = h;if (h.length % 2 == 1 || !h.match(/^[0-9A-Fa-f]+$/)) {
g = rstrtohex(h);
}this.pass = CryptoJS.enc.Hex.parse(g);return;
}if ((typeof h === "undefined" ? "undefined" : _typeof(h)) != "object") {
throw "KJUR.crypto.Mac unsupported password type: " + h;
}var g = null;if (h.hex !== undefined) {
if (h.hex.length % 2 != 0 || !h.hex.match(/^[0-9A-Fa-f]+$/)) {
throw "Mac: wrong hex password: " + h.hex;
}g = h.hex;
}if (h.utf8 !== undefined) {
g = utf8tohex(h.utf8);
}if (h.rstr !== undefined) {
g = rstrtohex(h.rstr);
}if (h.b64 !== undefined) {
g = b64tohex(h.b64);
}if (h.b64u !== undefined) {
g = b64utohex(h.b64u);
}if (g == null) {
throw "KJUR.crypto.Mac unsupported password type: " + h;
}this.pass = CryptoJS.enc.Hex.parse(g);
};if (d !== undefined) {
if (d.pass !== undefined) {
this.setPassword(d.pass);
}if (d.alg !== undefined) {
this.algName = d.alg;if (d.prov === undefined) {
this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName];
}this.setAlgAndProvider(this.algName, this.provName);
}
}
};KJUR.crypto.Signature = function (o) {
var q = null;var n = null;var r = null;var c = null;var l = null;var d = null;var k = null;var h = null;var p = null;var e = null;var b = -1;var g = null;var j = null;var a = null;var i = null;var f = null;this._setAlgNames = function () {
var s = this.algName.match(/^(.+)with(.+)$/);if (s) {
this.mdAlgName = s[1].toLowerCase();this.pubkeyAlgName = s[2].toLowerCase();
}
};this._zeroPaddingOfSignature = function (x, w) {
var v = "";var t = w / 4 - x.length;for (var u = 0; u < t; u++) {
v = v + "0";
}return v + x;
};this.setAlgAndProvider = function (u, t) {
this._setAlgNames();if (t != "cryptojs/jsrsa") {
throw "provider not supported: " + t;
}if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName) != -1) {
try {
this.md = new KJUR.crypto.MessageDigest({ alg: this.mdAlgName });
} catch (s) {
throw "setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + s;
}this.init = function (w, x) {
var y = null;try {
if (x === undefined) {
y = KEYUTIL.getKey(w);
} else {
y = KEYUTIL.getKey(w, x);
}
} catch (v) {
throw "init failed:" + v;
}if (y.isPrivate === true) {
this.prvKey = y;this.state = "SIGN";
} else {
if (y.isPublic === true) {
this.pubKey = y;this.state = "VERIFY";
} else {
throw "init failed.:" + y;
}
}
};this.updateString = function (v) {
this.md.updateString(v);
};this.updateHex = function (v) {
this.md.updateHex(v);
};this.sign = function () {
this.sHashHex = this.md.digest();if (typeof this.ecprvhex != "undefined" && typeof this.eccurvename != "undefined") {
var v = new KJUR.crypto.ECDSA({ curve: this.eccurvename });this.hSign = v.signHex(this.sHashHex, this.ecprvhex);
} else {
if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {
this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen);
} else {
if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {
this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName);
} else {
if (this.prvKey instanceof KJUR.crypto.ECDSA) {
this.hSign = this.prvKey.signWithMessageHash(this.sHashHex);
} else {
if (this.prvKey instanceof KJUR.crypto.DSA) {
this.hSign = this.prvKey.signWithMessageHash(this.sHashHex);
} else {
throw "Signature: unsupported private key alg: " + this.pubkeyAlgName;
}
}
}
}
}return this.hSign;
};this.signString = function (v) {
this.updateString(v);return this.sign();
};this.signHex = function (v) {
this.updateHex(v);return this.sign();
};this.verify = function (v) {
this.sHashHex = this.md.digest();if (typeof this.ecpubhex != "undefined" && typeof this.eccurvename != "undefined") {
var w = new KJUR.crypto.ECDSA({ curve: this.eccurvename });return w.verifyHex(this.sHashHex, v, this.ecpubhex);
} else {
if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {
return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, v, this.mdAlgName, this.pssSaltLen);
} else {
if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {
return this.pubKey.verifyWithMessageHash(this.sHashHex, v);
} else {
if (KJUR.crypto.ECDSA !== undefined && this.pubKey instanceof KJUR.crypto.ECDSA) {
return this.pubKey.verifyWithMessageHash(this.sHashHex, v);
} else {
if (KJUR.crypto.DSA !== undefined && this.pubKey instanceof KJUR.crypto.DSA) {
return this.pubKey.verifyWithMessageHash(this.sHashHex, v);
} else {
throw "Signature: unsupported public key alg: " + this.pubkeyAlgName;
}
}
}
}
}
};
}
};this.init = function (s, t) {
throw "init(key, pass) not supported for this alg:prov=" + this.algProvName;
};this.updateString = function (s) {
throw "updateString(str) not supported for this alg:prov=" + this.algProvName;
};this.updateHex = function (s) {
throw "updateHex(hex) not supported for this alg:prov=" + this.algProvName;
};this.sign = function () {
throw "sign() not supported for this alg:prov=" + this.algProvName;
};this.signString = function (s) {
throw "digestString(str) not supported for this alg:prov=" + this.algProvName;
};this.signHex = function (s) {
throw "digestHex(hex) not supported for this alg:prov=" + this.algProvName;
};this.verify = function (s) {
throw "verify(hSigVal) not supported for this alg:prov=" + this.algProvName;
};this.initParams = o;if (o !== undefined) {
if (o.alg !== undefined) {
this.algName = o.alg;if (o.prov === undefined) {
this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName];
} else {
this.provName = o.prov;
}this.algProvName = this.algName + ":" + this.provName;this.setAlgAndProvider(this.algName, this.provName);this._setAlgNames();
}if (o.psssaltlen !== undefined) {
this.pssSaltLen = o.psssaltlen;
}if (o.prvkeypem !== undefined) {
if (o.prvkeypas !== undefined) {
throw "both prvkeypem and prvkeypas parameters not supported";
} else {
try {
var q = KEYUTIL.getKey(o.prvkeypem);this.init(q);
} catch (m) {
throw "fatal error to load pem private key: " + m;
}
}
}
}
};KJUR.crypto.Cipher = function (a) {};KJUR.crypto.Cipher.encrypt = function (e, f, d) {
if (f instanceof RSAKey && f.isPublic) {
var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);if (c === "RSA") {
return f.encrypt(e);
}if (c === "RSAOAEP") {
return f.encryptOAEP(e, "sha1");
}var b = c.match(/^RSAOAEP(\d+)$/);if (b !== null) {
return f.encryptOAEP(e, "sha" + b[1]);
}throw "Cipher.encrypt: unsupported algorithm for RSAKey: " + d;
} else {
throw "Cipher.encrypt: unsupported key or algorithm";
}
};KJUR.crypto.Cipher.decrypt = function (e, f, d) {
if (f instanceof RSAKey && f.isPrivate) {
var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);if (c === "RSA") {
return f.decrypt(e);
}if (c === "RSAOAEP") {
return f.decryptOAEP(e, "sha1");
}var b = c.match(/^RSAOAEP(\d+)$/);if (b !== null) {
return f.decryptOAEP(e, "sha" + b[1]);
}throw "Cipher.decrypt: unsupported algorithm for RSAKey: " + d;
} else {
throw "Cipher.decrypt: unsupported key or algorithm";
}
};KJUR.crypto.Cipher.getAlgByKeyAndName = function (b, a) {
if (b instanceof RSAKey) {
if (":RSA:RSAOAEP:RSAOAEP224:RSAOAEP256:RSAOAEP384:RSAOAEP512:".indexOf(a) != -1) {
return a;
}if (a === null || a === undefined) {
return "RSA";
}throw "getAlgByKeyAndName: not supported algorithm name for RSAKey: " + a;
}throw "getAlgByKeyAndName: not supported algorithm name: " + a;
};KJUR.crypto.OID = new function () {
this.oidhex2name = { "2a864886f70d010101": "rsaEncryption", "2a8648ce3d0201": "ecPublicKey", "2a8648ce380401": "dsa", "2a8648ce3d030107": "secp256r1", "2b8104001f": "secp192k1", "2b81040021": "secp224r1", "2b8104000a": "secp256k1", "2b81040023": "secp521r1", "2b81040022": "secp384r1", "2a8648ce380403": "SHA1withDSA", "608648016503040301": "SHA224withDSA", "608648016503040302": "SHA256withDSA" };
}();
if (typeof KJUR == "undefined" || !KJUR) {
exports.KJUR = KJUR = {};
}if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
KJUR.crypto = {};
}KJUR.crypto.ECDSA = function (h) {
var e = "secp256r1";var g = null;var b = null;var f = null;var a = new SecureRandom();var d = null;this.type = "EC";this.isPrivate = false;this.isPublic = false;function c(s, o, r, n) {
var j = Math.max(o.bitLength(), n.bitLength());var t = s.add2D(r);var q = s.curve.getInfinity();for (var p = j - 1; p >= 0; --p) {
q = q.twice2D();q.z = BigInteger.ONE;if (o.testBit(p)) {
if (n.testBit(p)) {
q = q.add2D(t);
} else {
q = q.add2D(s);
}
} else {
if (n.testBit(p)) {
q = q.add2D(r);
}
}
}return q;
}this.getBigRandom = function (i) {
return new BigInteger(i.bitLength(), a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE);
};this.setNamedCurve = function (i) {
this.ecparams = KJUR.crypto.ECParameterDB.getByName(i);this.prvKeyHex = null;this.pubKeyHex = null;this.curveName = i;
};this.setPrivateKeyHex = function (i) {
this.isPrivate = true;this.prvKeyHex = i;
};this.setPublicKeyHex = function (i) {
this.isPublic = true;this.pubKeyHex = i;
};this.getPublicKeyXYHex = function () {
var k = this.pubKeyHex;if (k.substr(0, 2) !== "04") {
throw "this method supports uncompressed format(04) only";
}var j = this.ecparams.keylen / 4;if (k.length !== 2 + j * 2) {
throw "malformed public key hex length";
}var i = {};i.x = k.substr(2, j);i.y = k.substr(2 + j);return i;
};this.getShortNISTPCurveName = function () {
var i = this.curveName;if (i === "secp256r1" || i === "NIST P-256" || i === "P-256" || i === "prime256v1") {
return "P-256";
}if (i === "secp384r1" || i === "NIST P-384" || i === "P-384") {
return "P-384";
}return null;
};this.generateKeyPairHex = function () {
var k = this.ecparams.n;var n = this.getBigRandom(k);var l = this.ecparams.G.multiply(n);var q = l.getX().toBigInteger();var o = l.getY().toBigInteger();var i = this.ecparams.keylen / 4;var m = ("0000000000" + n.toString(16)).slice(-i);var r = ("0000000000" + q.toString(16)).slice(-i);var p = ("0000000000" + o.toString(16)).slice(-i);var j = "04" + r + p;this.setPrivateKeyHex(m);this.setPublicKeyHex(j);return { ecprvhex: m, ecpubhex: j };
};this.signWithMessageHash = function (i) {
return this.signHex(i, this.prvKeyHex);
};this.signHex = function (o, j) {
var t = new BigInteger(j, 16);var l = this.ecparams.n;var q = new BigInteger(o, 16);do {
var m = this.getBigRandom(l);var u = this.ecparams.G;var p = u.multiply(m);var i = p.getX().toBigInteger().mod(l);
} while (i.compareTo(BigInteger.ZERO) <= 0);var v = m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i, v);
};this.sign = function (m, u) {
var q = u;var j = this.ecparams.n;var p = BigInteger.fromByteArrayUnsigned(m);do {
var l = this.getBigRandom(j);var t = this.ecparams.G;var o = t.multiply(l);var i = o.getX().toBigInteger().mod(j);
} while (i.compareTo(BigInteger.ZERO) <= 0);var v = l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);return this.serializeSig(i, v);
};this.verifyWithMessageHash = function (j, i) {
return this.verifyHex(j, i, this.pubKeyHex);
};this.verifyHex = function (m, i, p) {
var l, j;var o = KJUR.crypto.ECDSA.parseSigHex(i);l = o.r;j = o.s;var k;k = ECPointFp.decodeFromHex(this.ecparams.curve, p);var n = new BigInteger(m, 16);return this.verifyRaw(n, l, j, k);
};this.verify = function (o, p, j) {
var l, i;if (Bitcoin.Util.isArray(p)) {
var n = this.parseSig(p);l = n.r;i = n.s;
} else {
if ("object" === (typeof p === "undefined" ? "undefined" : _typeof(p)) && p.r && p.s) {
l = p.r;i = p.s;
} else {
throw "Invalid value for signature";
}
}var k;if (j instanceof ECPointFp) {
k = j;
} else {
if (Bitcoin.Util.isArray(j)) {
k = ECPointFp.decodeFrom(this.ecparams.curve, j);
} else {
throw "Invalid format for pubkey value, must be byte array or ECPointFp";
}
}var m = BigInteger.fromByteArrayUnsigned(o);return this.verifyRaw(m, l, i, k);
};this.verifyRaw = function (o, i, w, m) {
var l = this.ecparams.n;var u = this.ecparams.G;if (i.compareTo(BigInteger.ONE) < 0 || i.compareTo(l) >= 0) {
return false;
}if (w.compareTo(BigInteger.ONE) < 0 || w.compareTo(l) >= 0) {
return false;
}var p = w.modInverse(l);var k = o.multiply(p).mod(l);var j = i.multiply(p).mod(l);var q = u.multiply(k).add(m.multiply(j));var t = q.getX().toBigInteger().mod(l);return t.equals(i);
};this.serializeSig = function (k, j) {
var l = k.toByteArraySigned();var i = j.toByteArraySigned();var m = [];m.push(2);m.push(l.length);m = m.concat(l);m.push(2);m.push(i.length);m = m.concat(i);m.unshift(m.length);m.unshift(48);return m;
};this.parseSig = function (n) {
var m;if (n[0] != 48) {
throw new Error("Signature not a valid DERSequence");
}m = 2;if (n[m] != 2) {
throw new Error("First element in signature must be a DERInteger");
}var l = n.slice(m + 2, m + 2 + n[m + 1]);m += 2 + n[m + 1];if (n[m] != 2) {
throw new Error("Second element in signature must be a DERInteger");
}var i = n.slice(m + 2, m + 2 + n[m + 1]);m += 2 + n[m + 1];var k = BigInteger.fromByteArrayUnsigned(l);var j = BigInteger.fromByteArrayUnsigned(i);return { r: k, s: j };
};this.parseSigCompact = function (m) {
if (m.length !== 65) {
throw "Signature has the wrong length";
}var j = m[0] - 27;if (j < 0 || j > 7) {
throw "Invalid signature type";
}var o = this.ecparams.n;var l = BigInteger.fromByteArrayUnsigned(m.slice(1, 33)).mod(o);var k = BigInteger.fromByteArrayUnsigned(m.slice(33, 65)).mod(o);return { r: l, s: k, i: j };
};this.readPKCS5PrvKeyHex = function (l) {
var n = ASN1HEX;var m = KJUR.crypto.ECDSA.getName;var p = n.getVbyList;if (n.isASN1HEX(l) === false) {
throw "not ASN.1 hex string";
}var i, k, o;try {
i = p(l, 0, [2, 0], "06");k = p(l, 0, [1], "04");try {
o = p(l, 0, [3, 0], "03").substr(2);
} catch (j) {}
} catch (j) {
throw "malformed PKCS#1/5 plain ECC private key";
}this.curveName = m(i);if (this.curveName === undefined) {
throw "unsupported curve name";
}this.setNamedCurve(this.curveName);this.setPublicKeyHex(o);this.setPrivateKeyHex(k);this.isPublic = false;
};this.readPKCS8PrvKeyHex = function (l) {
var q = ASN1HEX;var i = KJUR.crypto.ECDSA.getName;var n = q.getVbyList;if (q.isASN1HEX(l) === false) {
throw "not ASN.1 hex string";
}var j, p, m, k;try {
j = n(l, 0, [1, 0], "06");p = n(l, 0, [1, 1], "06");m = n(l, 0, [2, 0, 1], "04");try {
k = n(l, 0, [2, 0, 2, 0], "03").substr(2);
} catch (o) {}
} catch (o) {
throw "malformed PKCS#8 plain ECC private key";
}this.curveName = i(p);if (this.curveName === undefined) {
throw "unsupported curve name";
}this.setNamedCurve(this.curveName);this.setPublicKeyHex(k);this.setPrivateKeyHex(m);this.isPublic = false;
};this.readPKCS8PubKeyHex = function (l) {
var n = ASN1HEX;var m = KJUR.crypto.ECDSA.getName;var p = n.getVbyList;if (n.isASN1HEX(l) === false) {
throw "not ASN.1 hex string";
}var k, i, o;try {
k = p(l, 0, [0, 0], "06");i = p(l, 0, [0, 1], "06");o = p(l, 0, [1], "03").substr(2);
} catch (j) {
throw "malformed PKCS#8 ECC public key";
}this.curveName = m(i);if (this.curveName === null) {
throw "unsupported curve name";
}this.setNamedCurve(this.curveName);this.setPublicKeyHex(o);
};this.readCertPubKeyHex = function (k, p) {
if (p !== 5) {
p = 6;
}var m = ASN1HEX;var l = KJUR.crypto.ECDSA.getName;var o = m.getVbyList;if (m.isASN1HEX(k) === false) {
throw "not ASN.1 hex string";
}var i, n;try {
i = o(k, 0, [0, p, 0, 1], "06");n = o(k, 0, [0, p, 1], "03").substr(2);
} catch (j) {
throw "malformed X.509 certificate ECC public key";
}this.curveName = l(i);if (this.curveName === null) {
throw "unsupported curve name";
}this.setNamedCurve(this.curveName);this.setPublicKeyHex(n);
};if (h !== undefined) {
if (h.curve !== undefined) {
this.curveName = h.curve;
}
}if (this.curveName === undefined) {
this.curveName = e;
}this.setNamedCurve(this.curveName);if (h !== undefined) {
if (h.prv !== undefined) {
this.setPrivateKeyHex(h.prv);
}if (h.pub !== undefined) {
this.setPublicKeyHex(h.pub);
}
}
};KJUR.crypto.ECDSA.parseSigHex = function (a) {
var b = KJUR.crypto.ECDSA.parseSigHexInHexRS(a);var d = new BigInteger(b.r, 16);var c = new BigInteger(b.s, 16);return { r: d, s: c };
};KJUR.crypto.ECDSA.parseSigHexInHexRS = function (f) {
var j = ASN1HEX;var i = j.getChildIdx;var g = j.getV;if (f.substr(0, 2) != "30") {
throw "signature is not a ASN.1 sequence";
}var h = i(f, 0);if (h.length != 2) {
throw "number of signature ASN.1 sequence elements seem wrong";
}var e = h[0];var d = h[1];if (f.substr(e, 2) != "02") {
throw "1st item of sequene of signature is not ASN.1 integer";
}if (f.substr(d, 2) != "02") {
throw "2nd item of sequene of signature is not ASN.1 integer";
}var c = g(f, e);var b = g(f, d);return { r: c, s: b };
};KJUR.crypto.ECDSA.asn1SigToConcatSig = function (c) {
var d = KJUR.crypto.ECDSA.parseSigHexInHexRS(c);var b = d.r;var a = d.s;if (b.substr(0, 2) == "00" && b.length % 32 == 2) {
b = b.substr(2);
}if (a.substr(0, 2) == "00" && a.length % 32 == 2) {
a = a.substr(2);
}if (b.length % 32 == 30) {
b = "00" + b;
}if (a.length % 32 == 30) {
a = "00" + a;
}if (b.length % 32 != 0) {
throw "unknown ECDSA sig r length error";
}if (a.length % 32 != 0) {
throw "unknown ECDSA sig s length error";
}return b + a;
};KJUR.crypto.ECDSA.concatSigToASN1Sig = function (a) {
if (a.length / 2 * 8 % (16 * 8) != 0) {
throw "unknown ECDSA concatinated r-s sig length error";
}var c = a.substr(0, a.length / 2);var b = a.substr(a.length / 2);return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c, b);
};KJUR.crypto.ECDSA.hexRSSigToASN1Sig = function (b, a) {
var d = new BigInteger(b, 16);var c = new BigInteger(a, 16);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d, c);
};KJUR.crypto.ECDSA.biRSSigToASN1Sig = function (f, d) {
var c = KJUR.asn1;var b = new c.DERInteger({ bigint: f });var a = new c.DERInteger({ bigint: d });var e = new c.DERSequence({ array: [b, a] });return e.getEncodedHex();
};KJUR.crypto.ECDSA.getName = function (a) {
if (a === "2a8648ce3d030107") {
return "secp256r1";
}if (a === "2b8104000a") {
return "secp256k1";
}if (a === "2b81040022") {
return "secp384r1";
}if ("|secp256r1|NIST P-256|P-256|prime256v1|".indexOf(a) !== -1) {
return "secp256r1";
}if ("|secp256k1|".indexOf(a) !== -1) {
return "secp256k1";
}if ("|secp384r1|NIST P-384|P-384|".indexOf(a) !== -1) {
return "secp384r1";
}return null;
};
if (typeof KJUR == "undefined" || !KJUR) {
exports.KJUR = KJUR = {};
}if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
KJUR.crypto = {};
}KJUR.crypto.ECParameterDB = new function () {
var b = {};var c = {};function a(d) {
return new BigInteger(d, 16);
}this.getByName = function (e) {
var d = e;if (typeof c[d] != "undefined") {
d = c[e];
}if (typeof b[d] != "undefined") {
return b[d];
}throw "unregistered EC curve name: " + d;
};this.regist = function (A, l, o, g, m, e, j, f, k, u, d, x) {
b[A] = {};var s = a(o);var z = a(g);var y = a(m);var t = a(e);var w = a(j);var r = new ECCurveFp(s, z, y);var q = r.decodePointHex("04" + f + k);b[A]["name"] = A;b[A]["keylen"] = l;b[A]["curve"] = r;b[A]["G"] = q;b[A]["n"] = t;b[A]["h"] = w;b[A]["oid"] = d;b[A]["info"] = x;for (var v = 0; v < u.length; v++) {
c[u[v]] = A;
}
};
}();KJUR.crypto.ECParameterDB.regist("secp128r1", 128, "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", "E87579C11079F43DD824993C2CEE5ED3", "FFFFFFFE0000000075A30D1B9038A115", "1", "161FF7528B899B2D0C28607CA52C5B86", "CF5AC8395BAFEB13C02DA292DDED7A83", [], "", "secp128r1 : SECG curve over a 128 bit prime field");KJUR.crypto.ECParameterDB.regist("secp160k1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", "0", "7", "0100000000000000000001B8FA16DFAB9ACA16B6B3", "1", "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", "938CF935318FDCED6BC28286531733C3F03C4FEE", [], "", "secp160k1 : SECG curve over a 160 bit prime field");KJUR.crypto.ECParameterDB.regist("secp160r1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", "0100000000000000000001F4C8F927AED3CA752257", "1", "4A96B5688EF573284664698968C38BB913CBFC82", "23A628553168947D59DCC912042351377AC5FB32", [], "", "secp160r1 : SECG curve over a 160 bit prime field");KJUR.crypto.ECParameterDB.regist("secp192k1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", "0", "3", "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", "1", "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", []);KJUR.crypto.ECParameterDB.regist("secp192r1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", "1", "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", []);KJUR.crypto.ECParameterDB.regist("secp224r1", 224, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", "1", "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", []);KJUR.crypto.ECParameterDB.regist("secp256k1", 256, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", "0", "7", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", "1", "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", []);KJUR.crypto.ECParameterDB.regist("secp256r1", 256, "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", "1", "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", ["NIST P-256", "P-256", "prime256v1"]);KJUR.crypto.ECParameterDB.regist("secp384r1", 384, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", "1", "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", ["NIST P-384", "P-384"]);KJUR.crypto.ECParameterDB.regist("secp521r1", 521, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", "1", "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", ["NIST P-521", "P-521"]);
var KEYUTIL = function () {
var d = function d(p, r, q) {
return k(CryptoJS.AES, p, r, q);
};var e = function e(p, r, q) {
return k(CryptoJS.TripleDES, p, r, q);
};var a = function a(p, r, q) {
return k(CryptoJS.DES, p, r, q);
};var k = function k(s, x, u, q) {
var r = CryptoJS.enc.Hex.parse(x);var w = CryptoJS.enc.Hex.parse(u);var p = CryptoJS.enc.Hex.parse(q);var t = {};t.key = w;t.iv = p;t.ciphertext = r;var v = s.decrypt(t, w, { iv: p });return CryptoJS.enc.Hex.stringify(v);
};var l = function l(p, r, q) {
return g(CryptoJS.AES, p, r, q);
};var o = function o(p, r, q) {
return g(CryptoJS.TripleDES, p, r, q);
};var f = function f(p, r, q) {
return g(CryptoJS.DES, p, r, q);
};var g = function g(t, y, v, q) {
var s = CryptoJS.enc.Hex.parse(y);var x = CryptoJS.enc.Hex.parse(v);var p = CryptoJS.enc.Hex.parse(q);var w = t.encrypt(s, x, { iv: p });var r = CryptoJS.enc.Hex.parse(w.toString());var u = CryptoJS.enc.Base64.stringify(r);return u;
};var i = { "AES-256-CBC": { proc: d, eproc: l, keylen: 32, ivlen: 16 }, "AES-192-CBC": { proc: d, eproc: l, keylen: 24, ivlen: 16 }, "AES-128-CBC": { proc: d, eproc: l, keylen: 16, ivlen: 16 }, "DES-EDE3-CBC": { proc: e, eproc: o, keylen: 24, ivlen: 8 }, "DES-CBC": { proc: a, eproc: f, keylen: 8, ivlen: 8 } };var c = function c(p) {
return i[p]["proc"];
};var m = function m(p) {
var r = CryptoJS.lib.WordArray.random(p);var q = CryptoJS.enc.Hex.stringify(r);return q;
};var n = function n(v) {
var w = {};var q = v.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"));if (q) {
w.cipher = q[1];w.ivsalt = q[2];
}var p = v.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"));if (p) {
w.type = p[1];
}var u = -1;var x = 0;if (v.indexOf("\r\n\r\n") != -1) {
u = v.indexOf("\r\n\r\n");x = 2;
}if (v.indexOf("\n\n") != -1) {
u = v.indexOf("\n\n");x = 1;
}var t = v.indexOf("-----END");if (u != -1 && t != -1) {
var r = v.substring(u + x * 2, t - x);r = r.replace(/\s+/g, "");w.data = r;
}return w;
};var j = function j(q, y, p) {
var v = p.substring(0, 16);var t = CryptoJS.enc.Hex.parse(v);var r = CryptoJS.enc.Utf8.parse(y);var u = i[q]["keylen"] + i[q]["ivlen"];var x = "";var w = null;for (;;) {
var s = CryptoJS.algo.MD5.create();if (w != null) {
s.update(w);
}s.update(r);s.update(t);w = s.finalize();x = x + CryptoJS.enc.Hex.stringify(w);if (x.length >= u * 2) {
break;
}
}var z = {};z.keyhex = x.substr(0, i[q]["keylen"] * 2);z.ivhex = x.substr(i[q]["keylen"] * 2, i[q]["ivlen"] * 2);return z;
};var b = function b(p, v, r, w) {
var s = CryptoJS.enc.Base64.parse(p);var q = CryptoJS.enc.Hex.stringify(s);var u = i[v]["proc"];var t = u(q, r, w);return t;
};var h = function h(p, s, q, u) {
var r = i[s]["eproc"];var t = r(p, q, u);return t;
};return { version: "1.0.0", parsePKCS5PEM: function parsePKCS5PEM(p) {
return n(p);
}, getKeyAndUnusedIvByPasscodeAndIvsalt: function getKeyAndUnusedIvByPasscodeAndIvsalt(q, p, r) {
return j(q, p, r);
}, decryptKeyB64: function decryptKeyB64(p, r, q, s) {
return b(p, r, q, s);
}, getDecryptedKeyHex: function getDecryptedKeyHex(y, x) {
var q = n(y);var t = q.type;var r = q.cipher;var p = q.ivsalt;var s = q.data;var w = j(r, x, p);var v = w.keyhex;var u = b(s, r, v, p);return u;
}, getEncryptedPKCS5PEMFromPrvKeyHex: function getEncryptedPKCS5PEMFromPrvKeyHex(x, s, A, t, r) {
var p = "";if (typeof t == "undefined" || t == null) {
t = "AES-256-CBC";
}if (typeof i[t] == "undefined") {
throw "KEYUTIL unsupported algorithm: " + t;
}if (typeof r == "undefined" || r == null) {
var v = i[t]["ivlen"];var u = m(v);r = u.toUpperCase();
}var z = j(t, A, r);var y = z.keyhex;var w = h(s, t, y, r);var q = w.replace(/(.{64})/g, "$1\r\n");var p = "-----BEGIN " + x + " PRIVATE KEY-----\r\n";p += "Proc-Type: 4,ENCRYPTED\r\n";p += "DEK-Info: " + t + "," + r + "\r\n";p += "\r\n";p += q;p += "\r\n-----END " + x + " PRIVATE KEY-----\r\n";return p;
}, parseHexOfEncryptedPKCS8: function parseHexOfEncryptedPKCS8(y) {
var B = ASN1HEX;var z = B.getChildIdx;var w = B.getV;var t = {};var r = z(y, 0);if (r.length != 2) {
throw "malformed format: SEQUENCE(0).items != 2: " + r.length;
}t.ciphertext = w(y, r[1]);var A = z(y, r[0]);if (A.length != 2) {
throw "malformed format: SEQUENCE(0.0).items != 2: " + A.length;
}if (w(y, A[0]) != "2a864886f70d01050d") {
throw "this only supports pkcs5PBES2";
}var p = z(y, A[1]);if (A.length != 2) {
throw "malformed format: SEQUENCE(0.0.1).items != 2: " + p.length;
}var q = z(y, p[1]);if (q.length != 2) {
throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + q.length;
}if (w(y, q[0]) != "2a864886f70d0307") {
throw "this only supports TripleDES";
}t.encryptionSchemeAlg = "TripleDES";t.encryptionSchemeIV = w(y, q[1]);var s = z(y, p[0]);if (s.length != 2) {
throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + s.length;
}if (w(y, s[0]) != "2a864886f70d01050c") {
throw "this only supports pkcs5PBKDF2";
}var x = z(y, s[1]);if (x.length < 2) {
throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + x.length;
}t.pbkdf2Salt = w(y, x[0]);var u = w(y, x[1]);try {
t.pbkdf2Iter = parseInt(u, 16);
} catch (v) {
throw "malformed format pbkdf2Iter: " + u;
}return t;
}, getPBKDF2KeyHexFromParam: function getPBKDF2KeyHexFromParam(u, p) {
var t = CryptoJS.enc.Hex.parse(u.pbkdf2Salt);var q = u.pbkdf2Iter;var s = CryptoJS.PBKDF2(p, t, { keySize: 192 / 32, iterations: q });var r = CryptoJS.enc.Hex.stringify(s);return r;
}, _getPlainPKCS8HexFromEncryptedPKCS8PEM: function _getPlainPKCS8HexFromEncryptedPKCS8PEM(x, y) {
var r = pemtohex(x, "ENCRYPTED PRIVATE KEY");var p = this.parseHexOfEncryptedPKCS8(r);var u = KEYUTIL.getPBKDF2KeyHexFromParam(p, y);var v = {};v.ciphertext = CryptoJS.enc.Hex.parse(p.ciphertext);var t = CryptoJS.enc.Hex.parse(u);var s = CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);var w = CryptoJS.TripleDES.decrypt(v, t, { iv: s });var q = CryptoJS.enc.Hex.stringify(w);return q;
}, getKeyFromEncryptedPKCS8PEM: function getKeyFromEncryptedPKCS8PEM(s, q) {
var p = this._getPlainPKCS8HexFromEncryptedPKCS8PEM(s, q);var r = this.getKeyFromPlainPrivatePKCS8Hex(p);return r;
}, parsePlainPrivatePKCS8Hex: function parsePlainPrivatePKCS8Hex(s) {
var v = ASN1HEX;var u = v.getChildIdx;var t = v.getV;var q = {};q.algparam = null;if (s.substr(0, 2) != "30") {
throw "malformed plain PKCS8 private key(code:001)";
}var r = u(s, 0);if (r.length != 3) {
throw "malformed plain PKCS8 private key(code:002)";
}if (s.substr(r[1], 2) != "30") {
throw "malformed PKCS8 private key(code:003)";
}var p = u(s, r[1]);if (p.length != 2) {
throw "malformed PKCS8 private key(code:004)";
}if (s.substr(p[0], 2) != "06") {
throw "malformed PKCS8 private key(code:005)";
}q.algoid = t(s, p[0]);if (s.substr(p[1], 2) == "06") {
q.algparam = t(s, p[1]);
}if (s.substr(r[2], 2) != "04") {
throw "malformed PKCS8 private key(code:006)";
}q.keyidx = v.getVidx(s, r[2]);return q;
}, getKeyFromPlainPrivatePKCS8PEM: function getKeyFromPlainPrivatePKCS8PEM(q) {
var p = pemtohex(q, "PRIVATE KEY");var r = this.getKeyFromPlainPrivatePKCS8Hex(p);return r;
}, getKeyFromPlainPrivatePKCS8Hex: function getKeyFromPlainPrivatePKCS8Hex(p) {
var q = this.parsePlainPrivatePKCS8Hex(p);var r;if (q.algoid == "2a864886f70d010101") {
r = new RSAKey();
} else {
if (q.algoid == "2a8648ce380401") {
r = new KJUR.crypto.DSA();
} else {
if (q.algoid == "2a8648ce3d0201") {
r = new KJUR.crypto.ECDSA();
} else {
throw "unsupported private key algorithm";
}
}
}r.readPKCS8PrvKeyHex(p);return r;
}, _getKeyFromPublicPKCS8Hex: function _getKeyFromPublicPKCS8Hex(q) {
var p;var r = ASN1HEX.getVbyList(q, 0, [0, 0], "06");if (r === "2a864886f70d010101") {
p = new RSAKey();
} else {
if (r === "2a8648ce380401") {
p = new KJUR.crypto.DSA();
} else {
if (r === "2a8648ce3d0201") {
p = new KJUR.crypto.ECDSA();
} else {
throw "unsupported PKCS#8 public key hex";
}
}
}p.readPKCS8PubKeyHex(q);return p;
}, parsePublicRawRSAKeyHex: function parsePublicRawRSAKeyHex(r) {
var u = ASN1HEX;var t = u.getChildIdx;var s = u.getV;var p = {};if (r.substr(0, 2) != "30") {
throw "malformed RSA key(code:001)";
}var q = t(r, 0);if (q.length != 2) {
throw "malformed RSA key(code:002)";
}if (r.substr(q[0], 2) != "02") {
throw "malformed RSA key(code:003)";
}p.n = s(r, q[0]);if (r.substr(q[1], 2) != "02") {
throw "malformed RSA key(code:004)";
}p.e = s(r, q[1]);return p;
}, parsePublicPKCS8Hex: function parsePublicPKCS8Hex(t) {
var v = ASN1HEX;var u = v.getChildIdx;var s = v.getV;var q = {};q.algparam = null;var r = u(t, 0);if (r.length != 2) {
throw "outer DERSequence shall have 2 elements: " + r.length;
}var w = r[0];if (t.substr(w, 2) != "30") {
throw "malformed PKCS8 public key(code:001)";
}var p = u(t, w);if (p.length != 2) {
throw "malformed PKCS8 public key(code:002)";
}if (t.substr(p[0], 2) != "06") {
throw "malformed PKCS8 public key(code:003)";
}q.algoid = s(t, p[0]);if (t.substr(p[1], 2) == "06") {
q.algparam = s(t, p[1]);
} else {
if (t.substr(p[1], 2) == "30") {
q.algparam = {};q.algparam.p = v.getVbyList(t, p[1], [0], "02");q.algparam.q = v.getVbyList(t, p[1], [1], "02");q.algparam.g = v.getVbyList(t, p[1], [2], "02");
}
}if (t.substr(r[1], 2) != "03") {
throw "malformed PKCS8 public key(code:004)";
}q.key = s(t, r[1]).substr(2);return q;
} };
}();KEYUTIL.getKey = function (l, k, n) {
var G = ASN1HEX,
L = G.getChildIdx,
v = G.getV,
d = G.getVbyList,
c = KJUR.crypto,
i = c.ECDSA,
C = c.DSA,
w = RSAKey,
M = pemtohex,
F = KEYUTIL;if (typeof w != "undefined" && l instanceof w) {
return l;
}if (typeof i != "undefined" && l instanceof i) {
return l;
}if (typeof C != "undefined" && l instanceof C) {
return l;
}if (l.curve !== undefined && l.xy !== undefined && l.d === undefined) {
return new i({ pub: l.xy, curve: l.curve });
}if (l.curve !== undefined && l.d !== undefined) {
return new i({ prv: l.d, curve: l.curve });
}if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d === undefined) {
var P = new w();P.setPublic(l.n, l.e);return P;
}if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.co !== undefined && l.qi === undefined) {
var P = new w();P.setPrivateEx(l.n, l.e, l.d, l.p, l.q, l.dp, l.dq, l.co);return P;
}if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p === undefined) {
var P = new w();P.setPrivate(l.n, l.e, l.d);return P;
}if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x === undefined) {
var P = new C();P.setPublic(l.p, l.q, l.g, l.y);return P;
}if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x !== undefined) {
var P = new C();P.setPrivate(l.p, l.q, l.g, l.y, l.x);return P;
}if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d === undefined) {
var P = new w();P.setPublic(b64utohex(l.n), b64utohex(l.e));return P;
}if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.qi !== undefined) {
var P = new w();P.setPrivateEx(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d), b64utohex(l.p), b64utohex(l.q), b64utohex(l.dp), b64utohex(l.dq), b64utohex(l.qi));return P;
}if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined) {
var P = new w();P.setPrivate(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d));return P;
}if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d === undefined) {
var j = new i({ curve: l.crv });var t = j.ecparams.keylen / 4;var B = ("0000000000" + b64utohex(l.x)).slice(-t);var z = ("0000000000" + b64utohex(l.y)).slice(-t);var u = "04" + B + z;j.setPublicKeyHex(u);return j;
}if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d !== undefined) {
var j = new i({ curve: l.crv });var t = j.ecparams.keylen / 4;var B = ("0000000000" + b64utohex(l.x)).slice(-t);var z = ("0000000000" + b64utohex(l.y)).slice(-t);var u = "04" + B + z;var b = ("0000000000" + b64utohex(l.d)).slice(-t);j.setPublicKeyHex(u);j.setPrivateKeyHex(b);return j;
}if (n === "pkcs5prv") {
var J = l,
G = ASN1HEX,
N,
P;N = L(J, 0);if (N.length === 9) {
P = new w();P.readPKCS5PrvKeyHex(J);
} else {
if (N.length === 6) {
P = new C();P.readPKCS5PrvKeyHex(J);
} else {
if (N.length > 2 && J.substr(N[1], 2) === "04") {
P = new i();P.readPKCS5PrvKeyHex(J);
} else {
throw "unsupported PKCS#1/5 hexadecimal key";
}
}
}return P;
}if (n === "pkcs8prv") {
var P = F.getKeyFromPlainPrivatePKCS8Hex(l);return P;
}if (n === "pkcs8pub") {
return F._getKeyFromPublicPKCS8Hex(l);
}if (n === "x509pub") {
return X509.getPublicKeyFromCertHex(l);
}if (l.indexOf("-END CERTIFICATE-", 0) != -1 || l.indexOf("-END X509 CERTIFICATE-", 0) != -1 || l.indexOf("-END TRUSTED CERTIFICATE-", 0) != -1) {
return X509.getPublicKeyFromCertPEM(l);
}if (l.indexOf("-END PUBLIC KEY-") != -1) {
var O = pemtohex(l, "PUBLIC KEY");return F._getKeyFromPublicPKCS8Hex(O);
}if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {
var m = M(l, "RSA PRIVATE KEY");return F.getKey(m, null, "pkcs5prv");
}if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {
var I = M(l, "DSA PRIVATE KEY");var E = d(I, 0, [1], "02");var D = d(I, 0, [2], "02");var K = d(I, 0, [3], "02");var r = d(I, 0, [4], "02");var s = d(I, 0, [5], "02");var P = new C();P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));return P;
}if (l.indexOf("-END PRIVATE KEY-") != -1) {
return F.getKeyFromPlainPrivatePKCS8PEM(l);
}if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
var o = F.getDecryptedKeyHex(l, k);var H = new RSAKey();H.readPKCS5PrvKeyHex(o);return H;
}if (l.indexOf("-END EC PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
var I = F.getDecryptedKeyHex(l, k);var P = d(I, 0, [1], "04");var f = d(I, 0, [2, 0], "06");var A = d(I, 0, [3, 0], "03").substr(2);var e = "";if (KJUR.crypto.OID.oidhex2name[f] !== undefined) {
e = KJUR.crypto.OID.oidhex2name[f];
} else {
throw "undefined OID(hex) in KJUR.crypto.OID: " + f;
}var j = new i({ curve: e });j.setPublicKeyHex(A);j.setPrivateKeyHex(P);j.isPublic = false;return j;
}if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
var I = F.getDecryptedKeyHex(l, k);var E = d(I, 0, [1], "02");var D = d(I, 0, [2], "02");var K = d(I, 0, [3], "02");var r = d(I, 0, [4], "02");var s = d(I, 0, [5], "02");var P = new C();P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));return P;
}if (l.indexOf("-END ENCRYPTED PRIVATE KEY-") != -1) {
return F.getKeyFromEncryptedPKCS8PEM(l, k);
}throw "not supported argument";
};KEYUTIL.generateKeypair = function (a, c) {
if (a == "RSA") {
var b = c;var h = new RSAKey();h.generate(b, "10001");h.isPrivate = true;h.isPublic = true;var f = new RSAKey();var e = h.n.toString(16);var i = h.e.toString(16);f.setPublic(e, i);f.isPrivate = false;f.isPublic = true;var k = {};k.prvKeyObj = h;k.pubKeyObj = f;return k;
} else {
if (a == "EC") {
var d = c;var g = new KJUR.crypto.ECDSA({ curve: d });var j = g.generateKeyPairHex();var h = new KJUR.crypto.ECDSA({ curve: d });h.setPublicKeyHex(j.ecpubhex);h.setPrivateKeyHex(j.ecprvhex);h.isPrivate = true;h.isPublic = false;var f = new KJUR.crypto.ECDSA({ curve: d });f.setPublicKeyHex(j.ecpubhex);f.isPrivate = false;f.isPublic = true;var k = {};k.prvKeyObj = h;k.pubKeyObj = f;return k;
} else {
throw "unknown algorithm: " + a;
}
}
};KEYUTIL.getPEM = function (b, D, y, m, q, j) {
var F = KJUR,
k = F.asn1,
z = k.DERObjectIdentifier,
f = k.DERInteger,
l = k.ASN1Util.newObject,
a = k.x509,
C = a.SubjectPublicKeyInfo,
e = F.crypto,
u = e.DSA,
r = e.ECDSA,
n = RSAKey;function A(s) {
var G = l({ seq: [{ "int": 0 }, { "int": { bigint: s.n } }, { "int": s.e }, { "int": { bigint: s.d } }, { "int": { bigint: s.p } }, { "int": { bigint: s.q } }, { "int": { bigint: s.dmp1 } }, { "int": { bigint: s.dmq1 } }, { "int": { bigint: s.coeff } }] });return G;
}function B(G) {
var s = l({ seq: [{ "int": 1 }, { octstr: { hex: G.prvKeyHex } }, { tag: ["a0", true, { oid: { name: G.curveName } }] }, { tag: ["a1", true, { bitstr: { hex: "00" + G.pubKeyHex } }] }] });return s;
}function x(s) {
var G = l({ seq: [{ "int": 0 }, { "int": { bigint: s.p } }, { "int": { bigint: s.q } }, { "int": { bigint: s.g } }, { "int": { bigint: s.y } }, { "int": { bigint: s.x } }] });return G;
}if ((n !== undefined && b instanceof n || u !== undefined && b instanceof u || r !== undefined && b instanceof r) && b.isPublic == true && (D === undefined || D == "PKCS8PUB")) {
var E = new C(b);var w = E.getEncodedHex();return hextopem(w, "PUBLIC KEY");
}if (D == "PKCS1PRV" && n !== undefined && b instanceof n && (y === undefined || y == null) && b.isPrivate == true) {
var E = A(b);var w = E.getEncodedHex();return hextopem(w, "RSA PRIVATE KEY");
}if (D == "PKCS1PRV" && r !== undefined && b instanceof r && (y === undefined || y == null) && b.isPrivate == true) {
var i = new z({ name: b.curveName });var v = i.getEncodedHex();var h = B(b);var t = h.getEncodedHex();var p = "";p += hextopem(v, "EC PARAMETERS");p += hextopem(t, "EC PRIVATE KEY");return p;
}if (D == "PKCS1PRV" && u !== undefined && b instanceof u && (y === undefined || y == null) && b.isPrivate == true) {
var E = x(b);var w = E.getEncodedHex();return hextopem(w, "DSA PRIVATE KEY");
}if (D == "PKCS5PRV" && n !== undefined && b instanceof n && y !== undefined && y != null && b.isPrivate == true) {
var E = A(b);var w = E.getEncodedHex();if (m === undefined) {
m = "DES-EDE3-CBC";
}return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", w, y, m, j);
}if (D == "PKCS5PRV" && r !== undefined && b instanceof r && y !== undefined && y != null && b.isPrivate == true) {
var E = B(b);var w = E.getEncodedHex();if (m === undefined) {
m = "DES-EDE3-CBC";
}return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC", w, y, m, j);
}if (D == "PKCS5PRV" && u !== undefined && b instanceof u && y !== undefined && y != null && b.isPrivate == true) {
var E = x(b);var w = E.getEncodedHex();if (m === undefined) {
m = "DES-EDE3-CBC";
}return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA", w, y, m, j);
}var o = function o(G, s) {
var I = c(G, s);var H = new l({ seq: [{ seq: [{ oid: { name: "pkcs5PBES2" } }, { seq: [{ seq: [{ oid: { name: "pkcs5PBKDF2" } }, { seq: [{ octstr: { hex: I.pbkdf2Salt } }, { "int": I.pbkdf2Iter }] }] }, { seq: [{ oid: { name: "des-EDE3-CBC" } }, { octstr: { hex: I.encryptionSchemeIV } }] }] }] }, { octstr: { hex: I.ciphertext } }] });return H.getEncodedHex();
};var c = function c(N, O) {
var H = 100;var M = CryptoJS.lib.WordArray.random(8);var L = "DES-EDE3-CBC";var s = CryptoJS.lib.WordArray.random(8);var I = CryptoJS.PBKDF2(O, M, { keySize: 192 / 32, iterations: H });var J = CryptoJS.enc.Hex.parse(N);var K = CryptoJS.TripleDES.encrypt(J, I, { iv: s }) + "";var G = {};G.ciphertext = K;G.pbkdf2Salt = CryptoJS.enc.Hex.stringify(M);G.pbkdf2Iter = H;G.encryptionSchemeAlg = L;G.encryptionSchemeIV = CryptoJS.enc.Hex.stringify(s);return G;
};if (D == "PKCS8PRV" && n != undefined && b instanceof n && b.isPrivate == true) {
var g = A(b);var d = g.getEncodedHex();var E = l({ seq: [{ "int": 0 }, { seq: [{ oid: { name: "rsaEncryption" } }, { "null": true }] }, { octstr: { hex: d } }] });var w = E.getEncodedHex();if (y === undefined || y == null) {
return hextopem(w, "PRIVATE KEY");
} else {
var t = o(w, y);return hextopem(t, "ENCRYPTED PRIVATE KEY");
}
}if (D == "PKCS8PRV" && r !== undefined && b instanceof r && b.isPrivate == true) {
var g = new l({ seq: [{ "int": 1 }, { octstr: { hex: b.prvKeyHex } }, { tag: ["a1", true, { bitstr: { hex: "00" + b.pubKeyHex } }] }] });var d = g.getEncodedHex();var E = l({ seq: [{ "int": 0 }, { seq: [{ oid: { name: "ecPublicKey" } }, { oid: { name: b.curveName } }] }, { octstr: { hex: d } }] });var w = E.getEncodedHex();if (y === undefined || y == null) {
return hextopem(w, "PRIVATE KEY");
} else {
var t = o(w, y);return hextopem(t, "ENCRYPTED PRIVATE KEY");
}
}if (D == "PKCS8PRV" && u !== undefined && b instanceof u && b.isPrivate == true) {
var g = new f({ bigint: b.x });var d = g.getEncodedHex();var E = l({ seq: [{ "int": 0 }, { seq: [{ oid: { name: "dsa" } }, { seq: [{ "int": { bigint: b.p } }, { "int": { bigint: b.q } }, { "int": { bigint: b.g } }] }] }, { octstr: { hex: d } }] });var w = E.getEncodedHex();if (y === undefined || y == null) {
return hextopem(w, "PRIVATE KEY");
} else {
var t = o(w, y);return hextopem(t, "ENCRYPTED PRIVATE KEY");
}
}throw "unsupported object nor format";
};KEYUTIL.getKeyFromCSRPEM = function (b) {
var a = pemtohex(b, "CERTIFICATE REQUEST");var c = KEYUTIL.getKeyFromCSRHex(a);return c;
};KEYUTIL.getKeyFromCSRHex = function (a) {
var c = KEYUTIL.parseCSRHex(a);var b = KEYUTIL.getKey(c.p8pubkeyhex, null, "pkcs8pub");return b;
};KEYUTIL.parseCSRHex = function (d) {
var i = ASN1HEX;var f = i.getChildIdx;var c = i.getTLV;var b = {};var g = d;if (g.substr(0, 2) != "30") {
throw "malformed CSR(code:001)";
}var e = f(g, 0);if (e.length < 1) {
throw "malformed CSR(code:002)";
}if (g.substr(e[0], 2) != "30") {
throw "malformed CSR(code:003)";
}var a = f(g, e[0]);if (a.length < 3) {
throw "malformed CSR(code:004)";
}b.p8pubkeyhex = c(g, a[2]);return b;
};KEYUTIL.getJWKFromKey = function (d) {
var b = {};if (d instanceof RSAKey && d.isPrivate) {
b.kty = "RSA";b.n = hextob64u(d.n.toString(16));b.e = hextob64u(d.e.toString(16));b.d = hextob64u(d.d.toString(16));b.p = hextob64u(d.p.toString(16));b.q = hextob64u(d.q.toString(16));b.dp = hextob64u(d.dmp1.toString(16));b.dq = hextob64u(d.dmq1.toString(16));b.qi = hextob64u(d.coeff.toString(16));return b;
} else {
if (d instanceof RSAKey && d.isPublic) {
b.kty = "RSA";b.n = hextob64u(d.n.toString(16));b.e = hextob64u(d.e.toString(16));return b;
} else {
if (d instanceof KJUR.crypto.ECDSA && d.isPrivate) {
var a = d.getShortNISTPCurveName();if (a !== "P-256" && a !== "P-384") {
throw "unsupported curve name for JWT: " + a;
}var c = d.getPublicKeyXYHex();b.kty = "EC";b.crv = a;b.x = hextob64u(c.x);b.y = hextob64u(c.y);b.d = hextob64u(d.prvKeyHex);return b;
} else {
if (d instanceof KJUR.crypto.ECDSA && d.isPublic) {
var a = d.getShortNISTPCurveName();if (a !== "P-256" && a !== "P-384") {
throw "unsupported curve name for JWT: " + a;
}var c = d.getPublicKeyXYHex();b.kty = "EC";b.crv = a;b.x = hextob64u(c.x);b.y = hextob64u(c.y);return b;
}
}
}
}throw "not supported key object";
};
RSAKey.getPosArrayOfChildrenFromHex = function (a) {
return ASN1HEX.getChildIdx(a, 0);
};RSAKey.getHexValueArrayOfChildrenFromHex = function (f) {
var n = ASN1HEX;var i = n.getV;var k = RSAKey.getPosArrayOfChildrenFromHex(f);var e = i(f, k[0]);var j = i(f, k[1]);var b = i(f, k[2]);var c = i(f, k[3]);var h = i(f, k[4]);var g = i(f, k[5]);var m = i(f, k[6]);var l = i(f, k[7]);var d = i(f, k[8]);var k = new Array();k.push(e, j, b, c, h, g, m, l, d);return k;
};RSAKey.prototype.readPrivateKeyFromPEMString = function (d) {
var c = pemtohex(d);var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]);
};RSAKey.prototype.readPKCS5PrvKeyHex = function (c) {
var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]);
};RSAKey.prototype.readPKCS8PrvKeyHex = function (e) {
var c, j, l, b, a, f, d, k;var m = ASN1HEX;var g = m.getVbyList;if (m.isASN1HEX(e) === false) {
throw "not ASN.1 hex string";
}try {
c = g(e, 0, [2, 0, 1], "02");j = g(e, 0, [2, 0, 2], "02");l = g(e, 0, [2, 0, 3], "02");b = g(e, 0, [2, 0, 4], "02");a = g(e, 0, [2, 0, 5], "02");f = g(e, 0, [2, 0, 6], "02");d = g(e, 0, [2, 0, 7], "02");k = g(e, 0, [2, 0, 8], "02");
} catch (i) {
throw "malformed PKCS#8 plain RSA private key";
}this.setPrivateEx(c, j, l, b, a, f, d, k);
};RSAKey.prototype.readPKCS5PubKeyHex = function (c) {
var e = ASN1HEX;var b = e.getV;if (e.isASN1HEX(c) === false) {
throw "keyHex is not ASN.1 hex string";
}var a = e.getChildIdx(c, 0);if (a.length !== 2 || c.substr(a[0], 2) !== "02" || c.substr(a[1], 2) !== "02") {
throw "wrong hex for PKCS#5 public key";
}var f = b(c, a[0]);var d = b(c, a[1]);this.setPublic(f, d);
};RSAKey.prototype.readPKCS8PubKeyHex = function (b) {
var c = ASN1HEX;if (c.isASN1HEX(b) === false) {
throw "not ASN.1 hex string";
}if (c.getTLVbyList(b, 0, [0, 0]) !== "06092a864886f70d010101") {
throw "not PKCS8 RSA public key";
}var a = c.getTLVbyList(b, 0, [1, 0]);this.readPKCS5PubKeyHex(a);
};RSAKey.prototype.readCertPubKeyHex = function (b, d) {
var a, c;a = new X509();a.readCertHex(b);c = a.getPublicKeyHex();this.readPKCS8PubKeyHex(c);
};
var _RE_HEXDECONLY = new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]", "gi");function _rsasign_getHexPaddedDigestInfoForString(d, e, a) {
var b = function b(f) {
return KJUR.crypto.Util.hashString(f, a);
};var c = b(d);return KJUR.crypto.Util.getPaddedDigestInfoHex(c, a, e);
}function _zeroPaddingOfSignature(e, d) {
var c = "";var a = d / 4 - e.length;for (var b = 0; b < a; b++) {
c = c + "0";
}return c + e;
}RSAKey.prototype.sign = function (d, a) {
var b = function b(e) {
return KJUR.crypto.Util.hashString(e, a);
};var c = b(d);return this.signWithMessageHash(c, a);
};RSAKey.prototype.signWithMessageHash = function (e, c) {
var f = KJUR.crypto.Util.getPaddedDigestInfoHex(e, c, this.n.bitLength());var b = parseBigInt(f, 16);var d = this.doPrivate(b);var a = d.toString(16);return _zeroPaddingOfSignature(a, this.n.bitLength());
};function pss_mgf1_str(c, a, e) {
var b = "",
d = 0;while (b.length < a) {
b += hextorstr(e(rstrtohex(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]))));d += 1;
}return b;
}RSAKey.prototype.signPSS = function (e, a, d) {
var c = function c(f) {
return KJUR.crypto.Util.hashHex(f, a);
};var b = c(rstrtohex(e));if (d === undefined) {
d = -1;
}return this.signWithMessageHashPSS(b, a, d);
};RSAKey.prototype.signWithMessageHashPSS = function (l, a, k) {
var b = hextorstr(l);var g = b.length;var m = this.n.bitLength() - 1;var c = Math.ceil(m / 8);var d;var o = function o(i) {
return KJUR.crypto.Util.hashHex(i, a);
};if (k === -1 || k === undefined) {
k = g;
} else {
if (k === -2) {
k = c - g - 2;
} else {
if (k < -2) {
throw "invalid salt length";
}
}
}if (c < g + k + 2) {
throw "data too long";
}var f = "";if (k > 0) {
f = new Array(k);new SecureRandom().nextBytes(f);f = String.fromCharCode.apply(String, f);
}var n = hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + b + f)));var j = [];for (d = 0; d < c - k - g - 2; d += 1) {
j[d] = 0;
}var e = String.fromCharCode.apply(String, j) + "\x01" + f;var h = pss_mgf1_str(n, e.length, o);var q = [];for (d = 0; d < e.length; d += 1) {
q[d] = e.charCodeAt(d) ^ h.charCodeAt(d);
}var p = 65280 >> 8 * c - m & 255;q[0] &= ~p;for (d = 0; d < g; d++) {
q.push(n.charCodeAt(d));
}q.push(188);return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16), this.n.bitLength());
};function _rsasign_getDecryptSignatureBI(a, d, c) {
var b = new RSAKey();b.setPublic(d, c);var e = b.doPublic(a);return e;
}function _rsasign_getHexDigestInfoFromSig(a, c, b) {
var e = _rsasign_getDecryptSignatureBI(a, c, b);var d = e.toString(16).replace(/^1f+00/, "");return d;
}function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f) {
for (var e in KJUR.crypto.Util.DIGESTINFOHEAD) {
var d = KJUR.crypto.Util.DIGESTINFOHEAD[e];var b = d.length;if (f.substring(0, b) == d) {
var c = [e, f.substring(b)];return c;
}
}return [];
}RSAKey.prototype.verify = function (f, j) {
j = j.replace(_RE_HEXDECONLY, "");j = j.replace(/[ \n]+/g, "");var b = parseBigInt(j, 16);if (b.bitLength() > this.n.bitLength()) {
return 0;
}var i = this.doPublic(b);var e = i.toString(16).replace(/^1f+00/, "");var g = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if (g.length == 0) {
return false;
}var d = g[0];var h = g[1];var a = function a(k) {
return KJUR.crypto.Util.hashString(k, d);
};var c = a(f);return h == c;
};RSAKey.prototype.verifyWithMessageHash = function (e, a) {
a = a.replace(_RE_HEXDECONLY, "");a = a.replace(/[ \n]+/g, "");var b = parseBigInt(a, 16);if (b.bitLength() > this.n.bitLength()) {
return 0;
}var h = this.doPublic(b);var g = h.toString(16).replace(/^1f+00/, "");var c = _rsasign_getAlgNameAndHashFromHexDisgestInfo(g);if (c.length == 0) {
return false;
}var d = c[0];var f = c[1];return f == e;
};RSAKey.prototype.verifyPSS = function (c, b, a, f) {
var e = function e(g) {
return KJUR.crypto.Util.hashHex(g, a);
};var d = e(rstrtohex(c));if (f === undefined) {
f = -1;
}return this.verifyWithMessageHashPSS(d, b, a, f);
};RSAKey.prototype.verifyWithMessageHashPSS = function (f, s, l, c) {
var k = new BigInteger(s, 16);if (k.bitLength() > this.n.bitLength()) {
return false;
}var r = function r(i) {
return KJUR.crypto.Util.hashHex(i, l);
};var j = hextorstr(f);var h = j.length;var g = this.n.bitLength() - 1;var m = Math.ceil(g / 8);var q;if (c === -1 || c === undefined) {
c = h;
} else {
if (c === -2) {
c = m - h - 2;
} else {
if (c < -2) {
throw "invalid salt length";
}
}
}if (m < h + c + 2) {
throw "data too long";
}var a = this.doPublic(k).toByteArray();for (q = 0; q < a.length; q += 1) {
a[q] &= 255;
}while (a.length < m) {
a.unshift(0);
}if (a[m - 1] !== 188) {
throw "encoded message does not end in 0xbc";
}a = String.fromCharCode.apply(String, a);var d = a.substr(0, m - h - 1);var e = a.substr(d.length, h);var p = 65280 >> 8 * m - g & 255;if ((d.charCodeAt(0) & p) !== 0) {
throw "bits beyond keysize not zero";
}var n = pss_mgf1_str(e, d.length, r);var o = [];for (q = 0; q < d.length; q += 1) {
o[q] = d.charCodeAt(q) ^ n.charCodeAt(q);
}o[0] &= ~p;var b = m - h - c - 2;for (q = 0; q < b; q += 1) {
if (o[q] !== 0) {
throw "leftmost octets not zero";
}
}if (o[b] !== 1) {
throw "0x01 marker not found";
}return e === hextorstr(r(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + j + String.fromCharCode.apply(String, o.slice(-c)))));
};RSAKey.SALT_LEN_HLEN = -1;RSAKey.SALT_LEN_MAX = -2;RSAKey.SALT_LEN_RECOVER = -2;
function X509() {
var k = ASN1HEX,
j = k.getChildIdx,
h = k.getV,
b = k.getTLV,
f = k.getVbyList,
c = k.getTLVbyList,
g = k.getIdxbyList,
d = k.getVidx,
i = k.oidname,
a = X509,
e = pemtohex;this.hex = null;this.version = 0;this.foffset = 0;this.aExtInfo = null;this.getVersion = function () {
if (this.hex === null || this.version !== 0) {
return this.version;
}if (c(this.hex, 0, [0, 0]) !== "a003020102") {
this.version = 1;this.foffset = -1;return 1;
}this.version = 3;return 3;
};this.getSerialNumberHex = function () {
return f(this.hex, 0, [0, 1 + this.foffset], "02");
};this.getSignatureAlgorithmField = function () {
return i(f(this.hex, 0, [0, 2 + this.foffset, 0], "06"));
};this.getIssuerHex = function () {
return c(this.hex, 0, [0, 3 + this.foffset], "30");
};this.getIssuerString = function () {
return a.hex2dn(this.getIssuerHex());
};this.getSubjectHex = function () {
return c(this.hex, 0, [0, 5 + this.foffset], "30");
};this.getSubjectString = function () {
return a.hex2dn(this.getSubjectHex());
};this.getNotBefore = function () {
var l = f(this.hex, 0, [0, 4 + this.foffset, 0]);l = l.replace(/(..)/g, "%$1");l = decodeURIComponent(l);return l;
};this.getNotAfter = function () {
var l = f(this.hex, 0, [0, 4 + this.foffset, 1]);l = l.replace(/(..)/g, "%$1");l = decodeURIComponent(l);return l;
};this.getPublicKeyHex = function () {
return k.getTLVbyList(this.hex, 0, [0, 6 + this.foffset], "30");
};this.getPublicKeyIdx = function () {
return g(this.hex, 0, [0, 6 + this.foffset], "30");
};this.getPublicKeyContentIdx = function () {
var l = this.getPublicKeyIdx();return g(this.hex, l, [1, 0], "30");
};this.getPublicKey = function () {
return KEYUTIL.getKey(this.getPublicKeyHex(), null, "pkcs8pub");
};this.getSignatureAlgorithmName = function () {
return i(f(this.hex, 0, [1, 0], "06"));
};this.getSignatureValueHex = function () {
return f(this.hex, 0, [2], "03", true);
};this.verifySignature = function (n) {
var o = this.getSignatureAlgorithmName();var l = this.getSignatureValueHex();var m = c(this.hex, 0, [0], "30");var p = new KJUR.crypto.Signature({ alg: o });p.init(n);p.updateHex(m);return p.verify(l);
};this.parseExt = function () {
if (this.version !== 3) {
return -1;
}var p = g(this.hex, 0, [0, 7, 0], "30");var m = j(this.hex, p);this.aExtInfo = new Array();for (var n = 0; n < m.length; n++) {
var q = {};q.critical = false;var l = j(this.hex, m[n]);var r = 0;if (l.length === 3) {
q.critical = true;r = 1;
}q.oid = k.hextooidstr(f(this.hex, m[n], [0], "06"));var o = g(this.hex, m[n], [1 + r]);q.vidx = d(this.hex, o);this.aExtInfo.push(q);
}
};this.getExtInfo = function (n) {
var l = this.aExtInfo;var o = n;if (!n.match(/^[0-9.]+$/)) {
o = KJUR.asn1.x509.OID.name2oid(n);
}if (o === "") {
return undefined;
}for (var m = 0; m < l.length; m++) {
if (l[m].oid === o) {
return l[m];
}
}return undefined;
};this.getExtBasicConstraints = function () {
var n = this.getExtInfo("basicConstraints");if (n === undefined) {
return n;
}var l = h(this.hex, n.vidx);if (l === "") {
return {};
}if (l === "0101ff") {
return { cA: true };
}if (l.substr(0, 8) === "0101ff02") {
var o = h(l, 6);var m = parseInt(o, 16);return { cA: true, pathLen: m };
}throw "basicConstraints parse error";
};this.getExtKeyUsageBin = function () {
var o = this.getExtInfo("keyUsage");if (o === undefined) {
return "";
}var m = h(this.hex, o.vidx);if (m.length % 2 != 0 || m.length <= 2) {
throw "malformed key usage value";
}var l = parseInt(m.substr(0, 2));var n = parseInt(m.substr(2), 16).toString(2);return n.substr(0, n.length - l);
};this.getExtKeyUsageString = function () {
var n = this.getExtKeyUsageBin();var l = new Array();for (var m = 0; m < n.length; m++) {
if (n.substr(m, 1) == "1") {
l.push(X509.KEYUSAGE_NAME[m]);
}
}return l.join(",");
};this.getExtSubjectKeyIdentifier = function () {
var l = this.getExtInfo("subjectKeyIdentifier");if (l === undefined) {
return l;
}return h(this.hex, l.vidx);
};this.getExtAuthorityKeyIdentifier = function () {
var p = this.getExtInfo("authorityKeyIdentifier");if (p === undefined) {
return p;
}var l = {};var o = b(this.hex, p.vidx);var m = j(o, 0);for (var n = 0; n < m.length; n++) {
if (o.substr(m[n], 2) === "80") {
l.kid = h(o, m[n]);
}
}return l;
};this.getExtExtKeyUsageName = function () {
var p = this.getExtInfo("extKeyUsage");if (p === undefined) {
return p;
}var l = new Array();var o = b(this.hex, p.vidx);if (o === "") {
return l;
}var m = j(o, 0);for (var n = 0; n < m.length; n++) {
l.push(i(h(o, m[n])));
}return l;
};this.getExtSubjectAltName = function () {
var m = this.getExtSubjectAltName2();var l = new Array();for (var n = 0; n < m.length; n++) {
if (m[n][0] === "DNS") {
l.push(m[n][1]);
}
}return l;
};this.getExtSubjectAltName2 = function () {
var p, s, r;var q = this.getExtInfo("subjectAltName");if (q === undefined) {
return q;
}var l = new Array();var o = b(this.hex, q.vidx);var m = j(o, 0);for (var n = 0; n < m.length; n++) {
r = o.substr(m[n], 2);p = h(o, m[n]);if (r === "81") {
s = hextoutf8(p);l.push(["MAIL", s]);
}if (r === "82") {
s = hextoutf8(p);l.push(["DNS", s]);
}if (r === "84") {
s = X509.hex2dn(p, 0);l.push(["DN", s]);
}if (r === "86") {
s = hextoutf8(p);l.push(["URI", s]);
}if (r === "87") {
s = hextoip(p);l.push(["IP", s]);
}
}return l;
};this.getExtCRLDistributionPointsURI = function () {
var q = this.getExtInfo("cRLDistributionPoints");if (q === undefined) {
return q;
}var l = new Array();var m = j(this.hex, q.vidx);for (var o = 0; o < m.length; o++) {
try {
var r = f(this.hex, m[o], [0, 0, 0], "86");var p = hextoutf8(r);l.push(p);
} catch (n) {}
}return l;
};this.getExtAIAInfo = function () {
var p = this.getExtInfo("authorityInfoAccess");if (p === undefined) {
return p;
}var l = { ocsp: [], caissuer: [] };var m = j(this.hex, p.vidx);for (var n = 0; n < m.length; n++) {
var q = f(this.hex, m[n], [0], "06");var o = f(this.hex, m[n], [1], "86");if (q === "2b06010505073001") {
l.ocsp.push(hextoutf8(o));
}if (q === "2b06010505073002") {
l.caissuer.push(hextoutf8(o));
}
}return l;
};this.getExtCertificatePolicies = function () {
var o = this.getExtInfo("certificatePolicies");if (o === undefined) {
return o;
}var l = b(this.hex, o.vidx);var u = [];var s = j(l, 0);for (var r = 0; r < s.length; r++) {
var t = {};var n = j(l, s[r]);t.id = i(h(l, n[0]));if (n.length === 2) {
var m = j(l, n[1]);for (var q = 0; q < m.length; q++) {
var p = f(l, m[q], [0], "06");if (p === "2b06010505070201") {
t.cps = hextoutf8(f(l, m[q], [1]));
} else {
if (p === "2b06010505070202") {
t.unotice = hextoutf8(f(l, m[q], [1, 0]));
}
}
}
}u.push(t);
}return u;
};this.readCertPEM = function (l) {
this.readCertHex(e(l));
};this.readCertHex = function (l) {
this.hex = l;this.getVersion();try {
g(this.hex, 0, [0, 7], "a3");this.parseExt();
} catch (m) {}
};this.getInfo = function () {
var m = X509;var B, u, z;B = "Basic Fields\n";B += " serial number: " + this.getSerialNumberHex() + "\n";B += " signature algorithm: " + this.getSignatureAlgorithmField() + "\n";B += " issuer: " + this.getIssuerString() + "\n";B += " notBefore: " + this.getNotBefore() + "\n";B += " notAfter: " + this.getNotAfter() + "\n";B += " subject: " + this.getSubjectString() + "\n";B += " subject public key info: \n";u = this.getPublicKey();B += " key algorithm: " + u.type + "\n";if (u.type === "RSA") {
B += " n=" + hextoposhex(u.n.toString(16)).substr(0, 16) + "...\n";B += " e=" + hextoposhex(u.e.toString(16)) + "\n";
}z = this.aExtInfo;if (z !== undefined && z !== null) {
B += "X509v3 Extensions:\n";for (var r = 0; r < z.length; r++) {
var n = z[r];var A = KJUR.asn1.x509.OID.oid2name(n.oid);if (A === "") {
A = n.oid;
}var x = "";if (n.critical === true) {
x = "CRITICAL";
}B += " " + A + " " + x + ":\n";if (A === "basicConstraints") {
var v = this.getExtBasicConstraints();if (v.cA === undefined) {
B += " {}\n";
} else {
B += " cA=true";if (v.pathLen !== undefined) {
B += ", pathLen=" + v.pathLen;
}B += "\n";
}
} else {
if (A === "keyUsage") {
B += " " + this.getExtKeyUsageString() + "\n";
} else {
if (A === "subjectKeyIdentifier") {
B += " " + this.getExtSubjectKeyIdentifier() + "\n";
} else {
if (A === "authorityKeyIdentifier") {
var l = this.getExtAuthorityKeyIdentifier();if (l.kid !== undefined) {
B += " kid=" + l.kid + "\n";
}
} else {
if (A === "extKeyUsage") {
var w = this.getExtExtKeyUsageName();B += " " + w.join(", ") + "\n";
} else {
if (A === "subjectAltName") {
var t = this.getExtSubjectAltName2();B += " " + t + "\n";
} else {
if (A === "cRLDistributionPoints") {
var y = this.getExtCRLDistributionPointsURI();B += " " + y + "\n";
} else {
if (A === "authorityInfoAccess") {
var p = this.getExtAIAInfo();if (p.ocsp !== undefined) {
B += " ocsp: " + p.ocsp.join(",") + "\n";
}if (p.caissuer !== undefined) {
B += " caissuer: " + p.caissuer.join(",") + "\n";
}
} else {
if (A === "certificatePolicies") {
var o = this.getExtCertificatePolicies();for (var q = 0; q < o.length; q++) {
if (o[q].id !== undefined) {
B += " policy oid: " + o[q].id + "\n";
}if (o[q].cps !== undefined) {
B += " cps: " + o[q].cps + "\n";
}
}
}
}
}
}
}
}
}
}
}
}
}B += "signature algorithm: " + this.getSignatureAlgorithmName() + "\n";B += "signature: " + this.getSignatureValueHex().substr(0, 16) + "...\n";return B;
};
}X509.hex2dn = function (f, b) {
if (b === undefined) {
b = 0;
}if (f.substr(b, 2) !== "30") {
throw "malformed DN";
}var c = new Array();var d = ASN1HEX.getChildIdx(f, b);for (var e = 0; e < d.length; e++) {
c.push(X509.hex2rdn(f, d[e]));
}c = c.map(function (a) {
return a.replace("/", "\\/");
});return "/" + c.join("/");
};X509.hex2rdn = function (f, b) {
if (b === undefined) {
b = 0;
}if (f.substr(b, 2) !== "31") {
throw "malformed RDN";
}var c = new Array();var d = ASN1HEX.getChildIdx(f, b);for (var e = 0; e < d.length; e++) {
c.push(X509.hex2attrTypeValue(f, d[e]));
}c = c.map(function (a) {
return a.replace("+", "\\+");
});return c.join("+");
};X509.hex2attrTypeValue = function (d, i) {
var j = ASN1HEX;var h = j.getV;if (i === undefined) {
i = 0;
}if (d.substr(i, 2) !== "30") {
throw "malformed attribute type and value";
}var g = j.getChildIdx(d, i);if (g.length !== 2 || d.substr(g[0], 2) !== "06") {
"malformed attribute type and value";
}var b = h(d, g[0]);var f = KJUR.asn1.ASN1Util.oidHexToInt(b);var e = KJUR.asn1.x509.OID.oid2atype(f);var a = h(d, g[1]);var c = hextorstr(a);return e + "=" + c;
};X509.getPublicKeyFromCertHex = function (b) {
var a = new X509();a.readCertHex(b);return a.getPublicKey();
};X509.getPublicKeyFromCertPEM = function (b) {
var a = new X509();a.readCertPEM(b);return a.getPublicKey();
};X509.getPublicKeyInfoPropOfCertPEM = function (c) {
var e = ASN1HEX;var g = e.getVbyList;var b = {};var a, f, d;b.algparam = null;a = new X509();a.readCertPEM(c);f = a.getPublicKeyHex();b.keyhex = g(f, 0, [1], "03").substr(2);b.algoid = g(f, 0, [0, 0], "06");if (b.algoid === "2a8648ce3d0201") {
b.algparam = g(f, 0, [0, 1], "06");
}return b;
};X509.KEYUSAGE_NAME = ["digitalSignature", "nonRepudiation", "keyEncipherment", "dataEncipherment", "keyAgreement", "keyCertSign", "cRLSign", "encipherOnly", "decipherOnly"];
if (typeof KJUR == "undefined" || !KJUR) {
exports.KJUR = KJUR = {};
}if (typeof KJUR.jws == "undefined" || !KJUR.jws) {
KJUR.jws = {};
}KJUR.jws.JWS = function () {
var b = KJUR,
a = b.jws.JWS,
c = a.isSafeJSONString;this.parseJWS = function (g, j) {
if (this.parsedJWS !== undefined && (j || this.parsedJWS.sigvalH !== undefined)) {
return;
}var i = g.match(/^([^.]+)\.([^.]+)\.([^.]+)$/);if (i == null) {
throw "JWS signature is not a form of 'Head.Payload.SigValue'.";
}var k = i[1];var e = i[2];var l = i[3];var n = k + "." + e;this.parsedJWS = {};this.parsedJWS.headB64U = k;this.parsedJWS.payloadB64U = e;this.parsedJWS.sigvalB64U = l;this.parsedJWS.si = n;if (!j) {
var h = b64utohex(l);var f = parseBigInt(h, 16);this.parsedJWS.sigvalH = h;this.parsedJWS.sigvalBI = f;
}var d = b64utoutf8(k);var m = b64utoutf8(e);this.parsedJWS.headS = d;this.parsedJWS.payloadS = m;if (!c(d, this.parsedJWS, "headP")) {
throw "malformed JSON string for JWS Head: " + d;
}
};
};KJUR.jws.JWS.sign = function (i, v, y, z, a) {
var w = KJUR,
m = w.jws,
q = m.JWS,
g = q.readSafeJSONString,
p = q.isSafeJSONString,
d = w.crypto,
k = d.ECDSA,
o = d.Mac,
c = d.Signature,
t = JSON;var s, j, n;if (typeof v != "string" && (typeof v === "undefined" ? "undefined" : _typeof(v)) != "object") {
throw "spHeader must be JSON string or object: " + v;
}if ((typeof v === "undefined" ? "undefined" : _typeof(v)) == "object") {
j = v;s = t.stringify(j);
}if (typeof v == "string") {
s = v;if (!p(s)) {
throw "JWS Head is not safe JSON string: " + s;
}j = g(s);
}n = y;if ((typeof y === "undefined" ? "undefined" : _typeof(y)) == "object") {
n = t.stringify(y);
}if ((i == "" || i == null) && j.alg !== undefined) {
i = j.alg;
}if (i != "" && i != null && j.alg === undefined) {
j.alg = i;s = t.stringify(j);
}if (i !== j.alg) {
throw "alg and sHeader.alg doesn't match: " + i + "!=" + j.alg;
}var r = null;if (q.jwsalg2sigalg[i] === undefined) {
throw "unsupported alg name: " + i;
} else {
r = q.jwsalg2sigalg[i];
}var e = utf8tob64u(s);var l = utf8tob64u(n);var b = e + "." + l;var x = "";if (r.substr(0, 4) == "Hmac") {
if (z === undefined) {
throw "mac key shall be specified for HS* alg";
}var h = new o({ alg: r, prov: "cryptojs", pass: z });h.updateString(b);x = h.doFinal();
} else {
if (r.indexOf("withECDSA") != -1) {
var f = new c({ alg: r });f.init(z, a);f.updateString(b);hASN1Sig = f.sign();x = KJUR.crypto.ECDSA.asn1SigToConcatSig(hASN1Sig);
} else {
if (r != "none") {
var f = new c({ alg: r });f.init(z, a);f.updateString(b);x = f.sign();
}
}
}var u = hextob64u(x);return b + "." + u;
};KJUR.jws.JWS.verify = function (w, B, n) {
var x = KJUR,
q = x.jws,
t = q.JWS,
i = t.readSafeJSONString,
e = x.crypto,
p = e.ECDSA,
s = e.Mac,
d = e.Signature,
m;if ((typeof RSAKey === "undefined" ? "undefined" : _typeof(RSAKey)) !== undefined) {
m = RSAKey;
}var y = w.split(".");if (y.length !== 3) {
return false;
}var f = y[0];var r = y[1];var c = f + "." + r;var A = b64utohex(y[2]);var l = i(b64utoutf8(y[0]));var k = null;var z = null;if (l.alg === undefined) {
throw "algorithm not specified in header";
} else {
k = l.alg;z = k.substr(0, 2);
}if (n != null && Object.prototype.toString.call(n) === "[object Array]" && n.length > 0) {
var b = ":" + n.join(":") + ":";if (b.indexOf(":" + k + ":") == -1) {
throw "algorithm '" + k + "' not accepted in the list";
}
}if (k != "none" && B === null) {
throw "key shall be specified to verify.";
}if (typeof B == "string" && B.indexOf("-----BEGIN ") != -1) {
B = KEYUTIL.getKey(B);
}if (z == "RS" || z == "PS") {
if (!(B instanceof m)) {
throw "key shall be a RSAKey obj for RS* and PS* algs";
}
}if (z == "ES") {
if (!(B instanceof p)) {
throw "key shall be a ECDSA obj for ES* algs";
}
}if (k == "none") {}var u = null;if (t.jwsalg2sigalg[l.alg] === undefined) {
throw "unsupported alg name: " + k;
} else {
u = t.jwsalg2sigalg[k];
}if (u == "none") {
throw "not supported";
} else {
if (u.substr(0, 4) == "Hmac") {
var o = null;if (B === undefined) {
throw "hexadecimal key shall be specified for HMAC";
}var j = new s({ alg: u, pass: B });j.updateString(c);o = j.doFinal();return A == o;
} else {
if (u.indexOf("withECDSA") != -1) {
var h = null;try {
h = p.concatSigToASN1Sig(A);
} catch (v) {
return false;
}var g = new d({ alg: u });g.init(B);g.updateString(c);return g.verify(h);
} else {
var g = new d({ alg: u });g.init(B);g.updateString(c);return g.verify(A);
}
}
}
};KJUR.jws.JWS.parse = function (g) {
var c = g.split(".");var b = {};var f, e, d;if (c.length != 2 && c.length != 3) {
throw "malformed sJWS: wrong number of '.' splitted elements";
}f = c[0];e = c[1];if (c.length == 3) {
d = c[2];
}b.headerObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(f));b.payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(e));b.headerPP = JSON.stringify(b.headerObj, null, " ");if (b.payloadObj == null) {
b.payloadPP = b64utoutf8(e);
} else {
b.payloadPP = JSON.stringify(b.payloadObj, null, " ");
}if (d !== undefined) {
b.sigHex = b64utohex(d);
}return b;
};KJUR.jws.JWS.verifyJWT = function (e, l, r) {
var d = KJUR,
j = d.jws,
o = j.JWS,
n = o.readSafeJSONString,
p = o.inArray,
f = o.includedArray;var k = e.split(".");var c = k[0];var i = k[1];var q = c + "." + i;var m = b64utohex(k[2]);var h = n(b64utoutf8(c));var g = n(b64utoutf8(i));if (h.alg === undefined) {
return false;
}if (r.alg === undefined) {
throw "acceptField.alg shall be specified";
}if (!p(h.alg, r.alg)) {
return false;
}if (g.iss !== undefined && _typeof(r.iss) === "object") {
if (!p(g.iss, r.iss)) {
return false;
}
}if (g.sub !== undefined && _typeof(r.sub) === "object") {
if (!p(g.sub, r.sub)) {
return false;
}
}if (g.aud !== undefined && _typeof(r.aud) === "object") {
if (typeof g.aud == "string") {
if (!p(g.aud, r.aud)) {
return false;
}
} else {
if (_typeof(g.aud) == "object") {
if (!f(g.aud, r.aud)) {
return false;
}
}
}
}var b = j.IntDate.getNow();if (r.verifyAt !== undefined && typeof r.verifyAt === "number") {
b = r.verifyAt;
}if (r.gracePeriod === undefined || typeof r.gracePeriod !== "number") {
r.gracePeriod = 0;
}if (g.exp !== undefined && typeof g.exp == "number") {
if (g.exp + r.gracePeriod < b) {
return false;
}
}if (g.nbf !== undefined && typeof g.nbf == "number") {
if (b < g.nbf - r.gracePeriod) {
return false;
}
}if (g.iat !== undefined && typeof g.iat == "number") {
if (b < g.iat - r.gracePeriod) {
return false;
}
}if (g.jti !== undefined && r.jti !== undefined) {
if (g.jti !== r.jti) {
return false;
}
}if (!o.verify(e, l, r.alg)) {
return false;
}return true;
};KJUR.jws.JWS.includedArray = function (b, a) {
var c = KJUR.jws.JWS.inArray;if (b === null) {
return false;
}if ((typeof b === "undefined" ? "undefined" : _typeof(b)) !== "object") {
return false;
}if (typeof b.length !== "number") {
return false;
}for (var d = 0; d < b.length; d++) {
if (!c(b[d], a)) {
return false;
}
}return true;
};KJUR.jws.JWS.inArray = function (d, b) {
if (b === null) {
return false;
}if ((typeof b === "undefined" ? "undefined" : _typeof(b)) !== "object") {
return false;
}if (typeof b.length !== "number") {
return false;
}for (var c = 0; c < b.length; c++) {
if (b[c] == d) {
return true;
}
}return false;
};KJUR.jws.JWS.jwsalg2sigalg = { HS256: "HmacSHA256", HS384: "HmacSHA384", HS512: "HmacSHA512", RS256: "SHA256withRSA", RS384: "SHA384withRSA", RS512: "SHA512withRSA", ES256: "SHA256withECDSA", ES384: "SHA384withECDSA", PS256: "SHA256withRSAandMGF1", PS384: "SHA384withRSAandMGF1", PS512: "SHA512withRSAandMGF1", none: "none" };KJUR.jws.JWS.isSafeJSONString = function (c, b, d) {
var e = null;try {
e = jsonParse(c);if ((typeof e === "undefined" ? "undefined" : _typeof(e)) != "object") {
return 0;
}if (e.constructor === Array) {
return 0;
}if (b) {
b[d] = e;
}return 1;
} catch (a) {
return 0;
}
};KJUR.jws.JWS.readSafeJSONString = function (b) {
var c = null;try {
c = jsonParse(b);if ((typeof c === "undefined" ? "undefined" : _typeof(c)) != "object") {
return null;
}if (c.constructor === Array) {
return null;
}return c;
} catch (a) {
return null;
}
};KJUR.jws.JWS.getEncodedSignatureValueFromJWS = function (b) {
var a = b.match(/^[^.]+\.[^.]+\.([^.]+)$/);if (a == null) {
throw "JWS signature is not a form of 'Head.Payload.SigValue'.";
}return a[1];
};KJUR.jws.JWS.getJWKthumbprint = function (d) {
if (d.kty !== "RSA" && d.kty !== "EC" && d.kty !== "oct") {
throw "unsupported algorithm for JWK Thumprint";
}var a = "{";if (d.kty === "RSA") {
if (typeof d.n != "string" || typeof d.e != "string") {
throw "wrong n and e value for RSA key";
}a += '"e":"' + d.e + '",';a += '"kty":"' + d.kty + '",';a += '"n":"' + d.n + '"}';
} else {
if (d.kty === "EC") {
if (typeof d.crv != "string" || typeof d.x != "string" || typeof d.y != "string") {
throw "wrong crv, x and y value for EC key";
}a += '"crv":"' + d.crv + '",';a += '"kty":"' + d.kty + '",';a += '"x":"' + d.x + '",';a += '"y":"' + d.y + '"}';
} else {
if (d.kty === "oct") {
if (typeof d.k != "string") {
throw "wrong k value for oct(symmetric) key";
}a += '"kty":"' + d.kty + '",';a += '"k":"' + d.k + '"}';
}
}
}var b = rstrtohex(a);var c = KJUR.crypto.Util.hashHex(b, "sha256");var e = hextob64u(c);return e;
};KJUR.jws.IntDate = {};KJUR.jws.IntDate.get = function (c) {
var b = KJUR.jws.IntDate,
d = b.getNow,
a = b.getZulu;if (c == "now") {
return d();
} else {
if (c == "now + 1hour") {
return d() + 60 * 60;
} else {
if (c == "now + 1day") {
return d() + 60 * 60 * 24;
} else {
if (c == "now + 1month") {
return d() + 60 * 60 * 24 * 30;
} else {
if (c == "now + 1year") {
return d() + 60 * 60 * 24 * 365;
} else {
if (c.match(/Z$/)) {
return a(c);
} else {
if (c.match(/^[0-9]+$/)) {
return parseInt(c);
}
}
}
}
}
}
}throw "unsupported format: " + c;
};KJUR.jws.IntDate.getZulu = function (a) {
return zulutosec(a);
};KJUR.jws.IntDate.getNow = function () {
var a = ~~(new Date() / 1000);return a;
};KJUR.jws.IntDate.intDate2UTCString = function (a) {
var b = new Date(a * 1000);return b.toUTCString();
};KJUR.jws.IntDate.intDate2Zulu = function (e) {
var i = new Date(e * 1000),
h = ("0000" + i.getUTCFullYear()).slice(-4),
g = ("00" + (i.getUTCMonth() + 1)).slice(-2),
b = ("00" + i.getUTCDate()).slice(-2),
a = ("00" + i.getUTCHours()).slice(-2),
c = ("00" + i.getUTCMinutes()).slice(-2),
f = ("00" + i.getUTCSeconds()).slice(-2);return h + g + b + a + c + f + "Z";
};
exports.SecureRandom = SecureRandom;
exports.rng_seed_time = rng_seed_time;
exports.BigInteger = BigInteger;
exports.RSAKey = RSAKey;
var EDSA = KJUR.crypto.EDSA;
exports.EDSA = EDSA;
var DSA = KJUR.crypto.DSA;
exports.DSA = DSA;
var Signature = KJUR.crypto.Signature;
exports.Signature = Signature;
var MessageDigest = KJUR.crypto.MessageDigest;
exports.MessageDigest = MessageDigest;
var Mac = KJUR.crypto.Mac;
exports.Mac = Mac;
var Cipher = KJUR.crypto.Cipher;
exports.Cipher = Cipher;
exports.KEYUTIL = KEYUTIL;
exports.ASN1HEX = ASN1HEX;
exports.X509 = X509;
exports.CryptoJS = CryptoJS;
// ext/base64.js
exports.b64tohex = b64tohex;
exports.b64toBA = b64toBA;
// base64x.js
exports.stoBA = stoBA;
exports.BAtos = BAtos;
exports.BAtohex = BAtohex;
exports.stohex = stohex;
exports.stob64 = stob64;
exports.stob64u = stob64u;
exports.b64utos = b64utos;
exports.b64tob64u = b64tob64u;
exports.b64utob64 = b64utob64;
exports.hex2b64 = hex2b64;
exports.hextob64u = hextob64u;
exports.b64utohex = b64utohex;
exports.utf8tob64u = utf8tob64u;
exports.b64utoutf8 = b64utoutf8;
exports.utf8tob64 = utf8tob64;
exports.b64toutf8 = b64toutf8;
exports.utf8tohex = utf8tohex;
exports.hextoutf8 = hextoutf8;
exports.hextorstr = hextorstr;
exports.rstrtohex = rstrtohex;
exports.hextob64 = hextob64;
exports.hextob64nl = hextob64nl;
exports.b64nltohex = b64nltohex;
exports.hextopem = hextopem;
exports.pemtohex = pemtohex;
exports.hextoArrayBuffer = hextoArrayBuffer;
exports.ArrayBuffertohex = ArrayBuffertohex;
exports.zulutomsec = zulutomsec;
exports.zulutosec = zulutosec;
exports.zulutodate = zulutodate;
exports.datetozulu = datetozulu;
exports.uricmptohex = uricmptohex;
exports.hextouricmp = hextouricmp;
exports.ipv6tohex = ipv6tohex;
exports.hextoipv6 = hextoipv6;
exports.hextoip = hextoip;
exports.iptohex = iptohex;
exports.encodeURIComponentAll = encodeURIComponentAll;
exports.newline_toUnix = newline_toUnix;
exports.newline_toDos = newline_toDos;
exports.hextoposhex = hextoposhex;
exports.intarystrtohex = intarystrtohex;
exports.strdiffidx = strdiffidx;
// name spaces
exports.KJUR = KJUR;
var _crypto = KJUR.crypto;
exports.crypto = _crypto;
var _KJUR = KJUR;
var asn1 = _KJUR.asn1;
exports.asn1 = asn1;
var _KJUR2 = KJUR;
var jws = _KJUR2.jws;
exports.jws = jws;
var _KJUR3 = KJUR;
var lang = _KJUR3.lang;
exports.lang = lang;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
/***/ }),
/***/ "./node_modules/base64-js/index.js":
/*!*****************************************!*\
!*** ./node_modules/base64-js/index.js ***!
\*****************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray
var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
lookup[i] = code[i]
revLookup[code.charCodeAt(i)] = i
}
// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63
function getLens (b64) {
var len = b64.length
if (len % 4 > 0) {
throw new Error('Invalid string. Length must be a multiple of 4')
}
// Trim off extra bytes after placeholder bytes are found
// See: https://github.com/beatgammit/base64-js/issues/42
var validLen = b64.indexOf('=')
if (validLen === -1) validLen = len
var placeHoldersLen = validLen === len
? 0
: 4 - (validLen % 4)
return [validLen, placeHoldersLen]
}
// base64 is 4/3 + up to two characters of the original data
function byteLength (b64) {
var lens = getLens(b64)
var validLen = lens[0]
var placeHoldersLen = lens[1]
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}
function _byteLength (b64, validLen, placeHoldersLen) {
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}
function toByteArray (b64) {
var tmp
var lens = getLens(b64)
var validLen = lens[0]
var placeHoldersLen = lens[1]
var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
var curByte = 0
// if there are placeholders, only get up to the last complete 4 chars
var len = placeHoldersLen > 0
? validLen - 4
: validLen
for (var i = 0; i < len; i += 4) {
tmp =
(revLookup[b64.charCodeAt(i)] << 18) |
(revLookup[b64.charCodeAt(i + 1)] << 12) |
(revLookup[b64.charCodeAt(i + 2)] << 6) |
revLookup[b64.charCodeAt(i + 3)]
arr[curByte++] = (tmp >> 16) & 0xFF
arr[curByte++] = (tmp >> 8) & 0xFF
arr[curByte++] = tmp & 0xFF
}
if (placeHoldersLen === 2) {
tmp =
(revLookup[b64.charCodeAt(i)] << 2) |
(revLookup[b64.charCodeAt(i + 1)] >> 4)
arr[curByte++] = tmp & 0xFF
}
if (placeHoldersLen === 1) {
tmp =
(revLookup[b64.charCodeAt(i)] << 10) |
(revLookup[b64.charCodeAt(i + 1)] << 4) |
(revLookup[b64.charCodeAt(i + 2)] >> 2)
arr[curByte++] = (tmp >> 8) & 0xFF
arr[curByte++] = tmp & 0xFF
}
return arr
}
function tripletToBase64 (num) {
return lookup[num >> 18 & 0x3F] +
lookup[num >> 12 & 0x3F] +
lookup[num >> 6 & 0x3F] +
lookup[num & 0x3F]
}
function encodeChunk (uint8, start, end) {
var tmp
var output = []
for (var i = start; i < end; i += 3) {
tmp =
((uint8[i] << 16) & 0xFF0000) +
((uint8[i + 1] << 8) & 0xFF00) +
(uint8[i + 2] & 0xFF)
output.push(tripletToBase64(tmp))
}
return output.join('')
}
function fromByteArray (uint8) {
var tmp
var len = uint8.length
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
var parts = []
var maxChunkLength = 16383 // must be multiple of 3
// go through the array every three bytes, we'll deal with trailing stuff later
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
parts.push(encodeChunk(
uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
))
}
// pad the end with zeros, but make sure to not forget the extra bytes
if (extraBytes === 1) {
tmp = uint8[len - 1]
parts.push(
lookup[tmp >> 2] +
lookup[(tmp << 4) & 0x3F] +
'=='
)
} else if (extraBytes === 2) {
tmp = (uint8[len - 2] << 8) + uint8[len - 1]
parts.push(
lookup[tmp >> 10] +
lookup[(tmp >> 4) & 0x3F] +
lookup[(tmp << 2) & 0x3F] +
'='
)
}
return parts.join('')
}
/***/ }),
/***/ "./node_modules/buffer/index.js":
/*!**************************************!*\
!*** ./node_modules/buffer/index.js ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(global) {/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
* @license MIT
*/
/* eslint-disable no-proto */
var base64 = __webpack_require__(/*! base64-js */ "./node_modules/base64-js/index.js")
var ieee754 = __webpack_require__(/*! ieee754 */ "./node_modules/ieee754/index.js")
var isArray = __webpack_require__(/*! isarray */ "./node_modules/buffer/node_modules/isarray/index.js")
exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50
/**
* 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+.
*
* Due to various browser bugs, sometimes the Object implementation will be used even
* when the browser supports typed arrays.
*
* Note:
*
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
* 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
* get the Object implementation, which is slower but behaves correctly.
*/
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
? global.TYPED_ARRAY_SUPPORT
: typedArraySupport()
/*
* Export kMaxLength after typed array support is determined.
*/
exports.kMaxLength = kMaxLength()
function typedArraySupport () {
try {
var arr = new Uint8Array(1)
arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
return arr.foo() === 42 && // typed array instances can be augmented
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
} catch (e) {
return false
}
}
function kMaxLength () {
return Buffer.TYPED_ARRAY_SUPPORT
? 0x7fffffff
: 0x3fffffff
}
function createBuffer (that, length) {
if (kMaxLength() < length) {
throw new RangeError('Invalid typed array length')
}
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
that = new Uint8Array(length)
that.__proto__ = Buffer.prototype
} else {
// Fallback: Return an object instance of the Buffer class
if (that === null) {
that = new Buffer(length)
}
that.length = length
}
return that
}
/**
* The Buffer constructor returns instances of `Uint8Array` that have their
* prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
* `Uint8Array`, so the returned instances will have all the node `Buffer` methods
* and the `Uint8Array` methods. Square bracket notation works as expected -- it
* returns a single octet.
*
* The `Uint8Array` prototype remains unmodified.
*/
function Buffer (arg, encodingOrOffset, length) {
if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
return new Buffer(arg, encodingOrOffset, length)
}
// Common case.
if (typeof arg === 'number') {
if (typeof encodingOrOffset === 'string') {
throw new Error(
'If encoding is specified then the first argument must be a string'
)
}
return allocUnsafe(this, arg)
}
return from(this, arg, encodingOrOffset, length)
}
Buffer.poolSize = 8192 // not used by this implementation
// TODO: Legacy, not needed anymore. Remove in next major version.
Buffer._augment = function (arr) {
arr.__proto__ = Buffer.prototype
return arr
}
function from (that, value, encodingOrOffset, length) {
if (typeof value === 'number') {
throw new TypeError('"value" argument must not be a number')
}
if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
return fromArrayBuffer(that, value, encodingOrOffset, length)
}
if (typeof value === 'string') {
return fromString(that, value, encodingOrOffset)
}
return fromObject(that, value)
}
/**
* Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
* if value is a number.
* Buffer.from(str[, encoding])
* Buffer.from(array)
* Buffer.from(buffer)
* Buffer.from(arrayBuffer[, byteOffset[, length]])
**/
Buffer.from = function (value, encodingOrOffset, length) {
return from(null, value, encodingOrOffset, length)
}
if (Buffer.TYPED_ARRAY_SUPPORT) {
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array
if (typeof Symbol !== 'undefined' && Symbol.species &&
Buffer[Symbol.species] === Buffer) {
// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
Object.defineProperty(Buffer, Symbol.species, {
value: null,
configurable: true
})
}
}
function assertSize (size) {
if (typeof size !== 'number') {
throw new TypeError('"size" argument must be a number')
} else if (size < 0) {
throw new RangeError('"size" argument must not be negative')
}
}
function alloc (that, size, fill, encoding) {
assertSize(size)
if (size <= 0) {
return createBuffer(that, size)
}
if (fill !== undefined) {
// Only pay attention to encoding if it's a string. This
// prevents accidentally sending in a number that would
// be interpretted as a start offset.
return typeof encoding === 'string'
? createBuffer(that, size).fill(fill, encoding)
: createBuffer(that, size).fill(fill)
}
return createBuffer(that, size)
}
/**
* Creates a new filled Buffer instance.
* alloc(size[, fill[, encoding]])
**/
Buffer.alloc = function (size, fill, encoding) {
return alloc(null, size, fill, encoding)
}
function allocUnsafe (that, size) {
assertSize(size)
that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) {
for (var i = 0; i < size; ++i) {
that[i] = 0
}
}
return that
}
/**
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
* */
Buffer.allocUnsafe = function (size) {
return allocUnsafe(null, size)
}
/**
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
*/
Buffer.allocUnsafeSlow = function (size) {
return allocUnsafe(null, size)
}
function fromString (that, string, encoding) {
if (typeof encoding !== 'string' || encoding === '') {
encoding = 'utf8'
}
if (!Buffer.isEncoding(encoding)) {
throw new TypeError('"encoding" must be a valid string encoding')
}
var length = byteLength(string, encoding) | 0
that = createBuffer(that, length)
var actual = that.write(string, encoding)
if (actual !== length) {
// Writing a hex string, for example, that contains invalid characters will
// cause everything after the first invalid character to be ignored. (e.g.
// 'abxxcd' will be treated as 'ab')
that = that.slice(0, actual)
}
return that
}
function fromArrayLike (that, array) {
var length = array.length < 0 ? 0 : checked(array.length) | 0
that = createBuffer(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
function fromArrayBuffer (that, array, byteOffset, length) {
array.byteLength // this throws if `array` is not a valid ArrayBuffer
if (byteOffset < 0 || array.byteLength < byteOffset) {
throw new RangeError('\'offset\' is out of bounds')
}
if (array.byteLength < byteOffset + (length || 0)) {
throw new RangeError('\'length\' is out of bounds')
}
if (byteOffset === undefined && length === undefined) {
array = new Uint8Array(array)
} else if (length === undefined) {
array = new Uint8Array(array, byteOffset)
} else {
array = new Uint8Array(array, byteOffset, length)
}
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
that = array
that.__proto__ = Buffer.prototype
} else {
// Fallback: Return an object instance of the Buffer class
that = fromArrayLike(that, array)
}
return that
}
function fromObject (that, obj) {
if (Buffer.isBuffer(obj)) {
var len = checked(obj.length) | 0
that = createBuffer(that, len)
if (that.length === 0) {
return that
}
obj.copy(that, 0, 0, len)
return that
}
if (obj) {
if ((typeof ArrayBuffer !== 'undefined' &&
obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
if (typeof obj.length !== 'number' || isnan(obj.length)) {
return createBuffer(that, 0)
}
return fromArrayLike(that, obj)
}
if (obj.type === 'Buffer' && isArray(obj.data)) {
return fromArrayLike(that, obj.data)
}
}
throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
}
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 (length) {
if (+length != length) { // eslint-disable-line eqeqeq
length = 0
}
return Buffer.alloc(+length)
}
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
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
if (a[i] !== b[i]) {
x = a[i]
y = b[i]
break
}
}
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 'latin1':
case 'binary':
case 'base64':
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 Buffer.alloc(0)
}
var i
if (length === undefined) {
length = 0
for (i = 0; i < list.length; ++i) {
length += list[i].length
}
}
var buffer = Buffer.allocUnsafe(length)
var pos = 0
for (i = 0; i < list.length; ++i) {
var buf = list[i]
if (!Buffer.isBuffer(buf)) {
throw new TypeError('"list" argument must be an Array of Buffers')
}
buf.copy(buffer, pos)
pos += buf.length
}
return buffer
}
function byteLength (string, encoding) {
if (Buffer.isBuffer(string)) {
return string.length
}
if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
(ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
return string.byteLength
}
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 'latin1':
case 'binary':
return len
case 'utf8':
case 'utf-8':
case undefined:
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
function slowToString (encoding, start, end) {
var loweredCase = false
// No need to verify that "this.length <= MAX_UINT32" since it's a read-only
// property of a typed array.
// This behaves neither like String nor Uint8Array in that we set start/end
// to their upper/lower bounds if the value passed is out of range.
// undefined is handled specially as per ECMA-262 6th Edition,
// Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
if (start === undefined || start < 0) {
start = 0
}
// Return early if start > this.length. Done here to prevent potential uint32
// coercion fail below.
if (start > this.length) {
return ''
}
if (end === undefined || end > this.length) {
end = this.length
}
if (end <= 0) {
return ''
}
// Force coersion to uint32. This will also coerce falsey/NaN values to 0.
end >>>= 0
start >>>= 0
if (end <= start) {
return ''
}
if (!encoding) encoding = 'utf8'
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 'latin1':
case 'binary':
return latin1Slice(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
}
}
}
// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
// Buffer instances.
Buffer.prototype._isBuffer = true
function swap (b, n, m) {
var i = b[n]
b[n] = b[m]
b[m] = i
}
Buffer.prototype.swap16 = function swap16 () {
var len = this.length
if (len % 2 !== 0) {
throw new RangeError('Buffer size must be a multiple of 16-bits')
}
for (var i = 0; i < len; i += 2) {
swap(this, i, i + 1)
}
return this
}
Buffer.prototype.swap32 = function swap32 () {
var len = this.length
if (len % 4 !== 0) {
throw new RangeError('Buffer size must be a multiple of 32-bits')
}
for (var i = 0; i < len; i += 4) {
swap(this, i, i + 3)
swap(this, i + 1, i + 2)
}
return this
}
Buffer.prototype.swap64 = function swap64 () {
var len = this.length
if (len % 8 !== 0) {
throw new RangeError('Buffer size must be a multiple of 64-bits')
}
for (var i = 0; i < len; i += 8) {
swap(this, i, i + 7)
swap(this, i + 1, i + 6)
swap(this, i + 2, i + 5)
swap(this, i + 3, i + 4)
}
return this
}
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 (target, start, end, thisStart, thisEnd) {
if (!Buffer.isBuffer(target)) {
throw new TypeError('Argument must be a Buffer')
}
if (start === undefined) {
start = 0
}
if (end === undefined) {
end = target ? target.length : 0
}
if (thisStart === undefined) {
thisStart = 0
}
if (thisEnd === undefined) {
thisEnd = this.length
}
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
throw new RangeError('out of range index')
}
if (thisStart >= thisEnd && start >= end) {
return 0
}
if (thisStart >= thisEnd) {
return -1
}
if (start >= end) {
return 1
}
start >>>= 0
end >>>= 0
thisStart >>>= 0
thisEnd >>>= 0
if (this === target) return 0
var x = thisEnd - thisStart
var y = end - start
var len = Math.min(x, y)
var thisCopy = this.slice(thisStart, thisEnd)
var targetCopy = target.slice(start, end)
for (var i = 0; i < len; ++i) {
if (thisCopy[i] !== targetCopy[i]) {
x = thisCopy[i]
y = targetCopy[i]
break
}
}
if (x < y) return -1
if (y < x) return 1
return 0
}
// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
// Empty buffer means no match
if (buffer.length === 0) return -1
// Normalize byteOffset
if (typeof byteOffset === 'string') {
encoding = byteOffset
byteOffset = 0
} else if (byteOffset > 0x7fffffff) {
byteOffset = 0x7fffffff
} else if (byteOffset < -0x80000000) {
byteOffset = -0x80000000
}
byteOffset = +byteOffset // Coerce to Number.
if (isNaN(byteOffset)) {
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
byteOffset = dir ? 0 : (buffer.length - 1)
}
// Normalize byteOffset: negative offsets start from the end of the buffer
if (byteOffset < 0) byteOffset = buffer.length + byteOffset
if (byteOffset >= buffer.length) {
if (dir) return -1
else byteOffset = buffer.length - 1
} else if (byteOffset < 0) {
if (dir) byteOffset = 0
else return -1
}
// Normalize val
if (typeof val === 'string') {
val = Buffer.from(val, encoding)
}
// Finally, search either indexOf (if dir is true) or lastIndexOf
if (Buffer.isBuffer(val)) {
// Special case: looking for empty string/buffer always fails
if (val.length === 0) {
return -1
}
return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
} else if (typeof val === 'number') {
val = val & 0xFF // Search for a byte value [0-255]
if (Buffer.TYPED_ARRAY_SUPPORT &&
typeof Uint8Array.prototype.indexOf === 'function') {
if (dir) {
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
} else {
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
}
}
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
}
throw new TypeError('val must be string, number or Buffer')
}
function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
var indexSize = 1
var arrLength = arr.length
var valLength = val.length
if (encoding !== undefined) {
encoding = String(encoding).toLowerCase()
if (encoding === 'ucs2' || encoding === 'ucs-2' ||
encoding === 'utf16le' || encoding === 'utf-16le') {
if (arr.length < 2 || val.length < 2) {
return -1
}
indexSize = 2
arrLength /= 2
valLength /= 2
byteOffset /= 2
}
}
function read (buf, i) {
if (indexSize === 1) {
return buf[i]
} else {
return buf.readUInt16BE(i * indexSize)
}
}
var i
if (dir) {
var foundIndex = -1
for (i = byteOffset; i < arrLength; i++) {
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
if (foundIndex === -1) foundIndex = i
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
} else {
if (foundIndex !== -1) i -= i - foundIndex
foundIndex = -1
}
}
} else {
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
for (i = byteOffset; i >= 0; i--) {
var found = true
for (var j = 0; j < valLength; j++) {
if (read(arr, i + j) !== read(val, j)) {
found = false
break
}
}
if (found) return i
}
}
return -1
}
Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
return this.indexOf(val, byteOffset, encoding) !== -1
}
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}
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 TypeError('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)) return i
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 latin1Write (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 {
throw new Error(
'Buffer.write(string, encoding, offset[, length]) is no longer supported'
)
}
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 'latin1':
case 'binary':
return latin1Write(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) {
end = Math.min(buf.length, end)
var res = []
var i = start
while (i < end) {
var firstByte = buf[i]
var codePoint = null
var bytesPerSequence = (firstByte > 0xEF) ? 4
: (firstByte > 0xDF) ? 3
: (firstByte > 0xBF) ? 2
: 1
if (i + bytesPerSequence <= end) {
var secondByte, thirdByte, fourthByte, tempCodePoint
switch (bytesPerSequence) {
case 1:
if (firstByte < 0x80) {
codePoint = firstByte
}
break
case 2:
secondByte = buf[i + 1]
if ((secondByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
if (tempCodePoint > 0x7F) {
codePoint = tempCodePoint
}
}
break
case 3:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
codePoint = tempCodePoint
}
}
break
case 4:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
fourthByte = buf[i + 3]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
codePoint = tempCodePoint
}
}
}
}
if (codePoint === null) {
// we did not generate a valid codePoint so insert a
// replacement char (U+FFFD) and advance only 1 byte
codePoint = 0xFFFD
bytesPerSequence = 1
} else if (codePoint > 0xFFFF) {
// encode to utf16 (surrogate pair dance)
codePoint -= 0x10000
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
codePoint = 0xDC00 | codePoint & 0x3FF
}
res.push(codePoint)
i += bytesPerSequence
}
return decodeCodePointsArray(res)
}
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000
function decodeCodePointsArray (codePoints) {
var len = codePoints.length
if (len <= MAX_ARGUMENTS_LENGTH) {
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
}
// Decode in chunks to avoid "call stack size exceeded".
var res = ''
var i = 0
while (i < len) {
res += String.fromCharCode.apply(
String,
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
)
}
return res
}
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 latin1Slice (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 = this.subarray(start, end)
newBuf.__proto__ = Buffer.prototype
} else {
var sliceLen = end - start
newBuf = new Buffer(sliceLen, undefined)
for (var i = 0; i < sliceLen; ++i) {
newBuf[i] = this[i + start]
}
}
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" argument must be a Buffer instance')
if (value > max || value < min) throw new RangeError('"value" argument 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) {
var maxBytes = Math.pow(2, 8 * byteLength) - 1
checkInt(this, value, offset, byteLength, maxBytes, 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) {
var maxBytes = Math.pow(2, 8 * byteLength) - 1
checkInt(this, value, offset, byteLength, maxBytes, 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 & 0xff)
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 & 0xff)
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 & 0xff)
} 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 & 0xff)
} 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 & 0xff)
} 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 = 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
sub = 1
}
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 = 0
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
sub = 1
}
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 & 0xff)
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 & 0xff)
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 & 0xff)
} 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 & 0xff)
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 & 0xff)
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
function checkIEEE754 (buf, value, offset, ext, max, min) {
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
var i
if (this === target && start < targetStart && targetStart < end) {
// descending copy from end
for (i = len - 1; i >= 0; --i) {
target[i + targetStart] = this[i + start]
}
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
// ascending copy from start
for (i = 0; i < len; ++i) {
target[i + targetStart] = this[i + start]
}
} else {
Uint8Array.prototype.set.call(
target,
this.subarray(start, start + len),
targetStart
)
}
return len
}
// Usage:
// buffer.fill(number[, offset[, end]])
// buffer.fill(buffer[, offset[, end]])
// buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
// Handle string cases:
if (typeof val === 'string') {
if (typeof start === 'string') {
encoding = start
start = 0
end = this.length
} else if (typeof end === 'string') {
encoding = end
end = this.length
}
if (val.length === 1) {
var code = val.charCodeAt(0)
if (code < 256) {
val = code
}
}
if (encoding !== undefined && typeof encoding !== 'string') {
throw new TypeError('encoding must be a string')
}
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
throw new TypeError('Unknown encoding: ' + encoding)
}
} else if (typeof val === 'number') {
val = val & 255
}
// Invalid ranges are not set to a default, so can range check early.
if (start < 0 || this.length < start || this.length < end) {
throw new RangeError('Out of range index')
}
if (end <= start) {
return this
}
start = start >>> 0
end = end === undefined ? this.length : end >>> 0
if (!val) val = 0
var i
if (typeof val === 'number') {
for (i = start; i < end; ++i) {
this[i] = val
}
} else {
var bytes = Buffer.isBuffer(val)
? val
: utf8ToBytes(new Buffer(val, encoding).toString())
var len = bytes.length
for (i = 0; i < end - start; ++i) {
this[i + start] = bytes[i % len]
}
}
return this
}
// HELPER FUNCTIONS
// ================
var INVALID_BASE64_RE = /[^+\/0-9A-Za-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 = []
for (var i = 0; i < length; ++i) {
codePoint = string.charCodeAt(i)
// is surrogate component
if (codePoint > 0xD7FF && codePoint < 0xE000) {
// last char was a lead
if (!leadSurrogate) {
// 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
}
// valid lead
leadSurrogate = codePoint
continue
}
// 2 leads in a row
if (codePoint < 0xDC00) {
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
leadSurrogate = codePoint
continue
}
// valid surrogate pair
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
} 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 < 0x110000) {
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 isnan (val) {
return val !== val // eslint-disable-line no-self-compare
}
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "./node_modules/buffer/node_modules/isarray/index.js":
/*!***********************************************************!*\
!*** ./node_modules/buffer/node_modules/isarray/index.js ***!
\***********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
var toString = {}.toString;
module.exports = Array.isArray || function (arr) {
return toString.call(arr) == '[object Array]';
};
/***/ }),
/***/ "./node_modules/ieee754/index.js":
/*!***************************************!*\
!*** ./node_modules/ieee754/index.js ***!
\***************************************/
/*! no static exports found */
/***/ (function(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
}
/***/ }),
/***/ "./node_modules/uuid/lib/bytesToUuid.js":
/*!**********************************************!*\
!*** ./node_modules/uuid/lib/bytesToUuid.js ***!
\**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* Convert array of 16 byte values to UUID string format of the form:
* XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
*/
var byteToHex = [];
for (var i = 0; i < 256; ++i) {
byteToHex[i] = (i + 0x100).toString(16).substr(1);
}
function bytesToUuid(buf, offset) {
var i = offset || 0;
var bth = byteToHex;
// join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4
return ([bth[buf[i++]], bth[buf[i++]],
bth[buf[i++]], bth[buf[i++]], '-',
bth[buf[i++]], bth[buf[i++]], '-',
bth[buf[i++]], bth[buf[i++]], '-',
bth[buf[i++]], bth[buf[i++]], '-',
bth[buf[i++]], bth[buf[i++]],
bth[buf[i++]], bth[buf[i++]],
bth[buf[i++]], bth[buf[i++]]]).join('');
}
module.exports = bytesToUuid;
/***/ }),
/***/ "./node_modules/uuid/lib/rng-browser.js":
/*!**********************************************!*\
!*** ./node_modules/uuid/lib/rng-browser.js ***!
\**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {
// Unique ID creation requires a high quality random # generator. In the
// browser this is a little complicated due to unknown quality of Math.random()
// and inconsistent support for the `crypto` API. We do the best we can via
// feature-detection
// getRandomValues needs to be invoked in a context where "this" is a Crypto
// implementation. Also, find the complete implementation of crypto on IE11.
var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||
(typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));
if (getRandomValues) {
// WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto
var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef
module.exports = function whatwgRNG() {
getRandomValues(rnds8);
return rnds8;
};
} else {
// Math.random()-based (RNG)
//
// If all else fails, use Math.random(). It's fast, but is of unspecified
// quality.
var rnds = new Array(16);
module.exports = function mathRNG() {
for (var i = 0, r; i < 16; i++) {
if ((i & 0x03) === 0) r = Math.random() * 0x100000000;
rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
}
return rnds;
};
}
/***/ }),
/***/ "./node_modules/uuid/v4.js":
/*!*********************************!*\
!*** ./node_modules/uuid/v4.js ***!
\*********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var rng = __webpack_require__(/*! ./lib/rng */ "./node_modules/uuid/lib/rng-browser.js");
var bytesToUuid = __webpack_require__(/*! ./lib/bytesToUuid */ "./node_modules/uuid/lib/bytesToUuid.js");
function v4(options, buf, offset) {
var i = buf && offset || 0;
if (typeof(options) == 'string') {
buf = options === 'binary' ? new Array(16) : null;
options = null;
}
options = options || {};
var rnds = options.random || (options.rng || rng)();
// Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
rnds[6] = (rnds[6] & 0x0f) | 0x40;
rnds[8] = (rnds[8] & 0x3f) | 0x80;
// Copy bytes to buffer, if provided
if (buf) {
for (var ii = 0; ii < 16; ++ii) {
buf[i + ii] = rnds[ii];
}
}
return buf || bytesToUuid(rnds);
}
module.exports = v4;
/***/ }),
/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
var g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || new Function("return this")();
} catch (e) {
// This works if the window reference is available
if (typeof window === "object") g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/***/ "./src/AccessTokenEvents.js":
/*!**********************************!*\
!*** ./src/AccessTokenEvents.js ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.AccessTokenEvents = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _Timer = __webpack_require__(/*! ./Timer.js */ "./src/Timer.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultAccessTokenExpiringNotificationTime = 60; // seconds
var AccessTokenEvents = exports.AccessTokenEvents = function () {
function AccessTokenEvents() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime,
accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir,
_ref$accessTokenExpir2 = _ref.accessTokenExpiringTimer,
accessTokenExpiringTimer = _ref$accessTokenExpir2 === undefined ? new _Timer.Timer("Access token expiring") : _ref$accessTokenExpir2,
_ref$accessTokenExpir3 = _ref.accessTokenExpiredTimer,
accessTokenExpiredTimer = _ref$accessTokenExpir3 === undefined ? new _Timer.Timer("Access token expired") : _ref$accessTokenExpir3;
_classCallCheck(this, AccessTokenEvents);
this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime;
this._accessTokenExpiring = accessTokenExpiringTimer;
this._accessTokenExpired = accessTokenExpiredTimer;
}
AccessTokenEvents.prototype.load = function load(container) {
// only register events if there's an access token and it has an expiration
if (container.access_token && container.expires_in !== undefined) {
var duration = container.expires_in;
_Log.Log.debug("AccessTokenEvents.load: access token present, remaining duration:", duration);
if (duration > 0) {
// only register expiring if we still have time
var expiring = duration - this._accessTokenExpiringNotificationTime;
if (expiring <= 0) {
expiring = 1;
}
_Log.Log.debug("AccessTokenEvents.load: registering expiring timer in:", expiring);
this._accessTokenExpiring.init(expiring);
} else {
_Log.Log.debug("AccessTokenEvents.load: canceling existing expiring timer becase we're past expiration.");
this._accessTokenExpiring.cancel();
}
// if it's negative, it will still fire
var expired = duration + 1;
_Log.Log.debug("AccessTokenEvents.load: registering expired timer in:", expired);
this._accessTokenExpired.init(expired);
} else {
this._accessTokenExpiring.cancel();
this._accessTokenExpired.cancel();
}
};
AccessTokenEvents.prototype.unload = function unload() {
_Log.Log.debug("AccessTokenEvents.unload: canceling existing access token timers");
this._accessTokenExpiring.cancel();
this._accessTokenExpired.cancel();
};
AccessTokenEvents.prototype.addAccessTokenExpiring = function addAccessTokenExpiring(cb) {
this._accessTokenExpiring.addHandler(cb);
};
AccessTokenEvents.prototype.removeAccessTokenExpiring = function removeAccessTokenExpiring(cb) {
this._accessTokenExpiring.removeHandler(cb);
};
AccessTokenEvents.prototype.addAccessTokenExpired = function addAccessTokenExpired(cb) {
this._accessTokenExpired.addHandler(cb);
};
AccessTokenEvents.prototype.removeAccessTokenExpired = function removeAccessTokenExpired(cb) {
this._accessTokenExpired.removeHandler(cb);
};
return AccessTokenEvents;
}();
/***/ }),
/***/ "./src/CheckSessionIFrame.js":
/*!***********************************!*\
!*** ./src/CheckSessionIFrame.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CheckSessionIFrame = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultInterval = 2000;
var CheckSessionIFrame = exports.CheckSessionIFrame = function () {
function CheckSessionIFrame(callback, client_id, url, interval) {
var stopOnError = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
_classCallCheck(this, CheckSessionIFrame);
this._callback = callback;
this._client_id = client_id;
this._url = url;
this._interval = interval || DefaultInterval;
this._stopOnError = stopOnError;
var idx = url.indexOf("/", url.indexOf("//") + 2);
this._frame_origin = url.substr(0, idx);
this._frame = window.document.createElement("iframe");
// shotgun approach
this._frame.style.visibility = "hidden";
this._frame.style.position = "absolute";
this._frame.style.display = "none";
this._frame.style.width = 0;
this._frame.style.height = 0;
this._frame.src = url;
}
CheckSessionIFrame.prototype.load = function load() {
var _this = this;
return new Promise(function (resolve) {
_this._frame.onload = function () {
resolve();
};
window.document.body.appendChild(_this._frame);
_this._boundMessageEvent = _this._message.bind(_this);
window.addEventListener("message", _this._boundMessageEvent, false);
});
};
CheckSessionIFrame.prototype._message = function _message(e) {
if (e.origin === this._frame_origin && e.source === this._frame.contentWindow) {
if (e.data === "error") {
_Log.Log.error("CheckSessionIFrame: error message from check session op iframe");
if (this._stopOnError) {
this.stop();
}
} else if (e.data === "changed") {
_Log.Log.debug("CheckSessionIFrame: changed message from check session op iframe");
this.stop();
this._callback();
} else {
_Log.Log.debug("CheckSessionIFrame: " + e.data + " message from check session op iframe");
}
}
};
CheckSessionIFrame.prototype.start = function start(session_state) {
var _this2 = this;
if (this._session_state !== session_state) {
_Log.Log.debug("CheckSessionIFrame.start");
this.stop();
this._session_state = session_state;
var send = function send() {
_this2._frame.contentWindow.postMessage(_this2._client_id + " " + _this2._session_state, _this2._frame_origin);
};
// trigger now
send();
// and setup timer
this._timer = window.setInterval(send, this._interval);
}
};
CheckSessionIFrame.prototype.stop = function stop() {
this._session_state = null;
if (this._timer) {
_Log.Log.debug("CheckSessionIFrame.stop");
window.clearInterval(this._timer);
this._timer = null;
}
};
return CheckSessionIFrame;
}();
/***/ }),
/***/ "./src/CordovaIFrameNavigator.js":
/*!***************************************!*\
!*** ./src/CordovaIFrameNavigator.js ***!
\***************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CordovaIFrameNavigator = undefined;
var _CordovaPopupWindow = __webpack_require__(/*! ./CordovaPopupWindow.js */ "./src/CordovaPopupWindow.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var CordovaIFrameNavigator = exports.CordovaIFrameNavigator = function () {
function CordovaIFrameNavigator() {
_classCallCheck(this, CordovaIFrameNavigator);
}
CordovaIFrameNavigator.prototype.prepare = function prepare(params) {
params.popupWindowFeatures = 'hidden=yes';
var popup = new _CordovaPopupWindow.CordovaPopupWindow(params);
return Promise.resolve(popup);
};
return CordovaIFrameNavigator;
}();
/***/ }),
/***/ "./src/CordovaPopupNavigator.js":
/*!**************************************!*\
!*** ./src/CordovaPopupNavigator.js ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CordovaPopupNavigator = undefined;
var _CordovaPopupWindow = __webpack_require__(/*! ./CordovaPopupWindow.js */ "./src/CordovaPopupWindow.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var CordovaPopupNavigator = exports.CordovaPopupNavigator = function () {
function CordovaPopupNavigator() {
_classCallCheck(this, CordovaPopupNavigator);
}
CordovaPopupNavigator.prototype.prepare = function prepare(params) {
var popup = new _CordovaPopupWindow.CordovaPopupWindow(params);
return Promise.resolve(popup);
};
return CordovaPopupNavigator;
}();
/***/ }),
/***/ "./src/CordovaPopupWindow.js":
/*!***********************************!*\
!*** ./src/CordovaPopupWindow.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CordovaPopupWindow = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var DefaultPopupFeatures = 'location=no,toolbar=no,zoom=no';
var DefaultPopupTarget = "_blank";
var CordovaPopupWindow = exports.CordovaPopupWindow = function () {
function CordovaPopupWindow(params) {
var _this = this;
_classCallCheck(this, CordovaPopupWindow);
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this.features = params.popupWindowFeatures || DefaultPopupFeatures;
this.target = params.popupWindowTarget || DefaultPopupTarget;
this.redirect_uri = params.startUrl;
_Log.Log.debug("CordovaPopupWindow.ctor: redirect_uri: " + this.redirect_uri);
}
CordovaPopupWindow.prototype._isInAppBrowserInstalled = function _isInAppBrowserInstalled(cordovaMetadata) {
return ["cordova-plugin-inappbrowser", "cordova-plugin-inappbrowser.inappbrowser", "org.apache.cordova.inappbrowser"].some(function (name) {
return cordovaMetadata.hasOwnProperty(name);
});
};
CordovaPopupWindow.prototype.navigate = function navigate(params) {
if (!params || !params.url) {
this._error("No url provided");
} else {
if (!window.cordova) {
return this._error("cordova is undefined");
}
var cordovaMetadata = window.cordova.require("cordova/plugin_list").metadata;
if (this._isInAppBrowserInstalled(cordovaMetadata) === false) {
return this._error("InAppBrowser plugin not found");
}
this._popup = cordova.InAppBrowser.open(params.url, this.target, this.features);
if (this._popup) {
_Log.Log.debug("CordovaPopupWindow.navigate: popup successfully created");
this._exitCallbackEvent = this._exitCallback.bind(this);
this._loadStartCallbackEvent = this._loadStartCallback.bind(this);
this._popup.addEventListener("exit", this._exitCallbackEvent, false);
this._popup.addEventListener("loadstart", this._loadStartCallbackEvent, false);
} else {
this._error("Error opening popup window");
}
}
return this.promise;
};
CordovaPopupWindow.prototype._loadStartCallback = function _loadStartCallback(event) {
if (event.url.indexOf(this.redirect_uri) === 0) {
this._success({ url: event.url });
}
};
CordovaPopupWindow.prototype._exitCallback = function _exitCallback(message) {
this._error(message);
};
CordovaPopupWindow.prototype._success = function _success(data) {
this._cleanup();
_Log.Log.debug("CordovaPopupWindow: Successful response from cordova popup window");
this._resolve(data);
};
CordovaPopupWindow.prototype._error = function _error(message) {
this._cleanup();
_Log.Log.error(message);
this._reject(new Error(message));
};
CordovaPopupWindow.prototype.close = function close() {
this._cleanup();
};
CordovaPopupWindow.prototype._cleanup = function _cleanup() {
if (this._popup) {
_Log.Log.debug("CordovaPopupWindow: cleaning up popup");
this._popup.removeEventListener("exit", this._exitCallbackEvent, false);
this._popup.removeEventListener("loadstart", this._loadStartCallbackEvent, false);
this._popup.close();
}
this._popup = null;
};
_createClass(CordovaPopupWindow, [{
key: 'promise',
get: function get() {
return this._promise;
}
}]);
return CordovaPopupWindow;
}();
/***/ }),
/***/ "./src/ErrorResponse.js":
/*!******************************!*\
!*** ./src/ErrorResponse.js ***!
\******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ErrorResponse = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var ErrorResponse = exports.ErrorResponse = function (_Error) {
_inherits(ErrorResponse, _Error);
function ErrorResponse() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
error = _ref.error,
error_description = _ref.error_description,
error_uri = _ref.error_uri,
state = _ref.state;
_classCallCheck(this, ErrorResponse);
if (!error) {
_Log.Log.error("No error passed to ErrorResponse");
throw new Error("error");
}
var _this = _possibleConstructorReturn(this, _Error.call(this, error_description || error));
_this.name = "ErrorResponse";
_this.error = error;
_this.error_description = error_description;
_this.error_uri = error_uri;
_this.state = state;
return _this;
}
return ErrorResponse;
}(Error);
/***/ }),
/***/ "./src/Event.js":
/*!**********************!*\
!*** ./src/Event.js ***!
\**********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Event = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var Event = exports.Event = function () {
function Event(name) {
_classCallCheck(this, Event);
this._name = name;
this._callbacks = [];
}
Event.prototype.addHandler = function addHandler(cb) {
this._callbacks.push(cb);
};
Event.prototype.removeHandler = function removeHandler(cb) {
var idx = this._callbacks.findIndex(function (item) {
return item === cb;
});
if (idx >= 0) {
this._callbacks.splice(idx, 1);
}
};
Event.prototype.raise = function raise() {
_Log.Log.debug("Event: Raising event: " + this._name);
for (var i = 0; i < this._callbacks.length; i++) {
var _callbacks;
(_callbacks = this._callbacks)[i].apply(_callbacks, arguments);
}
};
return Event;
}();
/***/ }),
/***/ "./src/Global.js":
/*!***********************!*\
!*** ./src/Global.js ***!
\***********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var timer = {
setInterval: function (_setInterval) {
function setInterval(_x, _x2) {
return _setInterval.apply(this, arguments);
}
setInterval.toString = function () {
return _setInterval.toString();
};
return setInterval;
}(function (cb, duration) {
return setInterval(cb, duration);
}),
clearInterval: function (_clearInterval) {
function clearInterval(_x3) {
return _clearInterval.apply(this, arguments);
}
clearInterval.toString = function () {
return _clearInterval.toString();
};
return clearInterval;
}(function (handle) {
return clearInterval(handle);
})
};
var testing = false;
var request = null;
var Global = exports.Global = function () {
function Global() {
_classCallCheck(this, Global);
}
Global._testing = function _testing() {
testing = true;
};
Global.setXMLHttpRequest = function setXMLHttpRequest(newRequest) {
request = newRequest;
};
_createClass(Global, null, [{
key: 'location',
get: function get() {
if (!testing) {
return location;
}
}
}, {
key: 'localStorage',
get: function get() {
if (!testing && typeof window !== 'undefined') {
return localStorage;
}
}
}, {
key: 'sessionStorage',
get: function get() {
if (!testing && typeof window !== 'undefined') {
return sessionStorage;
}
}
}, {
key: 'XMLHttpRequest',
get: function get() {
if (!testing && typeof window !== 'undefined') {
return request || XMLHttpRequest;
}
}
}, {
key: 'timer',
get: function get() {
if (!testing) {
return timer;
}
}
}]);
return Global;
}();
/***/ }),
/***/ "./src/IFrameNavigator.js":
/*!********************************!*\
!*** ./src/IFrameNavigator.js ***!
\********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.IFrameNavigator = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _IFrameWindow = __webpack_require__(/*! ./IFrameWindow.js */ "./src/IFrameWindow.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var IFrameNavigator = exports.IFrameNavigator = function () {
function IFrameNavigator() {
_classCallCheck(this, IFrameNavigator);
}
IFrameNavigator.prototype.prepare = function prepare(params) {
var frame = new _IFrameWindow.IFrameWindow(params);
return Promise.resolve(frame);
};
IFrameNavigator.prototype.callback = function callback(url) {
_Log.Log.debug("IFrameNavigator.callback");
try {
_IFrameWindow.IFrameWindow.notifyParent(url);
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
};
return IFrameNavigator;
}();
/***/ }),
/***/ "./src/IFrameWindow.js":
/*!*****************************!*\
!*** ./src/IFrameWindow.js ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.IFrameWindow = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var DefaultTimeout = 10000;
var IFrameWindow = exports.IFrameWindow = function () {
function IFrameWindow(params) {
var _this = this;
_classCallCheck(this, IFrameWindow);
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this._boundMessageEvent = this._message.bind(this);
window.addEventListener("message", this._boundMessageEvent, false);
this._frame = window.document.createElement("iframe");
// shotgun approach
this._frame.style.visibility = "hidden";
this._frame.style.position = "absolute";
this._frame.style.display = "none";
this._frame.style.width = 0;
this._frame.style.height = 0;
window.document.body.appendChild(this._frame);
}
IFrameWindow.prototype.navigate = function navigate(params) {
if (!params || !params.url) {
this._error("No url provided");
} else {
var timeout = params.silentRequestTimeout || DefaultTimeout;
_Log.Log.debug("IFrameWindow.navigate: Using timeout of:", timeout);
this._timer = window.setTimeout(this._timeout.bind(this), timeout);
this._frame.src = params.url;
}
return this.promise;
};
IFrameWindow.prototype._success = function _success(data) {
this._cleanup();
_Log.Log.debug("IFrameWindow: Successful response from frame window");
this._resolve(data);
};
IFrameWindow.prototype._error = function _error(message) {
this._cleanup();
_Log.Log.error(message);
this._reject(new Error(message));
};
IFrameWindow.prototype.close = function close() {
this._cleanup();
};
IFrameWindow.prototype._cleanup = function _cleanup() {
if (this._frame) {
_Log.Log.debug("IFrameWindow: cleanup");
window.removeEventListener("message", this._boundMessageEvent, false);
window.clearTimeout(this._timer);
window.document.body.removeChild(this._frame);
this._timer = null;
this._frame = null;
this._boundMessageEvent = null;
}
};
IFrameWindow.prototype._timeout = function _timeout() {
_Log.Log.debug("IFrameWindow.timeout");
this._error("Frame window timed out");
};
IFrameWindow.prototype._message = function _message(e) {
_Log.Log.debug("IFrameWindow.message");
if (this._timer && e.origin === this._origin && e.source === this._frame.contentWindow) {
var url = e.data;
if (url) {
this._success({ url: url });
} else {
this._error("Invalid response from frame");
}
}
};
IFrameWindow.notifyParent = function notifyParent(url) {
_Log.Log.debug("IFrameWindow.notifyParent");
if (window.frameElement) {
url = url || window.location.href;
if (url) {
_Log.Log.debug("IFrameWindow.notifyParent: posting url message to parent");
window.parent.postMessage(url, location.protocol + "//" + location.host);
}
}
};
_createClass(IFrameWindow, [{
key: "promise",
get: function get() {
return this._promise;
}
}, {
key: "_origin",
get: function get() {
return location.protocol + "//" + location.host;
}
}]);
return IFrameWindow;
}();
/***/ }),
/***/ "./src/InMemoryWebStorage.js":
/*!***********************************!*\
!*** ./src/InMemoryWebStorage.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.InMemoryWebStorage = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var InMemoryWebStorage = exports.InMemoryWebStorage = function () {
function InMemoryWebStorage() {
_classCallCheck(this, InMemoryWebStorage);
this._data = {};
}
InMemoryWebStorage.prototype.getItem = function getItem(key) {
_Log.Log.debug("InMemoryWebStorage.getItem", key);
return this._data[key];
};
InMemoryWebStorage.prototype.setItem = function setItem(key, value) {
_Log.Log.debug("InMemoryWebStorage.setItem", key);
this._data[key] = value;
};
InMemoryWebStorage.prototype.removeItem = function removeItem(key) {
_Log.Log.debug("InMemoryWebStorage.removeItem", key);
delete this._data[key];
};
InMemoryWebStorage.prototype.key = function key(index) {
return Object.getOwnPropertyNames(this._data)[index];
};
_createClass(InMemoryWebStorage, [{
key: "length",
get: function get() {
return Object.getOwnPropertyNames(this._data).length;
}
}]);
return InMemoryWebStorage;
}();
/***/ }),
/***/ "./src/JoseUtil.js":
/*!*************************!*\
!*** ./src/JoseUtil.js ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.JoseUtil = undefined;
var _jsrsasign = __webpack_require__(/*! ../jsrsasign/dist/jsrsasign.js */ "./jsrsasign/dist/jsrsasign.js");
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
//import { jws, KEYUTIL as KeyUtil, X509, crypto, hextob64u, b64tohex } from 'jsrsasign';
var AllowedSigningAlgs = ['RS256', 'RS384', 'RS512', 'PS256', 'PS384', 'PS512', 'ES256', 'ES384', 'ES512'];
var JoseUtil = exports.JoseUtil = function () {
function JoseUtil() {
_classCallCheck(this, JoseUtil);
}
JoseUtil.parseJwt = function parseJwt(jwt) {
_Log.Log.debug("JoseUtil.parseJwt");
try {
var token = _jsrsasign.jws.JWS.parse(jwt);
return {
header: token.headerObj,
payload: token.payloadObj
};
} catch (e) {
_Log.Log.error(e);
}
};
JoseUtil.validateJwt = function validateJwt(jwt, key, issuer, audience, clockSkew, now, timeInsensitive) {
_Log.Log.debug("JoseUtil.validateJwt");
try {
if (key.kty === "RSA") {
if (key.e && key.n) {
key = _jsrsasign.KEYUTIL.getKey(key);
} else if (key.x5c && key.x5c.length) {
var hex = (0, _jsrsasign.b64tohex)(key.x5c[0]);
key = _jsrsasign.X509.getPublicKeyFromCertHex(hex);
} else {
_Log.Log.error("JoseUtil.validateJwt: RSA key missing key material", key);
return Promise.reject(new Error("RSA key missing key material"));
}
} else if (key.kty === "EC") {
if (key.crv && key.x && key.y) {
key = _jsrsasign.KEYUTIL.getKey(key);
} else {
_Log.Log.error("JoseUtil.validateJwt: EC key missing key material", key);
return Promise.reject(new Error("EC key missing key material"));
}
} else {
_Log.Log.error("JoseUtil.validateJwt: Unsupported key type", key && key.kty);
return Promise.reject(new Error( true && key.kty));
}
return JoseUtil._validateJwt(jwt, key, issuer, audience, clockSkew, now, timeInsensitive);
} catch (e) {
_Log.Log.error(e && e.message || e);
return Promise.reject("JWT validation failed");
}
};
JoseUtil.validateJwtAttributes = function validateJwtAttributes(jwt, issuer, audience, clockSkew, now, timeInsensitive) {
if (!clockSkew) {
clockSkew = 0;
}
if (!now) {
now = parseInt(Date.now() / 1000);
}
var payload = JoseUtil.parseJwt(jwt).payload;
if (!payload.iss) {
_Log.Log.error("JoseUtil._validateJwt: issuer was not provided");
return Promise.reject(new Error("issuer was not provided"));
}
if (payload.iss !== issuer) {
_Log.Log.error("JoseUtil._validateJwt: Invalid issuer in token", payload.iss);
return Promise.reject(new Error("Invalid issuer in token: " + payload.iss));
}
if (!payload.aud) {
_Log.Log.error("JoseUtil._validateJwt: aud was not provided");
return Promise.reject(new Error("aud was not provided"));
}
var validAudience = payload.aud === audience || Array.isArray(payload.aud) && payload.aud.indexOf(audience) >= 0;
if (!validAudience) {
_Log.Log.error("JoseUtil._validateJwt: Invalid audience in token", payload.aud);
return Promise.reject(new Error("Invalid audience in token: " + payload.aud));
}
if (payload.azp && payload.azp !== audience) {
_Log.Log.error("JoseUtil._validateJwt: Invalid azp in token", payload.azp);
return Promise.reject(new Error("Invalid azp in token: " + payload.azp));
}
if (!timeInsensitive) {
var lowerNow = now + clockSkew;
var upperNow = now - clockSkew;
if (!payload.iat) {
_Log.Log.error("JoseUtil._validateJwt: iat was not provided");
return Promise.reject(new Error("iat was not provided"));
}
if (lowerNow < payload.iat) {
_Log.Log.error("JoseUtil._validateJwt: iat is in the future", payload.iat);
return Promise.reject(new Error("iat is in the future: " + payload.iat));
}
if (payload.nbf && lowerNow < payload.nbf) {
_Log.Log.error("JoseUtil._validateJwt: nbf is in the future", payload.nbf);
return Promise.reject(new Error("nbf is in the future: " + payload.nbf));
}
if (!payload.exp) {
_Log.Log.error("JoseUtil._validateJwt: exp was not provided");
return Promise.reject(new Error("exp was not provided"));
}
if (payload.exp < upperNow) {
_Log.Log.error("JoseUtil._validateJwt: exp is in the past", payload.exp);
return Promise.reject(new Error("exp is in the past:" + payload.exp));
}
}
return Promise.resolve(payload);
};
JoseUtil._validateJwt = function _validateJwt(jwt, key, issuer, audience, clockSkew, now, timeInsensitive) {
return JoseUtil.validateJwtAttributes(jwt, issuer, audience, clockSkew, now, timeInsensitive).then(function (payload) {
try {
if (!_jsrsasign.jws.JWS.verify(jwt, key, AllowedSigningAlgs)) {
_Log.Log.error("JoseUtil._validateJwt: signature validation failed");
return Promise.reject(new Error("signature validation failed"));
}
return payload;
} catch (e) {
_Log.Log.error(e && e.message || e);
return Promise.reject(new Error("signature validation failed"));
}
});
};
JoseUtil.hashString = function hashString(value, alg) {
try {
return _jsrsasign.crypto.Util.hashString(value, alg);
} catch (e) {
_Log.Log.error(e);
}
};
JoseUtil.hexToBase64Url = function hexToBase64Url(value) {
try {
return (0, _jsrsasign.hextob64u)(value);
} catch (e) {
_Log.Log.error(e);
}
};
return JoseUtil;
}();
/***/ }),
/***/ "./src/JsonService.js":
/*!****************************!*\
!*** ./src/JsonService.js ***!
\****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.JsonService = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var JsonService = exports.JsonService = function () {
function JsonService() {
var additionalContentTypes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var XMLHttpRequestCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _Global.Global.XMLHttpRequest;
var jwtHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
_classCallCheck(this, JsonService);
if (additionalContentTypes && Array.isArray(additionalContentTypes)) {
this._contentTypes = additionalContentTypes.slice();
} else {
this._contentTypes = [];
}
this._contentTypes.push('application/json');
if (jwtHandler) {
this._contentTypes.push('application/jwt');
}
this._XMLHttpRequest = XMLHttpRequestCtor;
this._jwtHandler = jwtHandler;
}
JsonService.prototype.getJson = function getJson(url, token) {
var _this = this;
if (!url) {
_Log.Log.error("JsonService.getJson: No url passed");
throw new Error("url");
}
_Log.Log.debug("JsonService.getJson, url: ", url);
return new Promise(function (resolve, reject) {
var req = new _this._XMLHttpRequest();
req.open('GET', url);
var allowedContentTypes = _this._contentTypes;
var jwtHandler = _this._jwtHandler;
req.onload = function () {
_Log.Log.debug("JsonService.getJson: HTTP response received, status", req.status);
if (req.status === 200) {
var contentType = req.getResponseHeader("Content-Type");
if (contentType) {
var found = allowedContentTypes.find(function (item) {
if (contentType.startsWith(item)) {
return true;
}
});
if (found == "application/jwt") {
jwtHandler(req).then(resolve, reject);
return;
}
if (found) {
try {
resolve(JSON.parse(req.responseText));
return;
} catch (e) {
_Log.Log.error("JsonService.getJson: Error parsing JSON response", e.message);
reject(e);
return;
}
}
}
reject(Error("Invalid response Content-Type: " + contentType + ", from URL: " + url));
} else {
reject(Error(req.statusText + " (" + req.status + ")"));
}
};
req.onerror = function () {
_Log.Log.error("JsonService.getJson: network error");
reject(Error("Network Error"));
};
if (token) {
_Log.Log.debug("JsonService.getJson: token passed, setting Authorization header");
req.setRequestHeader("Authorization", "Bearer " + token);
}
req.send();
});
};
JsonService.prototype.postForm = function postForm(url, payload) {
var _this2 = this;
if (!url) {
_Log.Log.error("JsonService.postForm: No url passed");
throw new Error("url");
}
_Log.Log.debug("JsonService.postForm, url: ", url);
return new Promise(function (resolve, reject) {
var req = new _this2._XMLHttpRequest();
req.open('POST', url);
var allowedContentTypes = _this2._contentTypes;
req.onload = function () {
_Log.Log.debug("JsonService.postForm: HTTP response received, status", req.status);
if (req.status === 200) {
var contentType = req.getResponseHeader("Content-Type");
if (contentType) {
var found = allowedContentTypes.find(function (item) {
if (contentType.startsWith(item)) {
return true;
}
});
if (found) {
try {
resolve(JSON.parse(req.responseText));
return;
} catch (e) {
_Log.Log.error("JsonService.postForm: Error parsing JSON response", e.message);
reject(e);
return;
}
}
}
reject(Error("Invalid response Content-Type: " + contentType + ", from URL: " + url));
return;
}
if (req.status === 400) {
var contentType = req.getResponseHeader("Content-Type");
if (contentType) {
var found = allowedContentTypes.find(function (item) {
if (contentType.startsWith(item)) {
return true;
}
});
if (found) {
try {
var payload = JSON.parse(req.responseText);
if (payload && payload.error) {
_Log.Log.error("JsonService.postForm: Error from server: ", payload.error);
reject(new Error(payload.error));
return;
}
} catch (e) {
_Log.Log.error("JsonService.postForm: Error parsing JSON response", e.message);
reject(e);
return;
}
}
}
}
reject(Error(req.statusText + " (" + req.status + ")"));
};
req.onerror = function () {
_Log.Log.error("JsonService.postForm: network error");
reject(Error("Network Error"));
};
var body = "";
for (var key in payload) {
var value = payload[key];
if (value) {
if (body.length > 0) {
body += "&";
}
body += encodeURIComponent(key);
body += "=";
body += encodeURIComponent(value);
}
}
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send(body);
});
};
return JsonService;
}();
/***/ }),
/***/ "./src/Log.js":
/*!********************!*\
!*** ./src/Log.js ***!
\********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var nopLogger = {
debug: function debug() {},
info: function info() {},
warn: function warn() {},
error: function error() {}
};
var NONE = 0;
var ERROR = 1;
var WARN = 2;
var INFO = 3;
var DEBUG = 4;
var logger = void 0;
var level = void 0;
var Log = exports.Log = function () {
function Log() {
_classCallCheck(this, Log);
}
Log.reset = function reset() {
level = INFO;
logger = nopLogger;
};
Log.debug = function debug() {
if (level >= DEBUG) {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
logger.debug.apply(logger, Array.from(args));
}
};
Log.info = function info() {
if (level >= INFO) {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
logger.info.apply(logger, Array.from(args));
}
};
Log.warn = function warn() {
if (level >= WARN) {
for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
logger.warn.apply(logger, Array.from(args));
}
};
Log.error = function error() {
if (level >= ERROR) {
for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
args[_key4] = arguments[_key4];
}
logger.error.apply(logger, Array.from(args));
}
};
_createClass(Log, null, [{
key: "NONE",
get: function get() {
return NONE;
}
}, {
key: "ERROR",
get: function get() {
return ERROR;
}
}, {
key: "WARN",
get: function get() {
return WARN;
}
}, {
key: "INFO",
get: function get() {
return INFO;
}
}, {
key: "DEBUG",
get: function get() {
return DEBUG;
}
}, {
key: "level",
get: function get() {
return level;
},
set: function set(value) {
if (NONE <= value && value <= DEBUG) {
level = value;
} else {
throw new Error("Invalid log level");
}
}
}, {
key: "logger",
get: function get() {
return logger;
},
set: function set(value) {
if (!value.debug && value.info) {
// just to stay backwards compat. can remove in 2.0
value.debug = value.info;
}
if (value.debug && value.info && value.warn && value.error) {
logger = value;
} else {
throw new Error("Invalid logger");
}
}
}]);
return Log;
}();
Log.reset();
/***/ }),
/***/ "./src/MetadataService.js":
/*!********************************!*\
!*** ./src/MetadataService.js ***!
\********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MetadataService = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _JsonService = __webpack_require__(/*! ./JsonService.js */ "./src/JsonService.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var OidcMetadataUrlPath = '.well-known/openid-configuration';
var MetadataService = exports.MetadataService = function () {
function MetadataService(settings) {
var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService.JsonService;
_classCallCheck(this, MetadataService);
if (!settings) {
_Log.Log.error("MetadataService: No settings passed to MetadataService");
throw new Error("settings");
}
this._settings = settings;
this._jsonService = new JsonServiceCtor(['application/jwk-set+json']);
}
MetadataService.prototype.getMetadata = function getMetadata() {
var _this = this;
if (this._settings.metadata) {
_Log.Log.debug("MetadataService.getMetadata: Returning metadata from settings");
return Promise.resolve(this._settings.metadata);
}
if (!this.metadataUrl) {
_Log.Log.error("MetadataService.getMetadata: No authority or metadataUrl configured on settings");
return Promise.reject(new Error("No authority or metadataUrl configured on settings"));
}
_Log.Log.debug("MetadataService.getMetadata: getting metadata from", this.metadataUrl);
return this._jsonService.getJson(this.metadataUrl).then(function (metadata) {
_Log.Log.debug("MetadataService.getMetadata: json received");
_this._settings.metadata = metadata;
return metadata;
});
};
MetadataService.prototype.getIssuer = function getIssuer() {
return this._getMetadataProperty("issuer");
};
MetadataService.prototype.getAuthorizationEndpoint = function getAuthorizationEndpoint() {
return this._getMetadataProperty("authorization_endpoint");
};
MetadataService.prototype.getUserInfoEndpoint = function getUserInfoEndpoint() {
return this._getMetadataProperty("userinfo_endpoint");
};
MetadataService.prototype.getTokenEndpoint = function getTokenEndpoint() {
var optional = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
return this._getMetadataProperty("token_endpoint", optional);
};
MetadataService.prototype.getCheckSessionIframe = function getCheckSessionIframe() {
return this._getMetadataProperty("check_session_iframe", true);
};
MetadataService.prototype.getEndSessionEndpoint = function getEndSessionEndpoint() {
return this._getMetadataProperty("end_session_endpoint", true);
};
MetadataService.prototype.getRevocationEndpoint = function getRevocationEndpoint() {
return this._getMetadataProperty("revocation_endpoint", true);
};
MetadataService.prototype.getKeysEndpoint = function getKeysEndpoint() {
return this._getMetadataProperty("jwks_uri", true);
};
MetadataService.prototype._getMetadataProperty = function _getMetadataProperty(name) {
var optional = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
_Log.Log.debug("MetadataService.getMetadataProperty for: " + name);
return this.getMetadata().then(function (metadata) {
_Log.Log.debug("MetadataService.getMetadataProperty: metadata recieved");
if (metadata[name] === undefined) {
if (optional === true) {
_Log.Log.warn("MetadataService.getMetadataProperty: Metadata does not contain optional property " + name);
return undefined;
} else {
_Log.Log.error("MetadataService.getMetadataProperty: Metadata does not contain property " + name);
throw new Error("Metadata does not contain property " + name);
}
}
return metadata[name];
});
};
MetadataService.prototype.getSigningKeys = function getSigningKeys() {
var _this2 = this;
if (this._settings.signingKeys) {
_Log.Log.debug("MetadataService.getSigningKeys: Returning signingKeys from settings");
return Promise.resolve(this._settings.signingKeys);
}
return this._getMetadataProperty("jwks_uri").then(function (jwks_uri) {
_Log.Log.debug("MetadataService.getSigningKeys: jwks_uri received", jwks_uri);
return _this2._jsonService.getJson(jwks_uri).then(function (keySet) {
_Log.Log.debug("MetadataService.getSigningKeys: key set received", keySet);
if (!keySet.keys) {
_Log.Log.error("MetadataService.getSigningKeys: Missing keys on keyset");
throw new Error("Missing keys on keyset");
}
_this2._settings.signingKeys = keySet.keys;
return _this2._settings.signingKeys;
});
});
};
_createClass(MetadataService, [{
key: 'metadataUrl',
get: function get() {
if (!this._metadataUrl) {
if (this._settings.metadataUrl) {
this._metadataUrl = this._settings.metadataUrl;
} else {
this._metadataUrl = this._settings.authority;
if (this._metadataUrl && this._metadataUrl.indexOf(OidcMetadataUrlPath) < 0) {
if (this._metadataUrl[this._metadataUrl.length - 1] !== '/') {
this._metadataUrl += '/';
}
this._metadataUrl += OidcMetadataUrlPath;
}
}
}
return this._metadataUrl;
}
}]);
return MetadataService;
}();
/***/ }),
/***/ "./src/OidcClient.js":
/*!***************************!*\
!*** ./src/OidcClient.js ***!
\***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.OidcClient = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _OidcClientSettings = __webpack_require__(/*! ./OidcClientSettings.js */ "./src/OidcClientSettings.js");
var _ErrorResponse = __webpack_require__(/*! ./ErrorResponse.js */ "./src/ErrorResponse.js");
var _SigninRequest = __webpack_require__(/*! ./SigninRequest.js */ "./src/SigninRequest.js");
var _SigninResponse = __webpack_require__(/*! ./SigninResponse.js */ "./src/SigninResponse.js");
var _SignoutRequest = __webpack_require__(/*! ./SignoutRequest.js */ "./src/SignoutRequest.js");
var _SignoutResponse = __webpack_require__(/*! ./SignoutResponse.js */ "./src/SignoutResponse.js");
var _SigninState = __webpack_require__(/*! ./SigninState.js */ "./src/SigninState.js");
var _State = __webpack_require__(/*! ./State.js */ "./src/State.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var OidcClient = exports.OidcClient = function () {
function OidcClient() {
var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, OidcClient);
if (settings instanceof _OidcClientSettings.OidcClientSettings) {
this._settings = settings;
} else {
this._settings = new _OidcClientSettings.OidcClientSettings(settings);
}
}
OidcClient.prototype.createSigninRequest = function createSigninRequest() {
var _this = this;
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
response_type = _ref.response_type,
scope = _ref.scope,
redirect_uri = _ref.redirect_uri,
data = _ref.data,
state = _ref.state,
prompt = _ref.prompt,
display = _ref.display,
max_age = _ref.max_age,
ui_locales = _ref.ui_locales,
id_token_hint = _ref.id_token_hint,
login_hint = _ref.login_hint,
acr_values = _ref.acr_values,
resource = _ref.resource,
request = _ref.request,
request_uri = _ref.request_uri,
response_mode = _ref.response_mode,
extraQueryParams = _ref.extraQueryParams;
var stateStore = arguments[1];
_Log.Log.debug("OidcClient.createSigninRequest");
var client_id = this._settings.client_id;
response_type = response_type || this._settings.response_type;
scope = scope || this._settings.scope;
redirect_uri = redirect_uri || this._settings.redirect_uri;
// id_token_hint, login_hint aren't allowed on _settings
prompt = prompt || this._settings.prompt;
display = display || this._settings.display;
max_age = max_age || this._settings.max_age;
ui_locales = ui_locales || this._settings.ui_locales;
acr_values = acr_values || this._settings.acr_values;
resource = resource || this._settings.resource;
response_mode = response_mode || this._settings.response_mode;
extraQueryParams = extraQueryParams || this._settings.extraQueryParams;
var authority = this._settings.authority;
if (_SigninRequest.SigninRequest.isCode(response_type) && response_type !== "code") {
return Promise.reject(new Error("OpenID Connect hybrid flow is not supported"));
}
return this._metadataService.getAuthorizationEndpoint().then(function (url) {
_Log.Log.debug("OidcClient.createSigninRequest: Received authorization endpoint", url);
var signinRequest = new _SigninRequest.SigninRequest({
url: url,
client_id: client_id,
redirect_uri: redirect_uri,
response_type: response_type,
scope: scope,
data: data || state,
authority: authority,
prompt: prompt, display: display, max_age: max_age, ui_locales: ui_locales, id_token_hint: id_token_hint, login_hint: login_hint, acr_values: acr_values,
resource: resource, request: request, request_uri: request_uri, extraQueryParams: extraQueryParams, response_mode: response_mode
});
var signinState = signinRequest.state;
stateStore = stateStore || _this._stateStore;
return stateStore.set(signinState.id, signinState.toStorageString()).then(function () {
return signinRequest;
});
});
};
OidcClient.prototype.processSigninResponse = function processSigninResponse(url, stateStore) {
var _this2 = this;
_Log.Log.debug("OidcClient.processSigninResponse");
var useQuery = this._settings.response_mode === "query" || !this._settings.response_mode && _SigninRequest.SigninRequest.isCode(this._settings.response_type);
var delimiter = useQuery ? "?" : "#";
var response = new _SigninResponse.SigninResponse(url, delimiter);
if (!response.state) {
_Log.Log.error("OidcClient.processSigninResponse: No state in response");
return Promise.reject(new Error("No state in response"));
}
stateStore = stateStore || this._stateStore;
return stateStore.remove(response.state).then(function (storedStateString) {
if (!storedStateString) {
_Log.Log.error("OidcClient.processSigninResponse: No matching state found in storage");
throw new Error("No matching state found in storage");
}
var state = _SigninState.SigninState.fromStorageString(storedStateString);
_Log.Log.debug("OidcClient.processSigninResponse: Received state from storage; validating response");
return _this2._validator.validateSigninResponse(state, response);
});
};
OidcClient.prototype.createSignoutRequest = function createSignoutRequest() {
var _this3 = this;
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
id_token_hint = _ref2.id_token_hint,
data = _ref2.data,
state = _ref2.state,
post_logout_redirect_uri = _ref2.post_logout_redirect_uri,
extraQueryParams = _ref2.extraQueryParams;
var stateStore = arguments[1];
_Log.Log.debug("OidcClient.createSignoutRequest");
post_logout_redirect_uri = post_logout_redirect_uri || this._settings.post_logout_redirect_uri;
extraQueryParams = extraQueryParams || this._settings.extraQueryParams;
return this._metadataService.getEndSessionEndpoint().then(function (url) {
if (!url) {
_Log.Log.error("OidcClient.createSignoutRequest: No end session endpoint url returned");
throw new Error("no end session endpoint");
}
_Log.Log.debug("OidcClient.createSignoutRequest: Received end session endpoint", url);
var request = new _SignoutRequest.SignoutRequest({
url: url,
id_token_hint: id_token_hint,
post_logout_redirect_uri: post_logout_redirect_uri,
data: data || state,
extraQueryParams: extraQueryParams
});
var signoutState = request.state;
if (signoutState) {
_Log.Log.debug("OidcClient.createSignoutRequest: Signout request has state to persist");
stateStore = stateStore || _this3._stateStore;
stateStore.set(signoutState.id, signoutState.toStorageString());
}
return request;
});
};
OidcClient.prototype.processSignoutResponse = function processSignoutResponse(url, stateStore) {
var _this4 = this;
_Log.Log.debug("OidcClient.processSignoutResponse");
var response = new _SignoutResponse.SignoutResponse(url);
if (!response.state) {
_Log.Log.debug("OidcClient.processSignoutResponse: No state in response");
if (response.error) {
_Log.Log.warn("OidcClient.processSignoutResponse: Response was error: ", response.error);
return Promise.reject(new _ErrorResponse.ErrorResponse(response));
}
return Promise.resolve(response);
}
var stateKey = response.state;
stateStore = stateStore || this._stateStore;
return stateStore.remove(stateKey).then(function (storedStateString) {
if (!storedStateString) {
_Log.Log.error("OidcClient.processSignoutResponse: No matching state found in storage");
throw new Error("No matching state found in storage");
}
var state = _State.State.fromStorageString(storedStateString);
_Log.Log.debug("OidcClient.processSignoutResponse: Received state from storage; validating response");
return _this4._validator.validateSignoutResponse(state, response);
});
};
OidcClient.prototype.clearStaleState = function clearStaleState(stateStore) {
_Log.Log.debug("OidcClient.clearStaleState");
stateStore = stateStore || this._stateStore;
return _State.State.clearStaleState(stateStore, this.settings.staleStateAge);
};
_createClass(OidcClient, [{
key: '_stateStore',
get: function get() {
return this.settings.stateStore;
}
}, {
key: '_validator',
get: function get() {
return this.settings.validator;
}
}, {
key: '_metadataService',
get: function get() {
return this.settings.metadataService;
}
}, {
key: 'settings',
get: function get() {
return this._settings;
}
}, {
key: 'metadataService',
get: function get() {
return this._metadataService;
}
}]);
return OidcClient;
}();
/***/ }),
/***/ "./src/OidcClientSettings.js":
/*!***********************************!*\
!*** ./src/OidcClientSettings.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.OidcClientSettings = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _WebStorageStateStore = __webpack_require__(/*! ./WebStorageStateStore.js */ "./src/WebStorageStateStore.js");
var _ResponseValidator = __webpack_require__(/*! ./ResponseValidator.js */ "./src/ResponseValidator.js");
var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var OidcMetadataUrlPath = '.well-known/openid-configuration';
var DefaultResponseType = "id_token";
var DefaultScope = "openid";
var DefaultStaleStateAge = 60 * 15; // seconds
var DefaultClockSkewInSeconds = 60 * 5;
var OidcClientSettings = exports.OidcClientSettings = function () {
function OidcClientSettings() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
authority = _ref.authority,
metadataUrl = _ref.metadataUrl,
metadata = _ref.metadata,
signingKeys = _ref.signingKeys,
client_id = _ref.client_id,
client_secret = _ref.client_secret,
_ref$response_type = _ref.response_type,
response_type = _ref$response_type === undefined ? DefaultResponseType : _ref$response_type,
_ref$scope = _ref.scope,
scope = _ref$scope === undefined ? DefaultScope : _ref$scope,
redirect_uri = _ref.redirect_uri,
post_logout_redirect_uri = _ref.post_logout_redirect_uri,
prompt = _ref.prompt,
display = _ref.display,
max_age = _ref.max_age,
ui_locales = _ref.ui_locales,
acr_values = _ref.acr_values,
resource = _ref.resource,
response_mode = _ref.response_mode,
_ref$filterProtocolCl = _ref.filterProtocolClaims,
filterProtocolClaims = _ref$filterProtocolCl === undefined ? true : _ref$filterProtocolCl,
_ref$loadUserInfo = _ref.loadUserInfo,
loadUserInfo = _ref$loadUserInfo === undefined ? true : _ref$loadUserInfo,
_ref$staleStateAge = _ref.staleStateAge,
staleStateAge = _ref$staleStateAge === undefined ? DefaultStaleStateAge : _ref$staleStateAge,
_ref$clockSkew = _ref.clockSkew,
clockSkew = _ref$clockSkew === undefined ? DefaultClockSkewInSeconds : _ref$clockSkew,
_ref$userInfoJwtIssue = _ref.userInfoJwtIssuer,
userInfoJwtIssuer = _ref$userInfoJwtIssue === undefined ? 'OP' : _ref$userInfoJwtIssue,
_ref$stateStore = _ref.stateStore,
stateStore = _ref$stateStore === undefined ? new _WebStorageStateStore.WebStorageStateStore() : _ref$stateStore,
_ref$ResponseValidato = _ref.ResponseValidatorCtor,
ResponseValidatorCtor = _ref$ResponseValidato === undefined ? _ResponseValidator.ResponseValidator : _ref$ResponseValidato,
_ref$MetadataServiceC = _ref.MetadataServiceCtor,
MetadataServiceCtor = _ref$MetadataServiceC === undefined ? _MetadataService.MetadataService : _ref$MetadataServiceC,
_ref$extraQueryParams = _ref.extraQueryParams,
extraQueryParams = _ref$extraQueryParams === undefined ? {} : _ref$extraQueryParams;
_classCallCheck(this, OidcClientSettings);
this._authority = authority;
this._metadataUrl = metadataUrl;
this._metadata = metadata;
this._signingKeys = signingKeys;
this._client_id = client_id;
this._client_secret = client_secret;
this._response_type = response_type;
this._scope = scope;
this._redirect_uri = redirect_uri;
this._post_logout_redirect_uri = post_logout_redirect_uri;
this._prompt = prompt;
this._display = display;
this._max_age = max_age;
this._ui_locales = ui_locales;
this._acr_values = acr_values;
this._resource = resource;
this._response_mode = response_mode;
this._filterProtocolClaims = !!filterProtocolClaims;
this._loadUserInfo = !!loadUserInfo;
this._staleStateAge = staleStateAge;
this._clockSkew = clockSkew;
this._userInfoJwtIssuer = userInfoJwtIssuer;
this._stateStore = stateStore;
this._validator = new ResponseValidatorCtor(this);
this._metadataService = new MetadataServiceCtor(this);
this._extraQueryParams = (typeof extraQueryParams === 'undefined' ? 'undefined' : _typeof(extraQueryParams)) === 'object' ? extraQueryParams : {};
}
// client config
_createClass(OidcClientSettings, [{
key: 'client_id',
get: function get() {
return this._client_id;
},
set: function set(value) {
if (!this._client_id) {
// one-time set only
this._client_id = value;
} else {
_Log.Log.error("OidcClientSettings.set_client_id: client_id has already been assigned.");
throw new Error("client_id has already been assigned.");
}
}
}, {
key: 'client_secret',
get: function get() {
return this._client_secret;
}
}, {
key: 'response_type',
get: function get() {
return this._response_type;
}
}, {
key: 'scope',
get: function get() {
return this._scope;
}
}, {
key: 'redirect_uri',
get: function get() {
return this._redirect_uri;
}
}, {
key: 'post_logout_redirect_uri',
get: function get() {
return this._post_logout_redirect_uri;
}
// optional protocol params
}, {
key: 'prompt',
get: function get() {
return this._prompt;
}
}, {
key: 'display',
get: function get() {
return this._display;
}
}, {
key: 'max_age',
get: function get() {
return this._max_age;
}
}, {
key: 'ui_locales',
get: function get() {
return this._ui_locales;
}
}, {
key: 'acr_values',
get: function get() {
return this._acr_values;
}
}, {
key: 'resource',
get: function get() {
return this._resource;
}
}, {
key: 'response_mode',
get: function get() {
return this._response_mode;
}
// metadata
}, {
key: 'authority',
get: function get() {
return this._authority;
},
set: function set(value) {
if (!this._authority) {
// one-time set only
this._authority = value;
} else {
_Log.Log.error("OidcClientSettings.set_authority: authority has already been assigned.");
throw new Error("authority has already been assigned.");
}
}
}, {
key: 'metadataUrl',
get: function get() {
if (!this._metadataUrl) {
this._metadataUrl = this.authority;
if (this._metadataUrl && this._metadataUrl.indexOf(OidcMetadataUrlPath) < 0) {
if (this._metadataUrl[this._metadataUrl.length - 1] !== '/') {
this._metadataUrl += '/';
}
this._metadataUrl += OidcMetadataUrlPath;
}
}
return this._metadataUrl;
}
// settable/cachable metadata values
}, {
key: 'metadata',
get: function get() {
return this._metadata;
},
set: function set(value) {
this._metadata = value;
}
}, {
key: 'signingKeys',
get: function get() {
return this._signingKeys;
},
set: function set(value) {
this._signingKeys = value;
}
// behavior flags
}, {
key: 'filterProtocolClaims',
get: function get() {
return this._filterProtocolClaims;
}
}, {
key: 'loadUserInfo',
get: function get() {
return this._loadUserInfo;
}
}, {
key: 'staleStateAge',
get: function get() {
return this._staleStateAge;
}
}, {
key: 'clockSkew',
get: function get() {
return this._clockSkew;
}
}, {
key: 'userInfoJwtIssuer',
get: function get() {
return this._userInfoJwtIssuer;
}
}, {
key: 'stateStore',
get: function get() {
return this._stateStore;
}
}, {
key: 'validator',
get: function get() {
return this._validator;
}
}, {
key: 'metadataService',
get: function get() {
return this._metadataService;
}
// extra query params
}, {
key: 'extraQueryParams',
get: function get() {
return this._extraQueryParams;
},
set: function set(value) {
if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {
this._extraQueryParams = value;
} else {
this._extraQueryParams = {};
}
}
}]);
return OidcClientSettings;
}();
/***/ }),
/***/ "./src/PopupNavigator.js":
/*!*******************************!*\
!*** ./src/PopupNavigator.js ***!
\*******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PopupNavigator = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _PopupWindow = __webpack_require__(/*! ./PopupWindow.js */ "./src/PopupWindow.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var PopupNavigator = exports.PopupNavigator = function () {
function PopupNavigator() {
_classCallCheck(this, PopupNavigator);
}
PopupNavigator.prototype.prepare = function prepare(params) {
var popup = new _PopupWindow.PopupWindow(params);
return Promise.resolve(popup);
};
PopupNavigator.prototype.callback = function callback(url, keepOpen, delimiter) {
_Log.Log.debug("PopupNavigator.callback");
try {
_PopupWindow.PopupWindow.notifyOpener(url, keepOpen, delimiter);
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
};
return PopupNavigator;
}();
/***/ }),
/***/ "./src/PopupWindow.js":
/*!****************************!*\
!*** ./src/PopupWindow.js ***!
\****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PopupWindow = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var CheckForPopupClosedInterval = 500;
var DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100;';
//const DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100;resizable=yes';
var DefaultPopupTarget = "_blank";
var PopupWindow = exports.PopupWindow = function () {
function PopupWindow(params) {
var _this = this;
_classCallCheck(this, PopupWindow);
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
var target = params.popupWindowTarget || DefaultPopupTarget;
var features = params.popupWindowFeatures || DefaultPopupFeatures;
this._popup = window.open('', target, features);
if (this._popup) {
_Log.Log.debug("PopupWindow.ctor: popup successfully created");
this._checkForPopupClosedTimer = window.setInterval(this._checkForPopupClosed.bind(this), CheckForPopupClosedInterval);
}
}
PopupWindow.prototype.navigate = function navigate(params) {
if (!this._popup) {
this._error("PopupWindow.navigate: Error opening popup window");
} else if (!params || !params.url) {
this._error("PopupWindow.navigate: no url provided");
this._error("No url provided");
} else {
_Log.Log.debug("PopupWindow.navigate: Setting URL in popup");
this._id = params.id;
if (this._id) {
window["popupCallback_" + params.id] = this._callback.bind(this);
}
this._popup.focus();
this._popup.window.location = params.url;
}
return this.promise;
};
PopupWindow.prototype._success = function _success(data) {
_Log.Log.debug("PopupWindow.callback: Successful response from popup window");
this._cleanup();
this._resolve(data);
};
PopupWindow.prototype._error = function _error(message) {
_Log.Log.error("PopupWindow.error: ", message);
this._cleanup();
this._reject(new Error(message));
};
PopupWindow.prototype.close = function close() {
this._cleanup(false);
};
PopupWindow.prototype._cleanup = function _cleanup(keepOpen) {
_Log.Log.debug("PopupWindow.cleanup");
window.clearInterval(this._checkForPopupClosedTimer);
this._checkForPopupClosedTimer = null;
delete window["popupCallback_" + this._id];
if (this._popup && !keepOpen) {
this._popup.close();
}
this._popup = null;
};
PopupWindow.prototype._checkForPopupClosed = function _checkForPopupClosed() {
if (!this._popup || this._popup.closed) {
this._error("Popup window closed");
}
};
PopupWindow.prototype._callback = function _callback(url, keepOpen) {
this._cleanup(keepOpen);
if (url) {
_Log.Log.debug("PopupWindow.callback success");
this._success({ url: url });
} else {
_Log.Log.debug("PopupWindow.callback: Invalid response from popup");
this._error("Invalid response from popup");
}
};
PopupWindow.notifyOpener = function notifyOpener(url, keepOpen, delimiter) {
if (window.opener) {
url = url || window.location.href;
if (url) {
var data = _UrlUtility.UrlUtility.parseUrlFragment(url, delimiter);
if (data.state) {
var name = "popupCallback_" + data.state;
var callback = window.opener[name];
if (callback) {
_Log.Log.debug("PopupWindow.notifyOpener: passing url message to opener");
callback(url, keepOpen);
} else {
_Log.Log.warn("PopupWindow.notifyOpener: no matching callback found on opener");
}
} else {
_Log.Log.warn("PopupWindow.notifyOpener: no state found in response url");
}
}
} else {
_Log.Log.warn("PopupWindow.notifyOpener: no window.opener. Can't complete notification.");
}
};
_createClass(PopupWindow, [{
key: 'promise',
get: function get() {
return this._promise;
}
}]);
return PopupWindow;
}();
/***/ }),
/***/ "./src/RedirectNavigator.js":
/*!**********************************!*\
!*** ./src/RedirectNavigator.js ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.RedirectNavigator = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var RedirectNavigator = exports.RedirectNavigator = function () {
function RedirectNavigator() {
_classCallCheck(this, RedirectNavigator);
}
RedirectNavigator.prototype.prepare = function prepare() {
return Promise.resolve(this);
};
RedirectNavigator.prototype.navigate = function navigate(params) {
if (!params || !params.url) {
_Log.Log.error("RedirectNavigator.navigate: No url provided");
return Promise.reject(new Error("No url provided"));
}
window.location = params.url;
return Promise.resolve();
};
_createClass(RedirectNavigator, [{
key: "url",
get: function get() {
return window.location.href;
}
}]);
return RedirectNavigator;
}();
/***/ }),
/***/ "./src/ResponseValidator.js":
/*!**********************************!*\
!*** ./src/ResponseValidator.js ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ResponseValidator = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js");
var _UserInfoService = __webpack_require__(/*! ./UserInfoService.js */ "./src/UserInfoService.js");
var _TokenClient = __webpack_require__(/*! ./TokenClient.js */ "./src/TokenClient.js");
var _ErrorResponse = __webpack_require__(/*! ./ErrorResponse.js */ "./src/ErrorResponse.js");
var _JoseUtil = __webpack_require__(/*! ./JoseUtil.js */ "./src/JoseUtil.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var ProtocolClaims = ["nonce", "at_hash", "iat", "nbf", "exp", "aud", "iss", "c_hash"];
var ResponseValidator = exports.ResponseValidator = function () {
function ResponseValidator(settings) {
var MetadataServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _MetadataService.MetadataService;
var UserInfoServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _UserInfoService.UserInfoService;
var joseUtil = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _JoseUtil.JoseUtil;
var TokenClientCtor = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _TokenClient.TokenClient;
_classCallCheck(this, ResponseValidator);
if (!settings) {
_Log.Log.error("ResponseValidator.ctor: No settings passed to ResponseValidator");
throw new Error("settings");
}
this._settings = settings;
this._metadataService = new MetadataServiceCtor(this._settings);
this._userInfoService = new UserInfoServiceCtor(this._settings);
this._joseUtil = joseUtil;
this._tokenClient = new TokenClientCtor(this._settings);
}
ResponseValidator.prototype.validateSigninResponse = function validateSigninResponse(state, response) {
var _this = this;
_Log.Log.debug("ResponseValidator.validateSigninResponse");
return this._processSigninParams(state, response).then(function (response) {
_Log.Log.debug("ResponseValidator.validateSigninResponse: state processed");
return _this._validateTokens(state, response).then(function (response) {
_Log.Log.debug("ResponseValidator.validateSigninResponse: tokens validated");
return _this._processClaims(response).then(function (response) {
_Log.Log.debug("ResponseValidator.validateSigninResponse: claims processed");
return response;
});
});
});
};
ResponseValidator.prototype.validateSignoutResponse = function validateSignoutResponse(state, response) {
if (state.id !== response.state) {
_Log.Log.error("ResponseValidator.validateSignoutResponse: State does not match");
return Promise.reject(new Error("State does not match"));
}
// now that we know the state matches, take the stored data
// and set it into the response so callers can get their state
// this is important for both success & error outcomes
_Log.Log.debug("ResponseValidator.validateSignoutResponse: state validated");
response.state = state.data;
if (response.error) {
_Log.Log.warn("ResponseValidator.validateSignoutResponse: Response was error", response.error);
return Promise.reject(new _ErrorResponse.ErrorResponse(response));
}
return Promise.resolve(response);
};
ResponseValidator.prototype._processSigninParams = function _processSigninParams(state, response) {
if (state.id !== response.state) {
_Log.Log.error("ResponseValidator._processSigninParams: State does not match");
return Promise.reject(new Error("State does not match"));
}
if (!state.client_id) {
_Log.Log.error("ResponseValidator._processSigninParams: No client_id on state");
return Promise.reject(new Error("No client_id on state"));
}
if (!state.authority) {
_Log.Log.error("ResponseValidator._processSigninParams: No authority on state");
return Promise.reject(new Error("No authority on state"));
}
// this allows the authority to be loaded from the signin state
if (!this._settings.authority) {
this._settings.authority = state.authority;
}
// ensure we're using the correct authority if the authority is not loaded from signin state
else if (this._settings.authority && this._settings.authority !== state.authority) {
_Log.Log.error("ResponseValidator._processSigninParams: authority mismatch on settings vs. signin state");
return Promise.reject(new Error("authority mismatch on settings vs. signin state"));
}
// this allows the client_id to be loaded from the signin state
if (!this._settings.client_id) {
this._settings.client_id = state.client_id;
}
// ensure we're using the correct client_id if the client_id is not loaded from signin state
else if (this._settings.client_id && this._settings.client_id !== state.client_id) {
_Log.Log.error("ResponseValidator._processSigninParams: client_id mismatch on settings vs. signin state");
return Promise.reject(new Error("client_id mismatch on settings vs. signin state"));
}
// now that we know the state matches, take the stored data
// and set it into the response so callers can get their state
// this is important for both success & error outcomes
_Log.Log.debug("ResponseValidator._processSigninParams: state validated");
response.state = state.data;
if (response.error) {
_Log.Log.warn("ResponseValidator._processSigninParams: Response was error", response.error);
return Promise.reject(new _ErrorResponse.ErrorResponse(response));
}
if (state.nonce && !response.id_token) {
_Log.Log.error("ResponseValidator._processSigninParams: Expecting id_token in response");
return Promise.reject(new Error("No id_token in response"));
}
if (!state.nonce && response.id_token) {
_Log.Log.error("ResponseValidator._processSigninParams: Not expecting id_token in response");
return Promise.reject(new Error("Unexpected id_token in response"));
}
if (state.code_verifier && !response.code) {
_Log.Log.error("ResponseValidator._processSigninParams: Expecting code in response");
return Promise.reject(new Error("No code in response"));
}
if (!state.code_verifier && response.code) {
_Log.Log.error("ResponseValidator._processSigninParams: Not expecting code in response");
return Promise.reject(new Error("Unexpected code in response"));
}
return Promise.resolve(response);
};
ResponseValidator.prototype._processClaims = function _processClaims(response) {
var _this2 = this;
if (response.isOpenIdConnect) {
_Log.Log.debug("ResponseValidator._processClaims: response is OIDC, processing claims");
response.profile = this._filterProtocolClaims(response.profile);
if (this._settings.loadUserInfo && response.access_token) {
_Log.Log.debug("ResponseValidator._processClaims: loading user info");
return this._userInfoService.getClaims(response.access_token).then(function (claims) {
_Log.Log.debug("ResponseValidator._processClaims: user info claims received from user info endpoint");
if (claims.sub !== response.profile.sub) {
_Log.Log.error("ResponseValidator._processClaims: sub from user info endpoint does not match sub in access_token");
return Promise.reject(new Error("sub from user info endpoint does not match sub in access_token"));
}
response.profile = _this2._mergeClaims(response.profile, claims);
_Log.Log.debug("ResponseValidator._processClaims: user info claims received, updated profile:", response.profile);
return response;
});
} else {
_Log.Log.debug("ResponseValidator._processClaims: not loading user info");
}
} else {
_Log.Log.debug("ResponseValidator._processClaims: response is not OIDC, not processing claims");
}
return Promise.resolve(response);
};
ResponseValidator.prototype._mergeClaims = function _mergeClaims(claims1, claims2) {
var result = Object.assign({}, claims1);
for (var name in claims2) {
var values = claims2[name];
if (!Array.isArray(values)) {
values = [values];
}
for (var i = 0; i < values.length; i++) {
var value = values[i];
if (!result[name]) {
result[name] = value;
} else if (Array.isArray(result[name])) {
if (result[name].indexOf(value) < 0) {
result[name].push(value);
}
} else if (result[name] !== value) {
if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {
result[name] = this._mergeClaims(result[name], value);
} else {
result[name] = [result[name], value];
}
}
}
}
return result;
};
ResponseValidator.prototype._filterProtocolClaims = function _filterProtocolClaims(claims) {
_Log.Log.debug("ResponseValidator._filterProtocolClaims, incoming claims:", claims);
var result = Object.assign({}, claims);
if (this._settings._filterProtocolClaims) {
ProtocolClaims.forEach(function (type) {
delete result[type];
});
_Log.Log.debug("ResponseValidator._filterProtocolClaims: protocol claims filtered", result);
} else {
_Log.Log.debug("ResponseValidator._filterProtocolClaims: protocol claims not filtered");
}
return result;
};
ResponseValidator.prototype._validateTokens = function _validateTokens(state, response) {
if (response.code) {
_Log.Log.debug("ResponseValidator._validateTokens: Validating code");
return this._processCode(state, response);
}
if (response.id_token) {
if (response.access_token) {
_Log.Log.debug("ResponseValidator._validateTokens: Validating id_token and access_token");
return this._validateIdTokenAndAccessToken(state, response);
}
_Log.Log.debug("ResponseValidator._validateTokens: Validating id_token");
return this._validateIdToken(state, response);
}
_Log.Log.debug("ResponseValidator._validateTokens: No code to process or id_token to validate");
return Promise.resolve(response);
};
ResponseValidator.prototype._processCode = function _processCode(state, response) {
var _this3 = this;
var request = {
client_id: state.client_id,
client_secret: this._settings.client_secret,
code: response.code,
redirect_uri: state.redirect_uri,
code_verifier: state.code_verifier
};
return this._tokenClient.exchangeCode(request).then(function (tokenResponse) {
for (var key in tokenResponse) {
response[key] = tokenResponse[key];
}
if (response.id_token) {
_Log.Log.debug("ResponseValidator._processCode: token response successful, processing id_token");
return _this3._validateIdTokenAttributes(state, response);
} else {
_Log.Log.debug("ResponseValidator._processCode: token response successful, returning response");
}
return response;
});
};
ResponseValidator.prototype._validateIdTokenAttributes = function _validateIdTokenAttributes(state, response) {
var _this4 = this;
return this._metadataService.getIssuer().then(function (issuer) {
var audience = state.client_id;
var clockSkewInSeconds = _this4._settings.clockSkew;
_Log.Log.debug("ResponseValidator._validateIdTokenAttributes: Validaing JWT attributes; using clock skew (in seconds) of: ", clockSkewInSeconds);
return _this4._joseUtil.validateJwtAttributes(response.id_token, issuer, audience, clockSkewInSeconds).then(function (payload) {
if (state.nonce && state.nonce !== payload.nonce) {
_Log.Log.error("ResponseValidator._validateIdTokenAttributes: Invalid nonce in id_token");
return Promise.reject(new Error("Invalid nonce in id_token"));
}
if (!payload.sub) {
_Log.Log.error("ResponseValidator._validateIdTokenAttributes: No sub present in id_token");
return Promise.reject(new Error("No sub present in id_token"));
}
response.profile = payload;
return response;
});
});
};
ResponseValidator.prototype._validateIdTokenAndAccessToken = function _validateIdTokenAndAccessToken(state, response) {
var _this5 = this;
return this._validateIdToken(state, response).then(function (response) {
return _this5._validateAccessToken(response);
});
};
ResponseValidator.prototype._validateIdToken = function _validateIdToken(state, response) {
var _this6 = this;
if (!state.nonce) {
_Log.Log.error("ResponseValidator._validateIdToken: No nonce on state");
return Promise.reject(new Error("No nonce on state"));
}
var jwt = this._joseUtil.parseJwt(response.id_token);
if (!jwt || !jwt.header || !jwt.payload) {
_Log.Log.error("ResponseValidator._validateIdToken: Failed to parse id_token", jwt);
return Promise.reject(new Error("Failed to parse id_token"));
}
if (state.nonce !== jwt.payload.nonce) {
_Log.Log.error("ResponseValidator._validateIdToken: Invalid nonce in id_token");
return Promise.reject(new Error("Invalid nonce in id_token"));
}
var kid = jwt.header.kid;
return this._metadataService.getIssuer().then(function (issuer) {
_Log.Log.debug("ResponseValidator._validateIdToken: Received issuer");
return _this6._metadataService.getSigningKeys().then(function (keys) {
if (!keys) {
_Log.Log.error("ResponseValidator._validateIdToken: No signing keys from metadata");
return Promise.reject(new Error("No signing keys from metadata"));
}
_Log.Log.debug("ResponseValidator._validateIdToken: Received signing keys");
var key = void 0;
if (!kid) {
keys = _this6._filterByAlg(keys, jwt.header.alg);
if (keys.length > 1) {
_Log.Log.error("ResponseValidator._validateIdToken: No kid found in id_token and more than one key found in metadata");
return Promise.reject(new Error("No kid found in id_token and more than one key found in metadata"));
} else {
// kid is mandatory only when there are multiple keys in the referenced JWK Set document
// see http://openid.net/specs/openid-connect-core-1_0.html#Signing
key = keys[0];
}
} else {
key = keys.filter(function (key) {
return key.kid === kid;
})[0];
}
if (!key) {
_Log.Log.error("ResponseValidator._validateIdToken: No key matching kid or alg found in signing keys");
return Promise.reject(new Error("No key matching kid or alg found in signing keys"));
}
var audience = state.client_id;
var clockSkewInSeconds = _this6._settings.clockSkew;
_Log.Log.debug("ResponseValidator._validateIdToken: Validaing JWT; using clock skew (in seconds) of: ", clockSkewInSeconds);
return _this6._joseUtil.validateJwt(response.id_token, key, issuer, audience, clockSkewInSeconds).then(function () {
_Log.Log.debug("ResponseValidator._validateIdToken: JWT validation successful");
if (!jwt.payload.sub) {
_Log.Log.error("ResponseValidator._validateIdToken: No sub present in id_token");
return Promise.reject(new Error("No sub present in id_token"));
}
response.profile = jwt.payload;
return response;
});
});
});
};
ResponseValidator.prototype._filterByAlg = function _filterByAlg(keys, alg) {
var kty = null;
if (alg.startsWith("RS")) {
kty = "RSA";
} else if (alg.startsWith("PS")) {
kty = "PS";
} else if (alg.startsWith("ES")) {
kty = "EC";
} else {
_Log.Log.debug("ResponseValidator._filterByAlg: alg not supported: ", alg);
return [];
}
_Log.Log.debug("ResponseValidator._filterByAlg: Looking for keys that match kty: ", kty);
keys = keys.filter(function (key) {
return key.kty === kty;
});
_Log.Log.debug("ResponseValidator._filterByAlg: Number of keys that match kty: ", kty, keys.length);
return keys;
};
ResponseValidator.prototype._validateAccessToken = function _validateAccessToken(response) {
if (!response.profile) {
_Log.Log.error("ResponseValidator._validateAccessToken: No profile loaded from id_token");
return Promise.reject(new Error("No profile loaded from id_token"));
}
if (!response.profile.at_hash) {
_Log.Log.error("ResponseValidator._validateAccessToken: No at_hash in id_token");
return Promise.reject(new Error("No at_hash in id_token"));
}
if (!response.id_token) {
_Log.Log.error("ResponseValidator._validateAccessToken: No id_token");
return Promise.reject(new Error("No id_token"));
}
var jwt = this._joseUtil.parseJwt(response.id_token);
if (!jwt || !jwt.header) {
_Log.Log.error("ResponseValidator._validateAccessToken: Failed to parse id_token", jwt);
return Promise.reject(new Error("Failed to parse id_token"));
}
var hashAlg = jwt.header.alg;
if (!hashAlg || hashAlg.length !== 5) {
_Log.Log.error("ResponseValidator._validateAccessToken: Unsupported alg:", hashAlg);
return Promise.reject(new Error("Unsupported alg: " + hashAlg));
}
var hashBits = hashAlg.substr(2, 3);
if (!hashBits) {
_Log.Log.error("ResponseValidator._validateAccessToken: Unsupported alg:", hashAlg, hashBits);
return Promise.reject(new Error("Unsupported alg: " + hashAlg));
}
hashBits = parseInt(hashBits);
if (hashBits !== 256 && hashBits !== 384 && hashBits !== 512) {
_Log.Log.error("ResponseValidator._validateAccessToken: Unsupported alg:", hashAlg, hashBits);
return Promise.reject(new Error("Unsupported alg: " + hashAlg));
}
var sha = "sha" + hashBits;
var hash = this._joseUtil.hashString(response.access_token, sha);
if (!hash) {
_Log.Log.error("ResponseValidator._validateAccessToken: access_token hash failed:", sha);
return Promise.reject(new Error("Failed to validate at_hash"));
}
var left = hash.substr(0, hash.length / 2);
var left_b64u = this._joseUtil.hexToBase64Url(left);
if (left_b64u !== response.profile.at_hash) {
_Log.Log.error("ResponseValidator._validateAccessToken: Failed to validate at_hash", left_b64u, response.profile.at_hash);
return Promise.reject(new Error("Failed to validate at_hash"));
}
_Log.Log.debug("ResponseValidator._validateAccessToken: success");
return Promise.resolve(response);
};
return ResponseValidator;
}();
/***/ }),
/***/ "./src/SessionMonitor.js":
/*!*******************************!*\
!*** ./src/SessionMonitor.js ***!
\*******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SessionMonitor = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _CheckSessionIFrame = __webpack_require__(/*! ./CheckSessionIFrame.js */ "./src/CheckSessionIFrame.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var SessionMonitor = exports.SessionMonitor = function () {
function SessionMonitor(userManager) {
var _this = this;
var CheckSessionIFrameCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _CheckSessionIFrame.CheckSessionIFrame;
_classCallCheck(this, SessionMonitor);
if (!userManager) {
_Log.Log.error("SessionMonitor.ctor: No user manager passed to SessionMonitor");
throw new Error("userManager");
}
this._userManager = userManager;
this._CheckSessionIFrameCtor = CheckSessionIFrameCtor;
this._userManager.events.addUserLoaded(this._start.bind(this));
this._userManager.events.addUserUnloaded(this._stop.bind(this));
this._userManager.getUser().then(function (user) {
// doing this manually here since calling getUser
// doesn't trigger load event.
if (user) {
_this._start(user);
}
}).catch(function (err) {
// catch to suppress errors since we're in a ctor
_Log.Log.error("SessionMonitor ctor: error from getUser:", err.message);
});
}
SessionMonitor.prototype._start = function _start(user) {
var _this2 = this;
var session_state = user.session_state;
if (session_state) {
this._sub = user.profile.sub;
this._sid = user.profile.sid;
_Log.Log.debug("SessionMonitor._start: session_state:", session_state, ", sub:", this._sub);
if (!this._checkSessionIFrame) {
this._metadataService.getCheckSessionIframe().then(function (url) {
if (url) {
_Log.Log.debug("SessionMonitor._start: Initializing check session iframe");
var client_id = _this2._client_id;
var interval = _this2._checkSessionInterval;
var stopOnError = _this2._stopCheckSessionOnError;
_this2._checkSessionIFrame = new _this2._CheckSessionIFrameCtor(_this2._callback.bind(_this2), client_id, url, interval, stopOnError);
_this2._checkSessionIFrame.load().then(function () {
_this2._checkSessionIFrame.start(session_state);
});
} else {
_Log.Log.warn("SessionMonitor._start: No check session iframe found in the metadata");
}
}).catch(function (err) {
// catch to suppress errors since we're in non-promise callback
_Log.Log.error("SessionMonitor._start: Error from getCheckSessionIframe:", err.message);
});
} else {
this._checkSessionIFrame.start(session_state);
}
}
};
SessionMonitor.prototype._stop = function _stop() {
this._sub = null;
this._sid = null;
if (this._checkSessionIFrame) {
_Log.Log.debug("SessionMonitor._stop");
this._checkSessionIFrame.stop();
}
};
SessionMonitor.prototype._callback = function _callback() {
var _this3 = this;
this._userManager.querySessionStatus().then(function (session) {
var raiseUserSignedOutEvent = true;
if (session) {
if (session.sub === _this3._sub) {
raiseUserSignedOutEvent = false;
_this3._checkSessionIFrame.start(session.session_state);
if (session.sid === _this3._sid) {
_Log.Log.debug("SessionMonitor._callback: Same sub still logged in at OP, restarting check session iframe; session_state:", session.session_state);
} else {
_Log.Log.debug("SessionMonitor._callback: Same sub still logged in at OP, session state has changed, restarting check session iframe; session_state:", session.session_state);
_this3._userManager.events._raiseUserSessionChanged();
}
} else {
_Log.Log.debug("SessionMonitor._callback: Different subject signed into OP:", session.sub);
}
} else {
_Log.Log.debug("SessionMonitor._callback: Subject no longer signed into OP");
}
if (raiseUserSignedOutEvent) {
_Log.Log.debug("SessionMonitor._callback: SessionMonitor._callback; raising signed out event");
_this3._userManager.events._raiseUserSignedOut();
}
}).catch(function (err) {
_Log.Log.debug("SessionMonitor._callback: Error calling queryCurrentSigninSession; raising signed out event", err.message);
_this3._userManager.events._raiseUserSignedOut();
});
};
_createClass(SessionMonitor, [{
key: '_settings',
get: function get() {
return this._userManager.settings;
}
}, {
key: '_metadataService',
get: function get() {
return this._userManager.metadataService;
}
}, {
key: '_client_id',
get: function get() {
return this._settings.client_id;
}
}, {
key: '_checkSessionInterval',
get: function get() {
return this._settings.checkSessionInterval;
}
}, {
key: '_stopCheckSessionOnError',
get: function get() {
return this._settings.stopCheckSessionOnError;
}
}]);
return SessionMonitor;
}();
/***/ }),
/***/ "./src/SigninRequest.js":
/*!******************************!*\
!*** ./src/SigninRequest.js ***!
\******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SigninRequest = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js");
var _SigninState = __webpack_require__(/*! ./SigninState.js */ "./src/SigninState.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SigninRequest = exports.SigninRequest = function () {
function SigninRequest(_ref) {
var url = _ref.url,
client_id = _ref.client_id,
redirect_uri = _ref.redirect_uri,
response_type = _ref.response_type,
scope = _ref.scope,
authority = _ref.authority,
data = _ref.data,
prompt = _ref.prompt,
display = _ref.display,
max_age = _ref.max_age,
ui_locales = _ref.ui_locales,
id_token_hint = _ref.id_token_hint,
login_hint = _ref.login_hint,
acr_values = _ref.acr_values,
resource = _ref.resource,
response_mode = _ref.response_mode,
request = _ref.request,
request_uri = _ref.request_uri,
extraQueryParams = _ref.extraQueryParams;
_classCallCheck(this, SigninRequest);
if (!url) {
_Log.Log.error("SigninRequest.ctor: No url passed");
throw new Error("url");
}
if (!client_id) {
_Log.Log.error("SigninRequest.ctor: No client_id passed");
throw new Error("client_id");
}
if (!redirect_uri) {
_Log.Log.error("SigninRequest.ctor: No redirect_uri passed");
throw new Error("redirect_uri");
}
if (!response_type) {
_Log.Log.error("SigninRequest.ctor: No response_type passed");
throw new Error("response_type");
}
if (!scope) {
_Log.Log.error("SigninRequest.ctor: No scope passed");
throw new Error("scope");
}
if (!authority) {
_Log.Log.error("SigninRequest.ctor: No authority passed");
throw new Error("authority");
}
var oidc = SigninRequest.isOidc(response_type);
var code = SigninRequest.isCode(response_type);
this.state = new _SigninState.SigninState({ nonce: oidc, data: data, client_id: client_id, authority: authority, redirect_uri: redirect_uri, code_verifier: code });
url = _UrlUtility.UrlUtility.addQueryParam(url, "client_id", client_id);
url = _UrlUtility.UrlUtility.addQueryParam(url, "redirect_uri", redirect_uri);
url = _UrlUtility.UrlUtility.addQueryParam(url, "response_type", response_type);
url = _UrlUtility.UrlUtility.addQueryParam(url, "scope", scope);
url = _UrlUtility.UrlUtility.addQueryParam(url, "state", this.state.id);
if (oidc) {
url = _UrlUtility.UrlUtility.addQueryParam(url, "nonce", this.state.nonce);
}
if (code) {
url = _UrlUtility.UrlUtility.addQueryParam(url, "code_challenge", this.state.code_challenge);
url = _UrlUtility.UrlUtility.addQueryParam(url, "code_challenge_method", "S256");
}
var optional = { prompt: prompt, display: display, max_age: max_age, ui_locales: ui_locales, id_token_hint: id_token_hint, login_hint: login_hint, acr_values: acr_values, resource: resource, request: request, request_uri: request_uri, response_mode: response_mode };
for (var key in optional) {
if (optional[key]) {
url = _UrlUtility.UrlUtility.addQueryParam(url, key, optional[key]);
}
}
for (var _key in extraQueryParams) {
url = _UrlUtility.UrlUtility.addQueryParam(url, _key, extraQueryParams[_key]);
}
this.url = url;
}
SigninRequest.isOidc = function isOidc(response_type) {
var result = response_type.split(/\s+/g).filter(function (item) {
return item === "id_token";
});
return !!result[0];
};
SigninRequest.isOAuth = function isOAuth(response_type) {
var result = response_type.split(/\s+/g).filter(function (item) {
return item === "token";
});
return !!result[0];
};
SigninRequest.isCode = function isCode(response_type) {
var result = response_type.split(/\s+/g).filter(function (item) {
return item === "code";
});
return !!result[0];
};
return SigninRequest;
}();
/***/ }),
/***/ "./src/SigninResponse.js":
/*!*******************************!*\
!*** ./src/SigninResponse.js ***!
\*******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SigninResponse = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var OidcScope = "openid";
var SigninResponse = exports.SigninResponse = function () {
function SigninResponse(url) {
var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "#";
_classCallCheck(this, SigninResponse);
var values = _UrlUtility.UrlUtility.parseUrlFragment(url, delimiter);
this.error = values.error;
this.error_description = values.error_description;
this.error_uri = values.error_uri;
this.code = values.code;
this.state = values.state;
this.id_token = values.id_token;
this.session_state = values.session_state;
this.access_token = values.access_token;
this.token_type = values.token_type;
this.scope = values.scope;
this.profile = undefined; // will be set from ResponseValidator
this.expires_in = values.expires_in;
}
_createClass(SigninResponse, [{
key: "expires_in",
get: function get() {
if (this.expires_at) {
var now = parseInt(Date.now() / 1000);
return this.expires_at - now;
}
return undefined;
},
set: function set(value) {
var expires_in = parseInt(value);
if (typeof expires_in === 'number' && expires_in > 0) {
var now = parseInt(Date.now() / 1000);
this.expires_at = now + expires_in;
}
}
}, {
key: "expired",
get: function get() {
var expires_in = this.expires_in;
if (expires_in !== undefined) {
return expires_in <= 0;
}
return undefined;
}
}, {
key: "scopes",
get: function get() {
return (this.scope || "").split(" ");
}
}, {
key: "isOpenIdConnect",
get: function get() {
return this.scopes.indexOf(OidcScope) >= 0 || !!this.id_token;
}
}]);
return SigninResponse;
}();
/***/ }),
/***/ "./src/SigninState.js":
/*!****************************!*\
!*** ./src/SigninState.js ***!
\****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SigninState = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _State2 = __webpack_require__(/*! ./State.js */ "./src/State.js");
var _JoseUtil = __webpack_require__(/*! ./JoseUtil.js */ "./src/JoseUtil.js");
var _random = __webpack_require__(/*! ./random.js */ "./src/random.js");
var _random2 = _interopRequireDefault(_random);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SigninState = exports.SigninState = function (_State) {
_inherits(SigninState, _State);
function SigninState() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
nonce = _ref.nonce,
authority = _ref.authority,
client_id = _ref.client_id,
redirect_uri = _ref.redirect_uri,
code_verifier = _ref.code_verifier;
_classCallCheck(this, SigninState);
var _this = _possibleConstructorReturn(this, _State.call(this, arguments[0]));
if (nonce === true) {
_this._nonce = (0, _random2.default)();
} else if (nonce) {
_this._nonce = nonce;
}
if (code_verifier === true) {
// random() produces 32 length
_this._code_verifier = (0, _random2.default)() + (0, _random2.default)() + (0, _random2.default)();
} else if (code_verifier) {
_this._code_verifier = code_verifier;
}
if (_this.code_verifier) {
var hash = _JoseUtil.JoseUtil.hashString(_this.code_verifier, "SHA256");
_this._code_challenge = _JoseUtil.JoseUtil.hexToBase64Url(hash);
}
_this._redirect_uri = redirect_uri;
_this._authority = authority;
_this._client_id = client_id;
return _this;
}
SigninState.prototype.toStorageString = function toStorageString() {
_Log.Log.debug("SigninState.toStorageString");
return JSON.stringify({
id: this.id,
data: this.data,
created: this.created,
nonce: this.nonce,
code_verifier: this.code_verifier,
redirect_uri: this.redirect_uri,
authority: this.authority,
client_id: this.client_id
});
};
SigninState.fromStorageString = function fromStorageString(storageString) {
_Log.Log.debug("SigninState.fromStorageString");
var data = JSON.parse(storageString);
return new SigninState(data);
};
_createClass(SigninState, [{
key: 'nonce',
get: function get() {
return this._nonce;
}
}, {
key: 'authority',
get: function get() {
return this._authority;
}
}, {
key: 'client_id',
get: function get() {
return this._client_id;
}
}, {
key: 'redirect_uri',
get: function get() {
return this._redirect_uri;
}
}, {
key: 'code_verifier',
get: function get() {
return this._code_verifier;
}
}, {
key: 'code_challenge',
get: function get() {
return this._code_challenge;
}
}]);
return SigninState;
}(_State2.State);
/***/ }),
/***/ "./src/SignoutRequest.js":
/*!*******************************!*\
!*** ./src/SignoutRequest.js ***!
\*******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SignoutRequest = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js");
var _State = __webpack_require__(/*! ./State.js */ "./src/State.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SignoutRequest = exports.SignoutRequest = function SignoutRequest(_ref) {
var url = _ref.url,
id_token_hint = _ref.id_token_hint,
post_logout_redirect_uri = _ref.post_logout_redirect_uri,
data = _ref.data,
extraQueryParams = _ref.extraQueryParams;
_classCallCheck(this, SignoutRequest);
if (!url) {
_Log.Log.error("SignoutRequest.ctor: No url passed");
throw new Error("url");
}
if (id_token_hint) {
url = _UrlUtility.UrlUtility.addQueryParam(url, "id_token_hint", id_token_hint);
}
if (post_logout_redirect_uri) {
url = _UrlUtility.UrlUtility.addQueryParam(url, "post_logout_redirect_uri", post_logout_redirect_uri);
if (data) {
this.state = new _State.State({ data: data });
url = _UrlUtility.UrlUtility.addQueryParam(url, "state", this.state.id);
}
}
for (var key in extraQueryParams) {
url = _UrlUtility.UrlUtility.addQueryParam(url, key, extraQueryParams[key]);
}
this.url = url;
};
/***/ }),
/***/ "./src/SignoutResponse.js":
/*!********************************!*\
!*** ./src/SignoutResponse.js ***!
\********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SignoutResponse = undefined;
var _UrlUtility = __webpack_require__(/*! ./UrlUtility.js */ "./src/UrlUtility.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SignoutResponse = exports.SignoutResponse = function SignoutResponse(url) {
_classCallCheck(this, SignoutResponse);
var values = _UrlUtility.UrlUtility.parseUrlFragment(url, "?");
this.error = values.error;
this.error_description = values.error_description;
this.error_uri = values.error_uri;
this.state = values.state;
};
/***/ }),
/***/ "./src/SilentRenewService.js":
/*!***********************************!*\
!*** ./src/SilentRenewService.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SilentRenewService = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SilentRenewService = exports.SilentRenewService = function () {
function SilentRenewService(userManager) {
_classCallCheck(this, SilentRenewService);
this._userManager = userManager;
}
SilentRenewService.prototype.start = function start() {
if (!this._callback) {
this._callback = this._tokenExpiring.bind(this);
this._userManager.events.addAccessTokenExpiring(this._callback);
// this will trigger loading of the user so the expiring events can be initialized
this._userManager.getUser().then(function (user) {
// deliberate nop
}).catch(function (err) {
// catch to suppress errors since we're in a ctor
_Log.Log.error("SilentRenewService.start: Error from getUser:", err.message);
});
}
};
SilentRenewService.prototype.stop = function stop() {
if (this._callback) {
this._userManager.events.removeAccessTokenExpiring(this._callback);
delete this._callback;
}
};
SilentRenewService.prototype._tokenExpiring = function _tokenExpiring() {
var _this = this;
this._userManager.signinSilent().then(function (user) {
_Log.Log.debug("SilentRenewService._tokenExpiring: Silent token renewal successful");
}, function (err) {
_Log.Log.error("SilentRenewService._tokenExpiring: Error from signinSilent:", err.message);
_this._userManager.events._raiseSilentRenewError(err);
});
};
return SilentRenewService;
}();
/***/ }),
/***/ "./src/State.js":
/*!**********************!*\
!*** ./src/State.js ***!
\**********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.State = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _random = __webpack_require__(/*! ./random.js */ "./src/random.js");
var _random2 = _interopRequireDefault(_random);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var State = exports.State = function () {
function State() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
id = _ref.id,
data = _ref.data,
created = _ref.created;
_classCallCheck(this, State);
this._id = id || (0, _random2.default)();
this._data = data;
if (typeof created === 'number' && created > 0) {
this._created = created;
} else {
this._created = parseInt(Date.now() / 1000);
}
}
State.prototype.toStorageString = function toStorageString() {
_Log.Log.debug("State.toStorageString");
return JSON.stringify({
id: this.id,
data: this.data,
created: this.created
});
};
State.fromStorageString = function fromStorageString(storageString) {
_Log.Log.debug("State.fromStorageString");
return new State(JSON.parse(storageString));
};
State.clearStaleState = function clearStaleState(storage, age) {
var cutoff = Date.now() / 1000 - age;
return storage.getAllKeys().then(function (keys) {
_Log.Log.debug("State.clearStaleState: got keys", keys);
var promises = [];
var _loop = function _loop(i) {
var key = keys[i];
p = storage.get(key).then(function (item) {
var remove = false;
if (item) {
try {
var state = State.fromStorageString(item);
_Log.Log.debug("State.clearStaleState: got item from key: ", key, state.created);
if (state.created <= cutoff) {
remove = true;
}
} catch (e) {
_Log.Log.error("State.clearStaleState: Error parsing state for key", key, e.message);
remove = true;
}
} else {
_Log.Log.debug("State.clearStaleState: no item in storage for key: ", key);
remove = true;
}
if (remove) {
_Log.Log.debug("State.clearStaleState: removed item for key: ", key);
return storage.remove(key);
}
});
promises.push(p);
};
for (var i = 0; i < keys.length; i++) {
var p;
_loop(i);
}
_Log.Log.debug("State.clearStaleState: waiting on promise count:", promises.length);
return Promise.all(promises);
});
};
_createClass(State, [{
key: 'id',
get: function get() {
return this._id;
}
}, {
key: 'data',
get: function get() {
return this._data;
}
}, {
key: 'created',
get: function get() {
return this._created;
}
}]);
return State;
}();
/***/ }),
/***/ "./src/Timer.js":
/*!**********************!*\
!*** ./src/Timer.js ***!
\**********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Timer = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js");
var _Event2 = __webpack_require__(/*! ./Event.js */ "./src/Event.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var TimerDuration = 5; // seconds
var Timer = exports.Timer = function (_Event) {
_inherits(Timer, _Event);
function Timer(name) {
var timer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _Global.Global.timer;
var nowFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
_classCallCheck(this, Timer);
var _this = _possibleConstructorReturn(this, _Event.call(this, name));
_this._timer = timer;
if (nowFunc) {
_this._nowFunc = nowFunc;
} else {
_this._nowFunc = function () {
return Date.now() / 1000;
};
}
return _this;
}
Timer.prototype.init = function init(duration) {
if (duration <= 0) {
duration = 1;
}
duration = parseInt(duration);
var expiration = this.now + duration;
if (this.expiration === expiration && this._timerHandle) {
// no need to reinitialize to same expiration, so bail out
_Log.Log.debug("Timer.init timer " + this._name + " skipping initialization since already initialized for expiration:", this.expiration);
return;
}
this.cancel();
_Log.Log.debug("Timer.init timer " + this._name + " for duration:", duration);
this._expiration = expiration;
// we're using a fairly short timer and then checking the expiration in the
// callback to handle scenarios where the browser device sleeps, and then
// the timers end up getting delayed.
var timerDuration = TimerDuration;
if (duration < timerDuration) {
timerDuration = duration;
}
this._timerHandle = this._timer.setInterval(this._callback.bind(this), timerDuration * 1000);
};
Timer.prototype.cancel = function cancel() {
if (this._timerHandle) {
_Log.Log.debug("Timer.cancel: ", this._name);
this._timer.clearInterval(this._timerHandle);
this._timerHandle = null;
}
};
Timer.prototype._callback = function _callback() {
var diff = this._expiration - this.now;
_Log.Log.debug("Timer.callback; " + this._name + " timer expires in:", diff);
if (this._expiration <= this.now) {
this.cancel();
_Event.prototype.raise.call(this);
}
};
_createClass(Timer, [{
key: 'now',
get: function get() {
return parseInt(this._nowFunc());
}
}, {
key: 'expiration',
get: function get() {
return this._expiration;
}
}]);
return Timer;
}(_Event2.Event);
/***/ }),
/***/ "./src/TokenClient.js":
/*!****************************!*\
!*** ./src/TokenClient.js ***!
\****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TokenClient = undefined;
var _JsonService = __webpack_require__(/*! ./JsonService.js */ "./src/JsonService.js");
var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js");
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var TokenClient = exports.TokenClient = function () {
function TokenClient(settings) {
var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService.JsonService;
var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService.MetadataService;
_classCallCheck(this, TokenClient);
if (!settings) {
_Log.Log.error("TokenClient.ctor: No settings passed");
throw new Error("settings");
}
this._settings = settings;
this._jsonService = new JsonServiceCtor();
this._metadataService = new MetadataServiceCtor(this._settings);
}
TokenClient.prototype.exchangeCode = function exchangeCode() {
var _this = this;
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
args.grant_type = args.grant_type || "authorization_code";
args.client_id = args.client_id || this._settings.client_id;
args.redirect_uri = args.redirect_uri || this._settings.redirect_uri;
if (!args.code) {
_Log.Log.error("TokenClient.exchangeCode: No code passed");
return Promise.reject(new Error("A code is required"));
}
if (!args.redirect_uri) {
_Log.Log.error("TokenClient.exchangeCode: No redirect_uri passed");
return Promise.reject(new Error("A redirect_uri is required"));
}
if (!args.code_verifier) {
_Log.Log.error("TokenClient.exchangeCode: No code_verifier passed");
return Promise.reject(new Error("A code_verifier is required"));
}
if (!args.client_id) {
_Log.Log.error("TokenClient.exchangeCode: No client_id passed");
return Promise.reject(new Error("A client_id is required"));
}
return this._metadataService.getTokenEndpoint(false).then(function (url) {
_Log.Log.debug("TokenClient.exchangeCode: Received token endpoint");
return _this._jsonService.postForm(url, args).then(function (response) {
_Log.Log.debug("TokenClient.exchangeCode: response received");
return response;
});
});
};
TokenClient.prototype.exchangeRefreshToken = function exchangeRefreshToken() {
var _this2 = this;
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
args.grant_type = args.grant_type || "refresh_token";
args.client_id = args.client_id || this._settings.client_id;
if (!args.refresh_token) {
_Log.Log.error("TokenClient.exchangeRefreshToken: No refresh_token passed");
return Promise.reject(new Error("A refresh_token is required"));
}
if (!args.client_id) {
_Log.Log.error("TokenClient.exchangeRefreshToken: No client_id passed");
return Promise.reject(new Error("A client_id is required"));
}
return this._metadataService.getTokenEndpoint(false).then(function (url) {
_Log.Log.debug("TokenClient.exchangeRefreshToken: Received token endpoint");
return _this2._jsonService.postForm(url, args).then(function (response) {
_Log.Log.debug("TokenClient.exchangeRefreshToken: response received");
return response;
});
});
};
return TokenClient;
}();
/***/ }),
/***/ "./src/TokenRevocationClient.js":
/*!**************************************!*\
!*** ./src/TokenRevocationClient.js ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TokenRevocationClient = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js");
var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var AccessTokenTypeHint = "access_token";
var RefreshTokenTypeHint = "refresh_token";
var TokenRevocationClient = exports.TokenRevocationClient = function () {
function TokenRevocationClient(settings) {
var XMLHttpRequestCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _Global.Global.XMLHttpRequest;
var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService.MetadataService;
_classCallCheck(this, TokenRevocationClient);
if (!settings) {
_Log.Log.error("TokenRevocationClient.ctor: No settings provided");
throw new Error("No settings provided.");
}
this._settings = settings;
this._XMLHttpRequestCtor = XMLHttpRequestCtor;
this._metadataService = new MetadataServiceCtor(this._settings);
}
TokenRevocationClient.prototype.revoke = function revoke(token, required) {
var _this = this;
var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "access_token";
if (!token) {
_Log.Log.error("TokenRevocationClient.revoke: No token provided");
throw new Error("No token provided.");
}
if (type !== AccessTokenTypeHint && type != RefreshTokenTypeHint) {
_Log.Log.error("TokenRevocationClient.revoke: Invalid token type");
throw new Error("Invalid token type.");
}
return this._metadataService.getRevocationEndpoint().then(function (url) {
if (!url) {
if (required) {
_Log.Log.error("TokenRevocationClient.revoke: Revocation not supported");
throw new Error("Revocation not supported");
}
// not required, so don't error and just return
return;
}
_Log.Log.debug("TokenRevocationClient.revoke: Revoking " + type);
var client_id = _this._settings.client_id;
var client_secret = _this._settings.client_secret;
return _this._revoke(url, client_id, client_secret, token, type);
});
};
TokenRevocationClient.prototype._revoke = function _revoke(url, client_id, client_secret, token, type) {
var _this2 = this;
return new Promise(function (resolve, reject) {
var xhr = new _this2._XMLHttpRequestCtor();
xhr.open("POST", url);
xhr.onload = function () {
_Log.Log.debug("TokenRevocationClient.revoke: HTTP response received, status", xhr.status);
if (xhr.status === 200) {
resolve();
} else {
reject(Error(xhr.statusText + " (" + xhr.status + ")"));
}
};
xhr.onerror = function () {
_Log.Log.debug("TokenRevocationClient.revoke: Network Error.");
reject("Network Error");
};
var body = "client_id=" + encodeURIComponent(client_id);
if (client_secret) {
body += "&client_secret=" + encodeURIComponent(client_secret);
}
body += "&token_type_hint=" + encodeURIComponent(type);
body += "&token=" + encodeURIComponent(token);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(body);
});
};
return TokenRevocationClient;
}();
/***/ }),
/***/ "./src/UrlUtility.js":
/*!***************************!*\
!*** ./src/UrlUtility.js ***!
\***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UrlUtility = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UrlUtility = exports.UrlUtility = function () {
function UrlUtility() {
_classCallCheck(this, UrlUtility);
}
UrlUtility.addQueryParam = function addQueryParam(url, name, value) {
if (url.indexOf('?') < 0) {
url += "?";
}
if (url[url.length - 1] !== "?") {
url += "&";
}
url += encodeURIComponent(name);
url += "=";
url += encodeURIComponent(value);
return url;
};
UrlUtility.parseUrlFragment = function parseUrlFragment(value) {
var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "#";
var global = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _Global.Global;
if (typeof value !== 'string') {
value = global.location.href;
}
var idx = value.lastIndexOf(delimiter);
if (idx >= 0) {
value = value.substr(idx + 1);
}
if (delimiter === "?") {
// if we're doing query, then strip off hash fragment before we parse
idx = value.indexOf('#');
if (idx >= 0) {
value = value.substr(0, idx);
}
}
var params = {},
regex = /([^&=]+)=([^&]*)/g,
m;
var counter = 0;
while (m = regex.exec(value)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
if (counter++ > 50) {
_Log.Log.error("UrlUtility.parseUrlFragment: response exceeded expected number of parameters", value);
return {
error: "Response exceeded expected number of parameters"
};
}
}
for (var prop in params) {
return params;
}
return {};
};
return UrlUtility;
}();
/***/ }),
/***/ "./src/User.js":
/*!*********************!*\
!*** ./src/User.js ***!
\*********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.User = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var User = exports.User = function () {
function User(_ref) {
var id_token = _ref.id_token,
session_state = _ref.session_state,
access_token = _ref.access_token,
refresh_token = _ref.refresh_token,
token_type = _ref.token_type,
scope = _ref.scope,
profile = _ref.profile,
expires_at = _ref.expires_at,
state = _ref.state;
_classCallCheck(this, User);
this.id_token = id_token;
this.session_state = session_state;
this.access_token = access_token;
this.refresh_token = refresh_token;
this.token_type = token_type;
this.scope = scope;
this.profile = profile;
this.expires_at = expires_at;
this.state = state;
}
User.prototype.toStorageString = function toStorageString() {
_Log.Log.debug("User.toStorageString");
return JSON.stringify({
id_token: this.id_token,
session_state: this.session_state,
access_token: this.access_token,
refresh_token: this.refresh_token,
token_type: this.token_type,
scope: this.scope,
profile: this.profile,
expires_at: this.expires_at
});
};
User.fromStorageString = function fromStorageString(storageString) {
_Log.Log.debug("User.fromStorageString");
return new User(JSON.parse(storageString));
};
_createClass(User, [{
key: 'expires_in',
get: function get() {
if (this.expires_at) {
var now = parseInt(Date.now() / 1000);
return this.expires_at - now;
}
return undefined;
},
set: function set(value) {
var expires_in = parseInt(value);
if (typeof expires_in === 'number' && expires_in > 0) {
var now = parseInt(Date.now() / 1000);
this.expires_at = now + expires_in;
}
}
}, {
key: 'expired',
get: function get() {
var expires_in = this.expires_in;
if (expires_in !== undefined) {
return expires_in <= 0;
}
return undefined;
}
}, {
key: 'scopes',
get: function get() {
return (this.scope || "").split(" ");
}
}]);
return User;
}();
/***/ }),
/***/ "./src/UserInfoService.js":
/*!********************************!*\
!*** ./src/UserInfoService.js ***!
\********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UserInfoService = undefined;
var _JsonService = __webpack_require__(/*! ./JsonService.js */ "./src/JsonService.js");
var _MetadataService = __webpack_require__(/*! ./MetadataService.js */ "./src/MetadataService.js");
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _JoseUtil = __webpack_require__(/*! ./JoseUtil.js */ "./src/JoseUtil.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UserInfoService = exports.UserInfoService = function () {
function UserInfoService(settings) {
var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService.JsonService;
var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService.MetadataService;
var joseUtil = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _JoseUtil.JoseUtil;
_classCallCheck(this, UserInfoService);
if (!settings) {
_Log.Log.error("UserInfoService.ctor: No settings passed");
throw new Error("settings");
}
this._settings = settings;
this._jsonService = new JsonServiceCtor(undefined, undefined, this._getClaimsFromJwt.bind(this));
this._metadataService = new MetadataServiceCtor(this._settings);
this._joseUtil = joseUtil;
}
UserInfoService.prototype.getClaims = function getClaims(token) {
var _this = this;
if (!token) {
_Log.Log.error("UserInfoService.getClaims: No token passed");
return Promise.reject(new Error("A token is required"));
}
return this._metadataService.getUserInfoEndpoint().then(function (url) {
_Log.Log.debug("UserInfoService.getClaims: received userinfo url", url);
return _this._jsonService.getJson(url, token).then(function (claims) {
_Log.Log.debug("UserInfoService.getClaims: claims received", claims);
return claims;
});
});
};
UserInfoService.prototype._getClaimsFromJwt = function _getClaimsFromJwt(req) {
var _this2 = this;
try {
var jwt = this._joseUtil.parseJwt(req.responseText);
if (!jwt || !jwt.header || !jwt.payload) {
_Log.Log.error("UserInfoService._getClaimsFromJwt: Failed to parse JWT", jwt);
return Promise.reject(new Error("Failed to parse id_token"));
}
var kid = jwt.header.kid;
var issuerPromise = void 0;
switch (this._settings.userInfoJwtIssuer) {
case 'OP':
issuerPromise = this._metadataService.getIssuer();
break;
case 'ANY':
issuerPromise = Promise.resolve(jwt.payload.iss);
break;
default:
issuerPromise = Promise.resolve(this._settings.userInfoJwtIssuer);
break;
}
return issuerPromise.then(function (issuer) {
_Log.Log.debug("UserInfoService._getClaimsFromJwt: Received issuer:" + issuer);
return _this2._metadataService.getSigningKeys().then(function (keys) {
if (!keys) {
_Log.Log.error("UserInfoService._getClaimsFromJwt: No signing keys from metadata");
return Promise.reject(new Error("No signing keys from metadata"));
}
_Log.Log.debug("UserInfoService._getClaimsFromJwt: Received signing keys");
var key = void 0;
if (!kid) {
keys = _this2._filterByAlg(keys, jwt.header.alg);
if (keys.length > 1) {
_Log.Log.error("UserInfoService._getClaimsFromJwt: No kid found in id_token and more than one key found in metadata");
return Promise.reject(new Error("No kid found in id_token and more than one key found in metadata"));
} else {
// kid is mandatory only when there are multiple keys in the referenced JWK Set document
// see http://openid.net/specs/openid-connect-core-1_0.html#Signing
key = keys[0];
}
} else {
key = keys.filter(function (key) {
return key.kid === kid;
})[0];
}
if (!key) {
_Log.Log.error("UserInfoService._getClaimsFromJwt: No key matching kid or alg found in signing keys");
return Promise.reject(new Error("No key matching kid or alg found in signing keys"));
}
var audience = _this2._settings.client_id;
var clockSkewInSeconds = _this2._settings.clockSkew;
_Log.Log.debug("UserInfoService._getClaimsFromJwt: Validaing JWT; using clock skew (in seconds) of: ", clockSkewInSeconds);
return _this2._joseUtil.validateJwt(req.responseText, key, issuer, audience, clockSkewInSeconds, undefined, true).then(function () {
_Log.Log.debug("UserInfoService._getClaimsFromJwt: JWT validation successful");
return jwt.payload;
});
});
});
return;
} catch (e) {
_Log.Log.error("UserInfoService._getClaimsFromJwt: Error parsing JWT response", e.message);
reject(e);
return;
}
};
UserInfoService.prototype._filterByAlg = function _filterByAlg(keys, alg) {
var kty = null;
if (alg.startsWith("RS")) {
kty = "RSA";
} else if (alg.startsWith("PS")) {
kty = "PS";
} else if (alg.startsWith("ES")) {
kty = "EC";
} else {
_Log.Log.debug("UserInfoService._filterByAlg: alg not supported: ", alg);
return [];
}
_Log.Log.debug("UserInfoService._filterByAlg: Looking for keys that match kty: ", kty);
keys = keys.filter(function (key) {
return key.kty === kty;
});
_Log.Log.debug("UserInfoService._filterByAlg: Number of keys that match kty: ", kty, keys.length);
return keys;
};
return UserInfoService;
}();
/***/ }),
/***/ "./src/UserManager.js":
/*!****************************!*\
!*** ./src/UserManager.js ***!
\****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UserManager = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _OidcClient2 = __webpack_require__(/*! ./OidcClient.js */ "./src/OidcClient.js");
var _UserManagerSettings = __webpack_require__(/*! ./UserManagerSettings.js */ "./src/UserManagerSettings.js");
var _User = __webpack_require__(/*! ./User.js */ "./src/User.js");
var _UserManagerEvents = __webpack_require__(/*! ./UserManagerEvents.js */ "./src/UserManagerEvents.js");
var _SilentRenewService = __webpack_require__(/*! ./SilentRenewService.js */ "./src/SilentRenewService.js");
var _SessionMonitor = __webpack_require__(/*! ./SessionMonitor.js */ "./src/SessionMonitor.js");
var _TokenRevocationClient = __webpack_require__(/*! ./TokenRevocationClient.js */ "./src/TokenRevocationClient.js");
var _TokenClient = __webpack_require__(/*! ./TokenClient.js */ "./src/TokenClient.js");
var _JoseUtil = __webpack_require__(/*! ./JoseUtil.js */ "./src/JoseUtil.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UserManager = exports.UserManager = function (_OidcClient) {
_inherits(UserManager, _OidcClient);
function UserManager() {
var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var SilentRenewServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _SilentRenewService.SilentRenewService;
var SessionMonitorCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _SessionMonitor.SessionMonitor;
var TokenRevocationClientCtor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _TokenRevocationClient.TokenRevocationClient;
var TokenClientCtor = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _TokenClient.TokenClient;
var joseUtil = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : _JoseUtil.JoseUtil;
_classCallCheck(this, UserManager);
if (!(settings instanceof _UserManagerSettings.UserManagerSettings)) {
settings = new _UserManagerSettings.UserManagerSettings(settings);
}
var _this = _possibleConstructorReturn(this, _OidcClient.call(this, settings));
_this._events = new _UserManagerEvents.UserManagerEvents(settings);
_this._silentRenewService = new SilentRenewServiceCtor(_this);
// order is important for the following properties; these services depend upon the events.
if (_this.settings.automaticSilentRenew) {
_Log.Log.debug("UserManager.ctor: automaticSilentRenew is configured, setting up silent renew");
_this.startSilentRenew();
}
if (_this.settings.monitorSession) {
_Log.Log.debug("UserManager.ctor: monitorSession is configured, setting up session monitor");
_this._sessionMonitor = new SessionMonitorCtor(_this);
}
_this._tokenRevocationClient = new TokenRevocationClientCtor(_this._settings);
_this._tokenClient = new TokenClientCtor(_this._settings);
_this._joseUtil = joseUtil;
return _this;
}
UserManager.prototype.getUser = function getUser() {
var _this2 = this;
return this._loadUser().then(function (user) {
if (user) {
_Log.Log.info("UserManager.getUser: user loaded");
_this2._events.load(user, false);
return user;
} else {
_Log.Log.info("UserManager.getUser: user not found in storage");
return null;
}
});
};
UserManager.prototype.removeUser = function removeUser() {
var _this3 = this;
return this.storeUser(null).then(function () {
_Log.Log.info("UserManager.removeUser: user removed from storage");
_this3._events.unload();
});
};
UserManager.prototype.signinRedirect = function signinRedirect(args) {
return this._signinStart(args, this._redirectNavigator).then(function () {
_Log.Log.info("UserManager.signinRedirect: successful");
});
};
UserManager.prototype.signinRedirectCallback = function signinRedirectCallback(url) {
return this._signinEnd(url || this._redirectNavigator.url).then(function (user) {
if (user) {
if (user.profile && user.profile.sub) {
_Log.Log.info("UserManager.signinRedirectCallback: successful, signed in sub: ", user.profile.sub);
} else {
_Log.Log.info("UserManager.signinRedirectCallback: no sub");
}
}
return user;
});
};
UserManager.prototype.signinPopup = function signinPopup() {
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var url = args.redirect_uri || this.settings.popup_redirect_uri || this.settings.redirect_uri;
if (!url) {
_Log.Log.error("UserManager.signinPopup: No popup_redirect_uri or redirect_uri configured");
return Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured"));
}
args.redirect_uri = url;
args.display = "popup";
return this._signin(args, this._popupNavigator, {
startUrl: url,
popupWindowFeatures: args.popupWindowFeatures || this.settings.popupWindowFeatures,
popupWindowTarget: args.popupWindowTarget || this.settings.popupWindowTarget
}).then(function (user) {
if (user) {
if (user.profile && user.profile.sub) {
_Log.Log.info("UserManager.signinPopup: signinPopup successful, signed in sub: ", user.profile.sub);
} else {
_Log.Log.info("UserManager.signinPopup: no sub");
}
}
return user;
});
};
UserManager.prototype.signinPopupCallback = function signinPopupCallback(url) {
return this._signinCallback(url, this._popupNavigator).then(function (user) {
if (user) {
if (user.profile && user.profile.sub) {
_Log.Log.info("UserManager.signinPopupCallback: successful, signed in sub: ", user.profile.sub);
} else {
_Log.Log.info("UserManager.signinPopupCallback: no sub");
}
}
return user;
}).catch(function (err) {
_Log.Log.error( true && err.message);
});
};
UserManager.prototype.signinSilent = function signinSilent() {
var _this4 = this;
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
// first determine if we have a refresh token, or need to use iframe
return this._loadUser().then(function (user) {
if (user && user.refresh_token) {
args.refresh_token = user.refresh_token;
return _this4._useRefreshToken(args);
} else {
args.id_token_hint = args.id_token_hint || _this4.settings.includeIdTokenInSilentRenew && user && user.id_token;
return _this4._signinSilentIframe(args);
}
});
};
UserManager.prototype._useRefreshToken = function _useRefreshToken() {
var _this5 = this;
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this._tokenClient.exchangeRefreshToken(args).then(function (result) {
if (!result) {
_Log.Log.error("UserManager._useRefreshToken: No response returned from token endpoint");
return Promise.reject("No response returned from token endpoint");
}
if (!result.access_token) {
_Log.Log.error("UserManager._useRefreshToken: No access token returned from token endpoint");
return Promise.reject("No access token returned from token endpoint");
}
return _this5._loadUser().then(function (user) {
if (user) {
var idTokenValidation = Promise.resolve();
if (result.id_token) {
idTokenValidation = _this5._validateIdTokenFromTokenRefreshToken(user.profile, result.id_token);
}
return idTokenValidation.then(function () {
_Log.Log.debug("UserManager._useRefreshToken: refresh token response success");
user.access_token = result.access_token;
user.refresh_token = result.refresh_token || user.refresh_token;
user.expires_in = result.expires_in;
return _this5.storeUser(user).then(function () {
_this5._events.load(user);
return user;
});
});
} else {
return null;
}
});
});
};
UserManager.prototype._validateIdTokenFromTokenRefreshToken = function _validateIdTokenFromTokenRefreshToken(profile, id_token) {
var _this6 = this;
return this._metadataService.getIssuer().then(function (issuer) {
return _this6._joseUtil.validateJwtAttributes(id_token, issuer, _this6._settings.client_id, _this6._settings.clockSkew).then(function (payload) {
if (!payload) {
_Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: Failed to validate id_token");
return Promise.reject(new Error("Failed to validate id_token"));
}
if (payload.sub !== profile.sub) {
_Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: sub in id_token does not match current sub");
return Promise.reject(new Error("sub in id_token does not match current sub"));
}
if (payload.auth_time && payload.auth_time !== profile.auth_time) {
_Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: auth_time in id_token does not match original auth_time");
return Promise.reject(new Error("auth_time in id_token does not match original auth_time"));
}
if (payload.azp && payload.azp !== profile.azp) {
_Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: azp in id_token does not match original azp");
return Promise.reject(new Error("azp in id_token does not match original azp"));
}
if (!payload.azp && profile.azp) {
_Log.Log.error("UserManager._validateIdTokenFromTokenRefreshToken: azp not in id_token, but present in original id_token");
return Promise.reject(new Error("azp not in id_token, but present in original id_token"));
}
});
});
};
UserManager.prototype._signinSilentIframe = function _signinSilentIframe() {
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var url = args.redirect_uri || this.settings.silent_redirect_uri;
if (!url) {
_Log.Log.error("UserManager.signinSilent: No silent_redirect_uri configured");
return Promise.reject(new Error("No silent_redirect_uri configured"));
}
args.redirect_uri = url;
args.prompt = args.prompt || "none";
return this._signin(args, this._iframeNavigator, {
startUrl: url,
silentRequestTimeout: args.silentRequestTimeout || this.settings.silentRequestTimeout
}).then(function (user) {
if (user) {
if (user.profile && user.profile.sub) {
_Log.Log.info("UserManager.signinSilent: successful, signed in sub: ", user.profile.sub);
} else {
_Log.Log.info("UserManager.signinSilent: no sub");
}
}
return user;
});
};
UserManager.prototype.signinSilentCallback = function signinSilentCallback(url) {
return this._signinCallback(url, this._iframeNavigator).then(function (user) {
if (user) {
if (user.profile && user.profile.sub) {
_Log.Log.info("UserManager.signinSilentCallback: successful, signed in sub: ", user.profile.sub);
} else {
_Log.Log.info("UserManager.signinSilentCallback: no sub");
}
}
return user;
});
};
UserManager.prototype.querySessionStatus = function querySessionStatus() {
var _this7 = this;
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var url = args.redirect_uri || this.settings.silent_redirect_uri;
if (!url) {
_Log.Log.error("UserManager.querySessionStatus: No silent_redirect_uri configured");
return Promise.reject(new Error("No silent_redirect_uri configured"));
}
args.redirect_uri = url;
args.prompt = "none";
args.response_type = args.response_type || this.settings.query_status_response_type;
args.scope = "openid";
return this._signinStart(args, this._iframeNavigator, {
startUrl: url,
silentRequestTimeout: args.silentRequestTimeout || this.settings.silentRequestTimeout
}).then(function (navResponse) {
return _this7.processSigninResponse(navResponse.url).then(function (signinResponse) {
_Log.Log.debug("UserManager.querySessionStatus: got signin response");
if (signinResponse.session_state && signinResponse.profile.sub) {
_Log.Log.info("UserManager.querySessionStatus: querySessionStatus success for sub: ", signinResponse.profile.sub);
return {
session_state: signinResponse.session_state,
sub: signinResponse.profile.sub,
sid: signinResponse.profile.sid
};
} else {
_Log.Log.info("querySessionStatus successful, user not authenticated");
}
});
});
};
UserManager.prototype._signin = function _signin(args, navigator) {
var _this8 = this;
var navigatorParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return this._signinStart(args, navigator, navigatorParams).then(function (navResponse) {
return _this8._signinEnd(navResponse.url);
});
};
UserManager.prototype._signinStart = function _signinStart(args, navigator) {
var _this9 = this;
var navigatorParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return navigator.prepare(navigatorParams).then(function (handle) {
_Log.Log.debug("UserManager._signinStart: got navigator window handle");
return _this9.createSigninRequest(args).then(function (signinRequest) {
_Log.Log.debug("UserManager._signinStart: got signin request");
navigatorParams.url = signinRequest.url;
navigatorParams.id = signinRequest.state.id;
return handle.navigate(navigatorParams);
}).catch(function (err) {
if (handle.close) {
_Log.Log.debug("UserManager._signinStart: Error after preparing navigator, closing navigator window");
handle.close();
}
throw err;
});
});
};
UserManager.prototype._signinEnd = function _signinEnd(url) {
var _this10 = this;
return this.processSigninResponse(url).then(function (signinResponse) {
_Log.Log.debug("UserManager._signinEnd: got signin response");
var user = new _User.User(signinResponse);
return _this10.storeUser(user).then(function () {
_Log.Log.debug("UserManager._signinEnd: user stored");
_this10._events.load(user);
return user;
});
});
};
UserManager.prototype._signinCallback = function _signinCallback(url, navigator) {
_Log.Log.debug("UserManager._signinCallback");
return navigator.callback(url);
};
UserManager.prototype.signoutRedirect = function signoutRedirect() {
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var postLogoutRedirectUri = args.post_logout_redirect_uri || this.settings.post_logout_redirect_uri;
if (postLogoutRedirectUri) {
args.post_logout_redirect_uri = postLogoutRedirectUri;
}
return this._signoutStart(args, this._redirectNavigator).then(function () {
_Log.Log.info("UserManager.signoutRedirect: successful");
});
};
UserManager.prototype.signoutRedirectCallback = function signoutRedirectCallback(url) {
return this._signoutEnd(url || this._redirectNavigator.url).then(function (response) {
_Log.Log.info("UserManager.signoutRedirectCallback: successful");
return response;
});
};
UserManager.prototype.signoutPopup = function signoutPopup() {
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var url = args.post_logout_redirect_uri || this.settings.popup_post_logout_redirect_uri || this.settings.post_logout_redirect_uri;
args.post_logout_redirect_uri = url;
args.display = "popup";
if (args.post_logout_redirect_uri) {
// we're putting a dummy entry in here because we
// need a unique id from the state for notification
// to the parent window, which is necessary if we
// plan to return back to the client after signout
// and so we can close the popup after signout
args.state = args.state || {};
}
return this._signout(args, this._popupNavigator, {
startUrl: url,
popupWindowFeatures: args.popupWindowFeatures || this.settings.popupWindowFeatures,
popupWindowTarget: args.popupWindowTarget || this.settings.popupWindowTarget
}).then(function () {
_Log.Log.info("UserManager.signoutPopup: successful");
});
};
UserManager.prototype.signoutPopupCallback = function signoutPopupCallback(url, keepOpen) {
if (typeof keepOpen === 'undefined' && typeof url === 'boolean') {
keepOpen = url;
url = null;
}
var delimiter = '?';
return this._popupNavigator.callback(url, keepOpen, delimiter).then(function () {
_Log.Log.info("UserManager.signoutPopupCallback: successful");
});
};
UserManager.prototype._signout = function _signout(args, navigator) {
var _this11 = this;
var navigatorParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return this._signoutStart(args, navigator, navigatorParams).then(function (navResponse) {
return _this11._signoutEnd(navResponse.url);
});
};
UserManager.prototype._signoutStart = function _signoutStart() {
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _this12 = this;
var navigator = arguments[1];
var navigatorParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return navigator.prepare(navigatorParams).then(function (handle) {
_Log.Log.debug("UserManager._signoutStart: got navigator window handle");
return _this12._loadUser().then(function (user) {
_Log.Log.debug("UserManager._signoutStart: loaded current user from storage");
var revokePromise = _this12._settings.revokeAccessTokenOnSignout ? _this12._revokeInternal(user) : Promise.resolve();
return revokePromise.then(function () {
var id_token = args.id_token_hint || user && user.id_token;
if (id_token) {
_Log.Log.debug("UserManager._signoutStart: Setting id_token into signout request");
args.id_token_hint = id_token;
}
return _this12.removeUser().then(function () {
_Log.Log.debug("UserManager._signoutStart: user removed, creating signout request");
return _this12.createSignoutRequest(args).then(function (signoutRequest) {
_Log.Log.debug("UserManager._signoutStart: got signout request");
navigatorParams.url = signoutRequest.url;
if (signoutRequest.state) {
navigatorParams.id = signoutRequest.state.id;
}
return handle.navigate(navigatorParams);
});
});
});
}).catch(function (err) {
if (handle.close) {
_Log.Log.debug("UserManager._signoutStart: Error after preparing navigator, closing navigator window");
handle.close();
}
throw err;
});
});
};
UserManager.prototype._signoutEnd = function _signoutEnd(url) {
return this.processSignoutResponse(url).then(function (signoutResponse) {
_Log.Log.debug("UserManager._signoutEnd: got signout response");
return signoutResponse;
});
};
UserManager.prototype.revokeAccessToken = function revokeAccessToken() {
var _this13 = this;
return this._loadUser().then(function (user) {
return _this13._revokeInternal(user, true).then(function (success) {
if (success) {
_Log.Log.debug("UserManager.revokeAccessToken: removing token properties from user and re-storing");
user.access_token = null;
user.refresh_token = null;
user.expires_at = null;
user.token_type = null;
return _this13.storeUser(user).then(function () {
_Log.Log.debug("UserManager.revokeAccessToken: user stored");
_this13._events.load(user);
});
}
});
}).then(function () {
_Log.Log.info("UserManager.revokeAccessToken: access token revoked successfully");
});
};
UserManager.prototype._revokeInternal = function _revokeInternal(user, required) {
var _this14 = this;
if (user) {
var access_token = user.access_token;
var refresh_token = user.refresh_token;
return this._revokeAccessTokenInternal(access_token, required).then(function (atSuccess) {
return _this14._revokeRefreshTokenInternal(refresh_token, required).then(function (rtSuccess) {
if (!atSuccess && !rtSuccess) {
_Log.Log.debug("UserManager.revokeAccessToken: no need to revoke due to no token(s), or JWT format");
}
return atSuccess || rtSuccess;
});
});
}
return Promise.resolve(false);
};
UserManager.prototype._revokeAccessTokenInternal = function _revokeAccessTokenInternal(access_token, required) {
// check for JWT vs. reference token
if (!access_token || access_token.indexOf('.') >= 0) {
return Promise.resolve(false);
}
return this._tokenRevocationClient.revoke(access_token, required).then(function () {
return true;
});
};
UserManager.prototype._revokeRefreshTokenInternal = function _revokeRefreshTokenInternal(refresh_token, required) {
if (!refresh_token) {
return Promise.resolve(false);
}
return this._tokenRevocationClient.revoke(refresh_token, required, "refresh_token").then(function () {
return true;
});
};
UserManager.prototype.startSilentRenew = function startSilentRenew() {
this._silentRenewService.start();
};
UserManager.prototype.stopSilentRenew = function stopSilentRenew() {
this._silentRenewService.stop();
};
UserManager.prototype._loadUser = function _loadUser() {
return this._userStore.get(this._userStoreKey).then(function (storageString) {
if (storageString) {
_Log.Log.debug("UserManager._loadUser: user storageString loaded");
return _User.User.fromStorageString(storageString);
}
_Log.Log.debug("UserManager._loadUser: no user storageString");
return null;
});
};
UserManager.prototype.storeUser = function storeUser(user) {
if (user) {
_Log.Log.debug("UserManager.storeUser: storing user");
var storageString = user.toStorageString();
return this._userStore.set(this._userStoreKey, storageString);
} else {
_Log.Log.debug("storeUser.storeUser: removing user");
return this._userStore.remove(this._userStoreKey);
}
};
_createClass(UserManager, [{
key: '_redirectNavigator',
get: function get() {
return this.settings.redirectNavigator;
}
}, {
key: '_popupNavigator',
get: function get() {
return this.settings.popupNavigator;
}
}, {
key: '_iframeNavigator',
get: function get() {
return this.settings.iframeNavigator;
}
}, {
key: '_userStore',
get: function get() {
return this.settings.userStore;
}
}, {
key: 'events',
get: function get() {
return this._events;
}
}, {
key: '_userStoreKey',
get: function get() {
return 'user:' + this.settings.authority + ':' + this.settings.client_id;
}
}]);
return UserManager;
}(_OidcClient2.OidcClient);
/***/ }),
/***/ "./src/UserManagerEvents.js":
/*!**********************************!*\
!*** ./src/UserManagerEvents.js ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UserManagerEvents = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _AccessTokenEvents2 = __webpack_require__(/*! ./AccessTokenEvents.js */ "./src/AccessTokenEvents.js");
var _Event = __webpack_require__(/*! ./Event.js */ "./src/Event.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UserManagerEvents = exports.UserManagerEvents = function (_AccessTokenEvents) {
_inherits(UserManagerEvents, _AccessTokenEvents);
function UserManagerEvents(settings) {
_classCallCheck(this, UserManagerEvents);
var _this = _possibleConstructorReturn(this, _AccessTokenEvents.call(this, settings));
_this._userLoaded = new _Event.Event("User loaded");
_this._userUnloaded = new _Event.Event("User unloaded");
_this._silentRenewError = new _Event.Event("Silent renew error");
_this._userSignedOut = new _Event.Event("User signed out");
_this._userSessionChanged = new _Event.Event("User session changed");
return _this;
}
UserManagerEvents.prototype.load = function load(user) {
var raiseEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
_Log.Log.debug("UserManagerEvents.load");
_AccessTokenEvents.prototype.load.call(this, user);
if (raiseEvent) {
this._userLoaded.raise(user);
}
};
UserManagerEvents.prototype.unload = function unload() {
_Log.Log.debug("UserManagerEvents.unload");
_AccessTokenEvents.prototype.unload.call(this);
this._userUnloaded.raise();
};
UserManagerEvents.prototype.addUserLoaded = function addUserLoaded(cb) {
this._userLoaded.addHandler(cb);
};
UserManagerEvents.prototype.removeUserLoaded = function removeUserLoaded(cb) {
this._userLoaded.removeHandler(cb);
};
UserManagerEvents.prototype.addUserUnloaded = function addUserUnloaded(cb) {
this._userUnloaded.addHandler(cb);
};
UserManagerEvents.prototype.removeUserUnloaded = function removeUserUnloaded(cb) {
this._userUnloaded.removeHandler(cb);
};
UserManagerEvents.prototype.addSilentRenewError = function addSilentRenewError(cb) {
this._silentRenewError.addHandler(cb);
};
UserManagerEvents.prototype.removeSilentRenewError = function removeSilentRenewError(cb) {
this._silentRenewError.removeHandler(cb);
};
UserManagerEvents.prototype._raiseSilentRenewError = function _raiseSilentRenewError(e) {
_Log.Log.debug("UserManagerEvents._raiseSilentRenewError", e.message);
this._silentRenewError.raise(e);
};
UserManagerEvents.prototype.addUserSignedOut = function addUserSignedOut(cb) {
this._userSignedOut.addHandler(cb);
};
UserManagerEvents.prototype.removeUserSignedOut = function removeUserSignedOut(cb) {
this._userSignedOut.removeHandler(cb);
};
UserManagerEvents.prototype._raiseUserSignedOut = function _raiseUserSignedOut(e) {
_Log.Log.debug("UserManagerEvents._raiseUserSignedOut");
this._userSignedOut.raise(e);
};
UserManagerEvents.prototype.addUserSessionChanged = function addUserSessionChanged(cb) {
this._userSessionChanged.addHandler(cb);
};
UserManagerEvents.prototype.removeUserSessionChanged = function removeUserSessionChanged(cb) {
this._userSessionChanged.removeHandler(cb);
};
UserManagerEvents.prototype._raiseUserSessionChanged = function _raiseUserSessionChanged(e) {
_Log.Log.debug("UserManagerEvents._raiseUserSessionChanged");
this._userSessionChanged.raise(e);
};
return UserManagerEvents;
}(_AccessTokenEvents2.AccessTokenEvents);
/***/ }),
/***/ "./src/UserManagerSettings.js":
/*!************************************!*\
!*** ./src/UserManagerSettings.js ***!
\************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UserManagerSettings = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _OidcClientSettings2 = __webpack_require__(/*! ./OidcClientSettings.js */ "./src/OidcClientSettings.js");
var _RedirectNavigator = __webpack_require__(/*! ./RedirectNavigator.js */ "./src/RedirectNavigator.js");
var _PopupNavigator = __webpack_require__(/*! ./PopupNavigator.js */ "./src/PopupNavigator.js");
var _IFrameNavigator = __webpack_require__(/*! ./IFrameNavigator.js */ "./src/IFrameNavigator.js");
var _WebStorageStateStore = __webpack_require__(/*! ./WebStorageStateStore.js */ "./src/WebStorageStateStore.js");
var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultAccessTokenExpiringNotificationTime = 60;
var DefaultCheckSessionInterval = 2000;
var DefaultQuerySessionStatusResponseType = "id_token";
var UserManagerSettings = exports.UserManagerSettings = function (_OidcClientSettings) {
_inherits(UserManagerSettings, _OidcClientSettings);
function UserManagerSettings() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
popup_redirect_uri = _ref.popup_redirect_uri,
popup_post_logout_redirect_uri = _ref.popup_post_logout_redirect_uri,
popupWindowFeatures = _ref.popupWindowFeatures,
popupWindowTarget = _ref.popupWindowTarget,
silent_redirect_uri = _ref.silent_redirect_uri,
silentRequestTimeout = _ref.silentRequestTimeout,
_ref$automaticSilentR = _ref.automaticSilentRenew,
automaticSilentRenew = _ref$automaticSilentR === undefined ? false : _ref$automaticSilentR,
_ref$includeIdTokenIn = _ref.includeIdTokenInSilentRenew,
includeIdTokenInSilentRenew = _ref$includeIdTokenIn === undefined ? true : _ref$includeIdTokenIn,
_ref$monitorSession = _ref.monitorSession,
monitorSession = _ref$monitorSession === undefined ? true : _ref$monitorSession,
_ref$checkSessionInte = _ref.checkSessionInterval,
checkSessionInterval = _ref$checkSessionInte === undefined ? DefaultCheckSessionInterval : _ref$checkSessionInte,
_ref$stopCheckSession = _ref.stopCheckSessionOnError,
stopCheckSessionOnError = _ref$stopCheckSession === undefined ? true : _ref$stopCheckSession,
_ref$query_status_res = _ref.query_status_response_type,
query_status_response_type = _ref$query_status_res === undefined ? DefaultQuerySessionStatusResponseType : _ref$query_status_res,
_ref$revokeAccessToke = _ref.revokeAccessTokenOnSignout,
revokeAccessTokenOnSignout = _ref$revokeAccessToke === undefined ? false : _ref$revokeAccessToke,
_ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime,
accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir,
_ref$redirectNavigato = _ref.redirectNavigator,
redirectNavigator = _ref$redirectNavigato === undefined ? new _RedirectNavigator.RedirectNavigator() : _ref$redirectNavigato,
_ref$popupNavigator = _ref.popupNavigator,
popupNavigator = _ref$popupNavigator === undefined ? new _PopupNavigator.PopupNavigator() : _ref$popupNavigator,
_ref$iframeNavigator = _ref.iframeNavigator,
iframeNavigator = _ref$iframeNavigator === undefined ? new _IFrameNavigator.IFrameNavigator() : _ref$iframeNavigator,
_ref$userStore = _ref.userStore,
userStore = _ref$userStore === undefined ? new _WebStorageStateStore.WebStorageStateStore({ store: _Global.Global.sessionStorage }) : _ref$userStore;
_classCallCheck(this, UserManagerSettings);
var _this = _possibleConstructorReturn(this, _OidcClientSettings.call(this, arguments[0]));
_this._popup_redirect_uri = popup_redirect_uri;
_this._popup_post_logout_redirect_uri = popup_post_logout_redirect_uri;
_this._popupWindowFeatures = popupWindowFeatures;
_this._popupWindowTarget = popupWindowTarget;
_this._silent_redirect_uri = silent_redirect_uri;
_this._silentRequestTimeout = silentRequestTimeout;
_this._automaticSilentRenew = !!automaticSilentRenew;
_this._includeIdTokenInSilentRenew = includeIdTokenInSilentRenew;
_this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime;
_this._monitorSession = monitorSession;
_this._checkSessionInterval = checkSessionInterval;
_this._stopCheckSessionOnError = stopCheckSessionOnError;
_this._query_status_response_type = query_status_response_type;
_this._revokeAccessTokenOnSignout = revokeAccessTokenOnSignout;
_this._redirectNavigator = redirectNavigator;
_this._popupNavigator = popupNavigator;
_this._iframeNavigator = iframeNavigator;
_this._userStore = userStore;
return _this;
}
_createClass(UserManagerSettings, [{
key: 'popup_redirect_uri',
get: function get() {
return this._popup_redirect_uri;
}
}, {
key: 'popup_post_logout_redirect_uri',
get: function get() {
return this._popup_post_logout_redirect_uri;
}
}, {
key: 'popupWindowFeatures',
get: function get() {
return this._popupWindowFeatures;
}
}, {
key: 'popupWindowTarget',
get: function get() {
return this._popupWindowTarget;
}
}, {
key: 'silent_redirect_uri',
get: function get() {
return this._silent_redirect_uri;
}
}, {
key: 'silentRequestTimeout',
get: function get() {
return this._silentRequestTimeout;
}
}, {
key: 'automaticSilentRenew',
get: function get() {
return !!(this.silent_redirect_uri && this._automaticSilentRenew);
}
}, {
key: 'includeIdTokenInSilentRenew',
get: function get() {
return this._includeIdTokenInSilentRenew;
}
}, {
key: 'accessTokenExpiringNotificationTime',
get: function get() {
return this._accessTokenExpiringNotificationTime;
}
}, {
key: 'monitorSession',
get: function get() {
return this._monitorSession;
}
}, {
key: 'checkSessionInterval',
get: function get() {
return this._checkSessionInterval;
}
}, {
key: 'stopCheckSessionOnError',
get: function get() {
return this._stopCheckSessionOnError;
}
}, {
key: 'query_status_response_type',
get: function get() {
return this._query_status_response_type;
}
}, {
key: 'revokeAccessTokenOnSignout',
get: function get() {
return this._revokeAccessTokenOnSignout;
}
}, {
key: 'redirectNavigator',
get: function get() {
return this._redirectNavigator;
}
}, {
key: 'popupNavigator',
get: function get() {
return this._popupNavigator;
}
}, {
key: 'iframeNavigator',
get: function get() {
return this._iframeNavigator;
}
}, {
key: 'userStore',
get: function get() {
return this._userStore;
}
}]);
return UserManagerSettings;
}(_OidcClientSettings2.OidcClientSettings);
/***/ }),
/***/ "./src/WebStorageStateStore.js":
/*!*************************************!*\
!*** ./src/WebStorageStateStore.js ***!
\*************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.WebStorageStateStore = undefined;
var _Log = __webpack_require__(/*! ./Log.js */ "./src/Log.js");
var _Global = __webpack_require__(/*! ./Global.js */ "./src/Global.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var WebStorageStateStore = exports.WebStorageStateStore = function () {
function WebStorageStateStore() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$prefix = _ref.prefix,
prefix = _ref$prefix === undefined ? "oidc." : _ref$prefix,
_ref$store = _ref.store,
store = _ref$store === undefined ? _Global.Global.localStorage : _ref$store;
_classCallCheck(this, WebStorageStateStore);
this._store = store;
this._prefix = prefix;
}
WebStorageStateStore.prototype.set = function set(key, value) {
_Log.Log.debug("WebStorageStateStore.set", key);
key = this._prefix + key;
this._store.setItem(key, value);
return Promise.resolve();
};
WebStorageStateStore.prototype.get = function get(key) {
_Log.Log.debug("WebStorageStateStore.get", key);
key = this._prefix + key;
var item = this._store.getItem(key);
return Promise.resolve(item);
};
WebStorageStateStore.prototype.remove = function remove(key) {
_Log.Log.debug("WebStorageStateStore.remove", key);
key = this._prefix + key;
var item = this._store.getItem(key);
this._store.removeItem(key);
return Promise.resolve(item);
};
WebStorageStateStore.prototype.getAllKeys = function getAllKeys() {
_Log.Log.debug("WebStorageStateStore.getAllKeys");
var keys = [];
for (var index = 0; index < this._store.length; index++) {
var key = this._store.key(index);
if (key.indexOf(this._prefix) === 0) {
keys.push(key.substr(this._prefix.length));
}
}
return Promise.resolve(keys);
};
return WebStorageStateStore;
}();
/***/ }),
/***/ "./src/random.js":
/*!***********************!*\
!*** ./src/random.js ***!
\***********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = random;
var uuid4 = __webpack_require__(/*! uuid/v4 */ "./node_modules/uuid/v4.js");
/**
* Generates RFC4122 version 4 guid ()
*/
function random() {
return uuid4().replace(/-/g, '');
}
module.exports = exports['default'];
/***/ })
/******/ });
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9qc3JzYXNpZ24vZGlzdC9qc3JzYXNpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvbGliL2J5dGVzVG9VdWlkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2xpYi9ybmctYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC92NC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvQ2hlY2tTZXNzaW9uSUZyYW1lLmpzIiwid2VicGFjazovLy8uL3NyYy9Db3Jkb3ZhSUZyYW1lTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Db3Jkb3ZhUG9wdXBOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvcmRvdmFQb3B1cFdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRXJyb3JSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRXZlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSUZyYW1lTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9JRnJhbWVXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0luTWVtb3J5V2ViU3RvcmFnZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSm9zZVV0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pzb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Mb2cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL01ldGFkYXRhU2VydmljZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvT2lkY0NsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvT2lkY0NsaWVudFNldHRpbmdzLmpzIiwid2VicGFjazovLy8uL3NyYy9Qb3B1cE5hdmlnYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvUG9wdXBXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1JlZGlyZWN0TmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9SZXNwb25zZVZhbGlkYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2Vzc2lvbk1vbml0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3NyYy9TaWduaW5TdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbm91dFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25vdXRSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lsZW50UmVuZXdTZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9TdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVGltZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Rva2VuQ2xpZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9Ub2tlblJldm9jYXRpb25DbGllbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VybFV0aWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXJJbmZvU2VydmljZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlck1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXJNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VyTWFuYWdlclNldHRpbmdzLmpzIiwid2VicGFjazovLy8uL3NyYy9XZWJTdG9yYWdlU3RhdGVTdG9yZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmFuZG9tLmpzIl0sIm5hbWVzIjpbIkxvZyIsIk9pZGNDbGllbnQiLCJPaWRjQ2xpZW50U2V0dGluZ3MiLCJXZWJTdG9yYWdlU3RhdGVTdG9yZSIsIkluTWVtb3J5V2ViU3RvcmFnZSIsIlVzZXJNYW5hZ2VyIiwiQWNjZXNzVG9rZW5FdmVudHMiLCJNZXRhZGF0YVNlcnZpY2UiLCJDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3IiLCJDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yIiwiQ2hlY2tTZXNzaW9uSUZyYW1lIiwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50IiwiU2Vzc2lvbk1vbml0b3IiLCJHbG9iYWwiLCJVc2VyIiwibmF2aWdhdG9yIiwidXNlckFnZW50Iiwid2luZG93IiwiWUFIT08iLCJ1bmRlZmluZWQiLCJsYW5nIiwiZXh0ZW5kIiwiZyIsImgiLCJmIiwiRXJyb3IiLCJkIiwicHJvdG90eXBlIiwiY29uc3RydWN0b3IiLCJzdXBlcmNsYXNzIiwiT2JqZWN0IiwiYiIsImUiLCJjIiwidGVzdCIsImoiLCJpIiwibGVuZ3RoIiwibCIsImsiLCJhIiwiQ3J5cHRvSlMiLCJsaWIiLCJCYXNlIiwibiIsInAiLCJvIiwibWl4SW4iLCJoYXNPd25Qcm9wZXJ0eSIsImluaXQiLCIkc3VwZXIiLCJhcHBseSIsImFyZ3VtZW50cyIsImNyZWF0ZSIsInRvU3RyaW5nIiwiY2xvbmUiLCJXb3JkQXJyYXkiLCJ3b3JkcyIsInNpZ0J5dGVzIiwic3RyaW5naWZ5IiwiY29uY2F0IiwidCIsInEiLCJzIiwiY2xhbXAiLCJyIiwiY2VpbCIsImNhbGwiLCJzbGljZSIsInJhbmRvbSIsInB1c2giLCJtIiwiZW5jIiwiSGV4Iiwiam9pbiIsInBhcnNlIiwicGFyc2VJbnQiLCJzdWJzdHIiLCJMYXRpbjEiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJjaGFyQ29kZUF0IiwiVXRmOCIsImRlY29kZVVSSUNvbXBvbmVudCIsImVzY2FwZSIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiQnVmZmVyZWRCbG9ja0FsZ29yaXRobSIsInJlc2V0IiwiX2RhdGEiLCJfbkRhdGFCeXRlcyIsIl9hcHBlbmQiLCJfcHJvY2VzcyIsInciLCJ4IiwiYmxvY2tTaXplIiwidiIsInUiLCJtYXgiLCJfbWluQnVmZmVyU2l6ZSIsIm1pbiIsIl9kb1Byb2Nlc3NCbG9jayIsInNwbGljZSIsIkhhc2hlciIsImNmZyIsIl9kb1Jlc2V0IiwidXBkYXRlIiwiZmluYWxpemUiLCJfZG9GaW5hbGl6ZSIsIl9jcmVhdGVIZWxwZXIiLCJfY3JlYXRlSG1hY0hlbHBlciIsIkhNQUMiLCJhbGdvIiwiTWF0aCIsIng2NCIsIldvcmQiLCJoaWdoIiwibG93IiwidG9YMzIiLCJCYXNlNjQiLCJfbWFwIiwiY2hhckF0IiwiaW5kZXhPZiIsInNxcnQiLCJwb3ciLCJTSEEyNTYiLCJfaGFzaCIsImZsb29yIiwiSG1hY1NIQTI1NiIsIlQiLCJlYSIsIlNIQTUxMiIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiWCIsIksiLCJZIiwiTCIsIloiLCJNIiwiJCIsIk4iLCJhYSIsIk8iLCJiYSIsIlAiLCJjYSIsIlEiLCJ6IiwiQSIsInkiLCJVIiwiQiIsIlIiLCJDIiwiUyIsIkQiLCJWIiwiRSIsIlciLCJmYSIsImRhIiwiSG1hY1NIQTUxMiIsIlNIQTM4NCIsIkhtYWNTSEEzODQiLCJiNjRtYXAiLCJiNjRwYWQiLCJoZXgyYjY0Iiwic3Vic3RyaW5nIiwiYjY0dG9oZXgiLCJpbnQyY2hhciIsImI2NHRvQkEiLCJBcnJheSIsImRiaXRzIiwiY2FuYXJ5Iiwial9sbSIsIkJpZ0ludGVnZXIiLCJmcm9tTnVtYmVyIiwiZnJvbVN0cmluZyIsIm5iaSIsImFtMSIsImFtMiIsImFtMyIsImFwcE5hbWUiLCJhbSIsIkRCIiwiRE0iLCJEViIsIkJJX0ZQIiwiRlYiLCJGMSIsIkYyIiwiQklfUk0iLCJCSV9SQyIsInJyIiwidnYiLCJpbnRBdCIsImJucENvcHlUbyIsImJucEZyb21JbnQiLCJuYnYiLCJmcm9tSW50IiwiYm5wRnJvbVN0cmluZyIsImZyb21SYWRpeCIsIlpFUk8iLCJzdWJUbyIsImJucENsYW1wIiwiYm5Ub1N0cmluZyIsIm5lZ2F0ZSIsInRvUmFkaXgiLCJibk5lZ2F0ZSIsImJuQWJzIiwiYm5Db21wYXJlVG8iLCJuYml0cyIsImJuQml0TGVuZ3RoIiwiYm5wRExTaGlmdFRvIiwiYm5wRFJTaGlmdFRvIiwiYm5wTFNoaWZ0VG8iLCJibnBSU2hpZnRUbyIsImJucFN1YlRvIiwiYm5wTXVsdGlwbHlUbyIsImFicyIsImJucFNxdWFyZVRvIiwiYm5wRGl2UmVtVG8iLCJjb3B5VG8iLCJsU2hpZnRUbyIsImRsU2hpZnRUbyIsImNvbXBhcmVUbyIsIk9ORSIsImRyU2hpZnRUbyIsInJTaGlmdFRvIiwiYm5Nb2QiLCJkaXZSZW1UbyIsIkNsYXNzaWMiLCJjQ29udmVydCIsIm1vZCIsImNSZXZlcnQiLCJjUmVkdWNlIiwiY011bFRvIiwibXVsdGlwbHlUbyIsInJlZHVjZSIsImNTcXJUbyIsInNxdWFyZVRvIiwiY29udmVydCIsInJldmVydCIsIm11bFRvIiwic3FyVG8iLCJibnBJbnZEaWdpdCIsIk1vbnRnb21lcnkiLCJtcCIsImludkRpZ2l0IiwibXBsIiwibXBoIiwidW0iLCJtdDIiLCJtb250Q29udmVydCIsIm1vbnRSZXZlcnQiLCJtb250UmVkdWNlIiwibW9udFNxclRvIiwibW9udE11bFRvIiwiYm5wSXNFdmVuIiwiYm5wRXhwIiwiYm5Nb2RQb3dJbnQiLCJpc0V2ZW4iLCJleHAiLCJiaXRMZW5ndGgiLCJtb2RQb3dJbnQiLCJibkNsb25lIiwiYm5JbnRWYWx1ZSIsImJuQnl0ZVZhbHVlIiwiYm5TaG9ydFZhbHVlIiwiYm5wQ2h1bmtTaXplIiwiTE4yIiwibG9nIiwiYm5TaWdOdW0iLCJibnBUb1JhZGl4Iiwic2lnbnVtIiwiY2h1bmtTaXplIiwiaW50VmFsdWUiLCJibnBGcm9tUmFkaXgiLCJkTXVsdGlwbHkiLCJkQWRkT2Zmc2V0IiwiYm5wRnJvbU51bWJlciIsInRlc3RCaXQiLCJiaXR3aXNlVG8iLCJzaGlmdExlZnQiLCJvcF9vciIsImlzUHJvYmFibGVQcmltZSIsIm5leHRCeXRlcyIsImJuVG9CeXRlQXJyYXkiLCJibkVxdWFscyIsImJuTWluIiwiYm5NYXgiLCJibnBCaXR3aXNlVG8iLCJvcF9hbmQiLCJibkFuZCIsImJuT3IiLCJvcF94b3IiLCJiblhvciIsIm9wX2FuZG5vdCIsImJuQW5kTm90IiwiYm5Ob3QiLCJiblNoaWZ0TGVmdCIsImJuU2hpZnRSaWdodCIsImxiaXQiLCJibkdldExvd2VzdFNldEJpdCIsImNiaXQiLCJibkJpdENvdW50IiwiYm5UZXN0Qml0IiwiYm5wQ2hhbmdlQml0IiwiYm5TZXRCaXQiLCJjaGFuZ2VCaXQiLCJibkNsZWFyQml0IiwiYm5GbGlwQml0IiwiYm5wQWRkVG8iLCJibkFkZCIsImFkZFRvIiwiYm5TdWJ0cmFjdCIsImJuTXVsdGlwbHkiLCJiblNxdWFyZSIsImJuRGl2aWRlIiwiYm5SZW1haW5kZXIiLCJibkRpdmlkZUFuZFJlbWFpbmRlciIsImJucERNdWx0aXBseSIsImJucERBZGRPZmZzZXQiLCJOdWxsRXhwIiwibk5vcCIsIm5NdWxUbyIsIm5TcXJUbyIsImJuUG93IiwiYm5wTXVsdGlwbHlMb3dlclRvIiwiYm5wTXVsdGlwbHlVcHBlclRvIiwiQmFycmV0dCIsInIyIiwicTMiLCJtdSIsImRpdmlkZSIsImJhcnJldHRDb252ZXJ0IiwiYmFycmV0dFJldmVydCIsImJhcnJldHRSZWR1Y2UiLCJtdWx0aXBseVVwcGVyVG8iLCJtdWx0aXBseUxvd2VyVG8iLCJiYXJyZXR0U3FyVG8iLCJiYXJyZXR0TXVsVG8iLCJibk1vZFBvdyIsImJuR0NEIiwiZ2V0TG93ZXN0U2V0Qml0IiwiYm5wTW9kSW50IiwiYm5Nb2RJbnZlcnNlIiwic3VidHJhY3QiLCJhZGQiLCJsb3dwcmltZXMiLCJscGxpbSIsImJuSXNQcm9iYWJsZVByaW1lIiwibW9kSW50IiwibWlsbGVyUmFiaW4iLCJibnBNaWxsZXJSYWJpbiIsInNoaWZ0UmlnaHQiLCJtb2RQb3ciLCJieXRlVmFsdWUiLCJzaG9ydFZhbHVlIiwidG9CeXRlQXJyYXkiLCJlcXVhbHMiLCJhbmQiLCJvciIsInhvciIsImFuZE5vdCIsIm5vdCIsImJpdENvdW50Iiwic2V0Qml0IiwiY2xlYXJCaXQiLCJmbGlwQml0IiwibXVsdGlwbHkiLCJyZW1haW5kZXIiLCJkaXZpZGVBbmRSZW1haW5kZXIiLCJtb2RJbnZlcnNlIiwiZ2NkIiwic3F1YXJlIiwiQXJjZm91ciIsIkFSQzRpbml0IiwiQVJDNG5leHQiLCJuZXh0IiwicHJuZ19uZXdzdGF0ZSIsInJuZ19wc2l6ZSIsInJuZ19zdGF0ZSIsInJuZ19wb29sIiwicm5nX3BwdHIiLCJybmdfc2VlZF9pbnQiLCJybmdfc2VlZF90aW1lIiwiRGF0ZSIsImdldFRpbWUiLCJjcnlwdG8iLCJtc0NyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsInVhIiwiVWludDhBcnJheSIsImFwcFZlcnNpb24iLCJybmdfZ2V0X2J5dGUiLCJybmdfZ2V0X2J5dGVzIiwiU2VjdXJlUmFuZG9tIiwicGFyc2VCaWdJbnQiLCJsaW5lYnJrIiwiYnl0ZTJIZXgiLCJwa2NzMXBhZDIiLCJvYWVwX21nZjFfYXJyIiwib2FlcF9wYWQiLCJLSlVSIiwiTWVzc2FnZURpZ2VzdCIsIlV0aWwiLCJnZXRDYW5vbmljYWxBbGdOYW1lIiwiZ2V0SGFzaExlbmd0aCIsImhleHRvcnN0ciIsImhhc2hIZXgiLCJyc3RydG9oZXgiLCJSU0FLZXkiLCJkbXAxIiwiZG1xMSIsImNvZWZmIiwiUlNBU2V0UHVibGljIiwiaXNQdWJsaWMiLCJpc1ByaXZhdGUiLCJSU0FEb1B1YmxpYyIsIlJTQUVuY3J5cHQiLCJkb1B1YmxpYyIsIlJTQUVuY3J5cHRPQUVQIiwic2V0UHVibGljIiwiZW5jcnlwdCIsImVuY3J5cHRPQUVQIiwidHlwZSIsIkVDRmllbGRFbGVtZW50RnAiLCJmZUZwRXF1YWxzIiwiZmVGcFRvQmlnSW50ZWdlciIsImZlRnBOZWdhdGUiLCJmZUZwQWRkIiwidG9CaWdJbnRlZ2VyIiwiZmVGcFN1YnRyYWN0IiwiZmVGcE11bHRpcGx5IiwiZmVGcFNxdWFyZSIsImZlRnBEaXZpZGUiLCJFQ1BvaW50RnAiLCJjdXJ2ZSIsInppbnYiLCJwb2ludEZwR2V0WCIsImZyb21CaWdJbnRlZ2VyIiwicG9pbnRGcEdldFkiLCJwb2ludEZwRXF1YWxzIiwiaXNJbmZpbml0eSIsInBvaW50RnBJc0luZmluaXR5IiwicG9pbnRGcE5lZ2F0ZSIsInBvaW50RnBBZGQiLCJ0d2ljZSIsImdldEluZmluaXR5IiwicG9pbnRGcFR3aWNlIiwicG9pbnRGcE11bHRpcGx5IiwicG9pbnRGcE11bHRpcGx5VHdvIiwiZ2V0WCIsImdldFkiLCJtdWx0aXBseVR3byIsIkVDQ3VydmVGcCIsImluZmluaXR5IiwiY3VydmVGcEdldFEiLCJjdXJ2ZUZwR2V0QSIsImN1cnZlRnBHZXRCIiwiY3VydmVGcEVxdWFscyIsImN1cnZlRnBHZXRJbmZpbml0eSIsImN1cnZlRnBGcm9tQmlnSW50ZWdlciIsImN1cnZlRnBEZWNvZGVQb2ludEhleCIsImdldFEiLCJnZXRBIiwiZ2V0QiIsImRlY29kZVBvaW50SGV4IiwiZ2V0Qnl0ZUxlbmd0aCIsImdldEVuY29kZWQiLCJ0b0J5dGVBcnJheVVuc2lnbmVkIiwidW5zaGlmdCIsImRlY29kZUZyb20iLCJkZWNvZGVGcm9tSGV4IiwiYWRkMkQiLCJ0d2ljZTJEIiwidmFsdWVPZiIsIm11bHRpcGx5MkQiLCJpc09uQ3VydmUiLCJ2YWxpZGF0ZSIsImpzb25QYXJzZSIsIlJlZ0V4cCIsIm1hdGNoIiwicmVwbGFjZSIsInNoaWZ0IiwiYXNuMSIsIkFTTjFVdGlsIiwiaW50ZWdlclRvQnl0ZUhleCIsImJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4IiwiZ2V0UEVNU3RyaW5nRnJvbUhleCIsImhleHRvcGVtIiwibmV3T2JqZWN0IiwiREVSQm9vbGVhbiIsIkRFUkludGVnZXIiLCJERVJCaXRTdHJpbmciLCJERVJPY3RldFN0cmluZyIsIkRFUk51bGwiLCJERVJPYmplY3RJZGVudGlmaWVyIiwiREVSRW51bWVyYXRlZCIsIkRFUlVURjhTdHJpbmciLCJERVJOdW1lcmljU3RyaW5nIiwiREVSUHJpbnRhYmxlU3RyaW5nIiwiREVSVGVsZXRleFN0cmluZyIsIkRFUklBNVN0cmluZyIsIkRFUlVUQ1RpbWUiLCJERVJHZW5lcmFsaXplZFRpbWUiLCJERVJTZXF1ZW5jZSIsIkRFUlNldCIsIkRFUlRhZ2dlZE9iamVjdCIsImtleXMiLCJhcnJheSIsInRhZyIsImV4cGxpY2l0Iiwib2JqIiwianNvblRvQVNOMUhFWCIsImdldEVuY29kZWRIZXgiLCJvaWRIZXhUb0ludCIsIm9pZEludFRvSGV4Iiwic3BsaXQiLCJBU04xT2JqZWN0IiwiZ2V0TGVuZ3RoSGV4RnJvbVZhbHVlIiwiaFYiLCJoVExWIiwiaXNNb2RpZmllZCIsImdldEZyZXNoVmFsdWVIZXgiLCJoTCIsImhUIiwiZ2V0VmFsdWVIZXgiLCJERVJBYnN0cmFjdFN0cmluZyIsImdldFN0cmluZyIsInNldFN0cmluZyIsInV0Zjh0b2hleCIsInRvTG93ZXJDYXNlIiwic2V0U3RyaW5nSGV4Iiwic3RyIiwiaGV4IiwiREVSQWJzdHJhY3RUaW1lIiwibG9jYWxEYXRlVG9VVEMiLCJ1dGMiLCJnZXRUaW1lem9uZU9mZnNldCIsImZvcm1hdERhdGUiLCJ6ZXJvUGFkZGluZyIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsInN0b2hleCIsInNldEJ5RGF0ZVZhbHVlIiwiVVRDIiwic2V0QnlEYXRlIiwiREVSQWJzdHJhY3RTdHJ1Y3R1cmVkIiwic2V0QnlBU04xT2JqZWN0QXJyYXkiLCJhc24xQXJyYXkiLCJhcHBlbmRBU04xT2JqZWN0Iiwic2V0QnlCaWdJbnRlZ2VyIiwic2V0QnlJbnRlZ2VyIiwic2V0VmFsdWVIZXgiLCJiaWdpbnQiLCJzZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHMiLCJzZXRVbnVzZWRCaXRzQW5kSGV4VmFsdWUiLCJzZXRCeUJpbmFyeVN0cmluZyIsInNldEJ5Qm9vbGVhbkFycmF5IiwibmV3RmFsc2VBcnJheSIsImJpbiIsInNldFZhbHVlT2lkU3RyaW5nIiwic2V0VmFsdWVOYW1lIiwieDUwOSIsIk9JRCIsIm5hbWUyb2lkIiwib2lkIiwibmFtZSIsImRhdGUiLCJ3aXRoTWlsbGlzIiwibWlsbGlzIiwic29ydEZsYWciLCJzb3J0Iiwic29ydGZsYWciLCJpc0V4cGxpY2l0IiwiYXNuMU9iamVjdCIsInNldEFTTjFPYmplY3QiLCJBU04xSEVYIiwiZ2V0TGJsZW4iLCJnZXRMIiwiZ2V0VmJsZW4iLCJnZXRWaWR4IiwiZ2V0ViIsImdldFRMViIsImdldE5leHRTaWJsaW5nSWR4IiwiZ2V0Q2hpbGRJZHgiLCJnZXROdGhDaGlsZElkeCIsImdldElkeGJ5TGlzdCIsImdldFRMVmJ5TGlzdCIsImdldFZieUxpc3QiLCJoZXh0b29pZHN0ciIsImR1bXAiLCJvbW1pdF9sb25nX29jdGV0IiwiaXNBU04xSEVYIiwib2lkMm5hbWUiLCJoZXh0b3V0ZjgiLCJvaWRuYW1lIiwiSlNPTiIsIng1MDlFeHROYW1lIiwiaXNIZXgiLCJCYXNlNjR4Iiwic3RvQkEiLCJCQXRvcyIsIkJBdG9oZXgiLCJzdG9iNjQiLCJzdG9iNjR1IiwiYjY0dG9iNjR1IiwiYjY0dXRvcyIsImI2NHV0b2I2NCIsImhleHRvYjY0dSIsImI2NHV0b2hleCIsInV0Zjh0b2I2NHUiLCJiNjR1dG91dGY4IiwiQnVmZmVyIiwidXJpY21wdG9oZXgiLCJlbmNvZGVVUklDb21wb25lbnRBbGwiLCJoZXh0b3VyaWNtcCIsInV0Zjh0b2I2NCIsImI2NHRvdXRmOCIsImhleHRvYjY0IiwiaGV4dG9iNjRubCIsImI2NG5sdG9oZXgiLCJwZW10b2hleCIsImhleHRvQXJyYXlCdWZmZXIiLCJBcnJheUJ1ZmZlciIsIkRhdGFWaWV3Iiwic2V0VWludDgiLCJBcnJheUJ1ZmZlcnRvaGV4IiwiYnl0ZUxlbmd0aCIsImdldFVpbnQ4IiwienVsdXRvbXNlYyIsInp1bHV0b3NlYyIsInp1bHV0b2RhdGUiLCJkYXRldG96dWx1IiwiZ2V0VVRDRnVsbFllYXIiLCJnZXRVVENNb250aCIsImdldFVUQ0RhdGUiLCJnZXRVVENIb3VycyIsImdldFVUQ01pbnV0ZXMiLCJnZXRVVENTZWNvbmRzIiwiZ2V0VVRDTWlsbGlzZWNvbmRzIiwiaXB2NnRvaGV4IiwicmVwZWF0IiwiaGV4dG9pcHY2IiwiaGV4dG9pcCIsImlwdG9oZXgiLCJuZXdsaW5lX3RvVW5peCIsIm5ld2xpbmVfdG9Eb3MiLCJpc0ludGVnZXIiLCJpc0Jhc2U2NCIsImlzQmFzZTY0VVJMIiwiaXNJbnRlZ2VyQXJyYXkiLCJoZXh0b3Bvc2hleCIsImludGFyeXN0cnRvaGV4IiwibWFwIiwic3RyZGlmZmlkeCIsIkRJR0VTVElORk9IRUFEIiwic2hhMSIsInNoYTIyNCIsInNoYTI1NiIsInNoYTM4NCIsInNoYTUxMiIsIm1kMiIsIm1kNSIsInJpcGVtZDE2MCIsIkRFRkFVTFRQUk9WSURFUiIsImhtYWNtZDUiLCJobWFjc2hhMSIsImhtYWNzaGEyMjQiLCJobWFjc2hhMjU2IiwiaG1hY3NoYTM4NCIsImhtYWNzaGE1MTIiLCJobWFjcmlwZW1kMTYwIiwiTUQ1d2l0aFJTQSIsIlNIQTF3aXRoUlNBIiwiU0hBMjI0d2l0aFJTQSIsIlNIQTI1NndpdGhSU0EiLCJTSEEzODR3aXRoUlNBIiwiU0hBNTEyd2l0aFJTQSIsIlJJUEVNRDE2MHdpdGhSU0EiLCJNRDV3aXRoRUNEU0EiLCJTSEExd2l0aEVDRFNBIiwiU0hBMjI0d2l0aEVDRFNBIiwiU0hBMjU2d2l0aEVDRFNBIiwiU0hBMzg0d2l0aEVDRFNBIiwiU0hBNTEyd2l0aEVDRFNBIiwiUklQRU1EMTYwd2l0aEVDRFNBIiwiU0hBMXdpdGhEU0EiLCJTSEEyMjR3aXRoRFNBIiwiU0hBMjU2d2l0aERTQSIsIk1ENXdpdGhSU0FhbmRNR0YxIiwiU0hBMXdpdGhSU0FhbmRNR0YxIiwiU0hBMjI0d2l0aFJTQWFuZE1HRjEiLCJTSEEyNTZ3aXRoUlNBYW5kTUdGMSIsIlNIQTM4NHdpdGhSU0FhbmRNR0YxIiwiU0hBNTEyd2l0aFJTQWFuZE1HRjEiLCJSSVBFTUQxNjB3aXRoUlNBYW5kTUdGMSIsIkNSWVBUT0pTTUVTU0FHRURJR0VTVE5BTUUiLCJNRDUiLCJTSEExIiwiU0hBMjI0IiwiUklQRU1EMTYwIiwiZ2V0RGlnZXN0SW5mb0hleCIsImdldFBhZGRlZERpZ2VzdEluZm9IZXgiLCJoYXNoU3RyaW5nIiwiYWxnIiwiZGlnZXN0U3RyaW5nIiwiZGlnZXN0SGV4IiwicHJvdiIsInNoYTI1NkhleCIsInNoYTUxMkhleCIsIlNFQ1VSRVJBTkRPTUdFTiIsImdldFJhbmRvbUhleE9mTmJ5dGVzIiwiZ2V0UmFuZG9tQmlnSW50ZWdlck9mTmJ5dGVzIiwiZ2V0UmFuZG9tSGV4T2ZOYml0cyIsImdldFJhbmRvbUJpZ0ludGVnZXJPZk5iaXRzIiwiZ2V0UmFuZG9tQmlnSW50ZWdlclplcm9Ub01heCIsImdldFJhbmRvbUJpZ0ludGVnZXJNaW5Ub01heCIsInNldEFsZ0FuZFByb3ZpZGVyIiwibWQiLCJ1cGRhdGVTdHJpbmciLCJ1cGRhdGVIZXgiLCJkaWdlc3QiLCJzamNsIiwiaGFzaCIsImNvZGVjIiwidG9CaXRzIiwiZnJvbUJpdHMiLCJhbGdOYW1lIiwicHJvdk5hbWUiLCJIQVNITEVOR1RIIiwiTWFjIiwiYWxnUHJvdiIsIm1hYyIsInBhc3MiLCJkb0ZpbmFsIiwiZG9GaW5hbFN0cmluZyIsImRvRmluYWxIZXgiLCJzZXRQYXNzd29yZCIsInV0ZjgiLCJyc3RyIiwiYjY0IiwiYjY0dSIsIlNpZ25hdHVyZSIsIl9zZXRBbGdOYW1lcyIsIm1kQWxnTmFtZSIsInB1YmtleUFsZ05hbWUiLCJfemVyb1BhZGRpbmdPZlNpZ25hdHVyZSIsIktFWVVUSUwiLCJnZXRLZXkiLCJwcnZLZXkiLCJzdGF0ZSIsInB1YktleSIsInNpZ24iLCJzSGFzaEhleCIsImVjcHJ2aGV4IiwiZWNjdXJ2ZW5hbWUiLCJFQ0RTQSIsImhTaWduIiwic2lnbkhleCIsInNpZ25XaXRoTWVzc2FnZUhhc2hQU1MiLCJwc3NTYWx0TGVuIiwic2lnbldpdGhNZXNzYWdlSGFzaCIsIkRTQSIsInNpZ25TdHJpbmciLCJ2ZXJpZnkiLCJlY3B1YmhleCIsInZlcmlmeUhleCIsInZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUyIsInZlcmlmeVdpdGhNZXNzYWdlSGFzaCIsImFsZ1Byb3ZOYW1lIiwiaW5pdFBhcmFtcyIsInBzc3NhbHRsZW4iLCJwcnZrZXlwZW0iLCJwcnZrZXlwYXMiLCJDaXBoZXIiLCJnZXRBbGdCeUtleUFuZE5hbWUiLCJkZWNyeXB0IiwiZGVjcnlwdE9BRVAiLCJvaWRoZXgybmFtZSIsImdldEJpZ1JhbmRvbSIsInNldE5hbWVkQ3VydmUiLCJlY3BhcmFtcyIsIkVDUGFyYW1ldGVyREIiLCJnZXRCeU5hbWUiLCJwcnZLZXlIZXgiLCJwdWJLZXlIZXgiLCJjdXJ2ZU5hbWUiLCJzZXRQcml2YXRlS2V5SGV4Iiwic2V0UHVibGljS2V5SGV4IiwiZ2V0UHVibGljS2V5WFlIZXgiLCJrZXlsZW4iLCJnZXRTaG9ydE5JU1RQQ3VydmVOYW1lIiwiZ2VuZXJhdGVLZXlQYWlySGV4IiwiYmlSU1NpZ1RvQVNOMVNpZyIsImZyb21CeXRlQXJyYXlVbnNpZ25lZCIsInNlcmlhbGl6ZVNpZyIsInBhcnNlU2lnSGV4IiwidmVyaWZ5UmF3IiwiQml0Y29pbiIsImlzQXJyYXkiLCJwYXJzZVNpZyIsInRvQnl0ZUFycmF5U2lnbmVkIiwicGFyc2VTaWdDb21wYWN0IiwicmVhZFBLQ1M1UHJ2S2V5SGV4IiwiZ2V0TmFtZSIsInJlYWRQS0NTOFBydktleUhleCIsInJlYWRQS0NTOFB1YktleUhleCIsInJlYWRDZXJ0UHViS2V5SGV4IiwicHJ2IiwicHViIiwicGFyc2VTaWdIZXhJbkhleFJTIiwiYXNuMVNpZ1RvQ29uY2F0U2lnIiwiY29uY2F0U2lnVG9BU04xU2lnIiwiaGV4UlNTaWdUb0FTTjFTaWciLCJyZWdpc3QiLCJBRVMiLCJUcmlwbGVERVMiLCJERVMiLCJrZXkiLCJpdiIsImNpcGhlcnRleHQiLCJwcm9jIiwiZXByb2MiLCJpdmxlbiIsImNpcGhlciIsIml2c2FsdCIsImRhdGEiLCJrZXloZXgiLCJpdmhleCIsInZlcnNpb24iLCJwYXJzZVBLQ1M1UEVNIiwiZ2V0S2V5QW5kVW51c2VkSXZCeVBhc3Njb2RlQW5kSXZzYWx0IiwiZGVjcnlwdEtleUI2NCIsImdldERlY3J5cHRlZEtleUhleCIsImdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleCIsInRvVXBwZXJDYXNlIiwicGFyc2VIZXhPZkVuY3J5cHRlZFBLQ1M4IiwiZW5jcnlwdGlvblNjaGVtZUFsZyIsImVuY3J5cHRpb25TY2hlbWVJViIsInBia2RmMlNhbHQiLCJwYmtkZjJJdGVyIiwiZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtIiwiUEJLREYyIiwia2V5U2l6ZSIsIml0ZXJhdGlvbnMiLCJfZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTSIsImdldEtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTSIsImdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleCIsInBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXgiLCJhbGdwYXJhbSIsImFsZ29pZCIsImtleWlkeCIsImdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOFBFTSIsIl9nZXRLZXlGcm9tUHVibGljUEtDUzhIZXgiLCJwYXJzZVB1YmxpY1Jhd1JTQUtleUhleCIsInBhcnNlUHVibGljUEtDUzhIZXgiLCJ4eSIsImt0eSIsImRwIiwiZHEiLCJjbyIsInFpIiwic2V0UHJpdmF0ZUV4Iiwic2V0UHJpdmF0ZSIsImNydiIsIlg1MDkiLCJnZXRQdWJsaWNLZXlGcm9tQ2VydEhleCIsImdldFB1YmxpY0tleUZyb21DZXJ0UEVNIiwiZ2VuZXJhdGVLZXlwYWlyIiwiZ2VuZXJhdGUiLCJwcnZLZXlPYmoiLCJwdWJLZXlPYmoiLCJnZXRQRU0iLCJTdWJqZWN0UHVibGljS2V5SW5mbyIsInNlcSIsIm9jdHN0ciIsImJpdHN0ciIsImdldEtleUZyb21DU1JQRU0iLCJnZXRLZXlGcm9tQ1NSSGV4IiwicGFyc2VDU1JIZXgiLCJwOHB1YmtleWhleCIsImdldEpXS0Zyb21LZXkiLCJnZXRQb3NBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4IiwiZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4IiwicmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nIiwicmVhZFBLQ1M1UHViS2V5SGV4IiwicmVhZENlcnRIZXgiLCJnZXRQdWJsaWNLZXlIZXgiLCJfUkVfSEVYREVDT05MWSIsImNvbXBpbGUiLCJfcnNhc2lnbl9nZXRIZXhQYWRkZWREaWdlc3RJbmZvRm9yU3RyaW5nIiwiZG9Qcml2YXRlIiwicHNzX21nZjFfc3RyIiwic2lnblBTUyIsIl9yc2FzaWduX2dldERlY3J5cHRTaWduYXR1cmVCSSIsIl9yc2FzaWduX2dldEhleERpZ2VzdEluZm9Gcm9tU2lnIiwiX3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8iLCJ2ZXJpZnlQU1MiLCJTQUxUX0xFTl9ITEVOIiwiU0FMVF9MRU5fTUFYIiwiU0FMVF9MRU5fUkVDT1ZFUiIsImZvZmZzZXQiLCJhRXh0SW5mbyIsImdldFZlcnNpb24iLCJnZXRTZXJpYWxOdW1iZXJIZXgiLCJnZXRTaWduYXR1cmVBbGdvcml0aG1GaWVsZCIsImdldElzc3VlckhleCIsImdldElzc3VlclN0cmluZyIsImhleDJkbiIsImdldFN1YmplY3RIZXgiLCJnZXRTdWJqZWN0U3RyaW5nIiwiZ2V0Tm90QmVmb3JlIiwiZ2V0Tm90QWZ0ZXIiLCJnZXRQdWJsaWNLZXlJZHgiLCJnZXRQdWJsaWNLZXlDb250ZW50SWR4IiwiZ2V0UHVibGljS2V5IiwiZ2V0U2lnbmF0dXJlQWxnb3JpdGhtTmFtZSIsImdldFNpZ25hdHVyZVZhbHVlSGV4IiwidmVyaWZ5U2lnbmF0dXJlIiwicGFyc2VFeHQiLCJjcml0aWNhbCIsInZpZHgiLCJnZXRFeHRJbmZvIiwiZ2V0RXh0QmFzaWNDb25zdHJhaW50cyIsImNBIiwicGF0aExlbiIsImdldEV4dEtleVVzYWdlQmluIiwiZ2V0RXh0S2V5VXNhZ2VTdHJpbmciLCJLRVlVU0FHRV9OQU1FIiwiZ2V0RXh0U3ViamVjdEtleUlkZW50aWZpZXIiLCJnZXRFeHRBdXRob3JpdHlLZXlJZGVudGlmaWVyIiwia2lkIiwiZ2V0RXh0RXh0S2V5VXNhZ2VOYW1lIiwiZ2V0RXh0U3ViamVjdEFsdE5hbWUiLCJnZXRFeHRTdWJqZWN0QWx0TmFtZTIiLCJnZXRFeHRDUkxEaXN0cmlidXRpb25Qb2ludHNVUkkiLCJnZXRFeHRBSUFJbmZvIiwib2NzcCIsImNhaXNzdWVyIiwiZ2V0RXh0Q2VydGlmaWNhdGVQb2xpY2llcyIsImlkIiwiY3BzIiwidW5vdGljZSIsInJlYWRDZXJ0UEVNIiwiZ2V0SW5mbyIsImhleDJyZG4iLCJoZXgyYXR0clR5cGVWYWx1ZSIsIm9pZDJhdHlwZSIsImdldFB1YmxpY0tleUluZm9Qcm9wT2ZDZXJ0UEVNIiwiandzIiwiSldTIiwiaXNTYWZlSlNPTlN0cmluZyIsInBhcnNlSldTIiwicGFyc2VkSldTIiwic2lndmFsSCIsImhlYWRCNjRVIiwicGF5bG9hZEI2NFUiLCJzaWd2YWxCNjRVIiwic2kiLCJzaWd2YWxCSSIsImhlYWRTIiwicGF5bG9hZFMiLCJyZWFkU2FmZUpTT05TdHJpbmciLCJqd3NhbGcyc2lnYWxnIiwiaEFTTjFTaWciLCJoZWFkZXJPYmoiLCJwYXlsb2FkT2JqIiwiaGVhZGVyUFAiLCJwYXlsb2FkUFAiLCJzaWdIZXgiLCJ2ZXJpZnlKV1QiLCJpbkFycmF5IiwiaW5jbHVkZWRBcnJheSIsImlzcyIsInN1YiIsImF1ZCIsIkludERhdGUiLCJnZXROb3ciLCJ2ZXJpZnlBdCIsImdyYWNlUGVyaW9kIiwibmJmIiwiaWF0IiwianRpIiwiSFMyNTYiLCJIUzM4NCIsIkhTNTEyIiwiUlMyNTYiLCJSUzM4NCIsIlJTNTEyIiwiRVMyNTYiLCJFUzM4NCIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiIsIm5vbmUiLCJnZXRFbmNvZGVkU2lnbmF0dXJlVmFsdWVGcm9tSldTIiwiZ2V0SldLdGh1bWJwcmludCIsImdldCIsImdldFp1bHUiLCJpbnREYXRlMlVUQ1N0cmluZyIsInRvVVRDU3RyaW5nIiwiaW50RGF0ZTJadWx1IiwiRURTQSIsIl9jcnlwdG8iLCJEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUiLCJhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSIsImFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lciIsIlRpbWVyIiwiYWNjZXNzVG9rZW5FeHBpcmVkVGltZXIiLCJfYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUiLCJfYWNjZXNzVG9rZW5FeHBpcmluZyIsIl9hY2Nlc3NUb2tlbkV4cGlyZWQiLCJsb2FkIiwiY29udGFpbmVyIiwiYWNjZXNzX3Rva2VuIiwiZXhwaXJlc19pbiIsImR1cmF0aW9uIiwiZGVidWciLCJleHBpcmluZyIsImNhbmNlbCIsImV4cGlyZWQiLCJ1bmxvYWQiLCJhZGRBY2Nlc3NUb2tlbkV4cGlyaW5nIiwiY2IiLCJhZGRIYW5kbGVyIiwicmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmluZyIsInJlbW92ZUhhbmRsZXIiLCJhZGRBY2Nlc3NUb2tlbkV4cGlyZWQiLCJyZW1vdmVBY2Nlc3NUb2tlbkV4cGlyZWQiLCJEZWZhdWx0SW50ZXJ2YWwiLCJjYWxsYmFjayIsImNsaWVudF9pZCIsInVybCIsImludGVydmFsIiwic3RvcE9uRXJyb3IiLCJfY2FsbGJhY2siLCJfY2xpZW50X2lkIiwiX3VybCIsIl9pbnRlcnZhbCIsIl9zdG9wT25FcnJvciIsImlkeCIsIl9mcmFtZV9vcmlnaW4iLCJfZnJhbWUiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzdHlsZSIsInZpc2liaWxpdHkiLCJwb3NpdGlvbiIsImRpc3BsYXkiLCJ3aWR0aCIsImhlaWdodCIsInNyYyIsIlByb21pc2UiLCJyZXNvbHZlIiwib25sb2FkIiwiYm9keSIsImFwcGVuZENoaWxkIiwiX2JvdW5kTWVzc2FnZUV2ZW50IiwiX21lc3NhZ2UiLCJiaW5kIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9yaWdpbiIsInNvdXJjZSIsImNvbnRlbnRXaW5kb3ciLCJlcnJvciIsInN0b3AiLCJzdGFydCIsInNlc3Npb25fc3RhdGUiLCJfc2Vzc2lvbl9zdGF0ZSIsInNlbmQiLCJwb3N0TWVzc2FnZSIsIl90aW1lciIsInNldEludGVydmFsIiwiY2xlYXJJbnRlcnZhbCIsInByZXBhcmUiLCJwYXJhbXMiLCJwb3B1cFdpbmRvd0ZlYXR1cmVzIiwicG9wdXAiLCJDb3Jkb3ZhUG9wdXBXaW5kb3ciLCJEZWZhdWx0UG9wdXBGZWF0dXJlcyIsIkRlZmF1bHRQb3B1cFRhcmdldCIsIl9wcm9taXNlIiwicmVqZWN0IiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwiZmVhdHVyZXMiLCJ0YXJnZXQiLCJwb3B1cFdpbmRvd1RhcmdldCIsInJlZGlyZWN0X3VyaSIsInN0YXJ0VXJsIiwiX2lzSW5BcHBCcm93c2VySW5zdGFsbGVkIiwiY29yZG92YU1ldGFkYXRhIiwic29tZSIsIm5hdmlnYXRlIiwiX2Vycm9yIiwiY29yZG92YSIsInJlcXVpcmUiLCJtZXRhZGF0YSIsIl9wb3B1cCIsIkluQXBwQnJvd3NlciIsIm9wZW4iLCJfZXhpdENhbGxiYWNrRXZlbnQiLCJfZXhpdENhbGxiYWNrIiwiX2xvYWRTdGFydENhbGxiYWNrRXZlbnQiLCJfbG9hZFN0YXJ0Q2FsbGJhY2siLCJwcm9taXNlIiwiZXZlbnQiLCJfc3VjY2VzcyIsIm1lc3NhZ2UiLCJfY2xlYW51cCIsImNsb3NlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIkVycm9yUmVzcG9uc2UiLCJlcnJvcl9kZXNjcmlwdGlvbiIsImVycm9yX3VyaSIsIkV2ZW50IiwiX25hbWUiLCJfY2FsbGJhY2tzIiwiZmluZEluZGV4IiwiaXRlbSIsInJhaXNlIiwidGltZXIiLCJoYW5kbGUiLCJ0ZXN0aW5nIiwicmVxdWVzdCIsIl90ZXN0aW5nIiwic2V0WE1MSHR0cFJlcXVlc3QiLCJuZXdSZXF1ZXN0IiwibG9jYXRpb24iLCJsb2NhbFN0b3JhZ2UiLCJzZXNzaW9uU3RvcmFnZSIsIlhNTEh0dHBSZXF1ZXN0IiwiSUZyYW1lTmF2aWdhdG9yIiwiZnJhbWUiLCJJRnJhbWVXaW5kb3ciLCJub3RpZnlQYXJlbnQiLCJEZWZhdWx0VGltZW91dCIsInRpbWVvdXQiLCJzaWxlbnRSZXF1ZXN0VGltZW91dCIsInNldFRpbWVvdXQiLCJfdGltZW91dCIsImNsZWFyVGltZW91dCIsInJlbW92ZUNoaWxkIiwiX29yaWdpbiIsImZyYW1lRWxlbWVudCIsImhyZWYiLCJwYXJlbnQiLCJwcm90b2NvbCIsImhvc3QiLCJnZXRJdGVtIiwic2V0SXRlbSIsInZhbHVlIiwicmVtb3ZlSXRlbSIsImluZGV4IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsIkFsbG93ZWRTaWduaW5nQWxncyIsIkpvc2VVdGlsIiwicGFyc2VKd3QiLCJqd3QiLCJ0b2tlbiIsImhlYWRlciIsInBheWxvYWQiLCJ2YWxpZGF0ZUp3dCIsImlzc3VlciIsImF1ZGllbmNlIiwiY2xvY2tTa2V3Iiwibm93IiwidGltZUluc2Vuc2l0aXZlIiwiS2V5VXRpbCIsIng1YyIsIl92YWxpZGF0ZUp3dCIsInZhbGlkYXRlSnd0QXR0cmlidXRlcyIsInZhbGlkQXVkaWVuY2UiLCJhenAiLCJsb3dlck5vdyIsInVwcGVyTm93IiwidGhlbiIsImhleFRvQmFzZTY0VXJsIiwiSnNvblNlcnZpY2UiLCJhZGRpdGlvbmFsQ29udGVudFR5cGVzIiwiWE1MSHR0cFJlcXVlc3RDdG9yIiwiand0SGFuZGxlciIsIl9jb250ZW50VHlwZXMiLCJfWE1MSHR0cFJlcXVlc3QiLCJfand0SGFuZGxlciIsImdldEpzb24iLCJyZXEiLCJhbGxvd2VkQ29udGVudFR5cGVzIiwic3RhdHVzIiwiY29udGVudFR5cGUiLCJnZXRSZXNwb25zZUhlYWRlciIsImZvdW5kIiwiZmluZCIsInN0YXJ0c1dpdGgiLCJyZXNwb25zZVRleHQiLCJzdGF0dXNUZXh0Iiwib25lcnJvciIsInNldFJlcXVlc3RIZWFkZXIiLCJwb3N0Rm9ybSIsIm5vcExvZ2dlciIsImluZm8iLCJ3YXJuIiwiTk9ORSIsIkVSUk9SIiwiV0FSTiIsIklORk8iLCJERUJVRyIsImxvZ2dlciIsImxldmVsIiwiYXJncyIsImZyb20iLCJPaWRjTWV0YWRhdGFVcmxQYXRoIiwic2V0dGluZ3MiLCJKc29uU2VydmljZUN0b3IiLCJfc2V0dGluZ3MiLCJfanNvblNlcnZpY2UiLCJnZXRNZXRhZGF0YSIsIm1ldGFkYXRhVXJsIiwiZ2V0SXNzdWVyIiwiX2dldE1ldGFkYXRhUHJvcGVydHkiLCJnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQiLCJnZXRVc2VySW5mb0VuZHBvaW50IiwiZ2V0VG9rZW5FbmRwb2ludCIsIm9wdGlvbmFsIiwiZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lIiwiZ2V0RW5kU2Vzc2lvbkVuZHBvaW50IiwiZ2V0UmV2b2NhdGlvbkVuZHBvaW50IiwiZ2V0S2V5c0VuZHBvaW50IiwiZ2V0U2lnbmluZ0tleXMiLCJzaWduaW5nS2V5cyIsImp3a3NfdXJpIiwia2V5U2V0IiwiX21ldGFkYXRhVXJsIiwiYXV0aG9yaXR5IiwiY3JlYXRlU2lnbmluUmVxdWVzdCIsInJlc3BvbnNlX3R5cGUiLCJzY29wZSIsInByb21wdCIsIm1heF9hZ2UiLCJ1aV9sb2NhbGVzIiwiaWRfdG9rZW5faGludCIsImxvZ2luX2hpbnQiLCJhY3JfdmFsdWVzIiwicmVzb3VyY2UiLCJyZXF1ZXN0X3VyaSIsInJlc3BvbnNlX21vZGUiLCJleHRyYVF1ZXJ5UGFyYW1zIiwic3RhdGVTdG9yZSIsIlNpZ25pblJlcXVlc3QiLCJpc0NvZGUiLCJfbWV0YWRhdGFTZXJ2aWNlIiwic2lnbmluUmVxdWVzdCIsInNpZ25pblN0YXRlIiwiX3N0YXRlU3RvcmUiLCJzZXQiLCJ0b1N0b3JhZ2VTdHJpbmciLCJwcm9jZXNzU2lnbmluUmVzcG9uc2UiLCJ1c2VRdWVyeSIsImRlbGltaXRlciIsInJlc3BvbnNlIiwiU2lnbmluUmVzcG9uc2UiLCJyZW1vdmUiLCJzdG9yZWRTdGF0ZVN0cmluZyIsIlNpZ25pblN0YXRlIiwiZnJvbVN0b3JhZ2VTdHJpbmciLCJfdmFsaWRhdG9yIiwidmFsaWRhdGVTaWduaW5SZXNwb25zZSIsImNyZWF0ZVNpZ25vdXRSZXF1ZXN0IiwicG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiU2lnbm91dFJlcXVlc3QiLCJzaWdub3V0U3RhdGUiLCJwcm9jZXNzU2lnbm91dFJlc3BvbnNlIiwiU2lnbm91dFJlc3BvbnNlIiwic3RhdGVLZXkiLCJTdGF0ZSIsInZhbGlkYXRlU2lnbm91dFJlc3BvbnNlIiwiY2xlYXJTdGFsZVN0YXRlIiwic3RhbGVTdGF0ZUFnZSIsInZhbGlkYXRvciIsIm1ldGFkYXRhU2VydmljZSIsIkRlZmF1bHRSZXNwb25zZVR5cGUiLCJEZWZhdWx0U2NvcGUiLCJEZWZhdWx0U3RhbGVTdGF0ZUFnZSIsIkRlZmF1bHRDbG9ja1NrZXdJblNlY29uZHMiLCJjbGllbnRfc2VjcmV0IiwiZmlsdGVyUHJvdG9jb2xDbGFpbXMiLCJsb2FkVXNlckluZm8iLCJ1c2VySW5mb0p3dElzc3VlciIsIlJlc3BvbnNlVmFsaWRhdG9yQ3RvciIsIlJlc3BvbnNlVmFsaWRhdG9yIiwiTWV0YWRhdGFTZXJ2aWNlQ3RvciIsIl9hdXRob3JpdHkiLCJfbWV0YWRhdGEiLCJfc2lnbmluZ0tleXMiLCJfY2xpZW50X3NlY3JldCIsIl9yZXNwb25zZV90eXBlIiwiX3Njb3BlIiwiX3JlZGlyZWN0X3VyaSIsIl9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLCJfcHJvbXB0IiwiX2Rpc3BsYXkiLCJfbWF4X2FnZSIsIl91aV9sb2NhbGVzIiwiX2Fjcl92YWx1ZXMiLCJfcmVzb3VyY2UiLCJfcmVzcG9uc2VfbW9kZSIsIl9maWx0ZXJQcm90b2NvbENsYWltcyIsIl9sb2FkVXNlckluZm8iLCJfc3RhbGVTdGF0ZUFnZSIsIl9jbG9ja1NrZXciLCJfdXNlckluZm9Kd3RJc3N1ZXIiLCJfZXh0cmFRdWVyeVBhcmFtcyIsIlBvcHVwTmF2aWdhdG9yIiwiUG9wdXBXaW5kb3ciLCJrZWVwT3BlbiIsIm5vdGlmeU9wZW5lciIsIkNoZWNrRm9yUG9wdXBDbG9zZWRJbnRlcnZhbCIsIl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIiLCJfY2hlY2tGb3JQb3B1cENsb3NlZCIsIl9pZCIsImZvY3VzIiwiY2xvc2VkIiwib3BlbmVyIiwiVXJsVXRpbGl0eSIsInBhcnNlVXJsRnJhZ21lbnQiLCJSZWRpcmVjdE5hdmlnYXRvciIsIlByb3RvY29sQ2xhaW1zIiwiVXNlckluZm9TZXJ2aWNlQ3RvciIsIlVzZXJJbmZvU2VydmljZSIsImpvc2VVdGlsIiwiVG9rZW5DbGllbnRDdG9yIiwiVG9rZW5DbGllbnQiLCJfdXNlckluZm9TZXJ2aWNlIiwiX2pvc2VVdGlsIiwiX3Rva2VuQ2xpZW50IiwiX3Byb2Nlc3NTaWduaW5QYXJhbXMiLCJfdmFsaWRhdGVUb2tlbnMiLCJfcHJvY2Vzc0NsYWltcyIsIm5vbmNlIiwiaWRfdG9rZW4iLCJjb2RlX3ZlcmlmaWVyIiwiY29kZSIsImlzT3BlbklkQ29ubmVjdCIsInByb2ZpbGUiLCJnZXRDbGFpbXMiLCJjbGFpbXMiLCJfbWVyZ2VDbGFpbXMiLCJjbGFpbXMxIiwiY2xhaW1zMiIsInJlc3VsdCIsImFzc2lnbiIsInZhbHVlcyIsImZvckVhY2giLCJfcHJvY2Vzc0NvZGUiLCJfdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW4iLCJfdmFsaWRhdGVJZFRva2VuIiwiZXhjaGFuZ2VDb2RlIiwidG9rZW5SZXNwb25zZSIsIl92YWxpZGF0ZUlkVG9rZW5BdHRyaWJ1dGVzIiwiY2xvY2tTa2V3SW5TZWNvbmRzIiwiX3ZhbGlkYXRlQWNjZXNzVG9rZW4iLCJfZmlsdGVyQnlBbGciLCJmaWx0ZXIiLCJhdF9oYXNoIiwiaGFzaEFsZyIsImhhc2hCaXRzIiwic2hhIiwibGVmdCIsImxlZnRfYjY0dSIsInVzZXJNYW5hZ2VyIiwiQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciIsIl91c2VyTWFuYWdlciIsIl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yIiwiZXZlbnRzIiwiYWRkVXNlckxvYWRlZCIsIl9zdGFydCIsImFkZFVzZXJVbmxvYWRlZCIsIl9zdG9wIiwiZ2V0VXNlciIsInVzZXIiLCJjYXRjaCIsImVyciIsIl9zdWIiLCJfc2lkIiwic2lkIiwiX2NoZWNrU2Vzc2lvbklGcmFtZSIsIl9jaGVja1Nlc3Npb25JbnRlcnZhbCIsIl9zdG9wQ2hlY2tTZXNzaW9uT25FcnJvciIsInF1ZXJ5U2Vzc2lvblN0YXR1cyIsInJhaXNlVXNlclNpZ25lZE91dEV2ZW50Iiwic2Vzc2lvbiIsIl9yYWlzZVVzZXJTZXNzaW9uQ2hhbmdlZCIsIl9yYWlzZVVzZXJTaWduZWRPdXQiLCJjaGVja1Nlc3Npb25JbnRlcnZhbCIsInN0b3BDaGVja1Nlc3Npb25PbkVycm9yIiwib2lkYyIsImlzT2lkYyIsImFkZFF1ZXJ5UGFyYW0iLCJjb2RlX2NoYWxsZW5nZSIsImlzT0F1dGgiLCJPaWRjU2NvcGUiLCJ0b2tlbl90eXBlIiwiZXhwaXJlc19hdCIsInNjb3BlcyIsIl9ub25jZSIsIl9jb2RlX3ZlcmlmaWVyIiwiX2NvZGVfY2hhbGxlbmdlIiwiY3JlYXRlZCIsInN0b3JhZ2VTdHJpbmciLCJTaWxlbnRSZW5ld1NlcnZpY2UiLCJfdG9rZW5FeHBpcmluZyIsInNpZ25pblNpbGVudCIsIl9yYWlzZVNpbGVudFJlbmV3RXJyb3IiLCJfY3JlYXRlZCIsInN0b3JhZ2UiLCJhZ2UiLCJjdXRvZmYiLCJnZXRBbGxLZXlzIiwicHJvbWlzZXMiLCJhbGwiLCJUaW1lckR1cmF0aW9uIiwibm93RnVuYyIsIl9ub3dGdW5jIiwiZXhwaXJhdGlvbiIsIl90aW1lckhhbmRsZSIsIl9leHBpcmF0aW9uIiwidGltZXJEdXJhdGlvbiIsImRpZmYiLCJncmFudF90eXBlIiwiZXhjaGFuZ2VSZWZyZXNoVG9rZW4iLCJyZWZyZXNoX3Rva2VuIiwiQWNjZXNzVG9rZW5UeXBlSGludCIsIlJlZnJlc2hUb2tlblR5cGVIaW50IiwiX1hNTEh0dHBSZXF1ZXN0Q3RvciIsInJldm9rZSIsInJlcXVpcmVkIiwiX3Jldm9rZSIsInhociIsImdsb2JhbCIsImxhc3RJbmRleE9mIiwicmVnZXgiLCJjb3VudGVyIiwiZXhlYyIsInByb3AiLCJfZ2V0Q2xhaW1zRnJvbUp3dCIsImlzc3VlclByb21pc2UiLCJTaWxlbnRSZW5ld1NlcnZpY2VDdG9yIiwiU2Vzc2lvbk1vbml0b3JDdG9yIiwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50Q3RvciIsIlVzZXJNYW5hZ2VyU2V0dGluZ3MiLCJfZXZlbnRzIiwiVXNlck1hbmFnZXJFdmVudHMiLCJfc2lsZW50UmVuZXdTZXJ2aWNlIiwiYXV0b21hdGljU2lsZW50UmVuZXciLCJzdGFydFNpbGVudFJlbmV3IiwibW9uaXRvclNlc3Npb24iLCJfc2Vzc2lvbk1vbml0b3IiLCJfdG9rZW5SZXZvY2F0aW9uQ2xpZW50IiwiX2xvYWRVc2VyIiwicmVtb3ZlVXNlciIsInN0b3JlVXNlciIsInNpZ25pblJlZGlyZWN0IiwiX3NpZ25pblN0YXJ0IiwiX3JlZGlyZWN0TmF2aWdhdG9yIiwic2lnbmluUmVkaXJlY3RDYWxsYmFjayIsIl9zaWduaW5FbmQiLCJzaWduaW5Qb3B1cCIsInBvcHVwX3JlZGlyZWN0X3VyaSIsIl9zaWduaW4iLCJfcG9wdXBOYXZpZ2F0b3IiLCJzaWduaW5Qb3B1cENhbGxiYWNrIiwiX3NpZ25pbkNhbGxiYWNrIiwiX3VzZVJlZnJlc2hUb2tlbiIsImluY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldyIsIl9zaWduaW5TaWxlbnRJZnJhbWUiLCJpZFRva2VuVmFsaWRhdGlvbiIsIl92YWxpZGF0ZUlkVG9rZW5Gcm9tVG9rZW5SZWZyZXNoVG9rZW4iLCJhdXRoX3RpbWUiLCJzaWxlbnRfcmVkaXJlY3RfdXJpIiwiX2lmcmFtZU5hdmlnYXRvciIsInNpZ25pblNpbGVudENhbGxiYWNrIiwicXVlcnlfc3RhdHVzX3Jlc3BvbnNlX3R5cGUiLCJuYXZSZXNwb25zZSIsInNpZ25pblJlc3BvbnNlIiwibmF2aWdhdG9yUGFyYW1zIiwic2lnbm91dFJlZGlyZWN0IiwicG9zdExvZ291dFJlZGlyZWN0VXJpIiwiX3NpZ25vdXRTdGFydCIsInNpZ25vdXRSZWRpcmVjdENhbGxiYWNrIiwiX3NpZ25vdXRFbmQiLCJzaWdub3V0UG9wdXAiLCJwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLCJfc2lnbm91dCIsInNpZ25vdXRQb3B1cENhbGxiYWNrIiwicmV2b2tlUHJvbWlzZSIsInJldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0IiwiX3Jldm9rZUludGVybmFsIiwic2lnbm91dFJlcXVlc3QiLCJzaWdub3V0UmVzcG9uc2UiLCJyZXZva2VBY2Nlc3NUb2tlbiIsInN1Y2Nlc3MiLCJfcmV2b2tlQWNjZXNzVG9rZW5JbnRlcm5hbCIsIl9yZXZva2VSZWZyZXNoVG9rZW5JbnRlcm5hbCIsImF0U3VjY2VzcyIsInJ0U3VjY2VzcyIsInN0b3BTaWxlbnRSZW5ldyIsIl91c2VyU3RvcmUiLCJfdXNlclN0b3JlS2V5IiwicmVkaXJlY3ROYXZpZ2F0b3IiLCJwb3B1cE5hdmlnYXRvciIsImlmcmFtZU5hdmlnYXRvciIsInVzZXJTdG9yZSIsIl91c2VyTG9hZGVkIiwiX3VzZXJVbmxvYWRlZCIsIl9zaWxlbnRSZW5ld0Vycm9yIiwiX3VzZXJTaWduZWRPdXQiLCJfdXNlclNlc3Npb25DaGFuZ2VkIiwicmFpc2VFdmVudCIsInJlbW92ZVVzZXJMb2FkZWQiLCJyZW1vdmVVc2VyVW5sb2FkZWQiLCJhZGRTaWxlbnRSZW5ld0Vycm9yIiwicmVtb3ZlU2lsZW50UmVuZXdFcnJvciIsImFkZFVzZXJTaWduZWRPdXQiLCJyZW1vdmVVc2VyU2lnbmVkT3V0IiwiYWRkVXNlclNlc3Npb25DaGFuZ2VkIiwicmVtb3ZlVXNlclNlc3Npb25DaGFuZ2VkIiwiRGVmYXVsdENoZWNrU2Vzc2lvbkludGVydmFsIiwiRGVmYXVsdFF1ZXJ5U2Vzc2lvblN0YXR1c1Jlc3BvbnNlVHlwZSIsInN0b3JlIiwiX3BvcHVwX3JlZGlyZWN0X3VyaSIsIl9wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLCJfcG9wdXBXaW5kb3dGZWF0dXJlcyIsIl9wb3B1cFdpbmRvd1RhcmdldCIsIl9zaWxlbnRfcmVkaXJlY3RfdXJpIiwiX3NpbGVudFJlcXVlc3RUaW1lb3V0IiwiX2F1dG9tYXRpY1NpbGVudFJlbmV3IiwiX2luY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldyIsIl9tb25pdG9yU2Vzc2lvbiIsIl9xdWVyeV9zdGF0dXNfcmVzcG9uc2VfdHlwZSIsIl9yZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCIsInByZWZpeCIsIl9zdG9yZSIsIl9wcmVmaXgiLCJ1dWlkNCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtEQUEwQyxnQ0FBZ0M7QUFDMUU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnRUFBd0Qsa0JBQWtCO0FBQzFFO0FBQ0EseURBQWlELGNBQWM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUF5QyxpQ0FBaUM7QUFDMUUsd0hBQWdILG1CQUFtQixFQUFFO0FBQ3JJO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7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QWdMLEdBQWhMLEVBQW9MLEdBQXBMLEVBQXdMLEdBQXhMLEVBQTRMLEdBQTVMLEVBQWdNLEdBQWhNLEVBQW9NLEdBQXBNLEVBQXdNLEdBQXhNLEVBQTRNLEdBQTVNLEVBQWdOLEdBQWhOLEVBQW9OLEdBQXBOLEVBQXdOLEdBQXhOLEVBQTROLEdBQTVOLEVBQWdPLEdBQWhPLEVBQW9PLEdBQXBPLEVBQXdPLEdBQXhPLEVBQTRPLEdBQTVPLEVBQWdQLEdBQWhQLEVBQW9QLEdBQXBQLEVBQXdQLEdBQXhQLEVBQTRQLEdBQTVQLEVBQWdRLEdBQWhRLEVBQW9RLEdBQXBRLEVBQXdRLEdBQXhRLEVBQTRRLEdBQTVRLEVBQWdSLEdBQWhSLEVBQW9SLEdBQXBSLEVBQXdSLEdBQXhSLEVBQTRSLEdBQTVSLEVBQWdTLEdBQWhTLEVBQW9TLEdBQXBTLEVBQXdTLEdBQXhTLEVBQTRTLEdBQTVTLEVBQWdULEdBQWhULEVBQW9ULEdBQXBULEVBQXdULEdBQXhULEVBQTRULEdBQTVULEVBQWdVLEdBQWhVLEVBQW9VLEdBQXBVLEVBQXdVLEdBQXhVLEVBQTRVLEdBQTVVLEVBQWdWLEdBQWhWLEVBQW9WLEdBQXBWLEVBQXdWLEdBQXhWLEVBQTRWLEdBQTVWLEVBQWdXLEdBQWhXLEVBQW9XLEdBQXBXLEVBQXdXLEdBQXhXLEVBQTRXLEdBQTVXLEVBQWdYLEdBQWhYLEVBQW9YLEdBQXBYLEVBQXdYLEdBQXhYLEVBQTRYLEdBQTVYLEVBQWdZLEdBQWhZLEVBQW9ZLEdBQXBZLEVBQXdZLEdBQXhZLEVBQTRZLEdBQTVZLEVBQWdaLEdBQWhaLEVBQW9aLEdBQXBaLEVBQXdaLEdBQXhaLEVBQTRaLEdBQTVaLEVBQWdhLEdBQWhhLEVBQW9hLEdBQXBhLEVBQXdhLEdBQXhhLEVBQTRhLEdBQTVhLEVBQWdiLEdBQWhiLEVBQW9iLEdBQXBiLEVBQXdiLEdBQXhiLEVBQTRiLEdBQTViLEVBQWdjLEdBQWhjLEVBQW9jLEdBQXBjLEVBQXdjLEdBQXhjLEVBQTRjLEdBQTVjLEVBQWdkLEdBQWhkLEVBQW9kLEdBQXBkLEVBQXdkLEdBQXhkLEVB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QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFVBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSx1Q0FBdUMsU0FBUztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlCQUFpQjtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsaUJBQWlCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxFQUFFO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixlQUFlO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0EscUJBQXFCLGVBQWU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxtQkFBbUIsY0FBYztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdURBQXVELE9BQU87QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQixRQUFRO0FBQzdCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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ZXB0QixHQUFyQjs7QUFFQSxZQUFJNlMsT0FBTyxLQUFLc2EsTUFBTCxDQUFZeFksT0FBWixDQUFvQjNVLEdBQXBCLENBQVg7QUFDQSxhQUFLbXRCLE1BQUwsQ0FBWXJZLFVBQVosQ0FBdUI5VSxHQUF2Qjs7QUFFQSxlQUFPME8sUUFBUUMsT0FBUixDQUFnQmtFLElBQWhCLENBQVA7QUFDSCxLOzttQ0FFRDBTLFUseUJBQWE7QUFDVHI1QyxpQkFBSXFnQyxLQUFKLENBQVUsaUNBQVY7O0FBRUEsWUFBSW5nQixPQUFPLEVBQVg7O0FBRUEsYUFBSyxJQUFJMm9CLFFBQVEsQ0FBakIsRUFBb0JBLFFBQVEsS0FBS29ZLE1BQUwsQ0FBWTUrQyxNQUF4QyxFQUFnRHdtQyxPQUFoRCxFQUF5RDtBQUNyRCxnQkFBSS9VLE1BQU0sS0FBS210QixNQUFMLENBQVludEIsR0FBWixDQUFnQitVLEtBQWhCLENBQVY7O0FBRUEsZ0JBQUkvVSxJQUFJcHNCLE9BQUosQ0FBWSxLQUFLdzVDLE9BQWpCLE1BQThCLENBQWxDLEVBQXFDO0FBQ2pDaGhDLHFCQUFLNWIsSUFBTCxDQUFVd3ZCLElBQUlqdkIsTUFBSixDQUFXLEtBQUtxOEMsT0FBTCxDQUFhNytDLE1BQXhCLENBQVY7QUFDSDtBQUNKOztBQUVELGVBQU9tZ0MsUUFBUUMsT0FBUixDQUFnQnZpQixJQUFoQixDQUFQO0FBQ0gsSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0JDbkRtQjdiLE07QUFOeEIsSUFBSTg4QyxRQUFRL2IsbUJBQU9BLENBQUMsMENBQVIsQ0FBWjs7QUFFQTs7OztBQUllLFNBQVMvZ0MsTUFBVCxHQUFrQjtBQUMvQixTQUFPODhDLFFBQVEzaUMsT0FBUixDQUFnQixJQUFoQixFQUFzQixFQUF0QixDQUFQO0FBQ0QiLCJmaWxlIjoib2lkYy1jbGllbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2Uge1xuXHRcdHZhciBhID0gZmFjdG9yeSgpO1xuXHRcdGZvcih2YXIgaSBpbiBhKSAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnID8gZXhwb3J0cyA6IHJvb3QpW2ldID0gYVtpXTtcblx0fVxufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9pbmRleC5qc1wiKTtcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vc3JjL0xvZy5qcyc7XHJcbmltcG9ydCB7IE9pZGNDbGllbnQgfSBmcm9tICcuL3NyYy9PaWRjQ2xpZW50LmpzJztcclxuaW1wb3J0IHsgT2lkY0NsaWVudFNldHRpbmdzIH0gZnJvbSAnLi9zcmMvT2lkY0NsaWVudFNldHRpbmdzLmpzJztcclxuaW1wb3J0IHsgV2ViU3RvcmFnZVN0YXRlU3RvcmUgfSBmcm9tICcuL3NyYy9XZWJTdG9yYWdlU3RhdGVTdG9yZS5qcyc7XHJcbmltcG9ydCB7IEluTWVtb3J5V2ViU3RvcmFnZSB9IGZyb20gJy4vc3JjL0luTWVtb3J5V2ViU3RvcmFnZS5qcyc7XHJcbmltcG9ydCB7IFVzZXJNYW5hZ2VyIH0gZnJvbSAnLi9zcmMvVXNlck1hbmFnZXIuanMnO1xyXG5pbXBvcnQgeyBBY2Nlc3NUb2tlbkV2ZW50cyB9IGZyb20gJy4vc3JjL0FjY2Vzc1Rva2VuRXZlbnRzLmpzJztcclxuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi9zcmMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcclxuaW1wb3J0IHsgQ29yZG92YVBvcHVwTmF2aWdhdG9yIH0gZnJvbSAnLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yLmpzJztcclxuaW1wb3J0IHsgQ29yZG92YUlGcmFtZU5hdmlnYXRvciB9IGZyb20gJy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMnO1xyXG5pbXBvcnQgeyBDaGVja1Nlc3Npb25JRnJhbWUgfSBmcm9tICcuL3NyYy9DaGVja1Nlc3Npb25JRnJhbWUuanMnO1xyXG5pbXBvcnQgeyBUb2tlblJldm9jYXRpb25DbGllbnQgfSBmcm9tICcuL3NyYy9Ub2tlblJldm9jYXRpb25DbGllbnQuanMnO1xyXG5pbXBvcnQgeyBTZXNzaW9uTW9uaXRvciB9IGZyb20gJy4vc3JjL1Nlc3Npb25Nb25pdG9yLmpzJztcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi9zcmMvR2xvYmFsLmpzJztcclxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4vc3JjL1VzZXIuanMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgTG9nLFxyXG4gICAgT2lkY0NsaWVudCxcclxuICAgIE9pZGNDbGllbnRTZXR0aW5ncyxcclxuICAgIFdlYlN0b3JhZ2VTdGF0ZVN0b3JlLFxyXG4gICAgSW5NZW1vcnlXZWJTdG9yYWdlLFxyXG4gICAgVXNlck1hbmFnZXIsXHJcbiAgICBBY2Nlc3NUb2tlbkV2ZW50cyxcclxuICAgIE1ldGFkYXRhU2VydmljZSxcclxuICAgIENvcmRvdmFQb3B1cE5hdmlnYXRvcixcclxuICAgIENvcmRvdmFJRnJhbWVOYXZpZ2F0b3IsXHJcbiAgICBDaGVja1Nlc3Npb25JRnJhbWUsXHJcbiAgICBUb2tlblJldm9jYXRpb25DbGllbnQsXHJcbiAgICBTZXNzaW9uTW9uaXRvcixcclxuICAgIEdsb2JhbCxcclxuICAgIFVzZXJcclxufTtcclxuIiwiLypcclxuICoganNyc2FzaWduKGFsbCkgOC4wLjEyICgyMDE4LTA0LTIyKSAoYykgMjAxMC0yMDE4IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXHJcbiAqL1xyXG5cclxudmFyIG5hdmlnYXRvciA9IHt9O1xyXG5uYXZpZ2F0b3IudXNlckFnZW50ID0gZmFsc2U7XHJcblxyXG52YXIgd2luZG93ID0ge307XHJcblxuLyohXHJcbkNvcHlyaWdodCAoYykgMjAxMSwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuQ29kZSBsaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2U6XHJcbmh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3l1aS9saWNlbnNlLmh0bWxcclxudmVyc2lvbjogMi45LjBcclxuKi9cclxuaWYoWUFIT089PT11bmRlZmluZWQpe3ZhciBZQUhPTz17fX1ZQUhPTy5sYW5nPXtleHRlbmQ6ZnVuY3Rpb24oZyxoLGYpe2lmKCFofHwhZyl7dGhyb3cgbmV3IEVycm9yKFwiWUFIT08ubGFuZy5leHRlbmQgZmFpbGVkLCBwbGVhc2UgY2hlY2sgdGhhdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbmNsdWRlZC5cIil9dmFyIGQ9ZnVuY3Rpb24oKXt9O2QucHJvdG90eXBlPWgucHJvdG90eXBlO2cucHJvdG90eXBlPW5ldyBkKCk7Zy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZztnLnN1cGVyY2xhc3M9aC5wcm90b3R5cGU7aWYoaC5wcm90b3R5cGUuY29uc3RydWN0b3I9PU9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3Ipe2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWh9aWYoZil7dmFyIGI7Zm9yKGIgaW4gZil7Zy5wcm90b3R5cGVbYl09ZltiXX12YXIgZT1mdW5jdGlvbigpe30sYz1bXCJ0b1N0cmluZ1wiLFwidmFsdWVPZlwiXTt0cnl7aWYoL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe2U9ZnVuY3Rpb24oaixpKXtmb3IoYj0wO2I8Yy5sZW5ndGg7Yj1iKzEpe3ZhciBsPWNbYl0saz1pW2xdO2lmKHR5cGVvZiBrPT09XCJmdW5jdGlvblwiJiZrIT1PYmplY3QucHJvdG90eXBlW2xdKXtqW2xdPWt9fX19fWNhdGNoKGEpe31lKGcucHJvdG90eXBlLGYpfX19O1xuLyohIENyeXB0b0pTIHYzLjEuMiBjb3JlLWZpeC5qc1xyXG4gKiBjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcclxuICogKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIGNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcclxuICogVEhJUyBJUyBGSVggb2YgJ2NvcmUuanMnIHRvIGZpeCBIbWFjIGlzc3VlLlxyXG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy9pc3N1ZXMvZGV0YWlsP2lkPTg0XHJcbiAqIGh0dHBzOi8vY3J5cHRvLWpzLmdvb2dsZWNvZGUuY29tL3N2bi1oaXN0b3J5L3I2NjcvYnJhbmNoZXMvMy54L3NyYy9jb3JlLmpzXHJcbiAqL1xyXG52YXIgQ3J5cHRvSlM9Q3J5cHRvSlN8fChmdW5jdGlvbihlLGcpe3ZhciBhPXt9O3ZhciBiPWEubGliPXt9O3ZhciBqPWIuQmFzZT0oZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7fXJldHVybntleHRlbmQ6ZnVuY3Rpb24ocCl7bi5wcm90b3R5cGU9dGhpczt2YXIgbz1uZXcgbigpO2lmKHApe28ubWl4SW4ocCl9aWYoIW8uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKXtvLmluaXQ9ZnVuY3Rpb24oKXtvLiRzdXBlci5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19by5pbml0LnByb3RvdHlwZT1vO28uJHN1cGVyPXRoaXM7cmV0dXJuIG99LGNyZWF0ZTpmdW5jdGlvbigpe3ZhciBvPXRoaXMuZXh0ZW5kKCk7by5pbml0LmFwcGx5KG8sYXJndW1lbnRzKTtyZXR1cm4gb30saW5pdDpmdW5jdGlvbigpe30sbWl4SW46ZnVuY3Rpb24ocCl7Zm9yKHZhciBvIGluIHApe2lmKHAuaGFzT3duUHJvcGVydHkobykpe3RoaXNbb109cFtvXX19aWYocC5oYXNPd25Qcm9wZXJ0eShcInRvU3RyaW5nXCIpKXt0aGlzLnRvU3RyaW5nPXAudG9TdHJpbmd9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKX19fSgpKTt2YXIgbD1iLldvcmRBcnJheT1qLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihvLG4pe289dGhpcy53b3Jkcz1vfHxbXTtpZihuIT1nKXt0aGlzLnNpZ0J5dGVzPW59ZWxzZXt0aGlzLnNpZ0J5dGVzPW8ubGVuZ3RoKjR9fSx0b1N0cmluZzpmdW5jdGlvbihuKXtyZXR1cm4obnx8aCkuc3RyaW5naWZ5KHRoaXMpfSxjb25jYXQ6ZnVuY3Rpb24odCl7dmFyIHE9dGhpcy53b3Jkczt2YXIgcD10LndvcmRzO3ZhciBuPXRoaXMuc2lnQnl0ZXM7dmFyIHM9dC5zaWdCeXRlczt0aGlzLmNsYW1wKCk7aWYobiU0KXtmb3IodmFyIHI9MDtyPHM7cisrKXt2YXIgbz0ocFtyPj4+Ml0+Pj4oMjQtKHIlNCkqOCkpJjI1NTtxWyhuK3IpPj4+Ml18PW88PCgyNC0oKG4rciklNCkqOCl9fWVsc2V7Zm9yKHZhciByPTA7cjxzO3IrPTQpe3FbKG4rcik+Pj4yXT1wW3I+Pj4yXX19dGhpcy5zaWdCeXRlcys9cztyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLndvcmRzO3ZhciBuPXRoaXMuc2lnQnl0ZXM7b1tuPj4+Ml0mPTQyOTQ5NjcyOTU8PCgzMi0obiU0KSo4KTtvLmxlbmd0aD1lLmNlaWwobi80KX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgbj1qLmNsb25lLmNhbGwodGhpcyk7bi53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApO3JldHVybiBufSxyYW5kb206ZnVuY3Rpb24ocCl7dmFyIG89W107Zm9yKHZhciBuPTA7bjxwO24rPTQpe28ucHVzaCgoZS5yYW5kb20oKSo0Mjk0OTY3Mjk2KXwwKX1yZXR1cm4gbmV3IGwuaW5pdChvLHApfX0pO3ZhciBtPWEuZW5jPXt9O3ZhciBoPW0uSGV4PXtzdHJpbmdpZnk6ZnVuY3Rpb24ocCl7dmFyIHI9cC53b3Jkczt2YXIgbz1wLnNpZ0J5dGVzO3ZhciBxPVtdO2Zvcih2YXIgbj0wO248bztuKyspe3ZhciBzPShyW24+Pj4yXT4+PigyNC0obiU0KSo4KSkmMjU1O3EucHVzaCgocz4+PjQpLnRvU3RyaW5nKDE2KSk7cS5wdXNoKChzJjE1KS50b1N0cmluZygxNikpfXJldHVybiBxLmpvaW4oXCJcIil9LHBhcnNlOmZ1bmN0aW9uKHApe3ZhciBuPXAubGVuZ3RoO3ZhciBxPVtdO2Zvcih2YXIgbz0wO288bjtvKz0yKXtxW28+Pj4zXXw9cGFyc2VJbnQocC5zdWJzdHIobywyKSwxNik8PCgyNC0obyU4KSo0KX1yZXR1cm4gbmV3IGwuaW5pdChxLG4vMil9fTt2YXIgZD1tLkxhdGluMT17c3RyaW5naWZ5OmZ1bmN0aW9uKHEpe3ZhciByPXEud29yZHM7dmFyIHA9cS5zaWdCeXRlczt2YXIgbj1bXTtmb3IodmFyIG89MDtvPHA7bysrKXt2YXIgcz0ocltvPj4+Ml0+Pj4oMjQtKG8lNCkqOCkpJjI1NTtuLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShzKSl9cmV0dXJuIG4uam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24ocCl7dmFyIG49cC5sZW5ndGg7dmFyIHE9W107Zm9yKHZhciBvPTA7bzxuO28rKyl7cVtvPj4+Ml18PShwLmNoYXJDb2RlQXQobykmMjU1KTw8KDI0LShvJTQpKjgpfXJldHVybiBuZXcgbC5pbml0KHEsbil9fTt2YXIgYz1tLlV0Zjg9e3N0cmluZ2lmeTpmdW5jdGlvbihuKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZC5zdHJpbmdpZnkobikpKX1jYXRjaChvKXt0aHJvdyBuZXcgRXJyb3IoXCJNYWxmb3JtZWQgVVRGLTggZGF0YVwiKX19LHBhcnNlOmZ1bmN0aW9uKG4pe3JldHVybiBkLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChuKSkpfX07dmFyIGk9Yi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtPWouZXh0ZW5kKHtyZXNldDpmdW5jdGlvbigpe3RoaXMuX2RhdGE9bmV3IGwuaW5pdCgpO3RoaXMuX25EYXRhQnl0ZXM9MH0sX2FwcGVuZDpmdW5jdGlvbihuKXtpZih0eXBlb2Ygbj09XCJzdHJpbmdcIil7bj1jLnBhcnNlKG4pfXRoaXMuX2RhdGEuY29uY2F0KG4pO3RoaXMuX25EYXRhQnl0ZXMrPW4uc2lnQnl0ZXN9LF9wcm9jZXNzOmZ1bmN0aW9uKHcpe3ZhciBxPXRoaXMuX2RhdGE7dmFyIHg9cS53b3Jkczt2YXIgbj1xLnNpZ0J5dGVzO3ZhciB0PXRoaXMuYmxvY2tTaXplO3ZhciB2PXQqNDt2YXIgdT1uL3Y7aWYodyl7dT1lLmNlaWwodSl9ZWxzZXt1PWUubWF4KCh1fDApLXRoaXMuX21pbkJ1ZmZlclNpemUsMCl9dmFyIHM9dSp0O3ZhciByPWUubWluKHMqNCxuKTtpZihzKXtmb3IodmFyIHA9MDtwPHM7cCs9dCl7dGhpcy5fZG9Qcm9jZXNzQmxvY2soeCxwKX12YXIgbz14LnNwbGljZSgwLHMpO3Euc2lnQnl0ZXMtPXJ9cmV0dXJuIG5ldyBsLmluaXQobyxyKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgbj1qLmNsb25lLmNhbGwodGhpcyk7bi5fZGF0YT10aGlzLl9kYXRhLmNsb25lKCk7cmV0dXJuIG59LF9taW5CdWZmZXJTaXplOjB9KTt2YXIgZj1iLkhhc2hlcj1pLmV4dGVuZCh7Y2ZnOmouZXh0ZW5kKCksaW5pdDpmdW5jdGlvbihuKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQobik7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe2kucmVzZXQuY2FsbCh0aGlzKTt0aGlzLl9kb1Jlc2V0KCl9LHVwZGF0ZTpmdW5jdGlvbihuKXt0aGlzLl9hcHBlbmQobik7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbihuKXtpZihuKXt0aGlzLl9hcHBlbmQobil9dmFyIG89dGhpcy5fZG9GaW5hbGl6ZSgpO3JldHVybiBvfSxibG9ja1NpemU6NTEyLzMyLF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHAsbyl7cmV0dXJuIG5ldyBuLmluaXQobykuZmluYWxpemUocCl9fSxfY3JlYXRlSG1hY0hlbHBlcjpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24ocCxvKXtyZXR1cm4gbmV3IGsuSE1BQy5pbml0KG4sbykuZmluYWxpemUocCl9fX0pO3ZhciBrPWEuYWxnbz17fTtyZXR1cm4gYX0oTWF0aCkpO1xuLypcclxuQ3J5cHRvSlMgdjMuMS4yIHg2NC1jb3JlLW1pbi5qc1xyXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcclxuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcclxuKi9cclxuKGZ1bmN0aW9uKGcpe3ZhciBhPUNyeXB0b0pTLGY9YS5saWIsZT1mLkJhc2UsaD1mLldvcmRBcnJheSxhPWEueDY0PXt9O2EuV29yZD1lLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihiLGMpe3RoaXMuaGlnaD1iO3RoaXMubG93PWN9fSk7YS5Xb3JkQXJyYXk9ZS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYixjKXtiPXRoaXMud29yZHM9Ynx8W107dGhpcy5zaWdCeXRlcz1jIT1nP2M6OCpiLmxlbmd0aH0sdG9YMzI6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy53b3JkcyxjPWIubGVuZ3RoLGE9W10sZD0wO2Q8YztkKyspe3ZhciBlPWJbZF07YS5wdXNoKGUuaGlnaCk7YS5wdXNoKGUubG93KX1yZXR1cm4gaC5jcmVhdGUoYSx0aGlzLnNpZ0J5dGVzKX0sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZS5jbG9uZS5jYWxsKHRoaXMpLGM9Yi53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApLGE9Yy5sZW5ndGgsZD0wO2Q8YTtkKyspY1tkXT1jW2RdLmNsb25lKCk7cmV0dXJuIGJ9fSl9KSgpO1xyXG5cbi8qXHJcbkNyeXB0b0pTIHYzLjEuMiBlbmMtYmFzZTY0LmpzXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xyXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxyXG4qL1xyXG4oZnVuY3Rpb24oKXt2YXIgaD1DcnlwdG9KUyxqPWgubGliLldvcmRBcnJheTtoLmVuYy5CYXNlNjQ9e3N0cmluZ2lmeTpmdW5jdGlvbihiKXt2YXIgZT1iLndvcmRzLGY9Yi5zaWdCeXRlcyxjPXRoaXMuX21hcDtiLmNsYW1wKCk7Yj1bXTtmb3IodmFyIGE9MDthPGY7YSs9Mylmb3IodmFyIGQ9KGVbYT4+PjJdPj4+MjQtOCooYSU0KSYyNTUpPDwxNnwoZVthKzE+Pj4yXT4+PjI0LTgqKChhKzEpJTQpJjI1NSk8PDh8ZVthKzI+Pj4yXT4+PjI0LTgqKChhKzIpJTQpJjI1NSxnPTA7ND5nJiZhKzAuNzUqZzxmO2crKyliLnB1c2goYy5jaGFyQXQoZD4+PjYqKDMtZykmNjMpKTtpZihlPWMuY2hhckF0KDY0KSlmb3IoO2IubGVuZ3RoJTQ7KWIucHVzaChlKTtyZXR1cm4gYi5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihiKXt2YXIgZT1iLmxlbmd0aCxmPXRoaXMuX21hcCxjPWYuY2hhckF0KDY0KTtjJiYoYz1iLmluZGV4T2YoYyksLTEhPWMmJihlPWMpKTtmb3IodmFyIGM9W10sYT0wLGQ9MDtkPFxyXG5lO2QrKylpZihkJTQpe3ZhciBnPWYuaW5kZXhPZihiLmNoYXJBdChkLTEpKTw8MiooZCU0KSxoPWYuaW5kZXhPZihiLmNoYXJBdChkKSk+Pj42LTIqKGQlNCk7Y1thPj4+Ml18PShnfGgpPDwyNC04KihhJTQpO2ErK31yZXR1cm4gai5jcmVhdGUoYyxhKX0sX21hcDpcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCJ9fSkoKTtcclxuXG4vKlxyXG5DcnlwdG9KUyB2My4xLjIgc2hhMjU2LW1pbi5qc1xyXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcclxuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcclxuKi9cclxuKGZ1bmN0aW9uKGspe2Zvcih2YXIgZz1DcnlwdG9KUyxoPWcubGliLHY9aC5Xb3JkQXJyYXksaj1oLkhhc2hlcixoPWcuYWxnbyxzPVtdLHQ9W10sdT1mdW5jdGlvbihxKXtyZXR1cm4gNDI5NDk2NzI5NioocS0ocXwwKSl8MH0sbD0yLGI9MDs2ND5iOyl7dmFyIGQ7YTp7ZD1sO2Zvcih2YXIgdz1rLnNxcnQoZCkscj0yO3I8PXc7cisrKWlmKCEoZCVyKSl7ZD0hMTticmVhayBhfWQ9ITB9ZCYmKDg+YiYmKHNbYl09dShrLnBvdyhsLDAuNSkpKSx0W2JdPXUoay5wb3cobCwxLzMpKSxiKyspO2wrK312YXIgbj1bXSxoPWguU0hBMjU2PWouZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IHYuaW5pdChzLnNsaWNlKDApKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHEsaCl7Zm9yKHZhciBhPXRoaXMuX2hhc2gud29yZHMsYz1hWzBdLGQ9YVsxXSxiPWFbMl0saz1hWzNdLGY9YVs0XSxnPWFbNV0saj1hWzZdLGw9YVs3XSxlPTA7NjQ+ZTtlKyspe2lmKDE2PmUpbltlXT1cclxucVtoK2VdfDA7ZWxzZXt2YXIgbT1uW2UtMTVdLHA9bltlLTJdO25bZV09KChtPDwyNXxtPj4+NyleKG08PDE0fG0+Pj4xOClebT4+PjMpK25bZS03XSsoKHA8PDE1fHA+Pj4xNyleKHA8PDEzfHA+Pj4xOSlecD4+PjEwKStuW2UtMTZdfW09bCsoKGY8PDI2fGY+Pj42KV4oZjw8MjF8Zj4+PjExKV4oZjw8N3xmPj4+MjUpKSsoZiZnXn5mJmopK3RbZV0rbltlXTtwPSgoYzw8MzB8Yz4+PjIpXihjPDwxOXxjPj4+MTMpXihjPDwxMHxjPj4+MjIpKSsoYyZkXmMmYl5kJmIpO2w9ajtqPWc7Zz1mO2Y9ayttfDA7az1iO2I9ZDtkPWM7Yz1tK3B8MH1hWzBdPWFbMF0rY3wwO2FbMV09YVsxXStkfDA7YVsyXT1hWzJdK2J8MDthWzNdPWFbM10ra3wwO2FbNF09YVs0XStmfDA7YVs1XT1hWzVdK2d8MDthWzZdPWFbNl0ranwwO2FbN109YVs3XStsfDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5fZGF0YSxiPWQud29yZHMsYT04KnRoaXMuX25EYXRhQnl0ZXMsYz04KmQuc2lnQnl0ZXM7XHJcbmJbYz4+PjVdfD0xMjg8PDI0LWMlMzI7YlsoYys2ND4+Pjk8PDQpKzE0XT1rLmZsb29yKGEvNDI5NDk2NzI5Nik7YlsoYys2ND4+Pjk8PDQpKzE1XT1hO2Quc2lnQnl0ZXM9NCpiLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9ai5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2cuU0hBMjU2PWouX2NyZWF0ZUhlbHBlcihoKTtnLkhtYWNTSEEyNTY9ai5fY3JlYXRlSG1hY0hlbHBlcihoKX0pKE1hdGgpO1xyXG5cbi8qXHJcbkNyeXB0b0pTIHYzLjEuMiBzaGE1MTItbWluLmpzXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xyXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxyXG4qL1xyXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7cmV0dXJuIGQuY3JlYXRlLmFwcGx5KGQsYXJndW1lbnRzKX1mb3IodmFyIG49Q3J5cHRvSlMscj1uLmxpYi5IYXNoZXIsZT1uLng2NCxkPWUuV29yZCxUPWUuV29yZEFycmF5LGU9bi5hbGdvLGVhPVthKDExMTYzNTI0MDgsMzYwOTc2NzQ1OCksYSgxODk5NDQ3NDQxLDYwMjg5MTcyNSksYSgzMDQ5MzIzNDcxLDM5NjQ0ODQzOTkpLGEoMzkyMTAwOTU3MywyMTczMjk1NTQ4KSxhKDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxhKDE1MDg5NzA5OTMsMzA1MzgzNDI2NSksYSgyNDUzNjM1NzQ4LDI5Mzc2NzE1NzkpLGEoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxhKDM2MjQzODEwODAsMjczNDg4MzM5NCksYSgzMTA1OTg0MDEsMTE2NDk5NjU0MiksYSg2MDcyMjUyNzgsMTMyMzYxMDc2NCksYSgxNDI2ODgxOTg3LDM1OTAzMDQ5OTQpLGEoMTkyNTA3ODM4OCw0MDY4MTgyMzgzKSxhKDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxhKDI2MTQ4ODgxMDMsNjMzODAzMzE3KSxcclxuYSgzMjQ4MjIyNTgwLDM0Nzk3NzQ4NjgpLGEoMzgzNTM5MDQwMSwyNjY2NjEzNDU4KSxhKDQwMjIyMjQ3NzQsOTQ0NzExMTM5KSxhKDI2NDM0NzA3OCwyMzQxMjYyNzczKSxhKDYwNDgwNzYyOCwyMDA3ODAwOTMzKSxhKDc3MDI1NTk4MywxNDk1OTkwOTAxKSxhKDEyNDkxNTAxMjIsMTg1NjQzMTIzNSksYSgxNTU1MDgxNjkyLDMxNzUyMTgxMzIpLGEoMTk5NjA2NDk4NiwyMTk4OTUwODM3KSxhKDI1NTQyMjA4ODIsMzk5OTcxOTMzOSksYSgyODIxODM0MzQ5LDc2Njc4NDAxNiksYSgyOTUyOTk2ODA4LDI1NjY1OTQ4NzkpLGEoMzIxMDMxMzY3MSwzMjAzMzM3OTU2KSxhKDMzMzY1NzE4OTEsMTAzNDQ1NzAyNiksYSgzNTg0NTI4NzExLDI0NjY5NDg5MDEpLGEoMTEzOTI2OTkzLDM3NTgzMjYzODMpLGEoMzM4MjQxODk1LDE2ODcxNzkzNiksYSg2NjYzMDcyMDUsMTE4ODE3OTk2NCksYSg3NzM1Mjk5MTIsMTU0NjA0NTczNCksYSgxMjk0NzU3MzcyLDE1MjI4MDU0ODUpLGEoMTM5NjE4MjI5MSxcclxuMjY0MzgzMzgyMyksYSgxNjk1MTgzNzAwLDIzNDM1MjczOTApLGEoMTk4NjY2MTA1MSwxMDE0NDc3NDgwKSxhKDIxNzcwMjYzNTAsMTIwNjc1OTE0MiksYSgyNDU2OTU2MDM3LDM0NDA3NzYyNyksYSgyNzMwNDg1OTIxLDEyOTA4NjM0NjApLGEoMjgyMDMwMjQxMSwzMTU4NDU0MjczKSxhKDMyNTk3MzA4MDAsMzUwNTk1MjY1NyksYSgzMzQ1NzY0NzcxLDEwNjIxNzAwOCksYSgzNTE2MDY1ODE3LDM2MDYwMDgzNDQpLGEoMzYwMDM1MjgwNCwxNDMyNzI1Nzc2KSxhKDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCksYSgyNzU0MjMzNDQsODUxMTY5NzIwKSxhKDQzMDIyNzczNCwzMTAwODIzNzUyKSxhKDUwNjk0ODYxNiwxMzYzMjU4MTk1KSxhKDY1OTA2MDU1NiwzNzUwNjg1NTkzKSxhKDg4Mzk5Nzg3NywzNzg1MDUwMjgwKSxhKDk1ODEzOTU3MSwzMzE4MzA3NDI3KSxhKDEzMjI4MjIyMTgsMzgxMjcyMzQwMyksYSgxNTM3MDAyMDYzLDIwMDMwMzQ5OTUpLGEoMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5KSxcclxuYSgxOTU1NTYyMjIyLDE1NzU5OTAwMTIpLGEoMjAyNDEwNDgxNSwxMTI1NTkyOTI4KSxhKDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksYSgyMzYxODUyNDI0LDQ0Mjc3NjA0NCksYSgyNDI4NDM2NDc0LDU5MzY5ODM0NCksYSgyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLGEoMzIwNDAzMTQ3OSwyOTk5MzUxNTczKSxhKDMzMjkzMjUyOTgsMzgxNTkyMDQyNyksYSgzMzkxNTY5NjE0LDM5MjgzODM5MDApLGEoMzUxNTI2NzI3MSw1NjYyODA3MTEpLGEoMzk0MDE4NzYwNiwzNDU0MDY5NTM0KSxhKDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksYSgxMTY0MTg0NzQsMTkxNDEzODU1NCksYSgxNzQyOTI0MjEsMjczMTA1NTI3MCksYSgyODkzODAzNTYsMzIwMzk5MzAwNiksYSg0NjAzOTMyNjksMzIwNjIwMzE1KSxhKDY4NTQ3MTczMyw1ODc0OTY4MzYpLGEoODUyMTQyOTcxLDEwODY3OTI4NTEpLGEoMTAxNzAzNjI5OCwzNjU1NDMxMDApLGEoMTEyNjAwMDU4MCwyNjE4Mjk3Njc2KSxhKDEyODgwMzM0NzAsXHJcbjM0MDk4NTUxNTgpLGEoMTUwMTUwNTk0OCw0MjM0NTA5ODY2KSxhKDE2MDcxNjc5MTUsOTg3MTY3NDY4KSxhKDE4MTY0MDIzMTYsMTI0NjE4OTU5MSldLHY9W10sdz0wOzgwPnc7dysrKXZbd109YSgpO2U9ZS5TSEE1MTI9ci5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgVC5pbml0KFtuZXcgZC5pbml0KDE3NzkwMzM3MDMsNDA4OTIzNTcyMCksbmV3IGQuaW5pdCgzMTQ0MTM0Mjc3LDIyMjc4NzM1OTUpLG5ldyBkLmluaXQoMTAxMzkwNDI0Miw0MjcxMTc1NzIzKSxuZXcgZC5pbml0KDI3NzM0ODA3NjIsMTU5NTc1MDEyOSksbmV3IGQuaW5pdCgxMzU5ODkzMTE5LDI5MTc1NjUxMzcpLG5ldyBkLmluaXQoMjYwMDgyMjkyNCw3MjU1MTExOTkpLG5ldyBkLmluaXQoNTI4NzM0NjM1LDQyMTUzODk1NDcpLG5ldyBkLmluaXQoMTU0MTQ1OTIyNSwzMjcwMzMyMDkpXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGQpe2Zvcih2YXIgZj10aGlzLl9oYXNoLndvcmRzLFxyXG5GPWZbMF0sZT1mWzFdLG49ZlsyXSxyPWZbM10sRz1mWzRdLEg9Zls1XSxJPWZbNl0sZj1mWzddLHc9Ri5oaWdoLEo9Ri5sb3csWD1lLmhpZ2gsSz1lLmxvdyxZPW4uaGlnaCxMPW4ubG93LFo9ci5oaWdoLE09ci5sb3csJD1HLmhpZ2gsTj1HLmxvdyxhYT1ILmhpZ2gsTz1ILmxvdyxiYT1JLmhpZ2gsUD1JLmxvdyxjYT1mLmhpZ2gsUT1mLmxvdyxrPXcsZz1KLHo9WCx4PUssQT1ZLHk9TCxVPVosQj1NLGw9JCxoPU4sUj1hYSxDPU8sUz1iYSxEPVAsVj1jYSxFPVEsbT0wOzgwPm07bSsrKXt2YXIgcz12W21dO2lmKDE2Pm0pdmFyIGo9cy5oaWdoPWFbZCsyKm1dfDAsYj1zLmxvdz1hW2QrMiptKzFdfDA7ZWxzZXt2YXIgaj12W20tMTVdLGI9ai5oaWdoLHA9ai5sb3csaj0oYj4+PjF8cDw8MzEpXihiPj4+OHxwPDwyNCleYj4+PjcscD0ocD4+PjF8Yjw8MzEpXihwPj4+OHxiPDwyNCleKHA+Pj43fGI8PDI1KSx1PXZbbS0yXSxiPXUuaGlnaCxjPXUubG93LHU9KGI+Pj4xOXxjPDwxMyleKGI8PFxyXG4zfGM+Pj4yOSleYj4+PjYsYz0oYz4+PjE5fGI8PDEzKV4oYzw8M3xiPj4+MjkpXihjPj4+NnxiPDwyNiksYj12W20tN10sVz1iLmhpZ2gsdD12W20tMTZdLHE9dC5oaWdoLHQ9dC5sb3csYj1wK2IubG93LGo9aitXKyhiPj4+MDxwPj4+MD8xOjApLGI9YitjLGo9ait1KyhiPj4+MDxjPj4+MD8xOjApLGI9Yit0LGo9aitxKyhiPj4+MDx0Pj4+MD8xOjApO3MuaGlnaD1qO3MubG93PWJ9dmFyIFc9bCZSXn5sJlMsdD1oJkNefmgmRCxzPWsmel5rJkFeeiZBLFQ9ZyZ4XmcmeV54JnkscD0oaz4+PjI4fGc8PDQpXihrPDwzMHxnPj4+MileKGs8PDI1fGc+Pj43KSx1PShnPj4+Mjh8azw8NCleKGc8PDMwfGs+Pj4yKV4oZzw8MjV8az4+PjcpLGM9ZWFbbV0sZmE9Yy5oaWdoLGRhPWMubG93LGM9RSsoKGg+Pj4xNHxsPDwxOCleKGg+Pj4xOHxsPDwxNCleKGg8PDIzfGw+Pj45KSkscT1WKygobD4+PjE0fGg8PDE4KV4obD4+PjE4fGg8PDE0KV4obDw8MjN8aD4+PjkpKSsoYz4+PjA8RT4+PjA/MTpcclxuMCksYz1jK3QscT1xK1crKGM+Pj4wPHQ+Pj4wPzE6MCksYz1jK2RhLHE9cStmYSsoYz4+PjA8ZGE+Pj4wPzE6MCksYz1jK2IscT1xK2orKGM+Pj4wPGI+Pj4wPzE6MCksYj11K1Qscz1wK3MrKGI+Pj4wPHU+Pj4wPzE6MCksVj1TLEU9RCxTPVIsRD1DLFI9bCxDPWgsaD1CK2N8MCxsPVUrcSsoaD4+PjA8Qj4+PjA/MTowKXwwLFU9QSxCPXksQT16LHk9eCx6PWsseD1nLGc9YytifDAsaz1xK3MrKGc+Pj4wPGM+Pj4wPzE6MCl8MH1KPUYubG93PUorZztGLmhpZ2g9dytrKyhKPj4+MDxnPj4+MD8xOjApO0s9ZS5sb3c9Syt4O2UuaGlnaD1YK3orKEs+Pj4wPHg+Pj4wPzE6MCk7TD1uLmxvdz1MK3k7bi5oaWdoPVkrQSsoTD4+PjA8eT4+PjA/MTowKTtNPXIubG93PU0rQjtyLmhpZ2g9WitVKyhNPj4+MDxCPj4+MD8xOjApO049Ry5sb3c9TitoO0cuaGlnaD0kK2wrKE4+Pj4wPGg+Pj4wPzE6MCk7Tz1ILmxvdz1PK0M7SC5oaWdoPWFhK1IrKE8+Pj4wPEM+Pj4wPzE6MCk7UD1JLmxvdz1QK0Q7XHJcbkkuaGlnaD1iYStTKyhQPj4+MDxEPj4+MD8xOjApO1E9Zi5sb3c9UStFO2YuaGlnaD1jYStWKyhRPj4+MDxFPj4+MD8xOjApfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2RhdGEsZD1hLndvcmRzLGY9OCp0aGlzLl9uRGF0YUJ5dGVzLGU9OCphLnNpZ0J5dGVzO2RbZT4+PjVdfD0xMjg8PDI0LWUlMzI7ZFsoZSsxMjg+Pj4xMDw8NSkrMzBdPU1hdGguZmxvb3IoZi80Mjk0OTY3Mjk2KTtkWyhlKzEyOD4+PjEwPDw1KSszMV09ZjthLnNpZ0J5dGVzPTQqZC5sZW5ndGg7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzLl9oYXNoLnRvWDMyKCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGE9ci5jbG9uZS5jYWxsKHRoaXMpO2EuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBhfSxibG9ja1NpemU6MzJ9KTtuLlNIQTUxMj1yLl9jcmVhdGVIZWxwZXIoZSk7bi5IbWFjU0hBNTEyPXIuX2NyZWF0ZUhtYWNIZWxwZXIoZSl9KSgpO1xyXG5cbi8qXHJcbkNyeXB0b0pTIHYzLjEuMiBzaGEzODQtbWluLmpzXHJcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xyXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxyXG4qL1xyXG4oZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxhPWMueDY0LGI9YS5Xb3JkLGU9YS5Xb3JkQXJyYXksYT1jLmFsZ28sZD1hLlNIQTUxMixhPWEuU0hBMzg0PWQuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGUuaW5pdChbbmV3IGIuaW5pdCgzNDE4MDcwMzY1LDMyMzgzNzEwMzIpLG5ldyBiLmluaXQoMTY1NDI3MDI1MCw5MTQxNTA2NjMpLG5ldyBiLmluaXQoMjQzODUyOTM3MCw4MTI3MDI5OTkpLG5ldyBiLmluaXQoMzU1NDYyMzYwLDQxNDQ5MTI2OTcpLG5ldyBiLmluaXQoMTczMTQwNTQxNSw0MjkwNzc1ODU3KSxuZXcgYi5pbml0KDIzOTQxODAyMzEsMTc1MDYwMzAyNSksbmV3IGIuaW5pdCgzNjc1MDA4NTI1LDE2OTQwNzY4MzkpLG5ldyBiLmluaXQoMTIwMzA2MjgxMywzMjA0MDc1NDI4KV0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWQuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT0xNjtyZXR1cm4gYX19KTtjLlNIQTM4ND1cclxuZC5fY3JlYXRlSGVscGVyKGEpO2MuSG1hY1NIQTM4ND1kLl9jcmVhdGVIbWFjSGVscGVyKGEpfSkoKTtcclxuXG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cclxuICovXHJcbnZhciBiNjRtYXA9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7dmFyIGI2NHBhZD1cIj1cIjtmdW5jdGlvbiBoZXgyYjY0KGQpe3ZhciBiO3ZhciBlO3ZhciBhPVwiXCI7Zm9yKGI9MDtiKzM8PWQubGVuZ3RoO2IrPTMpe2U9cGFyc2VJbnQoZC5zdWJzdHJpbmcoYixiKzMpLDE2KTthKz1iNjRtYXAuY2hhckF0KGU+PjYpK2I2NG1hcC5jaGFyQXQoZSY2Myl9aWYoYisxPT1kLmxlbmd0aCl7ZT1wYXJzZUludChkLnN1YnN0cmluZyhiLGIrMSksMTYpO2ErPWI2NG1hcC5jaGFyQXQoZTw8Mil9ZWxzZXtpZihiKzI9PWQubGVuZ3RoKXtlPXBhcnNlSW50KGQuc3Vic3RyaW5nKGIsYisyKSwxNik7YSs9YjY0bWFwLmNoYXJBdChlPj4yKStiNjRtYXAuY2hhckF0KChlJjMpPDw0KX19aWYoYjY0cGFkKXt3aGlsZSgoYS5sZW5ndGgmMyk+MCl7YSs9YjY0cGFkfX1yZXR1cm4gYX1mdW5jdGlvbiBiNjR0b2hleChmKXt2YXIgZD1cIlwiO3ZhciBlO3ZhciBiPTA7dmFyIGM7dmFyIGE7Zm9yKGU9MDtlPGYubGVuZ3RoOysrZSl7aWYoZi5jaGFyQXQoZSk9PWI2NHBhZCl7YnJlYWt9YT1iNjRtYXAuaW5kZXhPZihmLmNoYXJBdChlKSk7aWYoYTwwKXtjb250aW51ZX1pZihiPT0wKXtkKz1pbnQyY2hhcihhPj4yKTtjPWEmMztiPTF9ZWxzZXtpZihiPT0xKXtkKz1pbnQyY2hhcigoYzw8Mil8KGE+PjQpKTtjPWEmMTU7Yj0yfWVsc2V7aWYoYj09Mil7ZCs9aW50MmNoYXIoYyk7ZCs9aW50MmNoYXIoYT4+Mik7Yz1hJjM7Yj0zfWVsc2V7ZCs9aW50MmNoYXIoKGM8PDIpfChhPj40KSk7ZCs9aW50MmNoYXIoYSYxNSk7Yj0wfX19fWlmKGI9PTEpe2QrPWludDJjaGFyKGM8PDIpfXJldHVybiBkfWZ1bmN0aW9uIGI2NHRvQkEoZSl7dmFyIGQ9YjY0dG9oZXgoZSk7dmFyIGM7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKGM9MDsyKmM8ZC5sZW5ndGg7KytjKXtiW2NdPXBhcnNlSW50KGQuc3Vic3RyaW5nKDIqYywyKmMrMiksMTYpfXJldHVybiBifTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xyXG4gKi9cclxudmFyIGRiaXRzO3ZhciBjYW5hcnk9MjQ0ODM3ODE0MDk0NTkwO3ZhciBqX2xtPSgoY2FuYXJ5JjE2Nzc3MjE1KT09MTU3MTUwNzApO2Z1bmN0aW9uIEJpZ0ludGVnZXIoZSxkLGYpe2lmKGUhPW51bGwpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXt0aGlzLmZyb21OdW1iZXIoZSxkLGYpfWVsc2V7aWYoZD09bnVsbCYmXCJzdHJpbmdcIiE9dHlwZW9mIGUpe3RoaXMuZnJvbVN0cmluZyhlLDI1Nil9ZWxzZXt0aGlzLmZyb21TdHJpbmcoZSxkKX19fX1mdW5jdGlvbiBuYmkoKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCl9ZnVuY3Rpb24gYW0xKGYsYSxiLGUsaCxnKXt3aGlsZSgtLWc+PTApe3ZhciBkPWEqdGhpc1tmKytdK2JbZV0raDtoPU1hdGguZmxvb3IoZC82NzEwODg2NCk7YltlKytdPWQmNjcxMDg4NjN9cmV0dXJuIGh9ZnVuY3Rpb24gYW0yKGYscSxyLGUsbyxhKXt2YXIgaz1xJjMyNzY3LHA9cT4+MTU7d2hpbGUoLS1hPj0wKXt2YXIgZD10aGlzW2ZdJjMyNzY3O3ZhciBnPXRoaXNbZisrXT4+MTU7dmFyIGI9cCpkK2cqaztkPWsqZCsoKGImMzI3NjcpPDwxNSkrcltlXSsobyYxMDczNzQxODIzKTtvPShkPj4+MzApKyhiPj4+MTUpK3AqZysobz4+PjMwKTtyW2UrK109ZCYxMDczNzQxODIzfXJldHVybiBvfWZ1bmN0aW9uIGFtMyhmLHEscixlLG8sYSl7dmFyIGs9cSYxNjM4MyxwPXE+PjE0O3doaWxlKC0tYT49MCl7dmFyIGQ9dGhpc1tmXSYxNjM4Mzt2YXIgZz10aGlzW2YrK10+PjE0O3ZhciBiPXAqZCtnKms7ZD1rKmQrKChiJjE2MzgzKTw8MTQpK3JbZV0rbztvPShkPj4yOCkrKGI+PjE0KStwKmc7cltlKytdPWQmMjY4NDM1NDU1fXJldHVybiBvfWlmKGpfbG0mJihuYXZpZ2F0b3IuYXBwTmFtZT09XCJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcIikpe0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMjtkYml0cz0zMH1lbHNle2lmKGpfbG0mJihuYXZpZ2F0b3IuYXBwTmFtZSE9XCJOZXRzY2FwZVwiKSl7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0xO2RiaXRzPTI2fWVsc2V7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0zO2RiaXRzPTI4fX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5EQj1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5ETT0oKDE8PGRiaXRzKS0xKTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5EVj0oMTw8ZGJpdHMpO3ZhciBCSV9GUD01MjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5GVj1NYXRoLnBvdygyLEJJX0ZQKTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMT1CSV9GUC1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMj0yKmRiaXRzLUJJX0ZQO3ZhciBCSV9STT1cIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO3ZhciBCSV9SQz1uZXcgQXJyYXkoKTt2YXIgcnIsdnY7cnI9XCIwXCIuY2hhckNvZGVBdCgwKTtmb3IodnY9MDt2djw9OTsrK3Z2KXtCSV9SQ1tycisrXT12dn1ycj1cImFcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0xMDt2djwzNjsrK3Z2KXtCSV9SQ1tycisrXT12dn1ycj1cIkFcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0xMDt2djwzNjsrK3Z2KXtCSV9SQ1tycisrXT12dn1mdW5jdGlvbiBpbnQyY2hhcihhKXtyZXR1cm4gQklfUk0uY2hhckF0KGEpfWZ1bmN0aW9uIGludEF0KGIsYSl7dmFyIGQ9QklfUkNbYi5jaGFyQ29kZUF0KGEpXTtyZXR1cm4oZD09bnVsbCk/LTE6ZH1mdW5jdGlvbiBibnBDb3B5VG8oYil7Zm9yKHZhciBhPXRoaXMudC0xO2E+PTA7LS1hKXtiW2FdPXRoaXNbYV19Yi50PXRoaXMudDtiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucEZyb21JbnQoYSl7dGhpcy50PTE7dGhpcy5zPShhPDApPy0xOjA7aWYoYT4wKXt0aGlzWzBdPWF9ZWxzZXtpZihhPC0xKXt0aGlzWzBdPWErdGhpcy5EVn1lbHNle3RoaXMudD0wfX19ZnVuY3Rpb24gbmJ2KGEpe3ZhciBiPW5iaSgpO2IuZnJvbUludChhKTtyZXR1cm4gYn1mdW5jdGlvbiBibnBGcm9tU3RyaW5nKGgsYyl7dmFyIGU7aWYoYz09MTYpe2U9NH1lbHNle2lmKGM9PTgpe2U9M31lbHNle2lmKGM9PTI1Nil7ZT04fWVsc2V7aWYoYz09Mil7ZT0xfWVsc2V7aWYoYz09MzIpe2U9NX1lbHNle2lmKGM9PTQpe2U9Mn1lbHNle3RoaXMuZnJvbVJhZGl4KGgsYyk7cmV0dXJufX19fX19dGhpcy50PTA7dGhpcy5zPTA7dmFyIGc9aC5sZW5ndGgsZD1mYWxzZSxmPTA7d2hpbGUoLS1nPj0wKXt2YXIgYT0oZT09OCk/aFtnXSYyNTU6aW50QXQoaCxnKTtpZihhPDApe2lmKGguY2hhckF0KGcpPT1cIi1cIil7ZD10cnVlfWNvbnRpbnVlfWQ9ZmFsc2U7aWYoZj09MCl7dGhpc1t0aGlzLnQrK109YX1lbHNle2lmKGYrZT50aGlzLkRCKXt0aGlzW3RoaXMudC0xXXw9KGEmKCgxPDwodGhpcy5EQi1mKSktMSkpPDxmO3RoaXNbdGhpcy50KytdPShhPj4odGhpcy5EQi1mKSl9ZWxzZXt0aGlzW3RoaXMudC0xXXw9YTw8Zn19Zis9ZTtpZihmPj10aGlzLkRCKXtmLT10aGlzLkRCfX1pZihlPT04JiYoaFswXSYxMjgpIT0wKXt0aGlzLnM9LTE7aWYoZj4wKXt0aGlzW3RoaXMudC0xXXw9KCgxPDwodGhpcy5EQi1mKSktMSk8PGZ9fXRoaXMuY2xhbXAoKTtpZihkKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX19ZnVuY3Rpb24gYm5wQ2xhbXAoKXt2YXIgYT10aGlzLnMmdGhpcy5ETTt3aGlsZSh0aGlzLnQ+MCYmdGhpc1t0aGlzLnQtMV09PWEpey0tdGhpcy50fX1mdW5jdGlvbiBiblRvU3RyaW5nKGMpe2lmKHRoaXMuczwwKXtyZXR1cm5cIi1cIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGMpfXZhciBlO2lmKGM9PTE2KXtlPTR9ZWxzZXtpZihjPT04KXtlPTN9ZWxzZXtpZihjPT0yKXtlPTF9ZWxzZXtpZihjPT0zMil7ZT01fWVsc2V7aWYoYz09NCl7ZT0yfWVsc2V7cmV0dXJuIHRoaXMudG9SYWRpeChjKX19fX19dmFyIGc9KDE8PGUpLTEsbCxhPWZhbHNlLGg9XCJcIixmPXRoaXMudDt2YXIgaj10aGlzLkRCLShmKnRoaXMuREIpJWU7aWYoZi0tPjApe2lmKGo8dGhpcy5EQiYmKGw9dGhpc1tmXT4+aik+MCl7YT10cnVlO2g9aW50MmNoYXIobCl9d2hpbGUoZj49MCl7aWYoajxlKXtsPSh0aGlzW2ZdJigoMTw8aiktMSkpPDwoZS1qKTtsfD10aGlzWy0tZl0+PihqKz10aGlzLkRCLWUpfWVsc2V7bD0odGhpc1tmXT4+KGotPWUpKSZnO2lmKGo8PTApe2orPXRoaXMuREI7LS1mfX1pZihsPjApe2E9dHJ1ZX1pZihhKXtoKz1pbnQyY2hhcihsKX19fXJldHVybiBhP2g6XCIwXCJ9ZnVuY3Rpb24gYm5OZWdhdGUoKXt2YXIgYT1uYmkoKTtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyxhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkFicygpe3JldHVybih0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzfWZ1bmN0aW9uIGJuQ29tcGFyZVRvKGIpe3ZhciBkPXRoaXMucy1iLnM7aWYoZCE9MCl7cmV0dXJuIGR9dmFyIGM9dGhpcy50O2Q9Yy1iLnQ7aWYoZCE9MCl7cmV0dXJuKHRoaXMuczwwKT8tZDpkfXdoaWxlKC0tYz49MCl7aWYoKGQ9dGhpc1tjXS1iW2NdKSE9MCl7cmV0dXJuIGR9fXJldHVybiAwfWZ1bmN0aW9uIG5iaXRzKGEpe3ZhciBjPTEsYjtpZigoYj1hPj4+MTYpIT0wKXthPWI7Yys9MTZ9aWYoKGI9YT4+OCkhPTApe2E9YjtjKz04fWlmKChiPWE+PjQpIT0wKXthPWI7Yys9NH1pZigoYj1hPj4yKSE9MCl7YT1iO2MrPTJ9aWYoKGI9YT4+MSkhPTApe2E9YjtjKz0xfXJldHVybiBjfWZ1bmN0aW9uIGJuQml0TGVuZ3RoKCl7aWYodGhpcy50PD0wKXtyZXR1cm4gMH1yZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXih0aGlzLnMmdGhpcy5ETSkpfWZ1bmN0aW9uIGJucERMU2hpZnRUbyhjLGIpe3ZhciBhO2ZvcihhPXRoaXMudC0xO2E+PTA7LS1hKXtiW2ErY109dGhpc1thXX1mb3IoYT1jLTE7YT49MDstLWEpe2JbYV09MH1iLnQ9dGhpcy50K2M7Yi5zPXRoaXMuc31mdW5jdGlvbiBibnBEUlNoaWZ0VG8oYyxiKXtmb3IodmFyIGE9YzthPHRoaXMudDsrK2Epe2JbYS1jXT10aGlzW2FdfWIudD1NYXRoLm1heCh0aGlzLnQtYywwKTtiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucExTaGlmdFRvKGosZSl7dmFyIGI9aiV0aGlzLkRCO3ZhciBhPXRoaXMuREItYjt2YXIgZz0oMTw8YSktMTt2YXIgZj1NYXRoLmZsb29yKGovdGhpcy5EQiksaD0odGhpcy5zPDxiKSZ0aGlzLkRNLGQ7Zm9yKGQ9dGhpcy50LTE7ZD49MDstLWQpe2VbZCtmKzFdPSh0aGlzW2RdPj5hKXxoO2g9KHRoaXNbZF0mZyk8PGJ9Zm9yKGQ9Zi0xO2Q+PTA7LS1kKXtlW2RdPTB9ZVtmXT1oO2UudD10aGlzLnQrZisxO2Uucz10aGlzLnM7ZS5jbGFtcCgpfWZ1bmN0aW9uIGJucFJTaGlmdFRvKGcsZCl7ZC5zPXRoaXMuczt2YXIgZT1NYXRoLmZsb29yKGcvdGhpcy5EQik7aWYoZT49dGhpcy50KXtkLnQ9MDtyZXR1cm59dmFyIGI9ZyV0aGlzLkRCO3ZhciBhPXRoaXMuREItYjt2YXIgZj0oMTw8YiktMTtkWzBdPXRoaXNbZV0+PmI7Zm9yKHZhciBjPWUrMTtjPHRoaXMudDsrK2Mpe2RbYy1lLTFdfD0odGhpc1tjXSZmKTw8YTtkW2MtZV09dGhpc1tjXT4+Yn1pZihiPjApe2RbdGhpcy50LWUtMV18PSh0aGlzLnMmZik8PGF9ZC50PXRoaXMudC1lO2QuY2xhbXAoKX1mdW5jdGlvbiBibnBTdWJUbyhkLGYpe3ZhciBlPTAsZz0wLGI9TWF0aC5taW4oZC50LHRoaXMudCk7d2hpbGUoZTxiKXtnKz10aGlzW2VdLWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1pZihkLnQ8dGhpcy50KXtnLT1kLnM7d2hpbGUoZTx0aGlzLnQpe2crPXRoaXNbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz10aGlzLnN9ZWxzZXtnKz10aGlzLnM7d2hpbGUoZTxkLnQpe2ctPWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nLT1kLnN9Zi5zPShnPDApPy0xOjA7aWYoZzwtMSl7ZltlKytdPXRoaXMuRFYrZ31lbHNle2lmKGc+MCl7ZltlKytdPWd9fWYudD1lO2YuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVRvKGMsZSl7dmFyIGI9dGhpcy5hYnMoKSxmPWMuYWJzKCk7dmFyIGQ9Yi50O2UudD1kK2YudDt3aGlsZSgtLWQ+PTApe2VbZF09MH1mb3IoZD0wO2Q8Zi50OysrZCl7ZVtkK2IudF09Yi5hbSgwLGZbZF0sZSxkLDAsYi50KX1lLnM9MDtlLmNsYW1wKCk7aWYodGhpcy5zIT1jLnMpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyhlLGUpfX1mdW5jdGlvbiBibnBTcXVhcmVUbyhkKXt2YXIgYT10aGlzLmFicygpO3ZhciBiPWQudD0yKmEudDt3aGlsZSgtLWI+PTApe2RbYl09MH1mb3IoYj0wO2I8YS50LTE7KytiKXt2YXIgZT1hLmFtKGIsYVtiXSxkLDIqYiwwLDEpO2lmKChkW2IrYS50XSs9YS5hbShiKzEsMiphW2JdLGQsMipiKzEsZSxhLnQtYi0xKSk+PWEuRFYpe2RbYithLnRdLT1hLkRWO2RbYithLnQrMV09MX19aWYoZC50PjApe2RbZC50LTFdKz1hLmFtKGIsYVtiXSxkLDIqYiwwLDEpfWQucz0wO2QuY2xhbXAoKX1mdW5jdGlvbiBibnBEaXZSZW1UbyhuLGgsZyl7dmFyIHc9bi5hYnMoKTtpZih3LnQ8PTApe3JldHVybn12YXIgaz10aGlzLmFicygpO2lmKGsudDx3LnQpe2lmKGghPW51bGwpe2guZnJvbUludCgwKX1pZihnIT1udWxsKXt0aGlzLmNvcHlUbyhnKX1yZXR1cm59aWYoZz09bnVsbCl7Zz1uYmkoKX12YXIgZD1uYmkoKSxhPXRoaXMucyxsPW4uczt2YXIgdj10aGlzLkRCLW5iaXRzKHdbdy50LTFdKTtpZih2PjApe3cubFNoaWZ0VG8odixkKTtrLmxTaGlmdFRvKHYsZyl9ZWxzZXt3LmNvcHlUbyhkKTtrLmNvcHlUbyhnKX12YXIgcD1kLnQ7dmFyIGI9ZFtwLTFdO2lmKGI9PTApe3JldHVybn12YXIgbz1iKigxPDx0aGlzLkYxKSsoKHA+MSk/ZFtwLTJdPj50aGlzLkYyOjApO3ZhciBBPXRoaXMuRlYvbyx6PSgxPDx0aGlzLkYxKS9vLHg9MTw8dGhpcy5GMjt2YXIgdT1nLnQscz11LXAsZj0oaD09bnVsbCk/bmJpKCk6aDtkLmRsU2hpZnRUbyhzLGYpO2lmKGcuY29tcGFyZVRvKGYpPj0wKXtnW2cudCsrXT0xO2cuc3ViVG8oZixnKX1CaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8ocCxmKTtmLnN1YlRvKGQsZCk7d2hpbGUoZC50PHApe2RbZC50KytdPTB9d2hpbGUoLS1zPj0wKXt2YXIgYz0oZ1stLXVdPT1iKT90aGlzLkRNOk1hdGguZmxvb3IoZ1t1XSpBKyhnW3UtMV0reCkqeik7aWYoKGdbdV0rPWQuYW0oMCxjLGcscywwLHApKTxjKXtkLmRsU2hpZnRUbyhzLGYpO2cuc3ViVG8oZixnKTt3aGlsZShnW3VdPC0tYyl7Zy5zdWJUbyhmLGcpfX19aWYoaCE9bnVsbCl7Zy5kclNoaWZ0VG8ocCxoKTtpZihhIT1sKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8oaCxoKX19Zy50PXA7Zy5jbGFtcCgpO2lmKHY+MCl7Zy5yU2hpZnRUbyh2LGcpfWlmKGE8MCl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKGcsZyl9fWZ1bmN0aW9uIGJuTW9kKGIpe3ZhciBjPW5iaSgpO3RoaXMuYWJzKCkuZGl2UmVtVG8oYixudWxsLGMpO2lmKHRoaXMuczwwJiZjLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPjApe2Iuc3ViVG8oYyxjKX1yZXR1cm4gY31mdW5jdGlvbiBDbGFzc2ljKGEpe3RoaXMubT1hfWZ1bmN0aW9uIGNDb252ZXJ0KGEpe2lmKGEuczwwfHxhLmNvbXBhcmVUbyh0aGlzLm0pPj0wKXtyZXR1cm4gYS5tb2QodGhpcy5tKX1lbHNle3JldHVybiBhfX1mdW5jdGlvbiBjUmV2ZXJ0KGEpe3JldHVybiBhfWZ1bmN0aW9uIGNSZWR1Y2UoYSl7YS5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxhKX1mdW5jdGlvbiBjTXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIGNTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9Q2xhc3NpYy5wcm90b3R5cGUuY29udmVydD1jQ29udmVydDtDbGFzc2ljLnByb3RvdHlwZS5yZXZlcnQ9Y1JldmVydDtDbGFzc2ljLnByb3RvdHlwZS5yZWR1Y2U9Y1JlZHVjZTtDbGFzc2ljLnByb3RvdHlwZS5tdWxUbz1jTXVsVG87Q2xhc3NpYy5wcm90b3R5cGUuc3FyVG89Y1NxclRvO2Z1bmN0aW9uIGJucEludkRpZ2l0KCl7aWYodGhpcy50PDEpe3JldHVybiAwfXZhciBhPXRoaXNbMF07aWYoKGEmMSk9PTApe3JldHVybiAwfXZhciBiPWEmMztiPShiKigyLShhJjE1KSpiKSkmMTU7Yj0oYiooMi0oYSYyNTUpKmIpKSYyNTU7Yj0oYiooMi0oKChhJjY1NTM1KSpiKSY2NTUzNSkpKSY2NTUzNTtiPShiKigyLWEqYiV0aGlzLkRWKSkldGhpcy5EVjtyZXR1cm4oYj4wKT90aGlzLkRWLWI6LWJ9ZnVuY3Rpb24gTW9udGdvbWVyeShhKXt0aGlzLm09YTt0aGlzLm1wPWEuaW52RGlnaXQoKTt0aGlzLm1wbD10aGlzLm1wJjMyNzY3O3RoaXMubXBoPXRoaXMubXA+PjE1O3RoaXMudW09KDE8PChhLkRCLTE1KSktMTt0aGlzLm10Mj0yKmEudH1mdW5jdGlvbiBtb250Q29udmVydChhKXt2YXIgYj1uYmkoKTthLmFicygpLmRsU2hpZnRUbyh0aGlzLm0udCxiKTtiLmRpdlJlbVRvKHRoaXMubSxudWxsLGIpO2lmKGEuczwwJiZiLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPjApe3RoaXMubS5zdWJUbyhiLGIpfXJldHVybiBifWZ1bmN0aW9uIG1vbnRSZXZlcnQoYSl7dmFyIGI9bmJpKCk7YS5jb3B5VG8oYik7dGhpcy5yZWR1Y2UoYik7cmV0dXJuIGJ9ZnVuY3Rpb24gbW9udFJlZHVjZShhKXt3aGlsZShhLnQ8PXRoaXMubXQyKXthW2EudCsrXT0wfWZvcih2YXIgYz0wO2M8dGhpcy5tLnQ7KytjKXt2YXIgYj1hW2NdJjMyNzY3O3ZhciBkPShiKnRoaXMubXBsKygoKGIqdGhpcy5tcGgrKGFbY10+PjE1KSp0aGlzLm1wbCkmdGhpcy51bSk8PDE1KSkmYS5ETTtiPWMrdGhpcy5tLnQ7YVtiXSs9dGhpcy5tLmFtKDAsZCxhLGMsMCx0aGlzLm0udCk7d2hpbGUoYVtiXT49YS5EVil7YVtiXS09YS5EVjthWysrYl0rK319YS5jbGFtcCgpO2EuZHJTaGlmdFRvKHRoaXMubS50LGEpO2lmKGEuY29tcGFyZVRvKHRoaXMubSk+PTApe2Euc3ViVG8odGhpcy5tLGEpfX1mdW5jdGlvbiBtb250U3FyVG8oYSxiKXthLnNxdWFyZVRvKGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIG1vbnRNdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYik7dGhpcy5yZWR1Y2UoYil9TW9udGdvbWVyeS5wcm90b3R5cGUuY29udmVydD1tb250Q29udmVydDtNb250Z29tZXJ5LnByb3RvdHlwZS5yZXZlcnQ9bW9udFJldmVydDtNb250Z29tZXJ5LnByb3RvdHlwZS5yZWR1Y2U9bW9udFJlZHVjZTtNb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbz1tb250TXVsVG87TW9udGdvbWVyeS5wcm90b3R5cGUuc3FyVG89bW9udFNxclRvO2Z1bmN0aW9uIGJucElzRXZlbigpe3JldHVybigodGhpcy50PjApPyh0aGlzWzBdJjEpOnRoaXMucyk9PTB9ZnVuY3Rpb24gYm5wRXhwKGgsail7aWYoaD40Mjk0OTY3Mjk1fHxoPDEpe3JldHVybiBCaWdJbnRlZ2VyLk9ORX12YXIgZj1uYmkoKSxhPW5iaSgpLGQ9ai5jb252ZXJ0KHRoaXMpLGM9bmJpdHMoaCktMTtkLmNvcHlUbyhmKTt3aGlsZSgtLWM+PTApe2ouc3FyVG8oZixhKTtpZigoaCYoMTw8YykpPjApe2oubXVsVG8oYSxkLGYpfWVsc2V7dmFyIGI9ZjtmPWE7YT1ifX1yZXR1cm4gai5yZXZlcnQoZil9ZnVuY3Rpb24gYm5Nb2RQb3dJbnQoYixhKXt2YXIgYztpZihiPDI1Nnx8YS5pc0V2ZW4oKSl7Yz1uZXcgQ2xhc3NpYyhhKX1lbHNle2M9bmV3IE1vbnRnb21lcnkoYSl9cmV0dXJuIHRoaXMuZXhwKGIsYyl9QmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvPWJucENvcHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50PWJucEZyb21JbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZz1ibnBGcm9tU3RyaW5nO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wPWJucENsYW1wO0JpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbz1ibnBETFNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvPWJucERSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbz1ibnBMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbz1ibnBSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbz1ibnBTdWJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvPWJucE11bHRpcGx5VG87QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG89Ym5wU3F1YXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG89Ym5wRGl2UmVtVG87QmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQ9Ym5wSW52RGlnaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuPWJucElzRXZlbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHA9Ym5wRXhwO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nPWJuVG9TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlPWJuTmVnYXRlO0JpZ0ludGVnZXIucHJvdG90eXBlLmFicz1ibkFicztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG89Ym5Db21wYXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoPWJuQml0TGVuZ3RoO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZD1ibk1vZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQ9Ym5Nb2RQb3dJbnQ7QmlnSW50ZWdlci5aRVJPPW5idigwKTtCaWdJbnRlZ2VyLk9ORT1uYnYoMSk7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cclxuICovXHJcbmZ1bmN0aW9uIGJuQ2xvbmUoKXt2YXIgYT1uYmkoKTt0aGlzLmNvcHlUbyhhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkludFZhbHVlKCl7aWYodGhpcy5zPDApe2lmKHRoaXMudD09MSl7cmV0dXJuIHRoaXNbMF0tdGhpcy5EVn1lbHNle2lmKHRoaXMudD09MCl7cmV0dXJuIC0xfX19ZWxzZXtpZih0aGlzLnQ9PTEpe3JldHVybiB0aGlzWzBdfWVsc2V7aWYodGhpcy50PT0wKXtyZXR1cm4gMH19fXJldHVybigodGhpc1sxXSYoKDE8PCgzMi10aGlzLkRCKSktMSkpPDx0aGlzLkRCKXx0aGlzWzBdfWZ1bmN0aW9uIGJuQnl0ZVZhbHVlKCl7cmV0dXJuKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwyNCk+PjI0fWZ1bmN0aW9uIGJuU2hvcnRWYWx1ZSgpe3JldHVybih0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MTYpPj4xNn1mdW5jdGlvbiBibnBDaHVua1NpemUoYSl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5MTjIqdGhpcy5EQi9NYXRoLmxvZyhhKSl9ZnVuY3Rpb24gYm5TaWdOdW0oKXtpZih0aGlzLnM8MCl7cmV0dXJuIC0xfWVsc2V7aWYodGhpcy50PD0wfHwodGhpcy50PT0xJiZ0aGlzWzBdPD0wKSl7cmV0dXJuIDB9ZWxzZXtyZXR1cm4gMX19fWZ1bmN0aW9uIGJucFRvUmFkaXgoYyl7aWYoYz09bnVsbCl7Yz0xMH1pZih0aGlzLnNpZ251bSgpPT0wfHxjPDJ8fGM+MzYpe3JldHVyblwiMFwifXZhciBmPXRoaXMuY2h1bmtTaXplKGMpO3ZhciBlPU1hdGgucG93KGMsZik7dmFyIGk9bmJ2KGUpLGo9bmJpKCksaD1uYmkoKSxnPVwiXCI7dGhpcy5kaXZSZW1UbyhpLGosaCk7d2hpbGUoai5zaWdudW0oKT4wKXtnPShlK2guaW50VmFsdWUoKSkudG9TdHJpbmcoYykuc3Vic3RyKDEpK2c7ai5kaXZSZW1UbyhpLGosaCl9cmV0dXJuIGguaW50VmFsdWUoKS50b1N0cmluZyhjKStnfWZ1bmN0aW9uIGJucEZyb21SYWRpeChtLGgpe3RoaXMuZnJvbUludCgwKTtpZihoPT1udWxsKXtoPTEwfXZhciBmPXRoaXMuY2h1bmtTaXplKGgpO3ZhciBnPU1hdGgucG93KGgsZiksZT1mYWxzZSxhPTAsbD0wO2Zvcih2YXIgYz0wO2M8bS5sZW5ndGg7KytjKXt2YXIgaz1pbnRBdChtLGMpO2lmKGs8MCl7aWYobS5jaGFyQXQoYyk9PVwiLVwiJiZ0aGlzLnNpZ251bSgpPT0wKXtlPXRydWV9Y29udGludWV9bD1oKmwraztpZigrK2E+PWYpe3RoaXMuZE11bHRpcGx5KGcpO3RoaXMuZEFkZE9mZnNldChsLDApO2E9MDtsPTB9fWlmKGE+MCl7dGhpcy5kTXVsdGlwbHkoTWF0aC5wb3coaCxhKSk7dGhpcy5kQWRkT2Zmc2V0KGwsMCl9aWYoZSl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyl9fWZ1bmN0aW9uIGJucEZyb21OdW1iZXIoZixlLGgpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXtpZihmPDIpe3RoaXMuZnJvbUludCgxKX1lbHNle3RoaXMuZnJvbU51bWJlcihmLGgpO2lmKCF0aGlzLnRlc3RCaXQoZi0xKSl7dGhpcy5iaXR3aXNlVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGYtMSksb3Bfb3IsdGhpcyl9aWYodGhpcy5pc0V2ZW4oKSl7dGhpcy5kQWRkT2Zmc2V0KDEsMCl9d2hpbGUoIXRoaXMuaXNQcm9iYWJsZVByaW1lKGUpKXt0aGlzLmRBZGRPZmZzZXQoMiwwKTtpZih0aGlzLmJpdExlbmd0aCgpPmYpe3RoaXMuc3ViVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGYtMSksdGhpcyl9fX19ZWxzZXt2YXIgZD1uZXcgQXJyYXkoKSxnPWYmNztkLmxlbmd0aD0oZj4+MykrMTtlLm5leHRCeXRlcyhkKTtpZihnPjApe2RbMF0mPSgoMTw8ZyktMSl9ZWxzZXtkWzBdPTB9dGhpcy5mcm9tU3RyaW5nKGQsMjU2KX19ZnVuY3Rpb24gYm5Ub0J5dGVBcnJheSgpe3ZhciBiPXRoaXMudCxjPW5ldyBBcnJheSgpO2NbMF09dGhpcy5zO3ZhciBlPXRoaXMuREItKGIqdGhpcy5EQiklOCxmLGE9MDtpZihiLS0+MCl7aWYoZTx0aGlzLkRCJiYoZj10aGlzW2JdPj5lKSE9KHRoaXMucyZ0aGlzLkRNKT4+ZSl7Y1thKytdPWZ8KHRoaXMuczw8KHRoaXMuREItZSkpfXdoaWxlKGI+PTApe2lmKGU8OCl7Zj0odGhpc1tiXSYoKDE8PGUpLTEpKTw8KDgtZSk7Znw9dGhpc1stLWJdPj4oZSs9dGhpcy5EQi04KX1lbHNle2Y9KHRoaXNbYl0+PihlLT04KSkmMjU1O2lmKGU8PTApe2UrPXRoaXMuREI7LS1ifX1pZigoZiYxMjgpIT0wKXtmfD0tMjU2fWlmKGE9PTAmJih0aGlzLnMmMTI4KSE9KGYmMTI4KSl7KythfWlmKGE+MHx8ZiE9dGhpcy5zKXtjW2ErK109Zn19fXJldHVybiBjfWZ1bmN0aW9uIGJuRXF1YWxzKGIpe3JldHVybih0aGlzLmNvbXBhcmVUbyhiKT09MCl9ZnVuY3Rpb24gYm5NaW4oYil7cmV0dXJuKHRoaXMuY29tcGFyZVRvKGIpPDApP3RoaXM6Yn1mdW5jdGlvbiBibk1heChiKXtyZXR1cm4odGhpcy5jb21wYXJlVG8oYik+MCk/dGhpczpifWZ1bmN0aW9uIGJucEJpdHdpc2VUbyhjLGgsZSl7dmFyIGQsZyxiPU1hdGgubWluKGMudCx0aGlzLnQpO2ZvcihkPTA7ZDxiOysrZCl7ZVtkXT1oKHRoaXNbZF0sY1tkXSl9aWYoYy50PHRoaXMudCl7Zz1jLnMmdGhpcy5ETTtmb3IoZD1iO2Q8dGhpcy50OysrZCl7ZVtkXT1oKHRoaXNbZF0sZyl9ZS50PXRoaXMudH1lbHNle2c9dGhpcy5zJnRoaXMuRE07Zm9yKGQ9YjtkPGMudDsrK2Qpe2VbZF09aChnLGNbZF0pfWUudD1jLnR9ZS5zPWgodGhpcy5zLGMucyk7ZS5jbGFtcCgpfWZ1bmN0aW9uIG9wX2FuZChhLGIpe3JldHVybiBhJmJ9ZnVuY3Rpb24gYm5BbmQoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF9hbmQsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gb3Bfb3IoYSxiKXtyZXR1cm4gYXxifWZ1bmN0aW9uIGJuT3IoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF9vcixjKTtyZXR1cm4gY31mdW5jdGlvbiBvcF94b3IoYSxiKXtyZXR1cm4gYV5ifWZ1bmN0aW9uIGJuWG9yKGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3BfeG9yLGMpO3JldHVybiBjfWZ1bmN0aW9uIG9wX2FuZG5vdChhLGIpe3JldHVybiBhJn5ifWZ1bmN0aW9uIGJuQW5kTm90KGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3BfYW5kbm90LGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuTm90KCl7dmFyIGI9bmJpKCk7Zm9yKHZhciBhPTA7YTx0aGlzLnQ7KythKXtiW2FdPXRoaXMuRE0mfnRoaXNbYV19Yi50PXRoaXMudDtiLnM9fnRoaXMucztyZXR1cm4gYn1mdW5jdGlvbiBiblNoaWZ0TGVmdChiKXt2YXIgYT1uYmkoKTtpZihiPDApe3RoaXMuclNoaWZ0VG8oLWIsYSl9ZWxzZXt0aGlzLmxTaGlmdFRvKGIsYSl9cmV0dXJuIGF9ZnVuY3Rpb24gYm5TaGlmdFJpZ2h0KGIpe3ZhciBhPW5iaSgpO2lmKGI8MCl7dGhpcy5sU2hpZnRUbygtYixhKX1lbHNle3RoaXMuclNoaWZ0VG8oYixhKX1yZXR1cm4gYX1mdW5jdGlvbiBsYml0KGEpe2lmKGE9PTApe3JldHVybiAtMX12YXIgYj0wO2lmKChhJjY1NTM1KT09MCl7YT4+PTE2O2IrPTE2fWlmKChhJjI1NSk9PTApe2E+Pj04O2IrPTh9aWYoKGEmMTUpPT0wKXthPj49NDtiKz00fWlmKChhJjMpPT0wKXthPj49MjtiKz0yfWlmKChhJjEpPT0wKXsrK2J9cmV0dXJuIGJ9ZnVuY3Rpb24gYm5HZXRMb3dlc3RTZXRCaXQoKXtmb3IodmFyIGE9MDthPHRoaXMudDsrK2Epe2lmKHRoaXNbYV0hPTApe3JldHVybiBhKnRoaXMuREIrbGJpdCh0aGlzW2FdKX19aWYodGhpcy5zPDApe3JldHVybiB0aGlzLnQqdGhpcy5EQn1yZXR1cm4gLTF9ZnVuY3Rpb24gY2JpdChhKXt2YXIgYj0wO3doaWxlKGEhPTApe2EmPWEtMTsrK2J9cmV0dXJuIGJ9ZnVuY3Rpb24gYm5CaXRDb3VudCgpe3ZhciBjPTAsYT10aGlzLnMmdGhpcy5ETTtmb3IodmFyIGI9MDtiPHRoaXMudDsrK2Ipe2MrPWNiaXQodGhpc1tiXV5hKX1yZXR1cm4gY31mdW5jdGlvbiBiblRlc3RCaXQoYil7dmFyIGE9TWF0aC5mbG9vcihiL3RoaXMuREIpO2lmKGE+PXRoaXMudCl7cmV0dXJuKHRoaXMucyE9MCl9cmV0dXJuKCh0aGlzW2FdJigxPDwoYiV0aGlzLkRCKSkpIT0wKX1mdW5jdGlvbiBibnBDaGFuZ2VCaXQoYyxiKXt2YXIgYT1CaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYyk7dGhpcy5iaXR3aXNlVG8oYSxiLGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuU2V0Qml0KGEpe3JldHVybiB0aGlzLmNoYW5nZUJpdChhLG9wX29yKX1mdW5jdGlvbiBibkNsZWFyQml0KGEpe3JldHVybiB0aGlzLmNoYW5nZUJpdChhLG9wX2FuZG5vdCl9ZnVuY3Rpb24gYm5GbGlwQml0KGEpe3JldHVybiB0aGlzLmNoYW5nZUJpdChhLG9wX3hvcil9ZnVuY3Rpb24gYm5wQWRkVG8oZCxmKXt2YXIgZT0wLGc9MCxiPU1hdGgubWluKGQudCx0aGlzLnQpO3doaWxlKGU8Yil7Zys9dGhpc1tlXStkW2VdO2ZbZSsrXT1nJnRoaXMuRE07Zz4+PXRoaXMuREJ9aWYoZC50PHRoaXMudCl7Zys9ZC5zO3doaWxlKGU8dGhpcy50KXtnKz10aGlzW2VdO2ZbZSsrXT1nJnRoaXMuRE07Zz4+PXRoaXMuREJ9Zys9dGhpcy5zfWVsc2V7Zys9dGhpcy5zO3doaWxlKGU8ZC50KXtnKz1kW2VdO2ZbZSsrXT1nJnRoaXMuRE07Zz4+PXRoaXMuREJ9Zys9ZC5zfWYucz0oZzwwKT8tMTowO2lmKGc+MCl7ZltlKytdPWd9ZWxzZXtpZihnPC0xKXtmW2UrK109dGhpcy5EVitnfX1mLnQ9ZTtmLmNsYW1wKCl9ZnVuY3Rpb24gYm5BZGQoYil7dmFyIGM9bmJpKCk7dGhpcy5hZGRUbyhiLGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuU3VidHJhY3QoYil7dmFyIGM9bmJpKCk7dGhpcy5zdWJUbyhiLGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuTXVsdGlwbHkoYil7dmFyIGM9bmJpKCk7dGhpcy5tdWx0aXBseVRvKGIsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5TcXVhcmUoKXt2YXIgYT1uYmkoKTt0aGlzLnNxdWFyZVRvKGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuRGl2aWRlKGIpe3ZhciBjPW5iaSgpO3RoaXMuZGl2UmVtVG8oYixjLG51bGwpO3JldHVybiBjfWZ1bmN0aW9uIGJuUmVtYWluZGVyKGIpe3ZhciBjPW5iaSgpO3RoaXMuZGl2UmVtVG8oYixudWxsLGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuRGl2aWRlQW5kUmVtYWluZGVyKGIpe3ZhciBkPW5iaSgpLGM9bmJpKCk7dGhpcy5kaXZSZW1UbyhiLGQsYyk7cmV0dXJuIG5ldyBBcnJheShkLGMpfWZ1bmN0aW9uIGJucERNdWx0aXBseShhKXt0aGlzW3RoaXMudF09dGhpcy5hbSgwLGEtMSx0aGlzLDAsMCx0aGlzLnQpOysrdGhpcy50O3RoaXMuY2xhbXAoKX1mdW5jdGlvbiBibnBEQWRkT2Zmc2V0KGIsYSl7aWYoYj09MCl7cmV0dXJufXdoaWxlKHRoaXMudDw9YSl7dGhpc1t0aGlzLnQrK109MH10aGlzW2FdKz1iO3doaWxlKHRoaXNbYV0+PXRoaXMuRFYpe3RoaXNbYV0tPXRoaXMuRFY7aWYoKythPj10aGlzLnQpe3RoaXNbdGhpcy50KytdPTB9Kyt0aGlzW2FdfX1mdW5jdGlvbiBOdWxsRXhwKCl7fWZ1bmN0aW9uIG5Ob3AoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gbk11bFRvKGEsYyxiKXthLm11bHRpcGx5VG8oYyxiKX1mdW5jdGlvbiBuU3FyVG8oYSxiKXthLnNxdWFyZVRvKGIpfU51bGxFeHAucHJvdG90eXBlLmNvbnZlcnQ9bk5vcDtOdWxsRXhwLnByb3RvdHlwZS5yZXZlcnQ9bk5vcDtOdWxsRXhwLnByb3RvdHlwZS5tdWxUbz1uTXVsVG87TnVsbEV4cC5wcm90b3R5cGUuc3FyVG89blNxclRvO2Z1bmN0aW9uIGJuUG93KGEpe3JldHVybiB0aGlzLmV4cChhLG5ldyBOdWxsRXhwKCkpfWZ1bmN0aW9uIGJucE11bHRpcGx5TG93ZXJUbyhiLGYsZSl7dmFyIGQ9TWF0aC5taW4odGhpcy50K2IudCxmKTtlLnM9MDtlLnQ9ZDt3aGlsZShkPjApe2VbLS1kXT0wfXZhciBjO2ZvcihjPWUudC10aGlzLnQ7ZDxjOysrZCl7ZVtkK3RoaXMudF09dGhpcy5hbSgwLGJbZF0sZSxkLDAsdGhpcy50KX1mb3IoYz1NYXRoLm1pbihiLnQsZik7ZDxjOysrZCl7dGhpcy5hbSgwLGJbZF0sZSxkLDAsZi1kKX1lLmNsYW1wKCl9ZnVuY3Rpb24gYm5wTXVsdGlwbHlVcHBlclRvKGIsZSxkKXstLWU7dmFyIGM9ZC50PXRoaXMudCtiLnQtZTtkLnM9MDt3aGlsZSgtLWM+PTApe2RbY109MH1mb3IoYz1NYXRoLm1heChlLXRoaXMudCwwKTtjPGIudDsrK2Mpe2RbdGhpcy50K2MtZV09dGhpcy5hbShlLWMsYltjXSxkLDAsMCx0aGlzLnQrYy1lKX1kLmNsYW1wKCk7ZC5kclNoaWZ0VG8oMSxkKX1mdW5jdGlvbiBCYXJyZXR0KGEpe3RoaXMucjI9bmJpKCk7dGhpcy5xMz1uYmkoKTtCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oMiphLnQsdGhpcy5yMik7dGhpcy5tdT10aGlzLnIyLmRpdmlkZShhKTt0aGlzLm09YX1mdW5jdGlvbiBiYXJyZXR0Q29udmVydChhKXtpZihhLnM8MHx8YS50PjIqdGhpcy5tLnQpe3JldHVybiBhLm1vZCh0aGlzLm0pfWVsc2V7aWYoYS5jb21wYXJlVG8odGhpcy5tKTwwKXtyZXR1cm4gYX1lbHNle3ZhciBiPW5iaSgpO2EuY29weVRvKGIpO3RoaXMucmVkdWNlKGIpO3JldHVybiBifX19ZnVuY3Rpb24gYmFycmV0dFJldmVydChhKXtyZXR1cm4gYX1mdW5jdGlvbiBiYXJyZXR0UmVkdWNlKGEpe2EuZHJTaGlmdFRvKHRoaXMubS50LTEsdGhpcy5yMik7aWYoYS50PnRoaXMubS50KzEpe2EudD10aGlzLm0udCsxO2EuY2xhbXAoKX10aGlzLm11Lm11bHRpcGx5VXBwZXJUbyh0aGlzLnIyLHRoaXMubS50KzEsdGhpcy5xMyk7dGhpcy5tLm11bHRpcGx5TG93ZXJUbyh0aGlzLnEzLHRoaXMubS50KzEsdGhpcy5yMik7d2hpbGUoYS5jb21wYXJlVG8odGhpcy5yMik8MCl7YS5kQWRkT2Zmc2V0KDEsdGhpcy5tLnQrMSl9YS5zdWJUbyh0aGlzLnIyLGEpO3doaWxlKGEuY29tcGFyZVRvKHRoaXMubSk+PTApe2Euc3ViVG8odGhpcy5tLGEpfX1mdW5jdGlvbiBiYXJyZXR0U3FyVG8oYSxiKXthLnNxdWFyZVRvKGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIGJhcnJldHRNdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYik7dGhpcy5yZWR1Y2UoYil9QmFycmV0dC5wcm90b3R5cGUuY29udmVydD1iYXJyZXR0Q29udmVydDtCYXJyZXR0LnByb3RvdHlwZS5yZXZlcnQ9YmFycmV0dFJldmVydDtCYXJyZXR0LnByb3RvdHlwZS5yZWR1Y2U9YmFycmV0dFJlZHVjZTtCYXJyZXR0LnByb3RvdHlwZS5tdWxUbz1iYXJyZXR0TXVsVG87QmFycmV0dC5wcm90b3R5cGUuc3FyVG89YmFycmV0dFNxclRvO2Z1bmN0aW9uIGJuTW9kUG93KHEsZil7dmFyIG89cS5iaXRMZW5ndGgoKSxoLGI9bmJ2KDEpLHY7aWYobzw9MCl7cmV0dXJuIGJ9ZWxzZXtpZihvPDE4KXtoPTF9ZWxzZXtpZihvPDQ4KXtoPTN9ZWxzZXtpZihvPDE0NCl7aD00fWVsc2V7aWYobzw3Njgpe2g9NX1lbHNle2g9Nn19fX19aWYobzw4KXt2PW5ldyBDbGFzc2ljKGYpfWVsc2V7aWYoZi5pc0V2ZW4oKSl7dj1uZXcgQmFycmV0dChmKX1lbHNle3Y9bmV3IE1vbnRnb21lcnkoZil9fXZhciBwPW5ldyBBcnJheSgpLGQ9MyxzPWgtMSxhPSgxPDxoKS0xO3BbMV09di5jb252ZXJ0KHRoaXMpO2lmKGg+MSl7dmFyIEE9bmJpKCk7di5zcXJUbyhwWzFdLEEpO3doaWxlKGQ8PWEpe3BbZF09bmJpKCk7di5tdWxUbyhBLHBbZC0yXSxwW2RdKTtkKz0yfX12YXIgbD1xLnQtMSx4LHU9dHJ1ZSxjPW5iaSgpLHk7bz1uYml0cyhxW2xdKS0xO3doaWxlKGw+PTApe2lmKG8+PXMpe3g9KHFbbF0+PihvLXMpKSZhfWVsc2V7eD0ocVtsXSYoKDE8PChvKzEpKS0xKSk8PChzLW8pO2lmKGw+MCl7eHw9cVtsLTFdPj4odGhpcy5EQitvLXMpfX1kPWg7d2hpbGUoKHgmMSk9PTApe3g+Pj0xOy0tZH1pZigoby09ZCk8MCl7bys9dGhpcy5EQjstLWx9aWYodSl7cFt4XS5jb3B5VG8oYik7dT1mYWxzZX1lbHNle3doaWxlKGQ+MSl7di5zcXJUbyhiLGMpO3Yuc3FyVG8oYyxiKTtkLT0yfWlmKGQ+MCl7di5zcXJUbyhiLGMpfWVsc2V7eT1iO2I9YztjPXl9di5tdWxUbyhjLHBbeF0sYil9d2hpbGUobD49MCYmKHFbbF0mKDE8PG8pKT09MCl7di5zcXJUbyhiLGMpO3k9YjtiPWM7Yz15O2lmKC0tbzwwKXtvPXRoaXMuREItMTstLWx9fX1yZXR1cm4gdi5yZXZlcnQoYil9ZnVuY3Rpb24gYm5HQ0QoYyl7dmFyIGI9KHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXMuY2xvbmUoKTt2YXIgaD0oYy5zPDApP2MubmVnYXRlKCk6Yy5jbG9uZSgpO2lmKGIuY29tcGFyZVRvKGgpPDApe3ZhciBlPWI7Yj1oO2g9ZX12YXIgZD1iLmdldExvd2VzdFNldEJpdCgpLGY9aC5nZXRMb3dlc3RTZXRCaXQoKTtpZihmPDApe3JldHVybiBifWlmKGQ8Zil7Zj1kfWlmKGY+MCl7Yi5yU2hpZnRUbyhmLGIpO2guclNoaWZ0VG8oZixoKX13aGlsZShiLnNpZ251bSgpPjApe2lmKChkPWIuZ2V0TG93ZXN0U2V0Qml0KCkpPjApe2IuclNoaWZ0VG8oZCxiKX1pZigoZD1oLmdldExvd2VzdFNldEJpdCgpKT4wKXtoLnJTaGlmdFRvKGQsaCl9aWYoYi5jb21wYXJlVG8oaCk+PTApe2Iuc3ViVG8oaCxiKTtiLnJTaGlmdFRvKDEsYil9ZWxzZXtoLnN1YlRvKGIsaCk7aC5yU2hpZnRUbygxLGgpfX1pZihmPjApe2gubFNoaWZ0VG8oZixoKX1yZXR1cm4gaH1mdW5jdGlvbiBibnBNb2RJbnQoZSl7aWYoZTw9MCl7cmV0dXJuIDB9dmFyIGM9dGhpcy5EViVlLGI9KHRoaXMuczwwKT9lLTE6MDtpZih0aGlzLnQ+MCl7aWYoYz09MCl7Yj10aGlzWzBdJWV9ZWxzZXtmb3IodmFyIGE9dGhpcy50LTE7YT49MDstLWEpe2I9KGMqYit0aGlzW2FdKSVlfX19cmV0dXJuIGJ9ZnVuY3Rpb24gYm5Nb2RJbnZlcnNlKGYpe3ZhciBqPWYuaXNFdmVuKCk7aWYoKHRoaXMuaXNFdmVuKCkmJmopfHxmLnNpZ251bSgpPT0wKXtyZXR1cm4gQmlnSW50ZWdlci5aRVJPfXZhciBpPWYuY2xvbmUoKSxoPXRoaXMuY2xvbmUoKTt2YXIgZz1uYnYoMSksZT1uYnYoMCksbD1uYnYoMCksaz1uYnYoMSk7d2hpbGUoaS5zaWdudW0oKSE9MCl7d2hpbGUoaS5pc0V2ZW4oKSl7aS5yU2hpZnRUbygxLGkpO2lmKGope2lmKCFnLmlzRXZlbigpfHwhZS5pc0V2ZW4oKSl7Zy5hZGRUbyh0aGlzLGcpO2Uuc3ViVG8oZixlKX1nLnJTaGlmdFRvKDEsZyl9ZWxzZXtpZighZS5pc0V2ZW4oKSl7ZS5zdWJUbyhmLGUpfX1lLnJTaGlmdFRvKDEsZSl9d2hpbGUoaC5pc0V2ZW4oKSl7aC5yU2hpZnRUbygxLGgpO2lmKGope2lmKCFsLmlzRXZlbigpfHwhay5pc0V2ZW4oKSl7bC5hZGRUbyh0aGlzLGwpO2suc3ViVG8oZixrKX1sLnJTaGlmdFRvKDEsbCl9ZWxzZXtpZighay5pc0V2ZW4oKSl7ay5zdWJUbyhmLGspfX1rLnJTaGlmdFRvKDEsayl9aWYoaS5jb21wYXJlVG8oaCk+PTApe2kuc3ViVG8oaCxpKTtpZihqKXtnLnN1YlRvKGwsZyl9ZS5zdWJUbyhrLGUpfWVsc2V7aC5zdWJUbyhpLGgpO2lmKGope2wuc3ViVG8oZyxsKX1rLnN1YlRvKGUsayl9fWlmKGguY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSE9MCl7cmV0dXJuIEJpZ0ludGVnZXIuWkVST31pZihrLmNvbXBhcmVUbyhmKT49MCl7cmV0dXJuIGsuc3VidHJhY3QoZil9aWYoay5zaWdudW0oKTwwKXtrLmFkZFRvKGYsayl9ZWxzZXtyZXR1cm4ga31pZihrLnNpZ251bSgpPDApe3JldHVybiBrLmFkZChmKX1lbHNle3JldHVybiBrfX12YXIgbG93cHJpbWVzPVsyLDMsNSw3LDExLDEzLDE3LDE5LDIzLDI5LDMxLDM3LDQxLDQzLDQ3LDUzLDU5LDYxLDY3LDcxLDczLDc5LDgzLDg5LDk3LDEwMSwxMDMsMTA3LDEwOSwxMTMsMTI3LDEzMSwxMzcsMTM5LDE0OSwxNTEsMTU3LDE2MywxNjcsMTczLDE3OSwxODEsMTkxLDE5MywxOTcsMTk5LDIxMSwyMjMsMjI3LDIyOSwyMzMsMjM5LDI0MSwyNTEsMjU3LDI2MywyNjksMjcxLDI3NywyODEsMjgzLDI5MywzMDcsMzExLDMxMywzMTcsMzMxLDMzNywzNDcsMzQ5LDM1MywzNTksMzY3LDM3MywzNzksMzgzLDM4OSwzOTcsNDAxLDQwOSw0MTksNDIxLDQzMSw0MzMsNDM5LDQ0Myw0NDksNDU3LDQ2MSw0NjMsNDY3LDQ3OSw0ODcsNDkxLDQ5OSw1MDMsNTA5LDUyMSw1MjMsNTQxLDU0Nyw1NTcsNTYzLDU2OSw1NzEsNTc3LDU4Nyw1OTMsNTk5LDYwMSw2MDcsNjEzLDYxNyw2MTksNjMxLDY0MSw2NDMsNjQ3LDY1Myw2NTksNjYxLDY3Myw2NzcsNjgzLDY5MSw3MDEsNzA5LDcxOSw3MjcsNzMzLDczOSw3NDMsNzUxLDc1Nyw3NjEsNzY5LDc3Myw3ODcsNzk3LDgwOSw4MTEsODIxLDgyMyw4MjcsODI5LDgzOSw4NTMsODU3LDg1OSw4NjMsODc3LDg4MSw4ODMsODg3LDkwNyw5MTEsOTE5LDkyOSw5MzcsOTQxLDk0Nyw5NTMsOTY3LDk3MSw5NzcsOTgzLDk5MSw5OTddO3ZhciBscGxpbT0oMTw8MjYpL2xvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdO2Z1bmN0aW9uIGJuSXNQcm9iYWJsZVByaW1lKGUpe3ZhciBkLGI9dGhpcy5hYnMoKTtpZihiLnQ9PTEmJmJbMF08PWxvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdKXtmb3IoZD0wO2Q8bG93cHJpbWVzLmxlbmd0aDsrK2Qpe2lmKGJbMF09PWxvd3ByaW1lc1tkXSl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX1pZihiLmlzRXZlbigpKXtyZXR1cm4gZmFsc2V9ZD0xO3doaWxlKGQ8bG93cHJpbWVzLmxlbmd0aCl7dmFyIGE9bG93cHJpbWVzW2RdLGM9ZCsxO3doaWxlKGM8bG93cHJpbWVzLmxlbmd0aCYmYTxscGxpbSl7YSo9bG93cHJpbWVzW2MrK119YT1iLm1vZEludChhKTt3aGlsZShkPGMpe2lmKGElbG93cHJpbWVzW2QrK109PTApe3JldHVybiBmYWxzZX19fXJldHVybiBiLm1pbGxlclJhYmluKGUpfWZ1bmN0aW9uIGJucE1pbGxlclJhYmluKGYpe3ZhciBnPXRoaXMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3ZhciBjPWcuZ2V0TG93ZXN0U2V0Qml0KCk7aWYoYzw9MCl7cmV0dXJuIGZhbHNlfXZhciBoPWcuc2hpZnRSaWdodChjKTtmPShmKzEpPj4xO2lmKGY+bG93cHJpbWVzLmxlbmd0aCl7Zj1sb3dwcmltZXMubGVuZ3RofXZhciBiPW5iaSgpO2Zvcih2YXIgZT0wO2U8ZjsrK2Upe2IuZnJvbUludChsb3dwcmltZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxvd3ByaW1lcy5sZW5ndGgpXSk7dmFyIGw9Yi5tb2RQb3coaCx0aGlzKTtpZihsLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTAmJmwuY29tcGFyZVRvKGcpIT0wKXt2YXIgZD0xO3doaWxlKGQrKzxjJiZsLmNvbXBhcmVUbyhnKSE9MCl7bD1sLm1vZFBvd0ludCgyLHRoaXMpO2lmKGwuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCl7cmV0dXJuIGZhbHNlfX1pZihsLmNvbXBhcmVUbyhnKSE9MCl7cmV0dXJuIGZhbHNlfX19cmV0dXJuIHRydWV9QmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplPWJucENodW5rU2l6ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS50b1JhZGl4PWJucFRvUmFkaXg7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVJhZGl4PWJucEZyb21SYWRpeDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tTnVtYmVyPWJucEZyb21OdW1iZXI7QmlnSW50ZWdlci5wcm90b3R5cGUuYml0d2lzZVRvPWJucEJpdHdpc2VUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jaGFuZ2VCaXQ9Ym5wQ2hhbmdlQml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmFkZFRvPWJucEFkZFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmRNdWx0aXBseT1ibnBETXVsdGlwbHk7QmlnSW50ZWdlci5wcm90b3R5cGUuZEFkZE9mZnNldD1ibnBEQWRkT2Zmc2V0O0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5TG93ZXJUbz1ibnBNdWx0aXBseUxvd2VyVG87QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlVcHBlclRvPWJucE11bHRpcGx5VXBwZXJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnQ9Ym5wTW9kSW50O0JpZ0ludGVnZXIucHJvdG90eXBlLm1pbGxlclJhYmluPWJucE1pbGxlclJhYmluO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsb25lPWJuQ2xvbmU7QmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWU9Ym5JbnRWYWx1ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5ieXRlVmFsdWU9Ym5CeXRlVmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuc2hvcnRWYWx1ZT1iblNob3J0VmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtPWJuU2lnTnVtO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvQnl0ZUFycmF5PWJuVG9CeXRlQXJyYXk7QmlnSW50ZWdlci5wcm90b3R5cGUuZXF1YWxzPWJuRXF1YWxzO0JpZ0ludGVnZXIucHJvdG90eXBlLm1pbj1ibk1pbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tYXg9Ym5NYXg7QmlnSW50ZWdlci5wcm90b3R5cGUuYW5kPWJuQW5kO0JpZ0ludGVnZXIucHJvdG90eXBlLm9yPWJuT3I7QmlnSW50ZWdlci5wcm90b3R5cGUueG9yPWJuWG9yO0JpZ0ludGVnZXIucHJvdG90eXBlLmFuZE5vdD1ibkFuZE5vdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3Q9Ym5Ob3Q7QmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRMZWZ0PWJuU2hpZnRMZWZ0O0JpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0UmlnaHQ9Ym5TaGlmdFJpZ2h0O0JpZ0ludGVnZXIucHJvdG90eXBlLmdldExvd2VzdFNldEJpdD1ibkdldExvd2VzdFNldEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRDb3VudD1ibkJpdENvdW50O0JpZ0ludGVnZXIucHJvdG90eXBlLnRlc3RCaXQ9Ym5UZXN0Qml0O0JpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdD1iblNldEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGVhckJpdD1ibkNsZWFyQml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmZsaXBCaXQ9Ym5GbGlwQml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmFkZD1ibkFkZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJ0cmFjdD1iblN1YnRyYWN0O0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5PWJuTXVsdGlwbHk7QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlPWJuRGl2aWRlO0JpZ0ludGVnZXIucHJvdG90eXBlLnJlbWFpbmRlcj1iblJlbWFpbmRlcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGVBbmRSZW1haW5kZXI9Ym5EaXZpZGVBbmRSZW1haW5kZXI7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93PWJuTW9kUG93O0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludmVyc2U9Ym5Nb2RJbnZlcnNlO0JpZ0ludGVnZXIucHJvdG90eXBlLnBvdz1iblBvdztCaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2Q9Ym5HQ0Q7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNQcm9iYWJsZVByaW1lPWJuSXNQcm9iYWJsZVByaW1lO0JpZ0ludGVnZXIucHJvdG90eXBlLnNxdWFyZT1iblNxdWFyZTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xyXG4gKi9cclxuZnVuY3Rpb24gQXJjZm91cigpe3RoaXMuaT0wO3RoaXMuaj0wO3RoaXMuUz1uZXcgQXJyYXkoKX1mdW5jdGlvbiBBUkM0aW5pdChkKXt2YXIgYyxhLGI7Zm9yKGM9MDtjPDI1NjsrK2Mpe3RoaXMuU1tjXT1jfWE9MDtmb3IoYz0wO2M8MjU2OysrYyl7YT0oYSt0aGlzLlNbY10rZFtjJWQubGVuZ3RoXSkmMjU1O2I9dGhpcy5TW2NdO3RoaXMuU1tjXT10aGlzLlNbYV07dGhpcy5TW2FdPWJ9dGhpcy5pPTA7dGhpcy5qPTB9ZnVuY3Rpb24gQVJDNG5leHQoKXt2YXIgYTt0aGlzLmk9KHRoaXMuaSsxKSYyNTU7dGhpcy5qPSh0aGlzLmordGhpcy5TW3RoaXMuaV0pJjI1NTthPXRoaXMuU1t0aGlzLmldO3RoaXMuU1t0aGlzLmldPXRoaXMuU1t0aGlzLmpdO3RoaXMuU1t0aGlzLmpdPWE7cmV0dXJuIHRoaXMuU1soYSt0aGlzLlNbdGhpcy5pXSkmMjU1XX1BcmNmb3VyLnByb3RvdHlwZS5pbml0PUFSQzRpbml0O0FyY2ZvdXIucHJvdG90eXBlLm5leHQ9QVJDNG5leHQ7ZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpe3JldHVybiBuZXcgQXJjZm91cigpfXZhciBybmdfcHNpemU9MjU2O1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXHJcbiAqL1xyXG52YXIgcm5nX3N0YXRlO3ZhciBybmdfcG9vbDt2YXIgcm5nX3BwdHI7ZnVuY3Rpb24gcm5nX3NlZWRfaW50KGEpe3JuZ19wb29sW3JuZ19wcHRyKytdXj1hJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjgpJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjE2KSYyNTU7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePShhPj4yNCkmMjU1O2lmKHJuZ19wcHRyPj1ybmdfcHNpemUpe3JuZ19wcHRyLT1ybmdfcHNpemV9fWZ1bmN0aW9uIHJuZ19zZWVkX3RpbWUoKXtybmdfc2VlZF9pbnQobmV3IERhdGUoKS5nZXRUaW1lKCkpfWlmKHJuZ19wb29sPT1udWxsKXtybmdfcG9vbD1uZXcgQXJyYXkoKTtybmdfcHB0cj0wO3ZhciB0O2lmKHdpbmRvdyE9PXVuZGVmaW5lZCYmKHdpbmRvdy5jcnlwdG8hPT11bmRlZmluZWR8fHdpbmRvdy5tc0NyeXB0byE9PXVuZGVmaW5lZCkpe3ZhciBjcnlwdG89d2luZG93LmNyeXB0b3x8d2luZG93Lm1zQ3J5cHRvO2lmKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciB1YT1uZXcgVWludDhBcnJheSgzMik7Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1YSk7Zm9yKHQ9MDt0PDMyOysrdCl7cm5nX3Bvb2xbcm5nX3BwdHIrK109dWFbdF19fWVsc2V7aWYobmF2aWdhdG9yLmFwcE5hbWU9PVwiTmV0c2NhcGVcIiYmbmF2aWdhdG9yLmFwcFZlcnNpb248XCI1XCIpe3ZhciB6PXdpbmRvdy5jcnlwdG8ucmFuZG9tKDMyKTtmb3IodD0wO3Q8ei5sZW5ndGg7Kyt0KXtybmdfcG9vbFtybmdfcHB0cisrXT16LmNoYXJDb2RlQXQodCkmMjU1fX19fXdoaWxlKHJuZ19wcHRyPHJuZ19wc2l6ZSl7dD1NYXRoLmZsb29yKDY1NTM2Kk1hdGgucmFuZG9tKCkpO3JuZ19wb29sW3JuZ19wcHRyKytdPXQ+Pj44O3JuZ19wb29sW3JuZ19wcHRyKytdPXQmMjU1fXJuZ19wcHRyPTA7cm5nX3NlZWRfdGltZSgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZSgpe2lmKHJuZ19zdGF0ZT09bnVsbCl7cm5nX3NlZWRfdGltZSgpO3JuZ19zdGF0ZT1wcm5nX25ld3N0YXRlKCk7cm5nX3N0YXRlLmluaXQocm5nX3Bvb2wpO2ZvcihybmdfcHB0cj0wO3JuZ19wcHRyPHJuZ19wb29sLmxlbmd0aDsrK3JuZ19wcHRyKXtybmdfcG9vbFtybmdfcHB0cl09MH1ybmdfcHB0cj0wfXJldHVybiBybmdfc3RhdGUubmV4dCgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZXMoYil7dmFyIGE7Zm9yKGE9MDthPGIubGVuZ3RoOysrYSl7YlthXT1ybmdfZ2V0X2J5dGUoKX19ZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCl7fVNlY3VyZVJhbmRvbS5wcm90b3R5cGUubmV4dEJ5dGVzPXJuZ19nZXRfYnl0ZXM7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlQmlnSW50KGIsYSl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGIsYSl9ZnVuY3Rpb24gbGluZWJyayhjLGQpe3ZhciBhPVwiXCI7dmFyIGI9MDt3aGlsZShiK2Q8Yy5sZW5ndGgpe2ErPWMuc3Vic3RyaW5nKGIsYitkKStcIlxcblwiO2IrPWR9cmV0dXJuIGErYy5zdWJzdHJpbmcoYixjLmxlbmd0aCl9ZnVuY3Rpb24gYnl0ZTJIZXgoYSl7aWYoYTwxNil7cmV0dXJuXCIwXCIrYS50b1N0cmluZygxNil9ZWxzZXtyZXR1cm4gYS50b1N0cmluZygxNil9fWZ1bmN0aW9uIHBrY3MxcGFkMihlLGgpe2lmKGg8ZS5sZW5ndGgrMTEpe3Rocm93XCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0FcIjtyZXR1cm4gbnVsbH12YXIgZz1uZXcgQXJyYXkoKTt2YXIgZD1lLmxlbmd0aC0xO3doaWxlKGQ+PTAmJmg+MCl7dmFyIGY9ZS5jaGFyQ29kZUF0KGQtLSk7aWYoZjwxMjgpe2dbLS1oXT1mfWVsc2V7aWYoKGY+MTI3KSYmKGY8MjA0OCkpe2dbLS1oXT0oZiY2Myl8MTI4O2dbLS1oXT0oZj4+Nil8MTkyfWVsc2V7Z1stLWhdPShmJjYzKXwxMjg7Z1stLWhdPSgoZj4+NikmNjMpfDEyODtnWy0taF09KGY+PjEyKXwyMjR9fX1nWy0taF09MDt2YXIgYj1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIGE9bmV3IEFycmF5KCk7d2hpbGUoaD4yKXthWzBdPTA7d2hpbGUoYVswXT09MCl7Yi5uZXh0Qnl0ZXMoYSl9Z1stLWhdPWFbMF19Z1stLWhdPTI7Z1stLWhdPTA7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGcpfWZ1bmN0aW9uIG9hZXBfbWdmMV9hcnIoYyxhLGUpe3ZhciBiPVwiXCIsZD0wO3doaWxlKGIubGVuZ3RoPGEpe2IrPWUoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsYy5jb25jYXQoWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKSk7ZCs9MX1yZXR1cm4gYn1mdW5jdGlvbiBvYWVwX3BhZChxLGEsZixsKXt2YXIgYz1LSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0O3ZhciBvPUtKVVIuY3J5cHRvLlV0aWw7dmFyIGI9bnVsbDtpZighZil7Zj1cInNoYTFcIn1pZih0eXBlb2YgZj09PVwic3RyaW5nXCIpe2I9Yy5nZXRDYW5vbmljYWxBbGdOYW1lKGYpO2w9Yy5nZXRIYXNoTGVuZ3RoKGIpO2Y9ZnVuY3Rpb24oaSl7cmV0dXJuIGhleHRvcnN0cihvLmhhc2hIZXgocnN0cnRvaGV4KGkpLGIpKX19aWYocS5sZW5ndGgrMipsKzI+YSl7dGhyb3dcIk1lc3NhZ2UgdG9vIGxvbmcgZm9yIFJTQVwifXZhciBrPVwiXCIsZTtmb3IoZT0wO2U8YS1xLmxlbmd0aC0yKmwtMjtlKz0xKXtrKz1cIlxceDAwXCJ9dmFyIGg9ZihcIlwiKStrK1wiXFx4MDFcIitxO3ZhciBnPW5ldyBBcnJheShsKTtuZXcgU2VjdXJlUmFuZG9tKCkubmV4dEJ5dGVzKGcpO3ZhciBqPW9hZXBfbWdmMV9hcnIoZyxoLmxlbmd0aCxmKTt2YXIgcD1bXTtmb3IoZT0wO2U8aC5sZW5ndGg7ZSs9MSl7cFtlXT1oLmNoYXJDb2RlQXQoZSleai5jaGFyQ29kZUF0KGUpfXZhciBtPW9hZXBfbWdmMV9hcnIocCxnLmxlbmd0aCxmKTt2YXIgZD1bMF07Zm9yKGU9MDtlPGcubGVuZ3RoO2UrPTEpe2RbZSsxXT1nW2VdXm0uY2hhckNvZGVBdChlKX1yZXR1cm4gbmV3IEJpZ0ludGVnZXIoZC5jb25jYXQocCkpfWZ1bmN0aW9uIFJTQUtleSgpe3RoaXMubj1udWxsO3RoaXMuZT0wO3RoaXMuZD1udWxsO3RoaXMucD1udWxsO3RoaXMucT1udWxsO3RoaXMuZG1wMT1udWxsO3RoaXMuZG1xMT1udWxsO3RoaXMuY29lZmY9bnVsbH1mdW5jdGlvbiBSU0FTZXRQdWJsaWMoYixhKXt0aGlzLmlzUHVibGljPXRydWU7dGhpcy5pc1ByaXZhdGU9ZmFsc2U7aWYodHlwZW9mIGIhPT1cInN0cmluZ1wiKXt0aGlzLm49Yjt0aGlzLmU9YX1lbHNle2lmKGIhPW51bGwmJmEhPW51bGwmJmIubGVuZ3RoPjAmJmEubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChiLDE2KTt0aGlzLmU9cGFyc2VJbnQoYSwxNil9ZWxzZXt0aHJvd1wiSW52YWxpZCBSU0EgcHVibGljIGtleVwifX19ZnVuY3Rpb24gUlNBRG9QdWJsaWMoYSl7cmV0dXJuIGEubW9kUG93SW50KHRoaXMuZSx0aGlzLm4pfWZ1bmN0aW9uIFJTQUVuY3J5cHQoZCl7dmFyIGE9cGtjczFwYWQyKGQsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+Myk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGU9dGhpcy5kb1B1YmxpYyhhKTtpZihlPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYj1lLnRvU3RyaW5nKDE2KTtpZigoYi5sZW5ndGgmMSk9PTApe3JldHVybiBifWVsc2V7cmV0dXJuXCIwXCIrYn19ZnVuY3Rpb24gUlNBRW5jcnlwdE9BRVAoZixlLGIpe3ZhciBhPW9hZXBfcGFkKGYsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+MyxlLGIpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXZhciBnPXRoaXMuZG9QdWJsaWMoYSk7aWYoZz09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGQ9Zy50b1N0cmluZygxNik7aWYoKGQubGVuZ3RoJjEpPT0wKXtyZXR1cm4gZH1lbHNle3JldHVyblwiMFwiK2R9fVJTQUtleS5wcm90b3R5cGUuZG9QdWJsaWM9UlNBRG9QdWJsaWM7UlNBS2V5LnByb3RvdHlwZS5zZXRQdWJsaWM9UlNBU2V0UHVibGljO1JTQUtleS5wcm90b3R5cGUuZW5jcnlwdD1SU0FFbmNyeXB0O1JTQUtleS5wcm90b3R5cGUuZW5jcnlwdE9BRVA9UlNBRW5jcnlwdE9BRVA7UlNBS2V5LnByb3RvdHlwZS50eXBlPVwiUlNBXCI7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cclxuICovXHJcbmZ1bmN0aW9uIEVDRmllbGRFbGVtZW50RnAoYixhKXt0aGlzLng9YTt0aGlzLnE9Yn1mdW5jdGlvbiBmZUZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfXJldHVybih0aGlzLnEuZXF1YWxzKGEucSkmJnRoaXMueC5lcXVhbHMoYS54KSl9ZnVuY3Rpb24gZmVGcFRvQmlnSW50ZWdlcigpe3JldHVybiB0aGlzLnh9ZnVuY3Rpb24gZmVGcE5lZ2F0ZSgpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54Lm5lZ2F0ZSgpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwQWRkKGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LmFkZChhLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcFN1YnRyYWN0KGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LnN1YnRyYWN0KGEudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwTXVsdGlwbHkoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLngubXVsdGlwbHkoYS50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBTcXVhcmUoKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5zcXVhcmUoKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcERpdmlkZShhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5tdWx0aXBseShhLnRvQmlnSW50ZWdlcigpLm1vZEludmVyc2UodGhpcy5xKSkubW9kKHRoaXMucSkpfUVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmVxdWFscz1mZUZwRXF1YWxzO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnRvQmlnSW50ZWdlcj1mZUZwVG9CaWdJbnRlZ2VyO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLm5lZ2F0ZT1mZUZwTmVnYXRlO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmFkZD1mZUZwQWRkO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnN1YnRyYWN0PWZlRnBTdWJ0cmFjdDtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5tdWx0aXBseT1mZUZwTXVsdGlwbHk7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuc3F1YXJlPWZlRnBTcXVhcmU7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZGl2aWRlPWZlRnBEaXZpZGU7ZnVuY3Rpb24gRUNQb2ludEZwKGMsYSxkLGIpe3RoaXMuY3VydmU9Yzt0aGlzLng9YTt0aGlzLnk9ZDtpZihiPT1udWxsKXt0aGlzLno9QmlnSW50ZWdlci5PTkV9ZWxzZXt0aGlzLno9Yn10aGlzLnppbnY9bnVsbH1mdW5jdGlvbiBwb2ludEZwR2V0WCgpe2lmKHRoaXMuemludj09bnVsbCl7dGhpcy56aW52PXRoaXMuei5tb2RJbnZlcnNlKHRoaXMuY3VydmUucSl9cmV0dXJuIHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMuemludikubW9kKHRoaXMuY3VydmUucSkpfWZ1bmN0aW9uIHBvaW50RnBHZXRZKCl7aWYodGhpcy56aW52PT1udWxsKXt0aGlzLnppbnY9dGhpcy56Lm1vZEludmVyc2UodGhpcy5jdXJ2ZS5xKX1yZXR1cm4gdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcih0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56aW52KS5tb2QodGhpcy5jdXJ2ZS5xKSl9ZnVuY3Rpb24gcG9pbnRGcEVxdWFscyhhKXtpZihhPT10aGlzKXtyZXR1cm4gdHJ1ZX1pZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIGEuaXNJbmZpbml0eSgpfWlmKGEuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCl9dmFyIGMsYjtjPWEueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShhLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtpZighYy5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSl7cmV0dXJuIGZhbHNlfWI9YS54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGEueikpLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBiLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pfWZ1bmN0aW9uIHBvaW50RnBJc0luZmluaXR5KCl7aWYoKHRoaXMueD09bnVsbCkmJih0aGlzLnk9PW51bGwpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gdGhpcy56LmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pJiYhdGhpcy55LnRvQmlnSW50ZWdlcigpLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pfWZ1bmN0aW9uIHBvaW50RnBOZWdhdGUoKXtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMueCx0aGlzLnkubmVnYXRlKCksdGhpcy56KX1mdW5jdGlvbiBwb2ludEZwQWRkKGwpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gbH1pZihsLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9dmFyIHA9bC55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGwueikpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBvPWwueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShsLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtpZihCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKG8pKXtpZihCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKHApKXtyZXR1cm4gdGhpcy50d2ljZSgpfXJldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGo9bmV3IEJpZ0ludGVnZXIoXCIzXCIpO3ZhciBlPXRoaXMueC50b0JpZ0ludGVnZXIoKTt2YXIgbj10aGlzLnkudG9CaWdJbnRlZ2VyKCk7dmFyIGM9bC54LnRvQmlnSW50ZWdlcigpO3ZhciBrPWwueS50b0JpZ0ludGVnZXIoKTt2YXIgbT1vLnNxdWFyZSgpO3ZhciBpPW0ubXVsdGlwbHkobyk7dmFyIGQ9ZS5tdWx0aXBseShtKTt2YXIgZz1wLnNxdWFyZSgpLm11bHRpcGx5KHRoaXMueik7dmFyIGE9Zy5zdWJ0cmFjdChkLnNoaWZ0TGVmdCgxKSkubXVsdGlwbHkobC56KS5zdWJ0cmFjdChpKS5tdWx0aXBseShvKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgaD1kLm11bHRpcGx5KGopLm11bHRpcGx5KHApLnN1YnRyYWN0KG4ubXVsdGlwbHkoaSkpLnN1YnRyYWN0KGcubXVsdGlwbHkocCkpLm11bHRpcGx5KGwueikuYWRkKHAubXVsdGlwbHkoaSkpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBmPWkubXVsdGlwbHkodGhpcy56KS5tdWx0aXBseShsLnopLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihhKSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGgpLGYpfWZ1bmN0aW9uIHBvaW50RnBUd2ljZSgpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnkudG9CaWdJbnRlZ2VyKCkuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9bmV3IEJpZ0ludGVnZXIoXCIzXCIpO3ZhciBjPXRoaXMueC50b0JpZ0ludGVnZXIoKTt2YXIgaD10aGlzLnkudG9CaWdJbnRlZ2VyKCk7dmFyIGU9aC5tdWx0aXBseSh0aGlzLnopO3ZhciBqPWUubXVsdGlwbHkoaCkubW9kKHRoaXMuY3VydmUucSk7dmFyIGk9dGhpcy5jdXJ2ZS5hLnRvQmlnSW50ZWdlcigpO3ZhciBrPWMuc3F1YXJlKCkubXVsdGlwbHkoZyk7aWYoIUJpZ0ludGVnZXIuWkVSTy5lcXVhbHMoaSkpe2s9ay5hZGQodGhpcy56LnNxdWFyZSgpLm11bHRpcGx5KGkpKX1rPWsubW9kKHRoaXMuY3VydmUucSk7dmFyIGI9ay5zcXVhcmUoKS5zdWJ0cmFjdChjLnNoaWZ0TGVmdCgzKS5tdWx0aXBseShqKSkuc2hpZnRMZWZ0KDEpLm11bHRpcGx5KGUpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBmPWsubXVsdGlwbHkoZykubXVsdGlwbHkoYykuc3VidHJhY3Qoai5zaGlmdExlZnQoMSkpLnNoaWZ0TGVmdCgyKS5tdWx0aXBseShqKS5zdWJ0cmFjdChrLnNxdWFyZSgpLm11bHRpcGx5KGspKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgZD1lLnNxdWFyZSgpLm11bHRpcGx5KGUpLnNoaWZ0TGVmdCgzKS5tb2QodGhpcy5jdXJ2ZS5xKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoYiksdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihmKSxkKX1mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHkoYil7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKGIuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9Yjt2YXIgZj1nLm11bHRpcGx5KG5ldyBCaWdJbnRlZ2VyKFwiM1wiKSk7dmFyIGw9dGhpcy5uZWdhdGUoKTt2YXIgZD10aGlzO3ZhciBjO2ZvcihjPWYuYml0TGVuZ3RoKCktMjtjPjA7LS1jKXtkPWQudHdpY2UoKTt2YXIgYT1mLnRlc3RCaXQoYyk7dmFyIGo9Zy50ZXN0Qml0KGMpO2lmKGEhPWope2Q9ZC5hZGQoYT90aGlzOmwpfX1yZXR1cm4gZH1mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHlUd28oYyxhLGIpe3ZhciBkO2lmKGMuYml0TGVuZ3RoKCk+Yi5iaXRMZW5ndGgoKSl7ZD1jLmJpdExlbmd0aCgpLTF9ZWxzZXtkPWIuYml0TGVuZ3RoKCktMX12YXIgZj10aGlzLmN1cnZlLmdldEluZmluaXR5KCk7dmFyIGU9dGhpcy5hZGQoYSk7d2hpbGUoZD49MCl7Zj1mLnR3aWNlKCk7aWYoYy50ZXN0Qml0KGQpKXtpZihiLnRlc3RCaXQoZCkpe2Y9Zi5hZGQoZSl9ZWxzZXtmPWYuYWRkKHRoaXMpfX1lbHNle2lmKGIudGVzdEJpdChkKSl7Zj1mLmFkZChhKX19LS1kfXJldHVybiBmfUVDUG9pbnRGcC5wcm90b3R5cGUuZ2V0WD1wb2ludEZwR2V0WDtFQ1BvaW50RnAucHJvdG90eXBlLmdldFk9cG9pbnRGcEdldFk7RUNQb2ludEZwLnByb3RvdHlwZS5lcXVhbHM9cG9pbnRGcEVxdWFscztFQ1BvaW50RnAucHJvdG90eXBlLmlzSW5maW5pdHk9cG9pbnRGcElzSW5maW5pdHk7RUNQb2ludEZwLnByb3RvdHlwZS5uZWdhdGU9cG9pbnRGcE5lZ2F0ZTtFQ1BvaW50RnAucHJvdG90eXBlLmFkZD1wb2ludEZwQWRkO0VDUG9pbnRGcC5wcm90b3R5cGUudHdpY2U9cG9pbnRGcFR3aWNlO0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHk9cG9pbnRGcE11bHRpcGx5O0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHlUd289cG9pbnRGcE11bHRpcGx5VHdvO2Z1bmN0aW9uIEVDQ3VydmVGcChlLGQsYyl7dGhpcy5xPWU7dGhpcy5hPXRoaXMuZnJvbUJpZ0ludGVnZXIoZCk7dGhpcy5iPXRoaXMuZnJvbUJpZ0ludGVnZXIoYyk7dGhpcy5pbmZpbml0eT1uZXcgRUNQb2ludEZwKHRoaXMsbnVsbCxudWxsKX1mdW5jdGlvbiBjdXJ2ZUZwR2V0USgpe3JldHVybiB0aGlzLnF9ZnVuY3Rpb24gY3VydmVGcEdldEEoKXtyZXR1cm4gdGhpcy5hfWZ1bmN0aW9uIGN1cnZlRnBHZXRCKCl7cmV0dXJuIHRoaXMuYn1mdW5jdGlvbiBjdXJ2ZUZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfXJldHVybih0aGlzLnEuZXF1YWxzKGEucSkmJnRoaXMuYS5lcXVhbHMoYS5hKSYmdGhpcy5iLmVxdWFscyhhLmIpKX1mdW5jdGlvbiBjdXJ2ZUZwR2V0SW5maW5pdHkoKXtyZXR1cm4gdGhpcy5pbmZpbml0eX1mdW5jdGlvbiBjdXJ2ZUZwRnJvbUJpZ0ludGVnZXIoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSxhKX1mdW5jdGlvbiBjdXJ2ZUZwRGVjb2RlUG9pbnRIZXgoZCl7c3dpdGNoKHBhcnNlSW50KGQuc3Vic3RyKDAsMiksMTYpKXtjYXNlIDA6cmV0dXJuIHRoaXMuaW5maW5pdHk7Y2FzZSAyOmNhc2UgMzpyZXR1cm4gbnVsbDtjYXNlIDQ6Y2FzZSA2OmNhc2UgNzp2YXIgYT0oZC5sZW5ndGgtMikvMjt2YXIgYz1kLnN1YnN0cigyLGEpO3ZhciBiPWQuc3Vic3RyKGErMixhKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoYywxNikpLHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoYiwxNikpKTtkZWZhdWx0OnJldHVybiBudWxsfX1FQ0N1cnZlRnAucHJvdG90eXBlLmdldFE9Y3VydmVGcEdldFE7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRBPWN1cnZlRnBHZXRBO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0Qj1jdXJ2ZUZwR2V0QjtFQ0N1cnZlRnAucHJvdG90eXBlLmVxdWFscz1jdXJ2ZUZwRXF1YWxzO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0SW5maW5pdHk9Y3VydmVGcEdldEluZmluaXR5O0VDQ3VydmVGcC5wcm90b3R5cGUuZnJvbUJpZ0ludGVnZXI9Y3VydmVGcEZyb21CaWdJbnRlZ2VyO0VDQ3VydmVGcC5wcm90b3R5cGUuZGVjb2RlUG9pbnRIZXg9Y3VydmVGcERlY29kZVBvaW50SGV4O1xuLyohIChjKSBTdGVmYW4gVGhvbWFzIHwgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW5qcy9iaXRjb2luanMtbGliXHJcbiAqL1xyXG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5nZXRCeXRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZmxvb3IoKHRoaXMudG9CaWdJbnRlZ2VyKCkuYml0TGVuZ3RoKCkrNykvOCl9O0VDUG9pbnRGcC5wcm90b3R5cGUuZ2V0RW5jb2RlZD1mdW5jdGlvbihjKXt2YXIgZD1mdW5jdGlvbihoLGYpe3ZhciBnPWgudG9CeXRlQXJyYXlVbnNpZ25lZCgpO2lmKGY8Zy5sZW5ndGgpe2c9Zy5zbGljZShnLmxlbmd0aC1mKX1lbHNle3doaWxlKGY+Zy5sZW5ndGgpe2cudW5zaGlmdCgwKX19cmV0dXJuIGd9O3ZhciBhPXRoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBlPXRoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBiPWQoYSwzMik7aWYoYyl7aWYoZS5pc0V2ZW4oKSl7Yi51bnNoaWZ0KDIpfWVsc2V7Yi51bnNoaWZ0KDMpfX1lbHNle2IudW5zaGlmdCg0KTtiPWIuY29uY2F0KGQoZSwzMikpfXJldHVybiBifTtFQ1BvaW50RnAuZGVjb2RlRnJvbT1mdW5jdGlvbihnLGMpe3ZhciBmPWNbMF07dmFyIGU9Yy5sZW5ndGgtMTt2YXIgZD1jLnNsaWNlKDEsMStlLzIpO3ZhciBiPWMuc2xpY2UoMStlLzIsMStlKTtkLnVuc2hpZnQoMCk7Yi51bnNoaWZ0KDApO3ZhciBhPW5ldyBCaWdJbnRlZ2VyKGQpO3ZhciBoPW5ldyBCaWdJbnRlZ2VyKGIpO3JldHVybiBuZXcgRUNQb2ludEZwKGcsZy5mcm9tQmlnSW50ZWdlcihhKSxnLmZyb21CaWdJbnRlZ2VyKGgpKX07RUNQb2ludEZwLmRlY29kZUZyb21IZXg9ZnVuY3Rpb24oZyxjKXt2YXIgZj1jLnN1YnN0cigwLDIpO3ZhciBlPWMubGVuZ3RoLTI7dmFyIGQ9Yy5zdWJzdHIoMixlLzIpO3ZhciBiPWMuc3Vic3RyKDIrZS8yLGUvMik7dmFyIGE9bmV3IEJpZ0ludGVnZXIoZCwxNik7dmFyIGg9bmV3IEJpZ0ludGVnZXIoYiwxNik7cmV0dXJuIG5ldyBFQ1BvaW50RnAoZyxnLmZyb21CaWdJbnRlZ2VyKGEpLGcuZnJvbUJpZ0ludGVnZXIoaCkpfTtFQ1BvaW50RnAucHJvdG90eXBlLmFkZDJEPWZ1bmN0aW9uKGMpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gY31pZihjLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYodGhpcy54LmVxdWFscyhjLngpKXtpZih0aGlzLnkuZXF1YWxzKGMueSkpe3JldHVybiB0aGlzLnR3aWNlKCl9cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1jLnguc3VidHJhY3QodGhpcy54KTt2YXIgZT1jLnkuc3VidHJhY3QodGhpcy55KTt2YXIgYT1lLmRpdmlkZShnKTt2YXIgZD1hLnNxdWFyZSgpLnN1YnRyYWN0KHRoaXMueCkuc3VidHJhY3QoYy54KTt2YXIgZj1hLm11bHRpcGx5KHRoaXMueC5zdWJ0cmFjdChkKSkuc3VidHJhY3QodGhpcy55KTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLGQsZil9O0VDUG9pbnRGcC5wcm90b3R5cGUudHdpY2UyRD1mdW5jdGlvbigpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnkudG9CaWdJbnRlZ2VyKCkuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGI9dGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoMikpO3ZhciBlPXRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDMpKTt2YXIgYT10aGlzLnguc3F1YXJlKCkubXVsdGlwbHkoZSkuYWRkKHRoaXMuY3VydmUuYSkuZGl2aWRlKHRoaXMueS5tdWx0aXBseShiKSk7dmFyIGM9YS5zcXVhcmUoKS5zdWJ0cmFjdCh0aGlzLngubXVsdGlwbHkoYikpO3ZhciBkPWEubXVsdGlwbHkodGhpcy54LnN1YnRyYWN0KGMpKS5zdWJ0cmFjdCh0aGlzLnkpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsYyxkKX07RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseTJEPWZ1bmN0aW9uKGIpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZihiLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPWI7dmFyIGY9Zy5tdWx0aXBseShuZXcgQmlnSW50ZWdlcihcIjNcIikpO3ZhciBsPXRoaXMubmVnYXRlKCk7dmFyIGQ9dGhpczt2YXIgYztmb3IoYz1mLmJpdExlbmd0aCgpLTI7Yz4wOy0tYyl7ZD1kLnR3aWNlKCk7dmFyIGE9Zi50ZXN0Qml0KGMpO3ZhciBqPWcudGVzdEJpdChjKTtpZihhIT1qKXtkPWQuYWRkMkQoYT90aGlzOmwpfX1yZXR1cm4gZH07RUNQb2ludEZwLnByb3RvdHlwZS5pc09uQ3VydmU9ZnVuY3Rpb24oKXt2YXIgZD10aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgaT10aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgZj10aGlzLmN1cnZlLmdldEEoKS50b0JpZ0ludGVnZXIoKTt2YXIgYz10aGlzLmN1cnZlLmdldEIoKS50b0JpZ0ludGVnZXIoKTt2YXIgaD10aGlzLmN1cnZlLmdldFEoKTt2YXIgZT1pLm11bHRpcGx5KGkpLm1vZChoKTt2YXIgZz1kLm11bHRpcGx5KGQpLm11bHRpcGx5KGQpLmFkZChmLm11bHRpcGx5KGQpKS5hZGQoYykubW9kKGgpO3JldHVybiBlLmVxdWFscyhnKX07RUNQb2ludEZwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiKFwiK3RoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKCkrXCIsXCIrdGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCkudG9TdHJpbmcoKStcIilcIn07RUNQb2ludEZwLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbigpe3ZhciBjPXRoaXMuY3VydmUuZ2V0USgpO2lmKHRoaXMuaXNJbmZpbml0eSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBhdCBpbmZpbml0eS5cIil9dmFyIGE9dGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGI9dGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7aWYoYS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fGEuY29tcGFyZVRvKGMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKT4wKXt0aHJvdyBuZXcgRXJyb3IoXCJ4IGNvb3JkaW5hdGUgb3V0IG9mIGJvdW5kc1wiKX1pZihiLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8Yi5jb21wYXJlVG8oYy5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpPjApe3Rocm93IG5ldyBFcnJvcihcInkgY29vcmRpbmF0ZSBvdXQgb2YgYm91bmRzXCIpfWlmKCF0aGlzLmlzT25DdXJ2ZSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBub3Qgb24gdGhlIGN1cnZlLlwiKX1pZih0aGlzLm11bHRpcGx5KGMpLmlzSW5maW5pdHkoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgbm90IGEgc2NhbGFyIG11bHRpcGxlIG9mIEcuXCIpfXJldHVybiB0cnVlfTtcbi8qISBNaWtlIFNhbXVlbCAoYykgMjAwOSB8IGNvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2Fucy1ldmFsXHJcbiAqL1xyXG52YXIganNvblBhcnNlPShmdW5jdGlvbigpe3ZhciBlPVwiKD86LT9cXFxcYig/OjB8WzEtOV1bMC05XSopKD86XFxcXC5bMC05XSspPyg/OltlRV1bKy1dP1swLTldKyk/XFxcXGIpXCI7dmFyIGo9Jyg/OlteXFxcXDAtXFxcXHgwOFxcXFx4MGEtXFxcXHgxZlwiXFxcXFxcXFxdfFxcXFxcXFxcKD86W1wiL1xcXFxcXFxcYmZucnRdfHVbMC05QS1GYS1mXXs0fSkpJzt2YXIgaT0nKD86XCInK2orJypcIiknO3ZhciBkPW5ldyBSZWdFeHAoXCIoPzpmYWxzZXx0cnVlfG51bGx8W1xcXFx7XFxcXH1cXFxcW1xcXFxdXXxcIitlK1wifFwiK2krXCIpXCIsXCJnXCIpO3ZhciBrPW5ldyBSZWdFeHAoXCJcXFxcXFxcXCg/OihbXnVdKXx1KC57NH0pKVwiLFwiZ1wiKTt2YXIgZz17J1wiJzonXCInLFwiL1wiOlwiL1wiLFwiXFxcXFwiOlwiXFxcXFwiLGI6XCJcXGJcIixmOlwiXFxmXCIsbjpcIlxcblwiLHI6XCJcXHJcIix0OlwiXFx0XCJ9O2Z1bmN0aW9uIGgobCxtLG4pe3JldHVybiBtP2dbbV06U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLDE2KSl9dmFyIGM9bmV3IFN0cmluZyhcIlwiKTt2YXIgYT1cIlxcXFxcIjt2YXIgZj17XCJ7XCI6T2JqZWN0LFwiW1wiOkFycmF5fTt2YXIgYj1PYmplY3QuaGFzT3duUHJvcGVydHk7cmV0dXJuIGZ1bmN0aW9uKHUscSl7dmFyIHA9dS5tYXRjaChkKTt2YXIgeDt2YXIgdj1wWzBdO3ZhciBsPWZhbHNlO2lmKFwie1wiPT09dil7eD17fX1lbHNle2lmKFwiW1wiPT09dil7eD1bXX1lbHNle3g9W107bD10cnVlfX12YXIgdDt2YXIgcj1beF07Zm9yKHZhciBvPTEtbCxtPXAubGVuZ3RoO288bTsrK28pe3Y9cFtvXTt2YXIgdztzd2l0Y2godi5jaGFyQ29kZUF0KDApKXtkZWZhdWx0Onc9clswXTt3W3R8fHcubGVuZ3RoXT0rKHYpO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMzQ6dj12LnN1YnN0cmluZygxLHYubGVuZ3RoLTEpO2lmKHYuaW5kZXhPZihhKSE9PS0xKXt2PXYucmVwbGFjZShrLGgpfXc9clswXTtpZighdCl7aWYodyBpbnN0YW5jZW9mIEFycmF5KXt0PXcubGVuZ3RofWVsc2V7dD12fHxjO2JyZWFrfX13W3RdPXY7dD12b2lkIDA7YnJlYWs7Y2FzZSA5MTp3PXJbMF07ci51bnNoaWZ0KHdbdHx8dy5sZW5ndGhdPVtdKTt0PXZvaWQgMDticmVhaztjYXNlIDkzOnIuc2hpZnQoKTticmVhaztjYXNlIDEwMjp3PXJbMF07d1t0fHx3Lmxlbmd0aF09ZmFsc2U7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTA6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPW51bGw7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTY6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPXRydWU7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjM6dz1yWzBdO3IudW5zaGlmdCh3W3R8fHcubGVuZ3RoXT17fSk7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjU6ci5zaGlmdCgpO2JyZWFrfX1pZihsKXtpZihyLmxlbmd0aCE9PTEpe3Rocm93IG5ldyBFcnJvcigpfXg9eFswXX1lbHNle2lmKHIubGVuZ3RoKXt0aHJvdyBuZXcgRXJyb3IoKX19aWYocSl7dmFyIHM9ZnVuY3Rpb24oQyxCKXt2YXIgRD1DW0JdO2lmKEQmJnR5cGVvZiBEPT09XCJvYmplY3RcIil7dmFyIG49bnVsbDtmb3IodmFyIHogaW4gRCl7aWYoYi5jYWxsKEQseikmJkQhPT1DKXt2YXIgeT1zKEQseik7aWYoeSE9PXZvaWQgMCl7RFt6XT15fWVsc2V7aWYoIW4pe249W119bi5wdXNoKHopfX19aWYobil7Zm9yKHZhciBBPW4ubGVuZ3RoOy0tQT49MDspe2RlbGV0ZSBEW25bQV1dfX19cmV0dXJuIHEuY2FsbChDLEIsRCl9O3g9cyh7XCJcIjp4fSxcIlwiKX1yZXR1cm4geH19KSgpO1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1LSlVSLmFzbjEuQVNOMVV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5pbnRlZ2VyVG9CeXRlSGV4PWZ1bmN0aW9uKGEpe3ZhciBiPWEudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCUyKT09MSl7Yj1cIjBcIitifXJldHVybiBifTt0aGlzLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4PWZ1bmN0aW9uKGope3ZhciBmPWoudG9TdHJpbmcoMTYpO2lmKGYuc3Vic3RyKDAsMSkhPVwiLVwiKXtpZihmLmxlbmd0aCUyPT0xKXtmPVwiMFwiK2Z9ZWxzZXtpZighZi5tYXRjaCgvXlswLTddLykpe2Y9XCIwMFwiK2Z9fX1lbHNle3ZhciBhPWYuc3Vic3RyKDEpO3ZhciBlPWEubGVuZ3RoO2lmKGUlMj09MSl7ZSs9MX1lbHNle2lmKCFmLm1hdGNoKC9eWzAtN10vKSl7ZSs9Mn19dmFyIGc9XCJcIjtmb3IodmFyIGQ9MDtkPGU7ZCsrKXtnKz1cImZcIn12YXIgYz1uZXcgQmlnSW50ZWdlcihnLDE2KTt2YXIgYj1jLnhvcihqKS5hZGQoQmlnSW50ZWdlci5PTkUpO2Y9Yi50b1N0cmluZygxNikucmVwbGFjZSgvXi0vLFwiXCIpfXJldHVybiBmfTt0aGlzLmdldFBFTVN0cmluZ0Zyb21IZXg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gaGV4dG9wZW0oYSxiKX07dGhpcy5uZXdPYmplY3Q9ZnVuY3Rpb24oayl7dmFyIEQ9S0pVUixuPUQuYXNuMSx6PW4uREVSQm9vbGVhbixlPW4uREVSSW50ZWdlcixzPW4uREVSQml0U3RyaW5nLGg9bi5ERVJPY3RldFN0cmluZyx2PW4uREVSTnVsbCx3PW4uREVST2JqZWN0SWRlbnRpZmllcixsPW4uREVSRW51bWVyYXRlZCxnPW4uREVSVVRGOFN0cmluZyxmPW4uREVSTnVtZXJpY1N0cmluZyx5PW4uREVSUHJpbnRhYmxlU3RyaW5nLHU9bi5ERVJUZWxldGV4U3RyaW5nLHA9bi5ERVJJQTVTdHJpbmcsQz1uLkRFUlVUQ1RpbWUsaj1uLkRFUkdlbmVyYWxpemVkVGltZSxtPW4uREVSU2VxdWVuY2UsYz1uLkRFUlNldCxyPW4uREVSVGFnZ2VkT2JqZWN0LG89bi5BU04xVXRpbC5uZXdPYmplY3Q7dmFyIHQ9T2JqZWN0LmtleXMoayk7aWYodC5sZW5ndGghPTEpe3Rocm93XCJrZXkgb2YgcGFyYW0gc2hhbGwgYmUgb25seSBvbmUuXCJ9dmFyIEY9dFswXTtpZihcIjpib29sOmludDpiaXRzdHI6b2N0c3RyOm51bGw6b2lkOmVudW06dXRmOHN0cjpudW1zdHI6cHJuc3RyOnRlbHN0cjppYTVzdHI6dXRjdGltZTpnZW50aW1lOnNlcTpzZXQ6dGFnOlwiLmluZGV4T2YoXCI6XCIrRitcIjpcIik9PS0xKXt0aHJvd1widW5kZWZpbmVkIGtleTogXCIrRn1pZihGPT1cImJvb2xcIil7cmV0dXJuIG5ldyB6KGtbRl0pfWlmKEY9PVwiaW50XCIpe3JldHVybiBuZXcgZShrW0ZdKX1pZihGPT1cImJpdHN0clwiKXtyZXR1cm4gbmV3IHMoa1tGXSl9aWYoRj09XCJvY3RzdHJcIil7cmV0dXJuIG5ldyBoKGtbRl0pfWlmKEY9PVwibnVsbFwiKXtyZXR1cm4gbmV3IHYoa1tGXSl9aWYoRj09XCJvaWRcIil7cmV0dXJuIG5ldyB3KGtbRl0pfWlmKEY9PVwiZW51bVwiKXtyZXR1cm4gbmV3IGwoa1tGXSl9aWYoRj09XCJ1dGY4c3RyXCIpe3JldHVybiBuZXcgZyhrW0ZdKX1pZihGPT1cIm51bXN0clwiKXtyZXR1cm4gbmV3IGYoa1tGXSl9aWYoRj09XCJwcm5zdHJcIil7cmV0dXJuIG5ldyB5KGtbRl0pfWlmKEY9PVwidGVsc3RyXCIpe3JldHVybiBuZXcgdShrW0ZdKX1pZihGPT1cImlhNXN0clwiKXtyZXR1cm4gbmV3IHAoa1tGXSl9aWYoRj09XCJ1dGN0aW1lXCIpe3JldHVybiBuZXcgQyhrW0ZdKX1pZihGPT1cImdlbnRpbWVcIil7cmV0dXJuIG5ldyBqKGtbRl0pfWlmKEY9PVwic2VxXCIpe3ZhciBkPWtbRl07dmFyIEU9W107Zm9yKHZhciB4PTA7eDxkLmxlbmd0aDt4Kyspe3ZhciBCPW8oZFt4XSk7RS5wdXNoKEIpfXJldHVybiBuZXcgbSh7YXJyYXk6RX0pfWlmKEY9PVwic2V0XCIpe3ZhciBkPWtbRl07dmFyIEU9W107Zm9yKHZhciB4PTA7eDxkLmxlbmd0aDt4Kyspe3ZhciBCPW8oZFt4XSk7RS5wdXNoKEIpfXJldHVybiBuZXcgYyh7YXJyYXk6RX0pfWlmKEY9PVwidGFnXCIpe3ZhciBBPWtbRl07aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKEEpPT09XCJbb2JqZWN0IEFycmF5XVwiJiZBLmxlbmd0aD09Myl7dmFyIHE9byhBWzJdKTtyZXR1cm4gbmV3IHIoe3RhZzpBWzBdLGV4cGxpY2l0OkFbMV0sb2JqOnF9KX1lbHNle3ZhciBiPXt9O2lmKEEuZXhwbGljaXQhPT11bmRlZmluZWQpe2IuZXhwbGljaXQ9QS5leHBsaWNpdH1pZihBLnRhZyE9PXVuZGVmaW5lZCl7Yi50YWc9QS50YWd9aWYoQS5vYmo9PT11bmRlZmluZWQpe3Rocm93XCJvYmogc2hhbGwgYmUgc3BlY2lmaWVkIGZvciAndGFnJy5cIn1iLm9iaj1vKEEub2JqKTtyZXR1cm4gbmV3IHIoYil9fX07dGhpcy5qc29uVG9BU04xSEVYPWZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMubmV3T2JqZWN0KGIpO3JldHVybiBhLmdldEVuY29kZWRIZXgoKX19O0tKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludD1mdW5jdGlvbihhKXt2YXIgaj1cIlwiO3ZhciBrPXBhcnNlSW50KGEuc3Vic3RyKDAsMiksMTYpO3ZhciBkPU1hdGguZmxvb3Ioay80MCk7dmFyIGM9ayU0MDt2YXIgaj1kK1wiLlwiK2M7dmFyIGU9XCJcIjtmb3IodmFyIGY9MjtmPGEubGVuZ3RoO2YrPTIpe3ZhciBnPXBhcnNlSW50KGEuc3Vic3RyKGYsMiksMTYpO3ZhciBoPShcIjAwMDAwMDAwXCIrZy50b1N0cmluZygyKSkuc2xpY2UoLTgpO2U9ZStoLnN1YnN0cigxLDcpO2lmKGguc3Vic3RyKDAsMSk9PVwiMFwiKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihlLDIpO2o9aitcIi5cIitiLnRvU3RyaW5nKDEwKTtlPVwiXCJ9fXJldHVybiBqfTtLSlVSLmFzbjEuQVNOMVV0aWwub2lkSW50VG9IZXg9ZnVuY3Rpb24oZil7dmFyIGU9ZnVuY3Rpb24oYSl7dmFyIGs9YS50b1N0cmluZygxNik7aWYoay5sZW5ndGg9PTEpe2s9XCIwXCIra31yZXR1cm4ga307dmFyIGQ9ZnVuY3Rpb24obyl7dmFyIG49XCJcIjt2YXIgaz1uZXcgQmlnSW50ZWdlcihvLDEwKTt2YXIgYT1rLnRvU3RyaW5nKDIpO3ZhciBsPTctYS5sZW5ndGglNztpZihsPT03KXtsPTB9dmFyIHE9XCJcIjtmb3IodmFyIG09MDttPGw7bSsrKXtxKz1cIjBcIn1hPXErYTtmb3IodmFyIG09MDttPGEubGVuZ3RoLTE7bSs9Nyl7dmFyIHA9YS5zdWJzdHIobSw3KTtpZihtIT1hLmxlbmd0aC03KXtwPVwiMVwiK3B9bis9ZShwYXJzZUludChwLDIpKX1yZXR1cm4gbn07aWYoIWYubWF0Y2goL15bMC05Ll0rJC8pKXt0aHJvd1wibWFsZm9ybWVkIG9pZCBzdHJpbmc6IFwiK2Z9dmFyIGc9XCJcIjt2YXIgYj1mLnNwbGl0KFwiLlwiKTt2YXIgaj1wYXJzZUludChiWzBdKSo0MCtwYXJzZUludChiWzFdKTtnKz1lKGopO2Iuc3BsaWNlKDAsMik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2crPWQoYltjXSl9cmV0dXJuIGd9O0tKVVIuYXNuMS5BU04xT2JqZWN0PWZ1bmN0aW9uKCl7dmFyIGM9dHJ1ZTt2YXIgYj1udWxsO3ZhciBkPVwiMDBcIjt2YXIgZT1cIjAwXCI7dmFyIGE9XCJcIjt0aGlzLmdldExlbmd0aEhleEZyb21WYWx1ZT1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhWPT1cInVuZGVmaW5lZFwifHx0aGlzLmhWPT1udWxsKXt0aHJvd1widGhpcy5oViBpcyBudWxsIG9yIHVuZGVmaW5lZC5cIn1pZih0aGlzLmhWLmxlbmd0aCUyPT0xKXt0aHJvd1widmFsdWUgaGV4IG11c3QgYmUgZXZlbiBsZW5ndGg6IG49XCIrYS5sZW5ndGgrXCIsdj1cIit0aGlzLmhWfXZhciBpPXRoaXMuaFYubGVuZ3RoLzI7dmFyIGg9aS50b1N0cmluZygxNik7aWYoaC5sZW5ndGglMj09MSl7aD1cIjBcIitofWlmKGk8MTI4KXtyZXR1cm4gaH1lbHNle3ZhciBnPWgubGVuZ3RoLzI7aWYoZz4xNSl7dGhyb3dcIkFTTi4xIGxlbmd0aCB0b28gbG9uZyB0byByZXByZXNlbnQgYnkgOHg6IG4gPSBcIitpLnRvU3RyaW5nKDE2KX12YXIgZj0xMjgrZztyZXR1cm4gZi50b1N0cmluZygxNikraH19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaFRMVj09bnVsbHx8dGhpcy5pc01vZGlmaWVkKXt0aGlzLmhWPXRoaXMuZ2V0RnJlc2hWYWx1ZUhleCgpO3RoaXMuaEw9dGhpcy5nZXRMZW5ndGhIZXhGcm9tVmFsdWUoKTt0aGlzLmhUTFY9dGhpcy5oVCt0aGlzLmhMK3RoaXMuaFY7dGhpcy5pc01vZGlmaWVkPWZhbHNlfXJldHVybiB0aGlzLmhUTFZ9O3RoaXMuZ2V0VmFsdWVIZXg9ZnVuY3Rpb24oKXt0aGlzLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuXCJcIn19O0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLmdldFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN9O3RoaXMuc2V0U3RyaW5nPWZ1bmN0aW9uKGQpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1kO3RoaXMuaFY9dXRmOHRvaGV4KHRoaXMucykudG9Mb3dlckNhc2UoKX07dGhpcy5zZXRTdHJpbmdIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiKXt0aGlzLnNldFN0cmluZyhjKX1lbHNle2lmKHR5cGVvZiBjLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRTdHJpbmcoYy5zdHIpfWVsc2V7aWYodHlwZW9mIGMuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFN0cmluZ0hleChjLmhleCl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLkRFUkFic3RyYWN0VGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMubG9jYWxEYXRlVG9VVEM9ZnVuY3Rpb24oZil7dXRjPWYuZ2V0VGltZSgpKyhmLmdldFRpbWV6b25lT2Zmc2V0KCkqNjAwMDApO3ZhciBlPW5ldyBEYXRlKHV0Yyk7cmV0dXJuIGV9O3RoaXMuZm9ybWF0RGF0ZT1mdW5jdGlvbihtLG8sZSl7dmFyIGc9dGhpcy56ZXJvUGFkZGluZzt2YXIgbj10aGlzLmxvY2FsRGF0ZVRvVVRDKG0pO3ZhciBwPVN0cmluZyhuLmdldEZ1bGxZZWFyKCkpO2lmKG89PVwidXRjXCIpe3A9cC5zdWJzdHIoMiwyKX12YXIgbD1nKFN0cmluZyhuLmdldE1vbnRoKCkrMSksMik7dmFyIHE9ZyhTdHJpbmcobi5nZXREYXRlKCkpLDIpO3ZhciBoPWcoU3RyaW5nKG4uZ2V0SG91cnMoKSksMik7dmFyIGk9ZyhTdHJpbmcobi5nZXRNaW51dGVzKCkpLDIpO3ZhciBqPWcoU3RyaW5nKG4uZ2V0U2Vjb25kcygpKSwyKTt2YXIgcj1wK2wrcStoK2krajtpZihlPT09dHJ1ZSl7dmFyIGY9bi5nZXRNaWxsaXNlY29uZHMoKTtpZihmIT0wKXt2YXIgaz1nKFN0cmluZyhmKSwzKTtrPWsucmVwbGFjZSgvWzBdKyQvLFwiXCIpO3I9citcIi5cIitrfX1yZXR1cm4gcitcIlpcIn07dGhpcy56ZXJvUGFkZGluZz1mdW5jdGlvbihlLGQpe2lmKGUubGVuZ3RoPj1kKXtyZXR1cm4gZX1yZXR1cm4gbmV3IEFycmF5KGQtZS5sZW5ndGgrMSkuam9pbihcIjBcIikrZX07dGhpcy5nZXRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfTt0aGlzLnNldFN0cmluZz1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9ZDt0aGlzLmhWPXN0b2hleChkKX07dGhpcy5zZXRCeURhdGVWYWx1ZT1mdW5jdGlvbihoLGosZSxkLGYsZyl7dmFyIGk9bmV3IERhdGUoRGF0ZS5VVEMoaCxqLTEsZSxkLGYsZywwKSk7dGhpcy5zZXRCeURhdGUoaSl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZD1mdW5jdGlvbihiKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRCeUFTTjFPYmplY3RBcnJheT1mdW5jdGlvbihjKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmFzbjFBcnJheT1jfTt0aGlzLmFwcGVuZEFTTjFPYmplY3Q9ZnVuY3Rpb24oYyl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5hc24xQXJyYXkucHVzaChjKX07dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFBcnJheT1iLmFycmF5fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCb29sZWFuPWZ1bmN0aW9uKCl7S0pVUi5hc24xLkRFUkJvb2xlYW4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMVwiO3RoaXMuaFRMVj1cIjAxMDFmZlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQm9vbGVhbixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkludGVnZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkludGVnZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMlwiO3RoaXMuc2V0QnlCaWdJbnRlZ2VyPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGIpfTt0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbihjKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihTdHJpbmcoYyksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGIpfTt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGIpe3RoaXMuaFY9Yn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5iaWdpbnQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGEuYmlnaW50KX1lbHNle2lmKHR5cGVvZiBhW1wiaW50XCJdIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5SW50ZWdlcihhW1wiaW50XCJdKX1lbHNle2lmKHR5cGVvZiBhPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5SW50ZWdlcihhKX1lbHNle2lmKHR5cGVvZiBhLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChhLmhleCl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkludGVnZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCaXRTdHJpbmc9ZnVuY3Rpb24oYil7aWYoYiE9PXVuZGVmaW5lZCYmdHlwZW9mIGIub2JqIT09XCJ1bmRlZmluZWRcIil7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdChiLm9iaik7Yi5oZXg9XCIwMFwiK2EuZ2V0RW5jb2RlZEhleCgpfUtKVVIuYXNuMS5ERVJCaXRTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwM1wiO3RoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzPWZ1bmN0aW9uKGMpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9Y307dGhpcy5zZXRVbnVzZWRCaXRzQW5kSGV4VmFsdWU9ZnVuY3Rpb24oYyxlKXtpZihjPDB8fDc8Yyl7dGhyb3dcInVudXNlZCBiaXRzIHNoYWxsIGJlIGZyb20gMCB0byA3OiB1ID0gXCIrY312YXIgZD1cIjBcIitjO3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9ZCtlfTt0aGlzLnNldEJ5QmluYXJ5U3RyaW5nPWZ1bmN0aW9uKGUpe2U9ZS5yZXBsYWNlKC8wKyQvLFwiXCIpO3ZhciBmPTgtZS5sZW5ndGglODtpZihmPT04KXtmPTB9Zm9yKHZhciBnPTA7Zzw9ZjtnKyspe2UrPVwiMFwifXZhciBqPVwiXCI7Zm9yKHZhciBnPTA7ZzxlLmxlbmd0aC0xO2crPTgpe3ZhciBkPWUuc3Vic3RyKGcsOCk7dmFyIGM9cGFyc2VJbnQoZCwyKS50b1N0cmluZygxNik7aWYoYy5sZW5ndGg9PTEpe2M9XCIwXCIrY31qKz1jfXRoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9XCIwXCIrZitqfTt0aGlzLnNldEJ5Qm9vbGVhbkFycmF5PWZ1bmN0aW9uKGUpe3ZhciBkPVwiXCI7Zm9yKHZhciBjPTA7YzxlLmxlbmd0aDtjKyspe2lmKGVbY109PXRydWUpe2QrPVwiMVwifWVsc2V7ZCs9XCIwXCJ9fXRoaXMuc2V0QnlCaW5hcnlTdHJpbmcoZCl9O3RoaXMubmV3RmFsc2VBcnJheT1mdW5jdGlvbihlKXt2YXIgYz1uZXcgQXJyYXkoZSk7Zm9yKHZhciBkPTA7ZDxlO2QrKyl7Y1tkXT1mYWxzZX1yZXR1cm4gY307dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYj09XCJzdHJpbmdcIiYmYi50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eWzAtOWEtZl0rJC8pKXt0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyhiKX1lbHNle2lmKHR5cGVvZiBiLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHMoYi5oZXgpfWVsc2V7aWYodHlwZW9mIGIuYmluIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5QmluYXJ5U3RyaW5nKGIuYmluKX1lbHNle2lmKHR5cGVvZiBiLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5Qm9vbGVhbkFycmF5KGIuYXJyYXkpfX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJPY3RldFN0cmluZz1mdW5jdGlvbihiKXtpZihiIT09dW5kZWZpbmVkJiZ0eXBlb2YgYi5vYmohPT1cInVuZGVmaW5lZFwiKXt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KGIub2JqKTtiLmhleD1hLmdldEVuY29kZWRIZXgoKX1LSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYik7dGhpcy5oVD1cIjA0XCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJOdWxsPWZ1bmN0aW9uKCl7S0pVUi5hc24xLkRFUk51bGwuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwNVwiO3RoaXMuaFRMVj1cIjA1MDBcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk51bGwsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyPWZ1bmN0aW9uKGMpe3ZhciBiPWZ1bmN0aW9uKGQpe3ZhciBlPWQudG9TdHJpbmcoMTYpO2lmKGUubGVuZ3RoPT0xKXtlPVwiMFwiK2V9cmV0dXJuIGV9O3ZhciBhPWZ1bmN0aW9uKGspe3ZhciBqPVwiXCI7dmFyIGU9bmV3IEJpZ0ludGVnZXIoaywxMCk7dmFyIGQ9ZS50b1N0cmluZygyKTt2YXIgZj03LWQubGVuZ3RoJTc7aWYoZj09Nyl7Zj0wfXZhciBtPVwiXCI7Zm9yKHZhciBnPTA7ZzxmO2crKyl7bSs9XCIwXCJ9ZD1tK2Q7Zm9yKHZhciBnPTA7ZzxkLmxlbmd0aC0xO2crPTcpe3ZhciBsPWQuc3Vic3RyKGcsNyk7aWYoZyE9ZC5sZW5ndGgtNyl7bD1cIjFcIitsfWorPWIocGFyc2VJbnQobCwyKSl9cmV0dXJuIGp9O0tKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMDZcIjt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGQpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1udWxsO3RoaXMuaFY9ZH07dGhpcy5zZXRWYWx1ZU9pZFN0cmluZz1mdW5jdGlvbihmKXtpZighZi5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJtYWxmb3JtZWQgb2lkIHN0cmluZzogXCIrZn12YXIgZz1cIlwiO3ZhciBkPWYuc3BsaXQoXCIuXCIpO3ZhciBqPXBhcnNlSW50KGRbMF0pKjQwK3BhcnNlSW50KGRbMV0pO2crPWIoaik7ZC5zcGxpY2UoMCwyKTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7Zys9YShkW2VdKX10aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9bnVsbDt0aGlzLmhWPWd9O3RoaXMuc2V0VmFsdWVOYW1lPWZ1bmN0aW9uKGUpe3ZhciBkPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZChlKTtpZihkIT09XCJcIil7dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhkKX1lbHNle3Rocm93XCJERVJPYmplY3RJZGVudGlmaWVyIG9pZE5hbWUgdW5kZWZpbmVkOiBcIitlfX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKGMhPT11bmRlZmluZWQpe2lmKHR5cGVvZiBjPT09XCJzdHJpbmdcIil7aWYoYy5tYXRjaCgvXlswLTJdLlswLTkuXSskLykpe3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoYyl9ZWxzZXt0aGlzLnNldFZhbHVlTmFtZShjKX19ZWxzZXtpZihjLm9pZCE9PXVuZGVmaW5lZCl7dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhjLm9pZCl9ZWxzZXtpZihjLmhleCE9PXVuZGVmaW5lZCl7dGhpcy5zZXRWYWx1ZUhleChjLmhleCl9ZWxzZXtpZihjLm5hbWUhPT11bmRlZmluZWQpe3RoaXMuc2V0VmFsdWVOYW1lKGMubmFtZSl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJFbnVtZXJhdGVkPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJFbnVtZXJhdGVkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMGFcIjt0aGlzLnNldEJ5QmlnSW50ZWdlcj1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmhWPUtKVVIuYXNuMS5BU04xVXRpbC5iaWdJbnRUb01pblR3b3NDb21wbGVtZW50c0hleChiKX07dGhpcy5zZXRCeUludGVnZXI9ZnVuY3Rpb24oYyl7dmFyIGI9bmV3IEJpZ0ludGVnZXIoU3RyaW5nKGMpLDEwKTt0aGlzLnNldEJ5QmlnSW50ZWdlcihiKX07dGhpcy5zZXRWYWx1ZUhleD1mdW5jdGlvbihiKXt0aGlzLmhWPWJ9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGFbXCJpbnRcIl0hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGFbXCJpbnRcIl0pfWVsc2V7aWYodHlwZW9mIGE9PVwibnVtYmVyXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGEpfWVsc2V7aWYodHlwZW9mIGEuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlSGV4KGEuaGV4KX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJFbnVtZXJhdGVkLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSVVRGOFN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVVRGOFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMGNcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlVURjhTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTJcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk51bWVyaWNTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjEzXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTRcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSSUE1U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJJQTVTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE2XCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSVVRDVGltZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVVRDVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTdcIjt0aGlzLnNldEJ5RGF0ZT1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmRhdGU9Yjt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcInV0Y1wiKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5kYXRlPT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5zPT1cInVuZGVmaW5lZFwiKXt0aGlzLmRhdGU9bmV3IERhdGUoKTt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcInV0Y1wiKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfXJldHVybiB0aGlzLmhWfTtpZihhIT09dW5kZWZpbmVkKXtpZihhLnN0ciE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmcoYS5zdHIpfWVsc2V7aWYodHlwZW9mIGE9PVwic3RyaW5nXCImJmEubWF0Y2goL15bMC05XXsxMn1aJC8pKXt0aGlzLnNldFN0cmluZyhhKX1lbHNle2lmKGEuaGV4IT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZ0hleChhLmhleCl9ZWxzZXtpZihhLmRhdGUhPT11bmRlZmluZWQpe3RoaXMuc2V0QnlEYXRlKGEuZGF0ZSl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlVUQ1RpbWUsS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSk7S0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxOFwiO3RoaXMud2l0aE1pbGxpcz1mYWxzZTt0aGlzLnNldEJ5RGF0ZT1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmRhdGU9Yjt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcImdlblwiLHRoaXMud2l0aE1pbGxpcyk7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kYXRlPT09dW5kZWZpbmVkJiZ0aGlzLnM9PT11bmRlZmluZWQpe3RoaXMuZGF0ZT1uZXcgRGF0ZSgpO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwiZ2VuXCIsdGhpcy53aXRoTWlsbGlzKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfXJldHVybiB0aGlzLmhWfTtpZihhIT09dW5kZWZpbmVkKXtpZihhLnN0ciE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmcoYS5zdHIpfWVsc2V7aWYodHlwZW9mIGE9PVwic3RyaW5nXCImJmEubWF0Y2goL15bMC05XXsxNH1aJC8pKXt0aGlzLnNldFN0cmluZyhhKX1lbHNle2lmKGEuaGV4IT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZ0hleChhLmhleCl9ZWxzZXtpZihhLmRhdGUhPT11bmRlZmluZWQpe3RoaXMuc2V0QnlEYXRlKGEuZGF0ZSl9fX19aWYoYS5taWxsaXM9PT10cnVlKXt0aGlzLndpdGhNaWxsaXM9dHJ1ZX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWUpO0tKVVIuYXNuMS5ERVJTZXF1ZW5jZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSU2VxdWVuY2Uuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjMwXCI7dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGM9XCJcIjtmb3IodmFyIGI9MDtiPHRoaXMuYXNuMUFycmF5Lmxlbmd0aDtiKyspe3ZhciBkPXRoaXMuYXNuMUFycmF5W2JdO2MrPWQuZ2V0RW5jb2RlZEhleCgpfXRoaXMuaFY9YztyZXR1cm4gdGhpcy5oVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkKTtLSlVSLmFzbjEuREVSU2V0PWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJTZXQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjMxXCI7dGhpcy5zb3J0RmxhZz10cnVlO3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBiPW5ldyBBcnJheSgpO2Zvcih2YXIgYz0wO2M8dGhpcy5hc24xQXJyYXkubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5hc24xQXJyYXlbY107Yi5wdXNoKGQuZ2V0RW5jb2RlZEhleCgpKX1pZih0aGlzLnNvcnRGbGFnPT10cnVlKXtiLnNvcnQoKX10aGlzLmhWPWIuam9pbihcIlwiKTtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLnNvcnRmbGFnIT1cInVuZGVmaW5lZFwiJiZhLnNvcnRmbGFnPT1mYWxzZSl7dGhpcy5zb3J0RmxhZz1mYWxzZX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSU2V0LEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpO0tKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Q9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cImEwXCI7dGhpcy5oVj1cIlwiO3RoaXMuaXNFeHBsaWNpdD10cnVlO3RoaXMuYXNuMU9iamVjdD1udWxsO3RoaXMuc2V0QVNOMU9iamVjdD1mdW5jdGlvbihiLGMsZCl7dGhpcy5oVD1jO3RoaXMuaXNFeHBsaWNpdD1iO3RoaXMuYXNuMU9iamVjdD1kO2lmKHRoaXMuaXNFeHBsaWNpdCl7dGhpcy5oVj10aGlzLmFzbjFPYmplY3QuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlfWVsc2V7dGhpcy5oVj1udWxsO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTt0aGlzLmhUTFY9dGhpcy5oVExWLnJlcGxhY2UoL14uLi8sYyk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS50YWchPVwidW5kZWZpbmVkXCIpe3RoaXMuaFQ9YS50YWd9aWYodHlwZW9mIGEuZXhwbGljaXQhPVwidW5kZWZpbmVkXCIpe3RoaXMuaXNFeHBsaWNpdD1hLmV4cGxpY2l0fWlmKHR5cGVvZiBhLm9iaiE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xT2JqZWN0PWEub2JqO3RoaXMuc2V0QVNOMU9iamVjdCh0aGlzLmlzRXhwbGljaXQsdGhpcy5oVCx0aGlzLmFzbjFPYmplY3QpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3QsS0pVUi5hc24xLkFTTjFPYmplY3QpO1xudmFyIEFTTjFIRVg9bmV3IGZ1bmN0aW9uKCl7fTtBU04xSEVYLmdldExibGVuPWZ1bmN0aW9uKGMsYSl7aWYoYy5zdWJzdHIoYSsyLDEpIT1cIjhcIil7cmV0dXJuIDF9dmFyIGI9cGFyc2VJbnQoYy5zdWJzdHIoYSszLDEpKTtpZihiPT0wKXtyZXR1cm4gLTF9aWYoMDxiJiZiPDEwKXtyZXR1cm4gYisxfXJldHVybiAtMn07QVNOMUhFWC5nZXRMPWZ1bmN0aW9uKGMsYil7dmFyIGE9QVNOMUhFWC5nZXRMYmxlbihjLGIpO2lmKGE8MSl7cmV0dXJuXCJcIn1yZXR1cm4gYy5zdWJzdHIoYisyLGEqMil9O0FTTjFIRVguZ2V0VmJsZW49ZnVuY3Rpb24oZCxhKXt2YXIgYyxiO2M9QVNOMUhFWC5nZXRMKGQsYSk7aWYoYz09XCJcIil7cmV0dXJuIC0xfWlmKGMuc3Vic3RyKDAsMSk9PT1cIjhcIil7Yj1uZXcgQmlnSW50ZWdlcihjLnN1YnN0cigyKSwxNil9ZWxzZXtiPW5ldyBCaWdJbnRlZ2VyKGMsMTYpfXJldHVybiBiLmludFZhbHVlKCl9O0FTTjFIRVguZ2V0VmlkeD1mdW5jdGlvbihjLGIpe3ZhciBhPUFTTjFIRVguZ2V0TGJsZW4oYyxiKTtpZihhPDApe3JldHVybiBhfXJldHVybiBiKyhhKzEpKjJ9O0FTTjFIRVguZ2V0Vj1mdW5jdGlvbihkLGEpe3ZhciBjPUFTTjFIRVguZ2V0VmlkeChkLGEpO3ZhciBiPUFTTjFIRVguZ2V0VmJsZW4oZCxhKTtyZXR1cm4gZC5zdWJzdHIoYyxiKjIpfTtBU04xSEVYLmdldFRMVj1mdW5jdGlvbihiLGEpe3JldHVybiBiLnN1YnN0cihhLDIpK0FTTjFIRVguZ2V0TChiLGEpK0FTTjFIRVguZ2V0VihiLGEpfTtBU04xSEVYLmdldE5leHRTaWJsaW5nSWR4PWZ1bmN0aW9uKGQsYSl7dmFyIGM9QVNOMUhFWC5nZXRWaWR4KGQsYSk7dmFyIGI9QVNOMUhFWC5nZXRWYmxlbihkLGEpO3JldHVybiBjK2IqMn07QVNOMUhFWC5nZXRDaGlsZElkeD1mdW5jdGlvbihlLGYpe3ZhciBqPUFTTjFIRVg7dmFyIGc9bmV3IEFycmF5KCk7dmFyIGk9ai5nZXRWaWR4KGUsZik7aWYoZS5zdWJzdHIoZiwyKT09XCIwM1wiKXtnLnB1c2goaSsyKX1lbHNle2cucHVzaChpKX12YXIgbD1qLmdldFZibGVuKGUsZik7dmFyIGM9aTt2YXIgZD0wO3doaWxlKDEpe3ZhciBiPWouZ2V0TmV4dFNpYmxpbmdJZHgoZSxjKTtpZihiPT1udWxsfHwoYi1pPj0obCoyKSkpe2JyZWFrfWlmKGQ+PTIwMCl7YnJlYWt9Zy5wdXNoKGIpO2M9YjtkKyt9cmV0dXJuIGd9O0FTTjFIRVguZ2V0TnRoQ2hpbGRJZHg9ZnVuY3Rpb24oZCxiLGUpe3ZhciBjPUFTTjFIRVguZ2V0Q2hpbGRJZHgoZCxiKTtyZXR1cm4gY1tlXX07QVNOMUhFWC5nZXRJZHhieUxpc3Q9ZnVuY3Rpb24oZSxkLGMsaSl7dmFyIGc9QVNOMUhFWDt2YXIgZixiO2lmKGMubGVuZ3RoPT0wKXtpZihpIT09dW5kZWZpbmVkKXtpZihlLnN1YnN0cihkLDIpIT09aSl7dGhyb3dcImNoZWNraW5nIHRhZyBkb2Vzbid0IG1hdGNoOiBcIitlLnN1YnN0cihkLDIpK1wiIT1cIitpfX1yZXR1cm4gZH1mPWMuc2hpZnQoKTtiPWcuZ2V0Q2hpbGRJZHgoZSxkKTtyZXR1cm4gZy5nZXRJZHhieUxpc3QoZSxiW2ZdLGMsaSl9O0FTTjFIRVguZ2V0VExWYnlMaXN0PWZ1bmN0aW9uKGQsYyxiLGYpe3ZhciBlPUFTTjFIRVg7dmFyIGE9ZS5nZXRJZHhieUxpc3QoZCxjLGIpO2lmKGE9PT11bmRlZmluZWQpe3Rocm93XCJjYW4ndCBmaW5kIG50aExpc3Qgb2JqZWN0XCJ9aWYoZiE9PXVuZGVmaW5lZCl7aWYoZC5zdWJzdHIoYSwyKSE9Zil7dGhyb3dcImNoZWNraW5nIHRhZyBkb2Vzbid0IG1hdGNoOiBcIitkLnN1YnN0cihhLDIpK1wiIT1cIitmfX1yZXR1cm4gZS5nZXRUTFYoZCxhKX07QVNOMUhFWC5nZXRWYnlMaXN0PWZ1bmN0aW9uKGUsYyxiLGcsaSl7dmFyIGY9QVNOMUhFWDt2YXIgYSxkO2E9Zi5nZXRJZHhieUxpc3QoZSxjLGIsZyk7aWYoYT09PXVuZGVmaW5lZCl7dGhyb3dcImNhbid0IGZpbmQgbnRoTGlzdCBvYmplY3RcIn1kPWYuZ2V0VihlLGEpO2lmKGk9PT10cnVlKXtkPWQuc3Vic3RyKDIpfXJldHVybiBkfTtBU04xSEVYLmhleHRvb2lkc3RyPWZ1bmN0aW9uKGUpe3ZhciBoPWZ1bmN0aW9uKGIsYSl7aWYoYi5sZW5ndGg+PWEpe3JldHVybiBifXJldHVybiBuZXcgQXJyYXkoYS1iLmxlbmd0aCsxKS5qb2luKFwiMFwiKStifTt2YXIgbD1bXTt2YXIgbz1lLnN1YnN0cigwLDIpO3ZhciBmPXBhcnNlSW50KG8sMTYpO2xbMF09bmV3IFN0cmluZyhNYXRoLmZsb29yKGYvNDApKTtsWzFdPW5ldyBTdHJpbmcoZiU0MCk7dmFyIG09ZS5zdWJzdHIoMik7dmFyIGs9W107Zm9yKHZhciBnPTA7ZzxtLmxlbmd0aC8yO2crKyl7ay5wdXNoKHBhcnNlSW50KG0uc3Vic3RyKGcqMiwyKSwxNikpfXZhciBqPVtdO3ZhciBkPVwiXCI7Zm9yKHZhciBnPTA7ZzxrLmxlbmd0aDtnKyspe2lmKGtbZ10mMTI4KXtkPWQraCgoa1tnXSYxMjcpLnRvU3RyaW5nKDIpLDcpfWVsc2V7ZD1kK2goKGtbZ10mMTI3KS50b1N0cmluZygyKSw3KTtqLnB1c2gobmV3IFN0cmluZyhwYXJzZUludChkLDIpKSk7ZD1cIlwifX12YXIgbj1sLmpvaW4oXCIuXCIpO2lmKGoubGVuZ3RoPjApe249bitcIi5cIitqLmpvaW4oXCIuXCIpfXJldHVybiBufTtBU04xSEVYLmR1bXA9ZnVuY3Rpb24odCxjLGwsZyl7dmFyIHA9QVNOMUhFWDt2YXIgaj1wLmdldFY7dmFyIHk9cC5kdW1wO3ZhciB3PXAuZ2V0Q2hpbGRJZHg7dmFyIGU9dDtpZih0IGluc3RhbmNlb2YgS0pVUi5hc24xLkFTTjFPYmplY3Qpe2U9dC5nZXRFbmNvZGVkSGV4KCl9dmFyIHE9ZnVuY3Rpb24oQSxpKXtpZihBLmxlbmd0aDw9aSoyKXtyZXR1cm4gQX1lbHNle3ZhciB2PUEuc3Vic3RyKDAsaSkrXCIuLih0b3RhbCBcIitBLmxlbmd0aC8yK1wiYnl0ZXMpLi5cIitBLnN1YnN0cihBLmxlbmd0aC1pLGkpO3JldHVybiB2fX07aWYoYz09PXVuZGVmaW5lZCl7Yz17b21taXRfbG9uZ19vY3RldDozMn19aWYobD09PXVuZGVmaW5lZCl7bD0wfWlmKGc9PT11bmRlZmluZWQpe2c9XCJcIn12YXIgeD1jLm9tbWl0X2xvbmdfb2N0ZXQ7aWYoZS5zdWJzdHIobCwyKT09XCIwMVwiKXt2YXIgaD1qKGUsbCk7aWYoaD09XCIwMFwiKXtyZXR1cm4gZytcIkJPT0xFQU4gRkFMU0VcXG5cIn1lbHNle3JldHVybiBnK1wiQk9PTEVBTiBUUlVFXFxuXCJ9fWlmKGUuc3Vic3RyKGwsMik9PVwiMDJcIil7dmFyIGg9aihlLGwpO3JldHVybiBnK1wiSU5URUdFUiBcIitxKGgseCkrXCJcXG5cIn1pZihlLnN1YnN0cihsLDIpPT1cIjAzXCIpe3ZhciBoPWooZSxsKTtyZXR1cm4gZytcIkJJVFNUUklORyBcIitxKGgseCkrXCJcXG5cIn1pZihlLnN1YnN0cihsLDIpPT1cIjA0XCIpe3ZhciBoPWooZSxsKTtpZihwLmlzQVNOMUhFWChoKSl7dmFyIGs9ZytcIk9DVEVUU1RSSU5HLCBlbmNhcHN1bGF0ZXNcXG5cIjtrPWsreShoLGMsMCxnK1wiICBcIik7cmV0dXJuIGt9ZWxzZXtyZXR1cm4gZytcIk9DVEVUU1RSSU5HIFwiK3EoaCx4KStcIlxcblwifX1pZihlLnN1YnN0cihsLDIpPT1cIjA1XCIpe3JldHVybiBnK1wiTlVMTFxcblwifWlmKGUuc3Vic3RyKGwsMik9PVwiMDZcIil7dmFyIG09aihlLGwpO3ZhciBhPUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludChtKTt2YXIgbz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYSk7dmFyIGI9YS5yZXBsYWNlKC9cXC4vZyxcIiBcIik7aWYobyE9XCJcIil7cmV0dXJuIGcrXCJPYmplY3RJZGVudGlmaWVyIFwiK28rXCIgKFwiK2IrXCIpXFxuXCJ9ZWxzZXtyZXR1cm4gZytcIk9iamVjdElkZW50aWZpZXIgKFwiK2IrXCIpXFxuXCJ9fWlmKGUuc3Vic3RyKGwsMik9PVwiMGNcIil7cmV0dXJuIGcrXCJVVEY4U3RyaW5nICdcIitoZXh0b3V0ZjgoaihlLGwpKStcIidcXG5cIn1pZihlLnN1YnN0cihsLDIpPT1cIjEzXCIpe3JldHVybiBnK1wiUHJpbnRhYmxlU3RyaW5nICdcIitoZXh0b3V0ZjgoaihlLGwpKStcIidcXG5cIn1pZihlLnN1YnN0cihsLDIpPT1cIjE0XCIpe3JldHVybiBnK1wiVGVsZXRleFN0cmluZyAnXCIraGV4dG91dGY4KGooZSxsKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIobCwyKT09XCIxNlwiKXtyZXR1cm4gZytcIklBNVN0cmluZyAnXCIraGV4dG91dGY4KGooZSxsKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIobCwyKT09XCIxN1wiKXtyZXR1cm4gZytcIlVUQ1RpbWUgXCIraGV4dG91dGY4KGooZSxsKSkrXCJcXG5cIn1pZihlLnN1YnN0cihsLDIpPT1cIjE4XCIpe3JldHVybiBnK1wiR2VuZXJhbGl6ZWRUaW1lIFwiK2hleHRvdXRmOChqKGUsbCkpK1wiXFxuXCJ9aWYoZS5zdWJzdHIobCwyKT09XCIzMFwiKXtpZihlLnN1YnN0cihsLDQpPT1cIjMwMDBcIil7cmV0dXJuIGcrXCJTRVFVRU5DRSB7fVxcblwifXZhciBrPWcrXCJTRVFVRU5DRVxcblwiO3ZhciBkPXcoZSxsKTt2YXIgZj1jO2lmKChkLmxlbmd0aD09Mnx8ZC5sZW5ndGg9PTMpJiZlLnN1YnN0cihkWzBdLDIpPT1cIjA2XCImJmUuc3Vic3RyKGRbZC5sZW5ndGgtMV0sMik9PVwiMDRcIil7dmFyIG89cC5vaWRuYW1lKGooZSxkWzBdKSk7dmFyIHI9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjKSk7ci54NTA5RXh0TmFtZT1vO2Y9cn1mb3IodmFyIHU9MDt1PGQubGVuZ3RoO3UrKyl7az1rK3koZSxmLGRbdV0sZytcIiAgXCIpfXJldHVybiBrfWlmKGUuc3Vic3RyKGwsMik9PVwiMzFcIil7dmFyIGs9ZytcIlNFVFxcblwiO3ZhciBkPXcoZSxsKTtmb3IodmFyIHU9MDt1PGQubGVuZ3RoO3UrKyl7az1rK3koZSxjLGRbdV0sZytcIiAgXCIpfXJldHVybiBrfXZhciB6PXBhcnNlSW50KGUuc3Vic3RyKGwsMiksMTYpO2lmKCh6JjEyOCkhPTApe3ZhciBuPXomMzE7aWYoKHomMzIpIT0wKXt2YXIgaz1nK1wiW1wiK24rXCJdXFxuXCI7dmFyIGQ9dyhlLGwpO2Zvcih2YXIgdT0wO3U8ZC5sZW5ndGg7dSsrKXtrPWsreShlLGMsZFt1XSxnK1wiICBcIil9cmV0dXJuIGt9ZWxzZXt2YXIgaD1qKGUsbCk7aWYoaC5zdWJzdHIoMCw4KT09XCI2ODc0NzQ3MFwiKXtoPWhleHRvdXRmOChoKX1pZihjLng1MDlFeHROYW1lPT09XCJzdWJqZWN0QWx0TmFtZVwiJiZuPT0yKXtoPWhleHRvdXRmOChoKX12YXIgaz1nK1wiW1wiK24rXCJdIFwiK2grXCJcXG5cIjtyZXR1cm4ga319cmV0dXJuIGcrXCJVTktOT1dOKFwiK2Uuc3Vic3RyKGwsMikrXCIpIFwiK2ooZSxsKStcIlxcblwifTtBU04xSEVYLmlzQVNOMUhFWD1mdW5jdGlvbihlKXt2YXIgZD1BU04xSEVYO2lmKGUubGVuZ3RoJTI9PTEpe3JldHVybiBmYWxzZX12YXIgYz1kLmdldFZibGVuKGUsMCk7dmFyIGI9ZS5zdWJzdHIoMCwyKTt2YXIgZj1kLmdldEwoZSwwKTt2YXIgYT1lLmxlbmd0aC1iLmxlbmd0aC1mLmxlbmd0aDtpZihhPT1jKjIpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX07QVNOMUhFWC5vaWRuYW1lPWZ1bmN0aW9uKGEpe3ZhciBjPUtKVVIuYXNuMTtpZihLSlVSLmxhbmcuU3RyaW5nLmlzSGV4KGEpKXthPWMuQVNOMVV0aWwub2lkSGV4VG9JbnQoYSl9dmFyIGI9Yy54NTA5Lk9JRC5vaWQybmFtZShhKTtpZihiPT09XCJcIil7Yj1hfXJldHVybiBifTtcbnZhciBLSlVSO2lmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5sYW5nPT1cInVuZGVmaW5lZFwifHwhS0pVUi5sYW5nKXtLSlVSLmxhbmc9e319S0pVUi5sYW5nLlN0cmluZz1mdW5jdGlvbigpe307ZnVuY3Rpb24gQmFzZTY0eCgpe31mdW5jdGlvbiBzdG9CQShkKXt2YXIgYj1uZXcgQXJyYXkoKTtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7YltjXT1kLmNoYXJDb2RlQXQoYyl9cmV0dXJuIGJ9ZnVuY3Rpb24gQkF0b3MoYil7dmFyIGQ9XCJcIjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7ZD1kK1N0cmluZy5mcm9tQ2hhckNvZGUoYltjXSl9cmV0dXJuIGR9ZnVuY3Rpb24gQkF0b2hleChiKXt2YXIgZT1cIlwiO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgYz1iW2RdLnRvU3RyaW5nKDE2KTtpZihjLmxlbmd0aD09MSl7Yz1cIjBcIitjfWU9ZStjfXJldHVybiBlfWZ1bmN0aW9uIHN0b2hleChhKXtyZXR1cm4gQkF0b2hleChzdG9CQShhKSl9ZnVuY3Rpb24gc3RvYjY0KGEpe3JldHVybiBoZXgyYjY0KHN0b2hleChhKSl9ZnVuY3Rpb24gc3RvYjY0dShhKXtyZXR1cm4gYjY0dG9iNjR1KGhleDJiNjQoc3RvaGV4KGEpKSl9ZnVuY3Rpb24gYjY0dXRvcyhhKXtyZXR1cm4gQkF0b3MoYjY0dG9CQShiNjR1dG9iNjQoYSkpKX1mdW5jdGlvbiBiNjR0b2I2NHUoYSl7YT1hLnJlcGxhY2UoL1xcPS9nLFwiXCIpO2E9YS5yZXBsYWNlKC9cXCsvZyxcIi1cIik7YT1hLnJlcGxhY2UoL1xcLy9nLFwiX1wiKTtyZXR1cm4gYX1mdW5jdGlvbiBiNjR1dG9iNjQoYSl7aWYoYS5sZW5ndGglND09Mil7YT1hK1wiPT1cIn1lbHNle2lmKGEubGVuZ3RoJTQ9PTMpe2E9YStcIj1cIn19YT1hLnJlcGxhY2UoLy0vZyxcIitcIik7YT1hLnJlcGxhY2UoL18vZyxcIi9cIik7cmV0dXJuIGF9ZnVuY3Rpb24gaGV4dG9iNjR1KGEpe2lmKGEubGVuZ3RoJTI9PTEpe2E9XCIwXCIrYX1yZXR1cm4gYjY0dG9iNjR1KGhleDJiNjQoYSkpfWZ1bmN0aW9uIGI2NHV0b2hleChhKXtyZXR1cm4gYjY0dG9oZXgoYjY0dXRvYjY0KGEpKX12YXIgdXRmOHRvYjY0dSxiNjR1dG91dGY4O2lmKHR5cGVvZiBCdWZmZXI9PT1cImZ1bmN0aW9uXCIpe3V0Zjh0b2I2NHU9ZnVuY3Rpb24oYSl7cmV0dXJuIGI2NHRvYjY0dShuZXcgQnVmZmVyKGEsXCJ1dGY4XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpKX07YjY0dXRvdXRmOD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEJ1ZmZlcihiNjR1dG9iNjQoYSksXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpfX1lbHNle3V0Zjh0b2I2NHU9ZnVuY3Rpb24oYSl7cmV0dXJuIGhleHRvYjY0dSh1cmljbXB0b2hleChlbmNvZGVVUklDb21wb25lbnRBbGwoYSkpKX07YjY0dXRvdXRmOD1mdW5jdGlvbihhKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGhleHRvdXJpY21wKGI2NHV0b2hleChhKSkpfX1mdW5jdGlvbiB1dGY4dG9iNjQoYSl7cmV0dXJuIGhleDJiNjQodXJpY21wdG9oZXgoZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpKSl9ZnVuY3Rpb24gYjY0dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYjY0dG9oZXgoYSkpKX1mdW5jdGlvbiB1dGY4dG9oZXgoYSl7cmV0dXJuIHVyaWNtcHRvaGV4KGVuY29kZVVSSUNvbXBvbmVudEFsbChhKSl9ZnVuY3Rpb24gaGV4dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYSkpfWZ1bmN0aW9uIGhleHRvcnN0cihjKXt2YXIgYj1cIlwiO2Zvcih2YXIgYT0wO2E8Yy5sZW5ndGgtMTthKz0yKXtiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGMuc3Vic3RyKGEsMiksMTYpKX1yZXR1cm4gYn1mdW5jdGlvbiByc3RydG9oZXgoYyl7dmFyIGE9XCJcIjtmb3IodmFyIGI9MDtiPGMubGVuZ3RoO2IrKyl7YSs9KFwiMFwiK2MuY2hhckNvZGVBdChiKS50b1N0cmluZygxNikpLnNsaWNlKC0yKX1yZXR1cm4gYX1mdW5jdGlvbiBoZXh0b2I2NChhKXtyZXR1cm4gaGV4MmI2NChhKX1mdW5jdGlvbiBoZXh0b2I2NG5sKGIpe3ZhciBhPWhleHRvYjY0KGIpO3ZhciBjPWEucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7Yz1jLnJlcGxhY2UoL1xcclxcbiQvLFwiXCIpO3JldHVybiBjfWZ1bmN0aW9uIGI2NG5sdG9oZXgoYil7dmFyIGE9Yi5yZXBsYWNlKC9bXjAtOUEtWmEtelxcLys9XSovZyxcIlwiKTt2YXIgYz1iNjR0b2hleChhKTtyZXR1cm4gY31mdW5jdGlvbiBoZXh0b3BlbShhLGIpe3ZhciBjPWhleHRvYjY0bmwoYSk7cmV0dXJuXCItLS0tLUJFR0lOIFwiK2IrXCItLS0tLVxcclxcblwiK2MrXCJcXHJcXG4tLS0tLUVORCBcIitiK1wiLS0tLS1cXHJcXG5cIn1mdW5jdGlvbiBwZW10b2hleChhLGIpe2lmKGEuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpPT0tMSl7dGhyb3dcImNhbid0IGZpbmQgUEVNIGhlYWRlcjogXCIrYn1pZihiIT09dW5kZWZpbmVkKXthPWEucmVwbGFjZShcIi0tLS0tQkVHSU4gXCIrYitcIi0tLS0tXCIsXCJcIik7YT1hLnJlcGxhY2UoXCItLS0tLUVORCBcIitiK1wiLS0tLS1cIixcIlwiKX1lbHNle2E9YS5yZXBsYWNlKC8tLS0tLUJFR0lOIFteLV0rLS0tLS0vLFwiXCIpO2E9YS5yZXBsYWNlKC8tLS0tLUVORCBbXi1dKy0tLS0tLyxcIlwiKX1yZXR1cm4gYjY0bmx0b2hleChhKX1mdW5jdGlvbiBoZXh0b0FycmF5QnVmZmVyKGQpe2lmKGQubGVuZ3RoJTIhPTApe3Rocm93XCJpbnB1dCBpcyBub3QgZXZlbiBsZW5ndGhcIn1pZihkLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pPT1udWxsKXt0aHJvd1wiaW5wdXQgaXMgbm90IGhleGFkZWNpbWFsXCJ9dmFyIGI9bmV3IEFycmF5QnVmZmVyKGQubGVuZ3RoLzIpO3ZhciBhPW5ldyBEYXRhVmlldyhiKTtmb3IodmFyIGM9MDtjPGQubGVuZ3RoLzI7YysrKXthLnNldFVpbnQ4KGMscGFyc2VJbnQoZC5zdWJzdHIoYyoyLDIpLDE2KSl9cmV0dXJuIGJ9ZnVuY3Rpb24gQXJyYXlCdWZmZXJ0b2hleChiKXt2YXIgZD1cIlwiO3ZhciBhPW5ldyBEYXRhVmlldyhiKTtmb3IodmFyIGM9MDtjPGIuYnl0ZUxlbmd0aDtjKyspe2QrPShcIjAwXCIrYS5nZXRVaW50OChjKS50b1N0cmluZygxNikpLnNsaWNlKC0yKX1yZXR1cm4gZH1mdW5jdGlvbiB6dWx1dG9tc2VjKG4pe3ZhciBsLGosbSxlLGYsaSxiLGs7dmFyIGEsaCxnLGM7Yz1uLm1hdGNoKC9eKFxcZHsyfXxcXGR7NH0pKFxcZFxcZCkoXFxkXFxkKShcXGRcXGQpKFxcZFxcZCkoXFxkXFxkKSh8XFwuXFxkKylaJC8pO2lmKGMpe2E9Y1sxXTtsPXBhcnNlSW50KGEpO2lmKGEubGVuZ3RoPT09Mil7aWYoNTA8PWwmJmw8MTAwKXtsPTE5MDArbH1lbHNle2lmKDA8PWwmJmw8NTApe2w9MjAwMCtsfX19aj1wYXJzZUludChjWzJdKS0xO209cGFyc2VJbnQoY1szXSk7ZT1wYXJzZUludChjWzRdKTtmPXBhcnNlSW50KGNbNV0pO2k9cGFyc2VJbnQoY1s2XSk7Yj0wO2g9Y1s3XTtpZihoIT09XCJcIil7Zz0oaC5zdWJzdHIoMSkrXCIwMFwiKS5zdWJzdHIoMCwzKTtiPXBhcnNlSW50KGcpfXJldHVybiBEYXRlLlVUQyhsLGosbSxlLGYsaSxiKX10aHJvd1widW5zdXBwb3J0ZWQgenVsdSBmb3JtYXQ6IFwiK259ZnVuY3Rpb24genVsdXRvc2VjKGEpe3ZhciBiPXp1bHV0b21zZWMoYSk7cmV0dXJuIH5+KGIvMTAwMCl9ZnVuY3Rpb24genVsdXRvZGF0ZShhKXtyZXR1cm4gbmV3IERhdGUoenVsdXRvbXNlYyhhKSl9ZnVuY3Rpb24gZGF0ZXRvenVsdShnLGUsZil7dmFyIGI7dmFyIGE9Zy5nZXRVVENGdWxsWWVhcigpO2lmKGUpe2lmKGE8MTk1MHx8MjA0OTxhKXt0aHJvd1wibm90IHByb3BlciB5ZWFyIGZvciBVVENUaW1lOiBcIithfWI9KFwiXCIrYSkuc2xpY2UoLTIpfWVsc2V7Yj0oXCIwMDBcIithKS5zbGljZSgtNCl9Yis9KFwiMFwiKyhnLmdldFVUQ01vbnRoKCkrMSkpLnNsaWNlKC0yKTtiKz0oXCIwXCIrZy5nZXRVVENEYXRlKCkpLnNsaWNlKC0yKTtiKz0oXCIwXCIrZy5nZXRVVENIb3VycygpKS5zbGljZSgtMik7Yis9KFwiMFwiK2cuZ2V0VVRDTWludXRlcygpKS5zbGljZSgtMik7Yis9KFwiMFwiK2cuZ2V0VVRDU2Vjb25kcygpKS5zbGljZSgtMik7aWYoZil7dmFyIGM9Zy5nZXRVVENNaWxsaXNlY29uZHMoKTtpZihjIT09MCl7Yz0oXCIwMFwiK2MpLnNsaWNlKC0zKTtjPWMucmVwbGFjZSgvMCskL2csXCJcIik7Yis9XCIuXCIrY319Yis9XCJaXCI7cmV0dXJuIGJ9ZnVuY3Rpb24gdXJpY21wdG9oZXgoYSl7cmV0dXJuIGEucmVwbGFjZSgvJS9nLFwiXCIpfWZ1bmN0aW9uIGhleHRvdXJpY21wKGEpe3JldHVybiBhLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKX1mdW5jdGlvbiBpcHY2dG9oZXgoZyl7dmFyIGI9XCJtYWxmb3JtZWQgSVB2NiBhZGRyZXNzXCI7aWYoIWcubWF0Y2goL15bMC05QS1GYS1mOl0rJC8pKXt0aHJvdyBifWc9Zy50b0xvd2VyQ2FzZSgpO3ZhciBkPWcuc3BsaXQoXCI6XCIpLmxlbmd0aC0xO2lmKGQ8Mil7dGhyb3cgYn12YXIgZT1cIjpcIi5yZXBlYXQoNy1kKzIpO2c9Zy5yZXBsYWNlKFwiOjpcIixlKTt2YXIgYz1nLnNwbGl0KFwiOlwiKTtpZihjLmxlbmd0aCE9OCl7dGhyb3cgYn1mb3IodmFyIGY9MDtmPDg7ZisrKXtjW2ZdPShcIjAwMDBcIitjW2ZdKS5zbGljZSgtNCl9cmV0dXJuIGMuam9pbihcIlwiKX1mdW5jdGlvbiBoZXh0b2lwdjYoZSl7aWYoIWUubWF0Y2goL15bMC05QS1GYS1mXXszMn0kLykpe3Rocm93XCJtYWxmb3JtZWQgSVB2NiBhZGRyZXNzIG9jdGV0XCJ9ZT1lLnRvTG93ZXJDYXNlKCk7dmFyIGI9ZS5tYXRjaCgvLnsxLDR9L2cpO2Zvcih2YXIgZD0wO2Q8ODtkKyspe2JbZF09YltkXS5yZXBsYWNlKC9eMCsvLFwiXCIpO2lmKGJbZF09PVwiXCIpe2JbZF09XCIwXCJ9fWU9XCI6XCIrYi5qb2luKFwiOlwiKStcIjpcIjt2YXIgYz1lLm1hdGNoKC86KDA6KXsyLH0vZyk7aWYoYz09PW51bGwpe3JldHVybiBlLnNsaWNlKDEsLTEpfXZhciBmPVwiXCI7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe2lmKGNbZF0ubGVuZ3RoPmYubGVuZ3RoKXtmPWNbZF19fWU9ZS5yZXBsYWNlKGYsXCI6OlwiKTtyZXR1cm4gZS5zbGljZSgxLC0xKX1mdW5jdGlvbiBoZXh0b2lwKGIpe3ZhciBkPVwibWFsZm9ybWVkIGhleCB2YWx1ZVwiO2lmKCFiLm1hdGNoKC9eKFswLTlBLUZhLWZdWzAtOUEtRmEtZl0pezEsfSQvKSl7dGhyb3cgZH1pZihiLmxlbmd0aD09OCl7dmFyIGM7dHJ5e2M9cGFyc2VJbnQoYi5zdWJzdHIoMCwyKSwxNikrXCIuXCIrcGFyc2VJbnQoYi5zdWJzdHIoMiwyKSwxNikrXCIuXCIrcGFyc2VJbnQoYi5zdWJzdHIoNCwyKSwxNikrXCIuXCIrcGFyc2VJbnQoYi5zdWJzdHIoNiwyKSwxNik7cmV0dXJuIGN9Y2F0Y2goYSl7dGhyb3cgZH19ZWxzZXtpZihiLmxlbmd0aD09MzIpe3JldHVybiBoZXh0b2lwdjYoYil9ZWxzZXtyZXR1cm4gYn19fWZ1bmN0aW9uIGlwdG9oZXgoZil7dmFyIGo9XCJtYWxmb3JtZWQgSVAgYWRkcmVzc1wiO2Y9Zi50b0xvd2VyQ2FzZShmKTtpZihmLm1hdGNoKC9eWzAtOS5dKyQvKSl7dmFyIGI9Zi5zcGxpdChcIi5cIik7aWYoYi5sZW5ndGghPT00KXt0aHJvdyBqfXZhciBnPVwiXCI7dHJ5e2Zvcih2YXIgZT0wO2U8NDtlKyspe3ZhciBoPXBhcnNlSW50KGJbZV0pO2crPShcIjBcIitoLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfXJldHVybiBnfWNhdGNoKGMpe3Rocm93IGp9fWVsc2V7aWYoZi5tYXRjaCgvXlswLTlhLWY6XSskLykmJmYuaW5kZXhPZihcIjpcIikhPT0tMSl7cmV0dXJuIGlwdjZ0b2hleChmKX1lbHNle3Rocm93IGp9fX1mdW5jdGlvbiBlbmNvZGVVUklDb21wb25lbnRBbGwoYSl7dmFyIGQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO3ZhciBiPVwiXCI7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe2lmKGRbY109PVwiJVwiKXtiPWIrZC5zdWJzdHIoYywzKTtjPWMrMn1lbHNle2I9YitcIiVcIitzdG9oZXgoZFtjXSl9fXJldHVybiBifWZ1bmN0aW9uIG5ld2xpbmVfdG9Vbml4KGEpe2E9YS5yZXBsYWNlKC9cXHJcXG4vbWcsXCJcXG5cIik7cmV0dXJuIGF9ZnVuY3Rpb24gbmV3bGluZV90b0RvcyhhKXthPWEucmVwbGFjZSgvXFxyXFxuL21nLFwiXFxuXCIpO2E9YS5yZXBsYWNlKC9cXG4vbWcsXCJcXHJcXG5cIik7cmV0dXJuIGF9S0pVUi5sYW5nLlN0cmluZy5pc0ludGVnZXI9ZnVuY3Rpb24oYSl7aWYoYS5tYXRjaCgvXlswLTldKyQvKSl7cmV0dXJuIHRydWV9ZWxzZXtpZihhLm1hdGNoKC9eLVswLTldKyQvKSl7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gZmFsc2V9fX07S0pVUi5sYW5nLlN0cmluZy5pc0hleD1mdW5jdGlvbihhKXtpZihhLmxlbmd0aCUyPT0wJiYoYS5tYXRjaCgvXlswLTlhLWZdKyQvKXx8YS5tYXRjaCgvXlswLTlBLUZdKyQvKSkpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX07S0pVUi5sYW5nLlN0cmluZy5pc0Jhc2U2ND1mdW5jdGlvbihhKXthPWEucmVwbGFjZSgvXFxzKy9nLFwiXCIpO2lmKGEubWF0Y2goL15bMC05QS1aYS16K1xcL10rPXswLDN9JC8pJiZhLmxlbmd0aCU0PT0wKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19O0tKVVIubGFuZy5TdHJpbmcuaXNCYXNlNjRVUkw9ZnVuY3Rpb24oYSl7aWYoYS5tYXRjaCgvWysvPV0vKSl7cmV0dXJuIGZhbHNlfWE9YjY0dXRvYjY0KGEpO3JldHVybiBLSlVSLmxhbmcuU3RyaW5nLmlzQmFzZTY0KGEpfTtLSlVSLmxhbmcuU3RyaW5nLmlzSW50ZWdlckFycmF5PWZ1bmN0aW9uKGEpe2E9YS5yZXBsYWNlKC9cXHMrL2csXCJcIik7aWYoYS5tYXRjaCgvXlxcW1swLTksXStcXF0kLykpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX07ZnVuY3Rpb24gaGV4dG9wb3NoZXgoYSl7aWYoYS5sZW5ndGglMj09MSl7cmV0dXJuXCIwXCIrYX1pZihhLnN1YnN0cigwLDEpPlwiN1wiKXtyZXR1cm5cIjAwXCIrYX1yZXR1cm4gYX1mdW5jdGlvbiBpbnRhcnlzdHJ0b2hleChiKXtiPWIucmVwbGFjZSgvXlxccypcXFtcXHMqLyxcIlwiKTtiPWIucmVwbGFjZSgvXFxzKlxcXVxccyokLyxcIlwiKTtiPWIucmVwbGFjZSgvXFxzKi9nLFwiXCIpO3RyeXt2YXIgYz1iLnNwbGl0KC8sLykubWFwKGZ1bmN0aW9uKGcsZSxoKXt2YXIgZj1wYXJzZUludChnKTtpZihmPDB8fDI1NTxmKXt0aHJvd1wiaW50ZWdlciBub3QgaW4gcmFuZ2UgMC0yNTVcIn12YXIgZD0oXCIwMFwiK2YudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7cmV0dXJuIGR9KS5qb2luKFwiXCIpO3JldHVybiBjfWNhdGNoKGEpe3Rocm93XCJtYWxmb3JtZWQgaW50ZWdlciBhcnJheSBzdHJpbmc6IFwiK2F9fXZhciBzdHJkaWZmaWR4PWZ1bmN0aW9uKGMsYSl7dmFyIGQ9Yy5sZW5ndGg7aWYoYy5sZW5ndGg+YS5sZW5ndGgpe2Q9YS5sZW5ndGh9Zm9yKHZhciBiPTA7YjxkO2IrKyl7aWYoYy5jaGFyQ29kZUF0KGIpIT1hLmNoYXJDb2RlQXQoYikpe3JldHVybiBifX1pZihjLmxlbmd0aCE9YS5sZW5ndGgpe3JldHVybiBkfXJldHVybiAtMX07XG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLlV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5ESUdFU1RJTkZPSEVBRD17c2hhMTpcIjMwMjEzMDA5MDYwNTJiMGUwMzAyMWEwNTAwMDQxNFwiLHNoYTIyNDpcIjMwMmQzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwNDA1MDAwNDFjXCIsc2hhMjU2OlwiMzAzMTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAxMDUwMDA0MjBcIixzaGEzODQ6XCIzMDQxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDIwNTAwMDQzMFwiLHNoYTUxMjpcIjMwNTEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMzA1MDAwNDQwXCIsbWQyOlwiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwMjA1MDAwNDEwXCIsbWQ1OlwiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwNTA1MDAwNDEwXCIscmlwZW1kMTYwOlwiMzAyMTMwMDkwNjA1MmIyNDAzMDIwMTA1MDAwNDE0XCIsfTt0aGlzLkRFRkFVTFRQUk9WSURFUj17bWQ1OlwiY3J5cHRvanNcIixzaGExOlwiY3J5cHRvanNcIixzaGEyMjQ6XCJjcnlwdG9qc1wiLHNoYTI1NjpcImNyeXB0b2pzXCIsc2hhMzg0OlwiY3J5cHRvanNcIixzaGE1MTI6XCJjcnlwdG9qc1wiLHJpcGVtZDE2MDpcImNyeXB0b2pzXCIsaG1hY21kNTpcImNyeXB0b2pzXCIsaG1hY3NoYTE6XCJjcnlwdG9qc1wiLGhtYWNzaGEyMjQ6XCJjcnlwdG9qc1wiLGhtYWNzaGEyNTY6XCJjcnlwdG9qc1wiLGhtYWNzaGEzODQ6XCJjcnlwdG9qc1wiLGhtYWNzaGE1MTI6XCJjcnlwdG9qc1wiLGhtYWNyaXBlbWQxNjA6XCJjcnlwdG9qc1wiLE1ENXdpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyNTZ3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixSSVBFTUQxNjB3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixNRDV3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTUxMndpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsTUQ1d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBNTEyd2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFJJUEVNRDE2MHdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIix9O3RoaXMuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRT17bWQ1OkNyeXB0b0pTLmFsZ28uTUQ1LHNoYTE6Q3J5cHRvSlMuYWxnby5TSEExLHNoYTIyNDpDcnlwdG9KUy5hbGdvLlNIQTIyNCxzaGEyNTY6Q3J5cHRvSlMuYWxnby5TSEEyNTYsc2hhMzg0OkNyeXB0b0pTLmFsZ28uU0hBMzg0LHNoYTUxMjpDcnlwdG9KUy5hbGdvLlNIQTUxMixyaXBlbWQxNjA6Q3J5cHRvSlMuYWxnby5SSVBFTUQxNjB9O3RoaXMuZ2V0RGlnZXN0SW5mb0hleD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiB0aGlzLkRJR0VTVElORk9IRUFEW2JdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiYWxnIG5vdCBzdXBwb3J0ZWQgaW4gVXRpbC5ESUdFU1RJTkZPSEVBRDogXCIrYn1yZXR1cm4gdGhpcy5ESUdFU1RJTkZPSEVBRFtiXSthfTt0aGlzLmdldFBhZGRlZERpZ2VzdEluZm9IZXg9ZnVuY3Rpb24oaCxhLGope3ZhciBjPXRoaXMuZ2V0RGlnZXN0SW5mb0hleChoLGEpO3ZhciBkPWovNDtpZihjLmxlbmd0aCsyMj5kKXt0aHJvd1wia2V5IGlzIHRvbyBzaG9ydCBmb3IgU2lnQWxnOiBrZXlsZW49XCIraitcIixcIithfXZhciBiPVwiMDAwMVwiO3ZhciBrPVwiMDBcIitjO3ZhciBnPVwiXCI7dmFyIGw9ZC1iLmxlbmd0aC1rLmxlbmd0aDtmb3IodmFyIGY9MDtmPGw7Zis9Mil7Zys9XCJmZlwifXZhciBlPWIrZytrO3JldHVybiBlfTt0aGlzLmhhc2hTdHJpbmc9ZnVuY3Rpb24oYSxjKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOmN9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuaGFzaEhleD1mdW5jdGlvbihiLGMpe3ZhciBhPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6Y30pO3JldHVybiBhLmRpZ2VzdEhleChiKX07dGhpcy5zaGExPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGExXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhMjU2PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGEyNTZcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5zaGEyNTZIZXg9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTI1NlwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0SGV4KGEpfTt0aGlzLnNoYTUxMj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhNTEyXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhNTEySGV4PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGE1MTJcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdEhleChhKX19O0tKVVIuY3J5cHRvLlV0aWwubWQ1PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJtZDVcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07S0pVUi5jcnlwdG8uVXRpbC5yaXBlbWQxNjA9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInJpcGVtZDE2MFwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTtLSlVSLmNyeXB0by5VdGlsLlNFQ1VSRVJBTkRPTUdFTj1uZXcgU2VjdXJlUmFuZG9tKCk7S0pVUi5jcnlwdG8uVXRpbC5nZXRSYW5kb21IZXhPZk5ieXRlcz1mdW5jdGlvbihiKXt2YXIgYT1uZXcgQXJyYXkoYik7S0pVUi5jcnlwdG8uVXRpbC5TRUNVUkVSQU5ET01HRU4ubmV4dEJ5dGVzKGEpO3JldHVybiBCQXRvaGV4KGEpfTtLSlVSLmNyeXB0by5VdGlsLmdldFJhbmRvbUJpZ0ludGVnZXJPZk5ieXRlcz1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoS0pVUi5jcnlwdG8uVXRpbC5nZXRSYW5kb21IZXhPZk5ieXRlcyhhKSwxNil9O0tKVVIuY3J5cHRvLlV0aWwuZ2V0UmFuZG9tSGV4T2ZOYml0cz1mdW5jdGlvbihkKXt2YXIgYz1kJTg7dmFyIGE9KGQtYykvODt2YXIgYj1uZXcgQXJyYXkoYSsxKTtLSlVSLmNyeXB0by5VdGlsLlNFQ1VSRVJBTkRPTUdFTi5uZXh0Qnl0ZXMoYik7YlswXT0oKCgyNTU8PGMpJjI1NSleMjU1KSZiWzBdO3JldHVybiBCQXRvaGV4KGIpfTtLSlVSLmNyeXB0by5VdGlsLmdldFJhbmRvbUJpZ0ludGVnZXJPZk5iaXRzPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgQmlnSW50ZWdlcihLSlVSLmNyeXB0by5VdGlsLmdldFJhbmRvbUhleE9mTmJpdHMoYSksMTYpfTtLSlVSLmNyeXB0by5VdGlsLmdldFJhbmRvbUJpZ0ludGVnZXJaZXJvVG9NYXg9ZnVuY3Rpb24oYil7dmFyIGE9Yi5iaXRMZW5ndGgoKTt3aGlsZSgxKXt2YXIgYz1LSlVSLmNyeXB0by5VdGlsLmdldFJhbmRvbUJpZ0ludGVnZXJPZk5iaXRzKGEpO2lmKGIuY29tcGFyZVRvKGMpIT0tMSl7cmV0dXJuIGN9fX07S0pVUi5jcnlwdG8uVXRpbC5nZXRSYW5kb21CaWdJbnRlZ2VyTWluVG9NYXg9ZnVuY3Rpb24oZSxiKXt2YXIgYz1lLmNvbXBhcmVUbyhiKTtpZihjPT0xKXt0aHJvd1wiYmlNaW4gaXMgZ3JlYXRlciB0aGFuIGJpTWF4XCJ9aWYoYz09MCl7cmV0dXJuIGV9dmFyIGE9Yi5zdWJ0cmFjdChlKTt2YXIgZD1LSlVSLmNyeXB0by5VdGlsLmdldFJhbmRvbUJpZ0ludGVnZXJaZXJvVG9NYXgoYSk7cmV0dXJuIGQuYWRkKGUpfTtLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0PWZ1bmN0aW9uKGMpe3ZhciBiPW51bGw7dmFyIGE9bnVsbDt2YXIgZD1udWxsO3RoaXMuc2V0QWxnQW5kUHJvdmlkZXI9ZnVuY3Rpb24oZyxmKXtnPUtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3QuZ2V0Q2Fub25pY2FsQWxnTmFtZShnKTtpZihnIT09bnVsbCYmZj09PXVuZGVmaW5lZCl7Zj1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUltnXX1pZihcIjptZDU6c2hhMTpzaGEyMjQ6c2hhMjU2OnNoYTM4NDpzaGE1MTI6cmlwZW1kMTYwOlwiLmluZGV4T2YoZykhPS0xJiZmPT1cImNyeXB0b2pzXCIpe3RyeXt0aGlzLm1kPUtKVVIuY3J5cHRvLlV0aWwuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRVtnXS5jcmVhdGUoKX1jYXRjaChlKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK2crXCIvXCIrZX10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihoKXt0aGlzLm1kLnVwZGF0ZShoKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oaCl7dmFyIGk9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShoKTt0aGlzLm1kLnVwZGF0ZShpKX07dGhpcy5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLm1kLmZpbmFsaXplKCk7cmV0dXJuIGgudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleCl9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlU3RyaW5nKGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZUhleChoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX19aWYoXCI6c2hhMjU2OlwiLmluZGV4T2YoZykhPS0xJiZmPT1cInNqY2xcIil7dHJ5e3RoaXMubWQ9bmV3IHNqY2wuaGFzaC5zaGEyNTYoKX1jYXRjaChlKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK2crXCIvXCIrZX10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihoKXt0aGlzLm1kLnVwZGF0ZShoKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oaSl7dmFyIGg9c2pjbC5jb2RlYy5oZXgudG9CaXRzKGkpO3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBoPXRoaXMubWQuZmluYWxpemUoKTtyZXR1cm4gc2pjbC5jb2RlYy5oZXguZnJvbUJpdHMoaCl9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlU3RyaW5nKGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZUhleChoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX19fTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihlKXt0aHJvd1widXBkYXRlU3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGUpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3Q9ZnVuY3Rpb24oKXt0aHJvd1wiZGlnZXN0KCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGUpe3Rocm93XCJkaWdlc3RTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3RIZXg9ZnVuY3Rpb24oZSl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTtpZihjIT09dW5kZWZpbmVkKXtpZihjLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPWMuYWxnO2lmKGMucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfXRoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpfX19O0tKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3QuZ2V0Q2Fub25pY2FsQWxnTmFtZT1mdW5jdGlvbihhKXtpZih0eXBlb2YgYT09PVwic3RyaW5nXCIpe2E9YS50b0xvd2VyQ2FzZSgpO2E9YS5yZXBsYWNlKC8tLyxcIlwiKX1yZXR1cm4gYX07S0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdC5nZXRIYXNoTGVuZ3RoPWZ1bmN0aW9uKGMpe3ZhciBiPUtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Q7dmFyIGE9Yi5nZXRDYW5vbmljYWxBbGdOYW1lKGMpO2lmKGIuSEFTSExFTkdUSFthXT09PXVuZGVmaW5lZCl7dGhyb3dcIm5vdCBzdXBwb3J0ZWQgYWxnb3JpdGhtOiBcIitjfXJldHVybiBiLkhBU0hMRU5HVEhbYV19O0tKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3QuSEFTSExFTkdUSD17bWQ1OjE2LHNoYTE6MjAsc2hhMjI0OjI4LHNoYTI1NjozMixzaGEzODQ6NDgsc2hhNTEyOjY0LHJpcGVtZDE2MDoyMH07S0pVUi5jcnlwdG8uTWFjPWZ1bmN0aW9uKGQpe3ZhciBmPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKGssaSl7az1rLnRvTG93ZXJDYXNlKCk7aWYoaz09bnVsbCl7az1cImhtYWNzaGExXCJ9az1rLnRvTG93ZXJDYXNlKCk7aWYoay5zdWJzdHIoMCw0KSE9XCJobWFjXCIpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciB1bnN1cHBvcnRlZCBITUFDIGFsZzogXCIra31pZihpPT09dW5kZWZpbmVkKXtpPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW2tdfXRoaXMuYWxnUHJvdj1rK1wiL1wiK2k7dmFyIGc9ay5zdWJzdHIoNCk7aWYoXCI6bWQ1OnNoYTE6c2hhMjI0OnNoYTI1NjpzaGEzODQ6c2hhNTEyOnJpcGVtZDE2MDpcIi5pbmRleE9mKGcpIT0tMSYmaT09XCJjcnlwdG9qc1wiKXt0cnl7dmFyIGo9S0pVUi5jcnlwdG8uVXRpbC5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FW2ddO3RoaXMubWFjPUNyeXB0b0pTLmFsZ28uSE1BQy5jcmVhdGUoaix0aGlzLnBhc3MpfWNhdGNoKGgpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBoYXNoQWxnPVwiK2crXCIvXCIraH10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihsKXt0aGlzLm1hYy51cGRhdGUobCl9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGwpe3ZhciBtPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UobCk7dGhpcy5tYWMudXBkYXRlKG0pfTt0aGlzLmRvRmluYWw9ZnVuY3Rpb24oKXt2YXIgbD10aGlzLm1hYy5maW5hbGl6ZSgpO3JldHVybiBsLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5IZXgpfTt0aGlzLmRvRmluYWxTdHJpbmc9ZnVuY3Rpb24obCl7dGhpcy51cGRhdGVTdHJpbmcobCk7cmV0dXJuIHRoaXMuZG9GaW5hbCgpfTt0aGlzLmRvRmluYWxIZXg9ZnVuY3Rpb24obCl7dGhpcy51cGRhdGVIZXgobCk7cmV0dXJuIHRoaXMuZG9GaW5hbCgpfX19O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGcpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGcpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbD1mdW5jdGlvbigpe3Rocm93XCJkaWdlc3QoKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbFN0cmluZz1mdW5jdGlvbihnKXt0aHJvd1wiZGlnZXN0U3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWxIZXg9ZnVuY3Rpb24oZyl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5zZXRQYXNzd29yZD1mdW5jdGlvbihoKXtpZih0eXBlb2YgaD09XCJzdHJpbmdcIil7dmFyIGc9aDtpZihoLmxlbmd0aCUyPT0xfHwhaC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7Zz1yc3RydG9oZXgoaCl9dGhpcy5wYXNzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoZyk7cmV0dXJufWlmKHR5cGVvZiBoIT1cIm9iamVjdFwiKXt0aHJvd1wiS0pVUi5jcnlwdG8uTWFjIHVuc3VwcG9ydGVkIHBhc3N3b3JkIHR5cGU6IFwiK2h9dmFyIGc9bnVsbDtpZihoLmhleCE9PXVuZGVmaW5lZCl7aWYoaC5oZXgubGVuZ3RoJTIhPTB8fCFoLmhleC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7dGhyb3dcIk1hYzogd3JvbmcgaGV4IHBhc3N3b3JkOiBcIitoLmhleH1nPWguaGV4fWlmKGgudXRmOCE9PXVuZGVmaW5lZCl7Zz11dGY4dG9oZXgoaC51dGY4KX1pZihoLnJzdHIhPT11bmRlZmluZWQpe2c9cnN0cnRvaGV4KGgucnN0cil9aWYoaC5iNjQhPT11bmRlZmluZWQpe2c9YjY0dG9oZXgoaC5iNjQpfWlmKGguYjY0dSE9PXVuZGVmaW5lZCl7Zz1iNjR1dG9oZXgoaC5iNjR1KX1pZihnPT1udWxsKXt0aHJvd1wiS0pVUi5jcnlwdG8uTWFjIHVuc3VwcG9ydGVkIHBhc3N3b3JkIHR5cGU6IFwiK2h9dGhpcy5wYXNzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoZyl9O2lmKGQhPT11bmRlZmluZWQpe2lmKGQucGFzcyE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQYXNzd29yZChkLnBhc3MpfWlmKGQuYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9ZC5hbGc7aWYoZC5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19dGhpcy5zZXRBbGdBbmRQcm92aWRlcih0aGlzLmFsZ05hbWUsdGhpcy5wcm92TmFtZSl9fX07S0pVUi5jcnlwdG8uU2lnbmF0dXJlPWZ1bmN0aW9uKG8pe3ZhciBxPW51bGw7dmFyIG49bnVsbDt2YXIgcj1udWxsO3ZhciBjPW51bGw7dmFyIGw9bnVsbDt2YXIgZD1udWxsO3ZhciBrPW51bGw7dmFyIGg9bnVsbDt2YXIgcD1udWxsO3ZhciBlPW51bGw7dmFyIGI9LTE7dmFyIGc9bnVsbDt2YXIgaj1udWxsO3ZhciBhPW51bGw7dmFyIGk9bnVsbDt2YXIgZj1udWxsO3RoaXMuX3NldEFsZ05hbWVzPWZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5hbGdOYW1lLm1hdGNoKC9eKC4rKXdpdGgoLispJC8pO2lmKHMpe3RoaXMubWRBbGdOYW1lPXNbMV0udG9Mb3dlckNhc2UoKTt0aGlzLnB1YmtleUFsZ05hbWU9c1syXS50b0xvd2VyQ2FzZSgpfX07dGhpcy5femVyb1BhZGRpbmdPZlNpZ25hdHVyZT1mdW5jdGlvbih4LHcpe3ZhciB2PVwiXCI7dmFyIHQ9dy80LXgubGVuZ3RoO2Zvcih2YXIgdT0wO3U8dDt1Kyspe3Y9ditcIjBcIn1yZXR1cm4gdit4fTt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKHUsdCl7dGhpcy5fc2V0QWxnTmFtZXMoKTtpZih0IT1cImNyeXB0b2pzL2pzcnNhXCIpe3Rocm93XCJwcm92aWRlciBub3Qgc3VwcG9ydGVkOiBcIit0fWlmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZih0aGlzLm1kQWxnTmFtZSkhPS0xKXt0cnl7dGhpcy5tZD1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOnRoaXMubWRBbGdOYW1lfSl9Y2F0Y2gocyl7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIGhhc2ggYWxnIHNldCBmYWlsIGFsZz1cIit0aGlzLm1kQWxnTmFtZStcIi9cIitzfXRoaXMuaW5pdD1mdW5jdGlvbih3LHgpe3ZhciB5PW51bGw7dHJ5e2lmKHg9PT11bmRlZmluZWQpe3k9S0VZVVRJTC5nZXRLZXkodyl9ZWxzZXt5PUtFWVVUSUwuZ2V0S2V5KHcseCl9fWNhdGNoKHYpe3Rocm93XCJpbml0IGZhaWxlZDpcIit2fWlmKHkuaXNQcml2YXRlPT09dHJ1ZSl7dGhpcy5wcnZLZXk9eTt0aGlzLnN0YXRlPVwiU0lHTlwifWVsc2V7aWYoeS5pc1B1YmxpYz09PXRydWUpe3RoaXMucHViS2V5PXk7dGhpcy5zdGF0ZT1cIlZFUklGWVwifWVsc2V7dGhyb3dcImluaXQgZmFpbGVkLjpcIit5fX19O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKHYpe3RoaXMubWQudXBkYXRlU3RyaW5nKHYpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbih2KXt0aGlzLm1kLnVwZGF0ZUhleCh2KX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5zSGFzaEhleD10aGlzLm1kLmRpZ2VzdCgpO2lmKHR5cGVvZiB0aGlzLmVjcHJ2aGV4IT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5lY2N1cnZlbmFtZSE9XCJ1bmRlZmluZWRcIil7dmFyIHY9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp0aGlzLmVjY3VydmVuYW1lfSk7dGhpcy5oU2lnbj12LnNpZ25IZXgodGhpcy5zSGFzaEhleCx0aGlzLmVjcHJ2aGV4KX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PT1cInJzYWFuZG1nZjFcIil7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKHRoaXMuc0hhc2hIZXgsdGhpcy5tZEFsZ05hbWUsdGhpcy5wc3NTYWx0TGVuKX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PT1cInJzYVwiKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCx0aGlzLm1kQWxnTmFtZSl9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCl9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgpfWVsc2V7dGhyb3dcIlNpZ25hdHVyZTogdW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnOiBcIit0aGlzLnB1YmtleUFsZ05hbWV9fX19fXJldHVybiB0aGlzLmhTaWdufTt0aGlzLnNpZ25TdHJpbmc9ZnVuY3Rpb24odil7dGhpcy51cGRhdGVTdHJpbmcodik7cmV0dXJuIHRoaXMuc2lnbigpfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24odil7dGhpcy51cGRhdGVIZXgodik7cmV0dXJuIHRoaXMuc2lnbigpfTt0aGlzLnZlcmlmeT1mdW5jdGlvbih2KXt0aGlzLnNIYXNoSGV4PXRoaXMubWQuZGlnZXN0KCk7aWYodHlwZW9mIHRoaXMuZWNwdWJoZXghPVwidW5kZWZpbmVkXCImJnR5cGVvZiB0aGlzLmVjY3VydmVuYW1lIT1cInVuZGVmaW5lZFwiKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnRoaXMuZWNjdXJ2ZW5hbWV9KTtyZXR1cm4gdy52ZXJpZnlIZXgodGhpcy5zSGFzaEhleCx2LHRoaXMuZWNwdWJoZXgpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09PVwicnNhYW5kbWdmMVwiKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTKHRoaXMuc0hhc2hIZXgsdix0aGlzLm1kQWxnTmFtZSx0aGlzLnBzc1NhbHRMZW4pfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09PVwicnNhXCIpe3JldHVybiB0aGlzLnB1YktleS52ZXJpZnlXaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCx2KX1lbHNle2lmKEtKVVIuY3J5cHRvLkVDRFNBIT09dW5kZWZpbmVkJiZ0aGlzLnB1YktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXtpZihLSlVSLmNyeXB0by5EU0EhPT11bmRlZmluZWQmJnRoaXMucHViS2V5IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXt0aHJvd1wiU2lnbmF0dXJlOiB1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZzogXCIrdGhpcy5wdWJrZXlBbGdOYW1lfX19fX19fX07dGhpcy5pbml0PWZ1bmN0aW9uKHMsdCl7dGhyb3dcImluaXQoa2V5LCBwYXNzKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3Rocm93XCJzaWduKCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnNpZ25TdHJpbmc9ZnVuY3Rpb24ocyl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJkaWdlc3RIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKHMpe3Rocm93XCJ2ZXJpZnkoaFNpZ1ZhbCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRQYXJhbXM9bztpZihvIT09dW5kZWZpbmVkKXtpZihvLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPW8uYWxnO2lmKG8ucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfWVsc2V7dGhpcy5wcm92TmFtZT1vLnByb3Z9dGhpcy5hbGdQcm92TmFtZT10aGlzLmFsZ05hbWUrXCI6XCIrdGhpcy5wcm92TmFtZTt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyKHRoaXMuYWxnTmFtZSx0aGlzLnByb3ZOYW1lKTt0aGlzLl9zZXRBbGdOYW1lcygpfWlmKG8ucHNzc2FsdGxlbiE9PXVuZGVmaW5lZCl7dGhpcy5wc3NTYWx0TGVuPW8ucHNzc2FsdGxlbn1pZihvLnBydmtleXBlbSE9PXVuZGVmaW5lZCl7aWYoby5wcnZrZXlwYXMhPT11bmRlZmluZWQpe3Rocm93XCJib3RoIHBydmtleXBlbSBhbmQgcHJ2a2V5cGFzIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZFwifWVsc2V7dHJ5e3ZhciBxPUtFWVVUSUwuZ2V0S2V5KG8ucHJ2a2V5cGVtKTt0aGlzLmluaXQocSl9Y2F0Y2gobSl7dGhyb3dcImZhdGFsIGVycm9yIHRvIGxvYWQgcGVtIHByaXZhdGUga2V5OiBcIittfX19fX07S0pVUi5jcnlwdG8uQ2lwaGVyPWZ1bmN0aW9uKGEpe307S0pVUi5jcnlwdG8uQ2lwaGVyLmVuY3J5cHQ9ZnVuY3Rpb24oZSxmLGQpe2lmKGYgaW5zdGFuY2VvZiBSU0FLZXkmJmYuaXNQdWJsaWMpe3ZhciBjPUtKVVIuY3J5cHRvLkNpcGhlci5nZXRBbGdCeUtleUFuZE5hbWUoZixkKTtpZihjPT09XCJSU0FcIil7cmV0dXJuIGYuZW5jcnlwdChlKX1pZihjPT09XCJSU0FPQUVQXCIpe3JldHVybiBmLmVuY3J5cHRPQUVQKGUsXCJzaGExXCIpfXZhciBiPWMubWF0Y2goL15SU0FPQUVQKFxcZCspJC8pO2lmKGIhPT1udWxsKXtyZXR1cm4gZi5lbmNyeXB0T0FFUChlLFwic2hhXCIrYlsxXSl9dGhyb3dcIkNpcGhlci5lbmNyeXB0OiB1bnN1cHBvcnRlZCBhbGdvcml0aG0gZm9yIFJTQUtleTogXCIrZH1lbHNle3Rocm93XCJDaXBoZXIuZW5jcnlwdDogdW5zdXBwb3J0ZWQga2V5IG9yIGFsZ29yaXRobVwifX07S0pVUi5jcnlwdG8uQ2lwaGVyLmRlY3J5cHQ9ZnVuY3Rpb24oZSxmLGQpe2lmKGYgaW5zdGFuY2VvZiBSU0FLZXkmJmYuaXNQcml2YXRlKXt2YXIgYz1LSlVSLmNyeXB0by5DaXBoZXIuZ2V0QWxnQnlLZXlBbmROYW1lKGYsZCk7aWYoYz09PVwiUlNBXCIpe3JldHVybiBmLmRlY3J5cHQoZSl9aWYoYz09PVwiUlNBT0FFUFwiKXtyZXR1cm4gZi5kZWNyeXB0T0FFUChlLFwic2hhMVwiKX12YXIgYj1jLm1hdGNoKC9eUlNBT0FFUChcXGQrKSQvKTtpZihiIT09bnVsbCl7cmV0dXJuIGYuZGVjcnlwdE9BRVAoZSxcInNoYVwiK2JbMV0pfXRocm93XCJDaXBoZXIuZGVjcnlwdDogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtIGZvciBSU0FLZXk6IFwiK2R9ZWxzZXt0aHJvd1wiQ2lwaGVyLmRlY3J5cHQ6IHVuc3VwcG9ydGVkIGtleSBvciBhbGdvcml0aG1cIn19O0tKVVIuY3J5cHRvLkNpcGhlci5nZXRBbGdCeUtleUFuZE5hbWU9ZnVuY3Rpb24oYixhKXtpZihiIGluc3RhbmNlb2YgUlNBS2V5KXtpZihcIjpSU0E6UlNBT0FFUDpSU0FPQUVQMjI0OlJTQU9BRVAyNTY6UlNBT0FFUDM4NDpSU0FPQUVQNTEyOlwiLmluZGV4T2YoYSkhPS0xKXtyZXR1cm4gYX1pZihhPT09bnVsbHx8YT09PXVuZGVmaW5lZCl7cmV0dXJuXCJSU0FcIn10aHJvd1wiZ2V0QWxnQnlLZXlBbmROYW1lOiBub3Qgc3VwcG9ydGVkIGFsZ29yaXRobSBuYW1lIGZvciBSU0FLZXk6IFwiK2F9dGhyb3dcImdldEFsZ0J5S2V5QW5kTmFtZTogbm90IHN1cHBvcnRlZCBhbGdvcml0aG0gbmFtZTogXCIrYX07S0pVUi5jcnlwdG8uT0lEPW5ldyBmdW5jdGlvbigpe3RoaXMub2lkaGV4Mm5hbWU9e1wiMmE4NjQ4ODZmNzBkMDEwMTAxXCI6XCJyc2FFbmNyeXB0aW9uXCIsXCIyYTg2NDhjZTNkMDIwMVwiOlwiZWNQdWJsaWNLZXlcIixcIjJhODY0OGNlMzgwNDAxXCI6XCJkc2FcIixcIjJhODY0OGNlM2QwMzAxMDdcIjpcInNlY3AyNTZyMVwiLFwiMmI4MTA0MDAxZlwiOlwic2VjcDE5MmsxXCIsXCIyYjgxMDQwMDIxXCI6XCJzZWNwMjI0cjFcIixcIjJiODEwNDAwMGFcIjpcInNlY3AyNTZrMVwiLFwiMmI4MTA0MDAyM1wiOlwic2VjcDUyMXIxXCIsXCIyYjgxMDQwMDIyXCI6XCJzZWNwMzg0cjFcIixcIjJhODY0OGNlMzgwNDAzXCI6XCJTSEExd2l0aERTQVwiLFwiNjA4NjQ4MDE2NTAzMDQwMzAxXCI6XCJTSEEyMjR3aXRoRFNBXCIsXCI2MDg2NDgwMTY1MDMwNDAzMDJcIjpcIlNIQTI1NndpdGhEU0FcIix9fTtcbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5jcnlwdG89PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmNyeXB0byl7S0pVUi5jcnlwdG89e319S0pVUi5jcnlwdG8uRUNEU0E9ZnVuY3Rpb24oaCl7dmFyIGU9XCJzZWNwMjU2cjFcIjt2YXIgZz1udWxsO3ZhciBiPW51bGw7dmFyIGY9bnVsbDt2YXIgYT1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIGQ9bnVsbDt0aGlzLnR5cGU9XCJFQ1wiO3RoaXMuaXNQcml2YXRlPWZhbHNlO3RoaXMuaXNQdWJsaWM9ZmFsc2U7ZnVuY3Rpb24gYyhzLG8scixuKXt2YXIgaj1NYXRoLm1heChvLmJpdExlbmd0aCgpLG4uYml0TGVuZ3RoKCkpO3ZhciB0PXMuYWRkMkQocik7dmFyIHE9cy5jdXJ2ZS5nZXRJbmZpbml0eSgpO2Zvcih2YXIgcD1qLTE7cD49MDstLXApe3E9cS50d2ljZTJEKCk7cS56PUJpZ0ludGVnZXIuT05FO2lmKG8udGVzdEJpdChwKSl7aWYobi50ZXN0Qml0KHApKXtxPXEuYWRkMkQodCl9ZWxzZXtxPXEuYWRkMkQocyl9fWVsc2V7aWYobi50ZXN0Qml0KHApKXtxPXEuYWRkMkQocil9fX1yZXR1cm4gcX10aGlzLmdldEJpZ1JhbmRvbT1mdW5jdGlvbihpKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoaS5iaXRMZW5ndGgoKSxhKS5tb2QoaS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpLmFkZChCaWdJbnRlZ2VyLk9ORSl9O3RoaXMuc2V0TmFtZWRDdXJ2ZT1mdW5jdGlvbihpKXt0aGlzLmVjcGFyYW1zPUtKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIuZ2V0QnlOYW1lKGkpO3RoaXMucHJ2S2V5SGV4PW51bGw7dGhpcy5wdWJLZXlIZXg9bnVsbDt0aGlzLmN1cnZlTmFtZT1pfTt0aGlzLnNldFByaXZhdGVLZXlIZXg9ZnVuY3Rpb24oaSl7dGhpcy5pc1ByaXZhdGU9dHJ1ZTt0aGlzLnBydktleUhleD1pfTt0aGlzLnNldFB1YmxpY0tleUhleD1mdW5jdGlvbihpKXt0aGlzLmlzUHVibGljPXRydWU7dGhpcy5wdWJLZXlIZXg9aX07dGhpcy5nZXRQdWJsaWNLZXlYWUhleD1mdW5jdGlvbigpe3ZhciBrPXRoaXMucHViS2V5SGV4O2lmKGsuc3Vic3RyKDAsMikhPT1cIjA0XCIpe3Rocm93XCJ0aGlzIG1ldGhvZCBzdXBwb3J0cyB1bmNvbXByZXNzZWQgZm9ybWF0KDA0KSBvbmx5XCJ9dmFyIGo9dGhpcy5lY3BhcmFtcy5rZXlsZW4vNDtpZihrLmxlbmd0aCE9PTIraioyKXt0aHJvd1wibWFsZm9ybWVkIHB1YmxpYyBrZXkgaGV4IGxlbmd0aFwifXZhciBpPXt9O2kueD1rLnN1YnN0cigyLGopO2kueT1rLnN1YnN0cigyK2opO3JldHVybiBpfTt0aGlzLmdldFNob3J0TklTVFBDdXJ2ZU5hbWU9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmN1cnZlTmFtZTtpZihpPT09XCJzZWNwMjU2cjFcInx8aT09PVwiTklTVCBQLTI1NlwifHxpPT09XCJQLTI1NlwifHxpPT09XCJwcmltZTI1NnYxXCIpe3JldHVyblwiUC0yNTZcIn1pZihpPT09XCJzZWNwMzg0cjFcInx8aT09PVwiTklTVCBQLTM4NFwifHxpPT09XCJQLTM4NFwiKXtyZXR1cm5cIlAtMzg0XCJ9cmV0dXJuIG51bGx9O3RoaXMuZ2VuZXJhdGVLZXlQYWlySGV4PWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5lY3BhcmFtcy5uO3ZhciBuPXRoaXMuZ2V0QmlnUmFuZG9tKGspO3ZhciBsPXRoaXMuZWNwYXJhbXMuRy5tdWx0aXBseShuKTt2YXIgcT1sLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgbz1sLmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgaT10aGlzLmVjcGFyYW1zLmtleWxlbi80O3ZhciBtPShcIjAwMDAwMDAwMDBcIituLnRvU3RyaW5nKDE2KSkuc2xpY2UoLWkpO3ZhciByPShcIjAwMDAwMDAwMDBcIitxLnRvU3RyaW5nKDE2KSkuc2xpY2UoLWkpO3ZhciBwPShcIjAwMDAwMDAwMDBcIitvLnRvU3RyaW5nKDE2KSkuc2xpY2UoLWkpO3ZhciBqPVwiMDRcIityK3A7dGhpcy5zZXRQcml2YXRlS2V5SGV4KG0pO3RoaXMuc2V0UHVibGljS2V5SGV4KGopO3JldHVybntlY3BydmhleDptLGVjcHViaGV4Omp9fTt0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMuc2lnbkhleChpLHRoaXMucHJ2S2V5SGV4KX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKG8sail7dmFyIHQ9bmV3IEJpZ0ludGVnZXIoaiwxNik7dmFyIGw9dGhpcy5lY3BhcmFtcy5uO3ZhciBxPW5ldyBCaWdJbnRlZ2VyKG8sMTYpO2Rve3ZhciBtPXRoaXMuZ2V0QmlnUmFuZG9tKGwpO3ZhciB1PXRoaXMuZWNwYXJhbXMuRzt2YXIgcD11Lm11bHRpcGx5KG0pO3ZhciBpPXAuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZChsKX13aGlsZShpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPD0wKTt2YXIgdj1tLm1vZEludmVyc2UobCkubXVsdGlwbHkocS5hZGQodC5tdWx0aXBseShpKSkpLm1vZChsKTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuYmlSU1NpZ1RvQVNOMVNpZyhpLHYpfTt0aGlzLnNpZ249ZnVuY3Rpb24obSx1KXt2YXIgcT11O3ZhciBqPXRoaXMuZWNwYXJhbXMubjt2YXIgcD1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChtKTtkb3t2YXIgbD10aGlzLmdldEJpZ1JhbmRvbShqKTt2YXIgdD10aGlzLmVjcGFyYW1zLkc7dmFyIG89dC5tdWx0aXBseShsKTt2YXIgaT1vLmdldFgoKS50b0JpZ0ludGVnZXIoKS5tb2Qoail9d2hpbGUoaS5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKTw9MCk7dmFyIHY9bC5tb2RJbnZlcnNlKGopLm11bHRpcGx5KHAuYWRkKHEubXVsdGlwbHkoaSkpKS5tb2Qoaik7cmV0dXJuIHRoaXMuc2VyaWFsaXplU2lnKGksdil9O3RoaXMudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKGosaSl7cmV0dXJuIHRoaXMudmVyaWZ5SGV4KGosaSx0aGlzLnB1YktleUhleCl9O3RoaXMudmVyaWZ5SGV4PWZ1bmN0aW9uKG0saSxwKXt2YXIgbCxqO3ZhciBvPUtKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4KGkpO2w9by5yO2o9by5zO3ZhciBrO2s9RUNQb2ludEZwLmRlY29kZUZyb21IZXgodGhpcy5lY3BhcmFtcy5jdXJ2ZSxwKTt2YXIgbj1uZXcgQmlnSW50ZWdlcihtLDE2KTtyZXR1cm4gdGhpcy52ZXJpZnlSYXcobixsLGosayl9O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKG8scCxqKXt2YXIgbCxpO2lmKEJpdGNvaW4uVXRpbC5pc0FycmF5KHApKXt2YXIgbj10aGlzLnBhcnNlU2lnKHApO2w9bi5yO2k9bi5zfWVsc2V7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBwJiZwLnImJnAucyl7bD1wLnI7aT1wLnN9ZWxzZXt0aHJvd1wiSW52YWxpZCB2YWx1ZSBmb3Igc2lnbmF0dXJlXCJ9fXZhciBrO2lmKGogaW5zdGFuY2VvZiBFQ1BvaW50RnApe2s9an1lbHNle2lmKEJpdGNvaW4uVXRpbC5pc0FycmF5KGopKXtrPUVDUG9pbnRGcC5kZWNvZGVGcm9tKHRoaXMuZWNwYXJhbXMuY3VydmUsail9ZWxzZXt0aHJvd1wiSW52YWxpZCBmb3JtYXQgZm9yIHB1YmtleSB2YWx1ZSwgbXVzdCBiZSBieXRlIGFycmF5IG9yIEVDUG9pbnRGcFwifX12YXIgbT1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChvKTtyZXR1cm4gdGhpcy52ZXJpZnlSYXcobSxsLGksayl9O3RoaXMudmVyaWZ5UmF3PWZ1bmN0aW9uKG8saSx3LG0pe3ZhciBsPXRoaXMuZWNwYXJhbXMubjt2YXIgdT10aGlzLmVjcGFyYW1zLkc7aWYoaS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fGkuY29tcGFyZVRvKGwpPj0wKXtyZXR1cm4gZmFsc2V9aWYody5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fHcuY29tcGFyZVRvKGwpPj0wKXtyZXR1cm4gZmFsc2V9dmFyIHA9dy5tb2RJbnZlcnNlKGwpO3ZhciBrPW8ubXVsdGlwbHkocCkubW9kKGwpO3ZhciBqPWkubXVsdGlwbHkocCkubW9kKGwpO3ZhciBxPXUubXVsdGlwbHkoaykuYWRkKG0ubXVsdGlwbHkoaikpO3ZhciB0PXEuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZChsKTtyZXR1cm4gdC5lcXVhbHMoaSl9O3RoaXMuc2VyaWFsaXplU2lnPWZ1bmN0aW9uKGssail7dmFyIGw9ay50b0J5dGVBcnJheVNpZ25lZCgpO3ZhciBpPWoudG9CeXRlQXJyYXlTaWduZWQoKTt2YXIgbT1bXTttLnB1c2goMik7bS5wdXNoKGwubGVuZ3RoKTttPW0uY29uY2F0KGwpO20ucHVzaCgyKTttLnB1c2goaS5sZW5ndGgpO209bS5jb25jYXQoaSk7bS51bnNoaWZ0KG0ubGVuZ3RoKTttLnVuc2hpZnQoNDgpO3JldHVybiBtfTt0aGlzLnBhcnNlU2lnPWZ1bmN0aW9uKG4pe3ZhciBtO2lmKG5bMF0hPTQ4KXt0aHJvdyBuZXcgRXJyb3IoXCJTaWduYXR1cmUgbm90IGEgdmFsaWQgREVSU2VxdWVuY2VcIil9bT0yO2lmKG5bbV0hPTIpe3Rocm93IG5ldyBFcnJvcihcIkZpcnN0IGVsZW1lbnQgaW4gc2lnbmF0dXJlIG11c3QgYmUgYSBERVJJbnRlZ2VyXCIpfXZhciBsPW4uc2xpY2UobSsyLG0rMituW20rMV0pO20rPTIrblttKzFdO2lmKG5bbV0hPTIpe3Rocm93IG5ldyBFcnJvcihcIlNlY29uZCBlbGVtZW50IGluIHNpZ25hdHVyZSBtdXN0IGJlIGEgREVSSW50ZWdlclwiKX12YXIgaT1uLnNsaWNlKG0rMixtKzIrblttKzFdKTttKz0yK25bbSsxXTt2YXIgaz1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChsKTt2YXIgaj1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChpKTtyZXR1cm57cjprLHM6an19O3RoaXMucGFyc2VTaWdDb21wYWN0PWZ1bmN0aW9uKG0pe2lmKG0ubGVuZ3RoIT09NjUpe3Rocm93XCJTaWduYXR1cmUgaGFzIHRoZSB3cm9uZyBsZW5ndGhcIn12YXIgaj1tWzBdLTI3O2lmKGo8MHx8aj43KXt0aHJvd1wiSW52YWxpZCBzaWduYXR1cmUgdHlwZVwifXZhciBvPXRoaXMuZWNwYXJhbXMubjt2YXIgbD1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChtLnNsaWNlKDEsMzMpKS5tb2Qobyk7dmFyIGs9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobS5zbGljZSgzMyw2NSkpLm1vZChvKTtyZXR1cm57cjpsLHM6ayxpOmp9fTt0aGlzLnJlYWRQS0NTNVBydktleUhleD1mdW5jdGlvbihsKXt2YXIgbj1BU04xSEVYO3ZhciBtPUtKVVIuY3J5cHRvLkVDRFNBLmdldE5hbWU7dmFyIHA9bi5nZXRWYnlMaXN0O2lmKG4uaXNBU04xSEVYKGwpPT09ZmFsc2Upe3Rocm93XCJub3QgQVNOLjEgaGV4IHN0cmluZ1wifXZhciBpLGssbzt0cnl7aT1wKGwsMCxbMiwwXSxcIjA2XCIpO2s9cChsLDAsWzFdLFwiMDRcIik7dHJ5e289cChsLDAsWzMsMF0sXCIwM1wiKS5zdWJzdHIoMil9Y2F0Y2goail7fX1jYXRjaChqKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1MjMS81IHBsYWluIEVDQyBwcml2YXRlIGtleVwifXRoaXMuY3VydmVOYW1lPW0oaSk7aWYodGhpcy5jdXJ2ZU5hbWU9PT11bmRlZmluZWQpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lXCJ9dGhpcy5zZXROYW1lZEN1cnZlKHRoaXMuY3VydmVOYW1lKTt0aGlzLnNldFB1YmxpY0tleUhleChvKTt0aGlzLnNldFByaXZhdGVLZXlIZXgoayk7dGhpcy5pc1B1YmxpYz1mYWxzZX07dGhpcy5yZWFkUEtDUzhQcnZLZXlIZXg9ZnVuY3Rpb24obCl7dmFyIHE9QVNOMUhFWDt2YXIgaT1LSlVSLmNyeXB0by5FQ0RTQS5nZXROYW1lO3ZhciBuPXEuZ2V0VmJ5TGlzdDtpZihxLmlzQVNOMUhFWChsKT09PWZhbHNlKXt0aHJvd1wibm90IEFTTi4xIGhleCBzdHJpbmdcIn12YXIgaixwLG0sazt0cnl7aj1uKGwsMCxbMSwwXSxcIjA2XCIpO3A9bihsLDAsWzEsMV0sXCIwNlwiKTttPW4obCwwLFsyLDAsMV0sXCIwNFwiKTt0cnl7az1uKGwsMCxbMiwwLDIsMF0sXCIwM1wiKS5zdWJzdHIoMil9Y2F0Y2gobyl7fX1jYXRjaChvKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1MjOCBwbGFpbiBFQ0MgcHJpdmF0ZSBrZXlcIn10aGlzLmN1cnZlTmFtZT1pKHApO2lmKHRoaXMuY3VydmVOYW1lPT09dW5kZWZpbmVkKXt0aHJvd1widW5zdXBwb3J0ZWQgY3VydmUgbmFtZVwifXRoaXMuc2V0TmFtZWRDdXJ2ZSh0aGlzLmN1cnZlTmFtZSk7dGhpcy5zZXRQdWJsaWNLZXlIZXgoayk7dGhpcy5zZXRQcml2YXRlS2V5SGV4KG0pO3RoaXMuaXNQdWJsaWM9ZmFsc2V9O3RoaXMucmVhZFBLQ1M4UHViS2V5SGV4PWZ1bmN0aW9uKGwpe3ZhciBuPUFTTjFIRVg7dmFyIG09S0pVUi5jcnlwdG8uRUNEU0EuZ2V0TmFtZTt2YXIgcD1uLmdldFZieUxpc3Q7aWYobi5pc0FTTjFIRVgobCk9PT1mYWxzZSl7dGhyb3dcIm5vdCBBU04uMSBoZXggc3RyaW5nXCJ9dmFyIGssaSxvO3RyeXtrPXAobCwwLFswLDBdLFwiMDZcIik7aT1wKGwsMCxbMCwxXSxcIjA2XCIpO289cChsLDAsWzFdLFwiMDNcIikuc3Vic3RyKDIpfWNhdGNoKGope3Rocm93XCJtYWxmb3JtZWQgUEtDUyM4IEVDQyBwdWJsaWMga2V5XCJ9dGhpcy5jdXJ2ZU5hbWU9bShpKTtpZih0aGlzLmN1cnZlTmFtZT09PW51bGwpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lXCJ9dGhpcy5zZXROYW1lZEN1cnZlKHRoaXMuY3VydmVOYW1lKTt0aGlzLnNldFB1YmxpY0tleUhleChvKX07dGhpcy5yZWFkQ2VydFB1YktleUhleD1mdW5jdGlvbihrLHApe2lmKHAhPT01KXtwPTZ9dmFyIG09QVNOMUhFWDt2YXIgbD1LSlVSLmNyeXB0by5FQ0RTQS5nZXROYW1lO3ZhciBvPW0uZ2V0VmJ5TGlzdDtpZihtLmlzQVNOMUhFWChrKT09PWZhbHNlKXt0aHJvd1wibm90IEFTTi4xIGhleCBzdHJpbmdcIn12YXIgaSxuO3RyeXtpPW8oaywwLFswLHAsMCwxXSxcIjA2XCIpO249byhrLDAsWzAscCwxXSxcIjAzXCIpLnN1YnN0cigyKX1jYXRjaChqKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIEVDQyBwdWJsaWMga2V5XCJ9dGhpcy5jdXJ2ZU5hbWU9bChpKTtpZih0aGlzLmN1cnZlTmFtZT09PW51bGwpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lXCJ9dGhpcy5zZXROYW1lZEN1cnZlKHRoaXMuY3VydmVOYW1lKTt0aGlzLnNldFB1YmxpY0tleUhleChuKX07aWYoaCE9PXVuZGVmaW5lZCl7aWYoaC5jdXJ2ZSE9PXVuZGVmaW5lZCl7dGhpcy5jdXJ2ZU5hbWU9aC5jdXJ2ZX19aWYodGhpcy5jdXJ2ZU5hbWU9PT11bmRlZmluZWQpe3RoaXMuY3VydmVOYW1lPWV9dGhpcy5zZXROYW1lZEN1cnZlKHRoaXMuY3VydmVOYW1lKTtpZihoIT09dW5kZWZpbmVkKXtpZihoLnBydiE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQcml2YXRlS2V5SGV4KGgucHJ2KX1pZihoLnB1YiE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQdWJsaWNLZXlIZXgoaC5wdWIpfX19O0tKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4PWZ1bmN0aW9uKGEpe3ZhciBiPUtKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4SW5IZXhSUyhhKTt2YXIgZD1uZXcgQmlnSW50ZWdlcihiLnIsMTYpO3ZhciBjPW5ldyBCaWdJbnRlZ2VyKGIucywxNik7cmV0dXJue3I6ZCxzOmN9fTtLSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlM9ZnVuY3Rpb24oZil7dmFyIGo9QVNOMUhFWDt2YXIgaT1qLmdldENoaWxkSWR4O3ZhciBnPWouZ2V0VjtpZihmLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJzaWduYXR1cmUgaXMgbm90IGEgQVNOLjEgc2VxdWVuY2VcIn12YXIgaD1pKGYsMCk7aWYoaC5sZW5ndGghPTIpe3Rocm93XCJudW1iZXIgb2Ygc2lnbmF0dXJlIEFTTi4xIHNlcXVlbmNlIGVsZW1lbnRzIHNlZW0gd3JvbmdcIn12YXIgZT1oWzBdO3ZhciBkPWhbMV07aWYoZi5zdWJzdHIoZSwyKSE9XCIwMlwiKXt0aHJvd1wiMXN0IGl0ZW0gb2Ygc2VxdWVuZSBvZiBzaWduYXR1cmUgaXMgbm90IEFTTi4xIGludGVnZXJcIn1pZihmLnN1YnN0cihkLDIpIT1cIjAyXCIpe3Rocm93XCIybmQgaXRlbSBvZiBzZXF1ZW5lIG9mIHNpZ25hdHVyZSBpcyBub3QgQVNOLjEgaW50ZWdlclwifXZhciBjPWcoZixlKTt2YXIgYj1nKGYsZCk7cmV0dXJue3I6YyxzOmJ9fTtLSlVSLmNyeXB0by5FQ0RTQS5hc24xU2lnVG9Db25jYXRTaWc9ZnVuY3Rpb24oYyl7dmFyIGQ9S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXhJbkhleFJTKGMpO3ZhciBiPWQucjt2YXIgYT1kLnM7aWYoYi5zdWJzdHIoMCwyKT09XCIwMFwiJiYoYi5sZW5ndGglMzIpPT0yKXtiPWIuc3Vic3RyKDIpfWlmKGEuc3Vic3RyKDAsMik9PVwiMDBcIiYmKGEubGVuZ3RoJTMyKT09Mil7YT1hLnN1YnN0cigyKX1pZigoYi5sZW5ndGglMzIpPT0zMCl7Yj1cIjAwXCIrYn1pZigoYS5sZW5ndGglMzIpPT0zMCl7YT1cIjAwXCIrYX1pZihiLmxlbmd0aCUzMiE9MCl7dGhyb3dcInVua25vd24gRUNEU0Egc2lnIHIgbGVuZ3RoIGVycm9yXCJ9aWYoYS5sZW5ndGglMzIhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyBzIGxlbmd0aCBlcnJvclwifXJldHVybiBiK2F9O0tKVVIuY3J5cHRvLkVDRFNBLmNvbmNhdFNpZ1RvQVNOMVNpZz1mdW5jdGlvbihhKXtpZigoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpIT0wKXt0aHJvd1widW5rbm93biBFQ0RTQSBjb25jYXRpbmF0ZWQgci1zIHNpZyAgbGVuZ3RoIGVycm9yXCJ9dmFyIGM9YS5zdWJzdHIoMCxhLmxlbmd0aC8yKTt2YXIgYj1hLnN1YnN0cihhLmxlbmd0aC8yKTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWcoYyxiKX07S0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWc9ZnVuY3Rpb24oYixhKXt2YXIgZD1uZXcgQmlnSW50ZWdlcihiLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihhLDE2KTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuYmlSU1NpZ1RvQVNOMVNpZyhkLGMpfTtLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnPWZ1bmN0aW9uKGYsZCl7dmFyIGM9S0pVUi5hc24xO3ZhciBiPW5ldyBjLkRFUkludGVnZXIoe2JpZ2ludDpmfSk7dmFyIGE9bmV3IGMuREVSSW50ZWdlcih7YmlnaW50OmR9KTt2YXIgZT1uZXcgYy5ERVJTZXF1ZW5jZSh7YXJyYXk6W2IsYV19KTtyZXR1cm4gZS5nZXRFbmNvZGVkSGV4KCl9O0tKVVIuY3J5cHRvLkVDRFNBLmdldE5hbWU9ZnVuY3Rpb24oYSl7aWYoYT09PVwiMmE4NjQ4Y2UzZDAzMDEwN1wiKXtyZXR1cm5cInNlY3AyNTZyMVwifWlmKGE9PT1cIjJiODEwNDAwMGFcIil7cmV0dXJuXCJzZWNwMjU2azFcIn1pZihhPT09XCIyYjgxMDQwMDIyXCIpe3JldHVyblwic2VjcDM4NHIxXCJ9aWYoXCJ8c2VjcDI1NnIxfE5JU1QgUC0yNTZ8UC0yNTZ8cHJpbWUyNTZ2MXxcIi5pbmRleE9mKGEpIT09LTEpe3JldHVyblwic2VjcDI1NnIxXCJ9aWYoXCJ8c2VjcDI1NmsxfFwiLmluZGV4T2YoYSkhPT0tMSl7cmV0dXJuXCJzZWNwMjU2azFcIn1pZihcInxzZWNwMzg0cjF8TklTVCBQLTM4NHxQLTM4NHxcIi5pbmRleE9mKGEpIT09LTEpe3JldHVyblwic2VjcDM4NHIxXCJ9cmV0dXJuIG51bGx9O1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCPW5ldyBmdW5jdGlvbigpe3ZhciBiPXt9O3ZhciBjPXt9O2Z1bmN0aW9uIGEoZCl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGQsMTYpfXRoaXMuZ2V0QnlOYW1lPWZ1bmN0aW9uKGUpe3ZhciBkPWU7aWYodHlwZW9mIGNbZF0hPVwidW5kZWZpbmVkXCIpe2Q9Y1tlXX1pZih0eXBlb2YgYltkXSE9XCJ1bmRlZmluZWRcIil7cmV0dXJuIGJbZF19dGhyb3dcInVucmVnaXN0ZXJlZCBFQyBjdXJ2ZSBuYW1lOiBcIitkfTt0aGlzLnJlZ2lzdD1mdW5jdGlvbihBLGwsbyxnLG0sZSxqLGYsayx1LGQseCl7YltBXT17fTt2YXIgcz1hKG8pO3ZhciB6PWEoZyk7dmFyIHk9YShtKTt2YXIgdD1hKGUpO3ZhciB3PWEoaik7dmFyIHI9bmV3IEVDQ3VydmVGcChzLHoseSk7dmFyIHE9ci5kZWNvZGVQb2ludEhleChcIjA0XCIrZitrKTtiW0FdW1wibmFtZVwiXT1BO2JbQV1bXCJrZXlsZW5cIl09bDtiW0FdW1wiY3VydmVcIl09cjtiW0FdW1wiR1wiXT1xO2JbQV1bXCJuXCJdPXQ7YltBXVtcImhcIl09dztiW0FdW1wib2lkXCJdPWQ7YltBXVtcImluZm9cIl09eDtmb3IodmFyIHY9MDt2PHUubGVuZ3RoO3YrKyl7Y1t1W3ZdXT1BfX19O0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDEyOHIxXCIsMTI4LFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIixcIkZGRkZGRkZERkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDXCIsXCJFODc1NzlDMTEwNzlGNDNERDgyNDk5M0MyQ0VFNUVEM1wiLFwiRkZGRkZGRkUwMDAwMDAwMDc1QTMwRDFCOTAzOEExMTVcIixcIjFcIixcIjE2MUZGNzUyOEI4OTlCMkQwQzI4NjA3Q0E1MkM1Qjg2XCIsXCJDRjVBQzgzOTVCQUZFQjEzQzAyREEyOTJEREVEN0E4M1wiLFtdLFwiXCIsXCJzZWNwMTI4cjEgOiBTRUNHIGN1cnZlIG92ZXIgYSAxMjggYml0IHByaW1lIGZpZWxkXCIpO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE2MGsxXCIsMTYwLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGQUM3M1wiLFwiMFwiLFwiN1wiLFwiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMUI4RkExNkRGQUI5QUNBMTZCNkIzXCIsXCIxXCIsXCIzQjRDMzgyQ0UzN0FBMTkyQTQwMTlFNzYzMDM2RjRGNURENEQ3RUJCXCIsXCI5MzhDRjkzNTMxOEZEQ0VENkJDMjgyODY1MzE3MzNDM0YwM0M0RkVFXCIsW10sXCJcIixcInNlY3AxNjBrMSA6IFNFQ0cgY3VydmUgb3ZlciBhIDE2MCBiaXQgcHJpbWUgZmllbGRcIik7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTYwcjFcIiwxNjAsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZDXCIsXCIxQzk3QkVGQzU0QkQ3QThCNjVBQ0Y4OUY4MUQ0RDRBREM1NjVGQTQ1XCIsXCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAxRjRDOEY5MjdBRUQzQ0E3NTIyNTdcIixcIjFcIixcIjRBOTZCNTY4OEVGNTczMjg0NjY0Njk4OTY4QzM4QkI5MTNDQkZDODJcIixcIjIzQTYyODU1MzE2ODk0N0Q1OURDQzkxMjA0MjM1MTM3N0FDNUZCMzJcIixbXSxcIlwiLFwic2VjcDE2MHIxIDogU0VDRyBjdXJ2ZSBvdmVyIGEgMTYwIGJpdCBwcmltZSBmaWVsZFwiKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxOTJrMVwiLDE5MixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRUUzN1wiLFwiMFwiLFwiM1wiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFMjZGMkZDMTcwRjY5NDY2QTc0REVGRDhEXCIsXCIxXCIsXCJEQjRGRjEwRUMwNTdFOUFFMjZCMDdEMDI4MEI3RjQzNDFEQTVEMUIxRUFFMDZDN0RcIixcIjlCMkYyRjZEOUM1NjI4QTc4NDQxNjNEMDE1QkU4NjM0NDA4MkFBODhEOTVFMkY5RFwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxOTJyMVwiLDE5MixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZDXCIsXCI2NDIxMDUxOUU1OUM4MEU3MEZBN0U5QUI3MjI0MzA0OUZFQjhERUVDQzE0NkI5QjFcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjk5REVGODM2MTQ2QkM5QjFCNEQyMjgzMVwiLFwiMVwiLFwiMTg4REE4MEVCMDMwOTBGNjdDQkYyMEVCNDNBMTg4MDBGNEZGMEFGRDgyRkYxMDEyXCIsXCIwNzE5MkI5NUZGQzhEQTc4NjMxMDExRUQ2QjI0Q0RENTczRjk3N0ExMUU3OTQ4MTFcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMjI0cjFcIiwyMjQsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMVwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVcIixcIkI0MDUwQTg1MEMwNEIzQUJGNTQxMzI1NjUwNDRCMEI3RDdCRkQ4QkEyNzBCMzk0MzIzNTVGRkI0XCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMTZBMkUwQjhGMDNFMTNERDI5NDU1QzVDMkEzRFwiLFwiMVwiLFwiQjcwRTBDQkQ2QkI0QkY3RjMyMTM5MEI5NEEwM0MxRDM1NkMyMTEyMjM0MzI4MEQ2MTE1QzFEMjFcIixcIkJEMzc2Mzg4QjVGNzIzRkI0QzIyREZFNkNENDM3NUEwNUEwNzQ3NjQ0NEQ1ODE5OTg1MDA3RTM0XCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDI1NmsxXCIsMjU2LFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkMyRlwiLFwiMFwiLFwiN1wiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVCQUFFRENFNkFGNDhBMDNCQkZEMjVFOENEMDM2NDE0MVwiLFwiMVwiLFwiNzlCRTY2N0VGOURDQkJBQzU1QTA2Mjk1Q0U4NzBCMDcwMjlCRkNEQjJEQ0UyOEQ5NTlGMjgxNUIxNkY4MTc5OFwiLFwiNDgzQURBNzcyNkEzQzQ2NTVEQTRGQkZDMEUxMTA4QThGRDE3QjQ0OEE2ODU1NDE5OUM0N0QwOEZGQjEwRDRCOFwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AyNTZyMVwiLDI1NixcIkZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIixcIkZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIjVBQzYzNUQ4QUEzQTkzRTdCM0VCQkQ1NTc2OTg4NkJDNjUxRDA2QjBDQzUzQjBGNjNCQ0UzQzNFMjdEMjYwNEJcIixcIkZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGQkNFNkZBQURBNzE3OUU4NEYzQjlDQUMyRkM2MzI1NTFcIixcIjFcIixcIjZCMTdEMUYyRTEyQzQyNDdGOEJDRTZFNTYzQTQ0MEYyNzcwMzdEODEyREVCMzNBMEY0QTEzOTQ1RDg5OEMyOTZcIixcIjRGRTM0MkUyRkUxQTdGOUI4RUU3RUI0QTdDMEY5RTE2MkJDRTMzNTc2QjMxNUVDRUNCQjY0MDY4MzdCRjUxRjVcIixbXCJOSVNUIFAtMjU2XCIsXCJQLTI1NlwiLFwicHJpbWUyNTZ2MVwiXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMzg0cjFcIiwzODQsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGQ1wiLFwiQjMzMTJGQTdFMjNFRTdFNDk4OEUwNTZCRTNGODJEMTkxODFEOUM2RUZFODE0MTEyMDMxNDA4OEY1MDEzODc1QUM2NTYzOThEOEEyRUQxOUQyQTg1QzhFREQzRUMyQUVGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDNzYzNEQ4MUY0MzcyRERGNTgxQTBEQjI0OEIwQTc3QUVDRUMxOTZBQ0NDNTI5NzNcIixcIjFcIixcIkFBODdDQTIyQkU4QjA1Mzc4RUIxQzcxRUYzMjBBRDc0NkUxRDNCNjI4QkE3OUI5ODU5Rjc0MUUwODI1NDJBMzg1NTAyRjI1REJGNTUyOTZDM0E1NDVFMzg3Mjc2MEFCN1wiLFwiMzYxN2RlNGE5NjI2MmM2ZjVkOWU5OGJmOTI5MmRjMjlmOGY0MWRiZDI4OWExNDdjZTlkYTMxMTNiNWYwYjhjMDBhNjBiMWNlMWQ3ZTgxOWQ3YTQzMWQ3YzkwZWEwZTVmXCIsW1wiTklTVCBQLTM4NFwiLFwiUC0zODRcIl0pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDUyMXIxXCIsNTIxLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIixcIjFGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDXCIsXCIwNTE5NTNFQjk2MThFMUM5QTFGOTI5QTIxQTBCNjg1NDBFRUEyREE3MjVCOTlCMzE1RjNCOEI0ODk5MThFRjEwOUUxNTYxOTM5NTFFQzdFOTM3QjE2NTJDMEJEM0JCMUJGMDczNTczREY4ODNEMkMzNEYxRUY0NTFGRDQ2QjUwM0YwMFwiLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQTUxODY4NzgzQkYyRjk2NkI3RkNDMDE0OEY3MDlBNUQwM0JCNUM5Qjg4OTlDNDdBRUJCNkZCNzFFOTEzODY0MDlcIixcIjFcIixcIkM2ODU4RTA2QjcwNDA0RTlDRDlFM0VDQjY2MjM5NUI0NDI5QzY0ODEzOTA1M0ZCNTIxRjgyOEFGNjA2QjREM0RCQUExNEI1RTc3RUZFNzU5MjhGRTFEQzEyN0EyRkZBOERFMzM0OEIzQzE4NTZBNDI5QkY5N0U3RTMxQzJFNUJENjZcIixcIjAxMTgzOTI5NmE3ODlhM2JjMDA0NWM4YTVmYjQyYzdkMWJkOTk4ZjU0NDQ5NTc5YjQ0NjgxN2FmYmQxNzI3M2U2NjJjOTdlZTcyOTk1ZWY0MjY0MGM1NTBiOTAxM2ZhZDA3NjEzNTNjNzA4NmEyNzJjMjQwODhiZTk0NzY5ZmQxNjY1MFwiLFtcIk5JU1QgUC01MjFcIixcIlAtNTIxXCJdKTtcbnZhciBLRVlVVElMPWZ1bmN0aW9uKCl7dmFyIGQ9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBrKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBlPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gayhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgYT1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGsoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGs9ZnVuY3Rpb24ocyx4LHUscSl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHQ9e307dC5rZXk9dzt0Lml2PXA7dC5jaXBoZXJ0ZXh0PXI7dmFyIHY9cy5kZWNyeXB0KHQsdyx7aXY6cH0pO3JldHVybiBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh2KX07dmFyIGw9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBnKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBvPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gZyhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgZj1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGcoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGc9ZnVuY3Rpb24odCx5LHYscSl7dmFyIHM9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh5KTt2YXIgeD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHc9dC5lbmNyeXB0KHMseCx7aXY6cH0pO3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uody50b1N0cmluZygpKTt2YXIgdT1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShyKTtyZXR1cm4gdX07dmFyIGk9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpkLGVwcm9jOmwsa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6ZCxlcHJvYzpsLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmQsZXByb2M6bCxrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZSxlcHJvYzpvLGtleWxlbjoyNCxpdmxlbjo4fSxcIkRFUy1DQkNcIjp7cHJvYzphLGVwcm9jOmYsa2V5bGVuOjgsaXZsZW46OH19O3ZhciBjPWZ1bmN0aW9uKHApe3JldHVybiBpW3BdW1wicHJvY1wiXX07dmFyIG09ZnVuY3Rpb24ocCl7dmFyIHI9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20ocCk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocik7cmV0dXJuIHF9O3ZhciBuPWZ1bmN0aW9uKHYpe3ZhciB3PXt9O3ZhciBxPXYubWF0Y2gobmV3IFJlZ0V4cChcIkRFSy1JbmZvOiAoW14sXSspLChbMC05QS1GYS1mXSspXCIsXCJtXCIpKTtpZihxKXt3LmNpcGhlcj1xWzFdO3cuaXZzYWx0PXFbMl19dmFyIHA9di5tYXRjaChuZXcgUmVnRXhwKFwiLS0tLS1CRUdJTiAoW0EtWl0rKSBQUklWQVRFIEtFWS0tLS0tXCIpKTtpZihwKXt3LnR5cGU9cFsxXX12YXIgdT0tMTt2YXIgeD0wO2lmKHYuaW5kZXhPZihcIlxcclxcblxcclxcblwiKSE9LTEpe3U9di5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpO3g9Mn1pZih2LmluZGV4T2YoXCJcXG5cXG5cIikhPS0xKXt1PXYuaW5kZXhPZihcIlxcblxcblwiKTt4PTF9dmFyIHQ9di5pbmRleE9mKFwiLS0tLS1FTkRcIik7aWYodSE9LTEmJnQhPS0xKXt2YXIgcj12LnN1YnN0cmluZyh1K3gqMix0LXgpO3I9ci5yZXBsYWNlKC9cXHMrL2csXCJcIik7dy5kYXRhPXJ9cmV0dXJuIHd9O3ZhciBqPWZ1bmN0aW9uKHEseSxwKXt2YXIgdj1wLnN1YnN0cmluZygwLDE2KTt2YXIgdD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciByPUNyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHkpO3ZhciB1PWlbcV1bXCJrZXlsZW5cIl0raVtxXVtcIml2bGVuXCJdO3ZhciB4PVwiXCI7dmFyIHc9bnVsbDtmb3IoOzspe3ZhciBzPUNyeXB0b0pTLmFsZ28uTUQ1LmNyZWF0ZSgpO2lmKHchPW51bGwpe3MudXBkYXRlKHcpfXMudXBkYXRlKHIpO3MudXBkYXRlKHQpO3c9cy5maW5hbGl6ZSgpO3g9eCtDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh3KTtpZih4Lmxlbmd0aD49dSoyKXticmVha319dmFyIHo9e307ei5rZXloZXg9eC5zdWJzdHIoMCxpW3FdW1wia2V5bGVuXCJdKjIpO3ouaXZoZXg9eC5zdWJzdHIoaVtxXVtcImtleWxlblwiXSoyLGlbcV1bXCJpdmxlblwiXSoyKTtyZXR1cm4gen07dmFyIGI9ZnVuY3Rpb24ocCx2LHIsdyl7dmFyIHM9Q3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShwKTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShzKTt2YXIgdT1pW3ZdW1wicHJvY1wiXTt2YXIgdD11KHEscix3KTtyZXR1cm4gdH07dmFyIGg9ZnVuY3Rpb24ocCxzLHEsdSl7dmFyIHI9aVtzXVtcImVwcm9jXCJdO3ZhciB0PXIocCxxLHUpO3JldHVybiB0fTtyZXR1cm57dmVyc2lvbjpcIjEuMC4wXCIscGFyc2VQS0NTNVBFTTpmdW5jdGlvbihwKXtyZXR1cm4gbihwKX0sZ2V0S2V5QW5kVW51c2VkSXZCeVBhc3Njb2RlQW5kSXZzYWx0OmZ1bmN0aW9uKHEscCxyKXtyZXR1cm4gaihxLHAscil9LGRlY3J5cHRLZXlCNjQ6ZnVuY3Rpb24ocCxyLHEscyl7cmV0dXJuIGIocCxyLHEscyl9LGdldERlY3J5cHRlZEtleUhleDpmdW5jdGlvbih5LHgpe3ZhciBxPW4oeSk7dmFyIHQ9cS50eXBlO3ZhciByPXEuY2lwaGVyO3ZhciBwPXEuaXZzYWx0O3ZhciBzPXEuZGF0YTt2YXIgdz1qKHIseCxwKTt2YXIgdj13LmtleWhleDt2YXIgdT1iKHMscix2LHApO3JldHVybiB1fSxnZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXg6ZnVuY3Rpb24oeCxzLEEsdCxyKXt2YXIgcD1cIlwiO2lmKHR5cGVvZiB0PT1cInVuZGVmaW5lZFwifHx0PT1udWxsKXt0PVwiQUVTLTI1Ni1DQkNcIn1pZih0eXBlb2YgaVt0XT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIktFWVVUSUwgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiBcIit0fWlmKHR5cGVvZiByPT1cInVuZGVmaW5lZFwifHxyPT1udWxsKXt2YXIgdj1pW3RdW1wiaXZsZW5cIl07dmFyIHU9bSh2KTtyPXUudG9VcHBlckNhc2UoKX12YXIgej1qKHQsQSxyKTt2YXIgeT16LmtleWhleDt2YXIgdz1oKHMsdCx5LHIpO3ZhciBxPXcucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7dmFyIHA9XCItLS0tLUJFR0lOIFwiK3grXCIgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3ArPVwiUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFxcclxcblwiO3ArPVwiREVLLUluZm86IFwiK3QrXCIsXCIrcitcIlxcclxcblwiO3ArPVwiXFxyXFxuXCI7cCs9cTtwKz1cIlxcclxcbi0tLS0tRU5EIFwiK3grXCIgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3JldHVybiBwfSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24oeSl7dmFyIEI9QVNOMUhFWDt2YXIgej1CLmdldENoaWxkSWR4O3ZhciB3PUIuZ2V0Vjt2YXIgdD17fTt2YXIgcj16KHksMCk7aWYoci5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwKS5pdGVtcyAhPSAyOiBcIityLmxlbmd0aH10LmNpcGhlcnRleHQ9dyh5LHJbMV0pO3ZhciBBPXooeSxyWzBdKTtpZihBLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMCkuaXRlbXMgIT0gMjogXCIrQS5sZW5ndGh9aWYodyh5LEFbMF0pIT1cIjJhODY0ODg2ZjcwZDAxMDUwZFwiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIHBrY3M1UEJFUzJcIn12YXIgcD16KHksQVsxXSk7aWYoQS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrcC5sZW5ndGh9dmFyIHE9eih5LHBbMV0pO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMSkuaXRlbXMgIT0gMjogXCIrcS5sZW5ndGh9aWYodyh5LHFbMF0pIT1cIjJhODY0ODg2ZjcwZDAzMDdcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBUcmlwbGVERVNcIn10LmVuY3J5cHRpb25TY2hlbWVBbGc9XCJUcmlwbGVERVNcIjt0LmVuY3J5cHRpb25TY2hlbWVJVj13KHkscVsxXSk7dmFyIHM9eih5LHBbMF0pO2lmKHMubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMCkuaXRlbXMgIT0gMjogXCIrcy5sZW5ndGh9aWYodyh5LHNbMF0pIT1cIjJhODY0ODg2ZjcwZDAxMDUwY1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIHBrY3M1UEJLREYyXCJ9dmFyIHg9eih5LHNbMV0pO2lmKHgubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIreC5sZW5ndGh9dC5wYmtkZjJTYWx0PXcoeSx4WzBdKTt2YXIgdT13KHkseFsxXSk7dHJ5e3QucGJrZGYySXRlcj1wYXJzZUludCh1LDE2KX1jYXRjaCh2KXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdCBwYmtkZjJJdGVyOiBcIit1fXJldHVybiB0fSxnZXRQQktERjJLZXlIZXhGcm9tUGFyYW06ZnVuY3Rpb24odSxwKXt2YXIgdD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUucGJrZGYyU2FsdCk7dmFyIHE9dS5wYmtkZjJJdGVyO3ZhciBzPUNyeXB0b0pTLlBCS0RGMihwLHQse2tleVNpemU6MTkyLzMyLGl0ZXJhdGlvbnM6cX0pO3ZhciByPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3JldHVybiByfSxfZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbih4LHkpe3ZhciByPXBlbXRvaGV4KHgsXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIik7dmFyIHA9dGhpcy5wYXJzZUhleE9mRW5jcnlwdGVkUEtDUzgocik7dmFyIHU9S0VZVVRJTC5nZXRQQktERjJLZXlIZXhGcm9tUGFyYW0ocCx5KTt2YXIgdj17fTt2LmNpcGhlcnRleHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShwLmNpcGhlcnRleHQpO3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodSk7dmFyIHM9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShwLmVuY3J5cHRpb25TY2hlbWVJVik7dmFyIHc9Q3J5cHRvSlMuVHJpcGxlREVTLmRlY3J5cHQodix0LHtpdjpzfSk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodyk7cmV0dXJuIHF9LGdldEtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbihzLHEpe3ZhciBwPXRoaXMuX2dldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocyxxKTt2YXIgcj10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChwKTtyZXR1cm4gcn0scGFyc2VQbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihzKXt2YXIgdj1BU04xSEVYO3ZhciB1PXYuZ2V0Q2hpbGRJZHg7dmFyIHQ9di5nZXRWO3ZhciBxPXt9O3EuYWxncGFyYW09bnVsbDtpZihzLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIHI9dShzLDApO2lmKHIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAyKVwifWlmKHMuc3Vic3RyKHJbMV0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMylcIn12YXIgcD11KHMsclsxXSk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDQpXCJ9aWYocy5zdWJzdHIocFswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA1KVwifXEuYWxnb2lkPXQocyxwWzBdKTtpZihzLnN1YnN0cihwWzFdLDIpPT1cIjA2XCIpe3EuYWxncGFyYW09dChzLHBbMV0pfWlmKHMuc3Vic3RyKHJbMl0sMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNilcIn1xLmtleWlkeD12LmdldFZpZHgocyxyWzJdKTtyZXR1cm4gcX0sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNOmZ1bmN0aW9uKHEpe3ZhciBwPXBlbXRvaGV4KHEsXCJQUklWQVRFIEtFWVwiKTt2YXIgcj10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChwKTtyZXR1cm4gcn0sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4OmZ1bmN0aW9uKHApe3ZhciBxPXRoaXMucGFyc2VQbGFpblByaXZhdGVQS0NTOEhleChwKTt2YXIgcjtpZihxLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7cj1uZXcgUlNBS2V5KCl9ZWxzZXtpZihxLmFsZ29pZD09XCIyYTg2NDhjZTM4MDQwMVwiKXtyPW5ldyBLSlVSLmNyeXB0by5EU0EoKX1lbHNle2lmKHEuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe3I9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKCl9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX1yLnJlYWRQS0NTOFBydktleUhleChwKTtyZXR1cm4gcn0sX2dldEtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgcDt2YXIgcj1BU04xSEVYLmdldFZieUxpc3QocSwwLFswLDBdLFwiMDZcIik7aWYocj09PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3A9bmV3IFJTQUtleSgpfWVsc2V7aWYocj09PVwiMmE4NjQ4Y2UzODA0MDFcIil7cD1uZXcgS0pVUi5jcnlwdG8uRFNBKCl9ZWxzZXtpZihyPT09XCIyYTg2NDhjZTNkMDIwMVwiKXtwPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSgpfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIFBLQ1MjOCBwdWJsaWMga2V5IGhleFwifX19cC5yZWFkUEtDUzhQdWJLZXlIZXgocSk7cmV0dXJuIHB9LHBhcnNlUHVibGljUmF3UlNBS2V5SGV4OmZ1bmN0aW9uKHIpe3ZhciB1PUFTTjFIRVg7dmFyIHQ9dS5nZXRDaGlsZElkeDt2YXIgcz11LmdldFY7dmFyIHA9e307aWYoci5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDEpXCJ9dmFyIHE9dChyLDApO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDIpXCJ9aWYoci5zdWJzdHIocVswXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDMpXCJ9cC5uPXMocixxWzBdKTtpZihyLnN1YnN0cihxWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwNClcIn1wLmU9cyhyLHFbMV0pO3JldHVybiBwfSxwYXJzZVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHQpe3ZhciB2PUFTTjFIRVg7dmFyIHU9di5nZXRDaGlsZElkeDt2YXIgcz12LmdldFY7dmFyIHE9e307cS5hbGdwYXJhbT1udWxsO3ZhciByPXUodCwwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrci5sZW5ndGh9dmFyIHc9clswXTtpZih0LnN1YnN0cih3LDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMSlcIn12YXIgcD11KHQsdyk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMilcIn1pZih0LnN1YnN0cihwWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMylcIn1xLmFsZ29pZD1zKHQscFswXSk7aWYodC5zdWJzdHIocFsxXSwyKT09XCIwNlwiKXtxLmFsZ3BhcmFtPXModCxwWzFdKX1lbHNle2lmKHQuc3Vic3RyKHBbMV0sMik9PVwiMzBcIil7cS5hbGdwYXJhbT17fTtxLmFsZ3BhcmFtLnA9di5nZXRWYnlMaXN0KHQscFsxXSxbMF0sXCIwMlwiKTtxLmFsZ3BhcmFtLnE9di5nZXRWYnlMaXN0KHQscFsxXSxbMV0sXCIwMlwiKTtxLmFsZ3BhcmFtLmc9di5nZXRWYnlMaXN0KHQscFsxXSxbMl0sXCIwMlwiKX19aWYodC5zdWJzdHIoclsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDQpXCJ9cS5rZXk9cyh0LHJbMV0pLnN1YnN0cigyKTtyZXR1cm4gcX0sfX0oKTtLRVlVVElMLmdldEtleT1mdW5jdGlvbihsLGssbil7dmFyIEc9QVNOMUhFWCxMPUcuZ2V0Q2hpbGRJZHgsdj1HLmdldFYsZD1HLmdldFZieUxpc3QsYz1LSlVSLmNyeXB0byxpPWMuRUNEU0EsQz1jLkRTQSx3PVJTQUtleSxNPXBlbXRvaGV4LEY9S0VZVVRJTDtpZih0eXBlb2YgdyE9XCJ1bmRlZmluZWRcIiYmbCBpbnN0YW5jZW9mIHcpe3JldHVybiBsfWlmKHR5cGVvZiBpIT1cInVuZGVmaW5lZFwiJiZsIGluc3RhbmNlb2YgaSl7cmV0dXJuIGx9aWYodHlwZW9mIEMhPVwidW5kZWZpbmVkXCImJmwgaW5zdGFuY2VvZiBDKXtyZXR1cm4gbH1pZihsLmN1cnZlIT09dW5kZWZpbmVkJiZsLnh5IT09dW5kZWZpbmVkJiZsLmQ9PT11bmRlZmluZWQpe3JldHVybiBuZXcgaSh7cHViOmwueHksY3VydmU6bC5jdXJ2ZX0pfWlmKGwuY3VydmUhPT11bmRlZmluZWQmJmwuZCE9PXVuZGVmaW5lZCl7cmV0dXJuIG5ldyBpKHtwcnY6bC5kLGN1cnZlOmwuY3VydmV9KX1pZihsLmt0eT09PXVuZGVmaW5lZCYmbC5uIT09dW5kZWZpbmVkJiZsLmUhPT11bmRlZmluZWQmJmwuZD09PXVuZGVmaW5lZCl7dmFyIFA9bmV3IHcoKTtQLnNldFB1YmxpYyhsLm4sbC5lKTtyZXR1cm4gUH1pZihsLmt0eT09PXVuZGVmaW5lZCYmbC5uIT09dW5kZWZpbmVkJiZsLmUhPT11bmRlZmluZWQmJmwuZCE9PXVuZGVmaW5lZCYmbC5wIT09dW5kZWZpbmVkJiZsLnEhPT11bmRlZmluZWQmJmwuZHAhPT11bmRlZmluZWQmJmwuZHEhPT11bmRlZmluZWQmJmwuY28hPT11bmRlZmluZWQmJmwucWk9PT11bmRlZmluZWQpe3ZhciBQPW5ldyB3KCk7UC5zZXRQcml2YXRlRXgobC5uLGwuZSxsLmQsbC5wLGwucSxsLmRwLGwuZHEsbC5jbyk7cmV0dXJuIFB9aWYobC5rdHk9PT11bmRlZmluZWQmJmwubiE9PXVuZGVmaW5lZCYmbC5lIT09dW5kZWZpbmVkJiZsLmQhPT11bmRlZmluZWQmJmwucD09PXVuZGVmaW5lZCl7dmFyIFA9bmV3IHcoKTtQLnNldFByaXZhdGUobC5uLGwuZSxsLmQpO3JldHVybiBQfWlmKGwucCE9PXVuZGVmaW5lZCYmbC5xIT09dW5kZWZpbmVkJiZsLmchPT11bmRlZmluZWQmJmwueSE9PXVuZGVmaW5lZCYmbC54PT09dW5kZWZpbmVkKXt2YXIgUD1uZXcgQygpO1Auc2V0UHVibGljKGwucCxsLnEsbC5nLGwueSk7cmV0dXJuIFB9aWYobC5wIT09dW5kZWZpbmVkJiZsLnEhPT11bmRlZmluZWQmJmwuZyE9PXVuZGVmaW5lZCYmbC55IT09dW5kZWZpbmVkJiZsLnghPT11bmRlZmluZWQpe3ZhciBQPW5ldyBDKCk7UC5zZXRQcml2YXRlKGwucCxsLnEsbC5nLGwueSxsLngpO3JldHVybiBQfWlmKGwua3R5PT09XCJSU0FcIiYmbC5uIT09dW5kZWZpbmVkJiZsLmUhPT11bmRlZmluZWQmJmwuZD09PXVuZGVmaW5lZCl7dmFyIFA9bmV3IHcoKTtQLnNldFB1YmxpYyhiNjR1dG9oZXgobC5uKSxiNjR1dG9oZXgobC5lKSk7cmV0dXJuIFB9aWYobC5rdHk9PT1cIlJTQVwiJiZsLm4hPT11bmRlZmluZWQmJmwuZSE9PXVuZGVmaW5lZCYmbC5kIT09dW5kZWZpbmVkJiZsLnAhPT11bmRlZmluZWQmJmwucSE9PXVuZGVmaW5lZCYmbC5kcCE9PXVuZGVmaW5lZCYmbC5kcSE9PXVuZGVmaW5lZCYmbC5xaSE9PXVuZGVmaW5lZCl7dmFyIFA9bmV3IHcoKTtQLnNldFByaXZhdGVFeChiNjR1dG9oZXgobC5uKSxiNjR1dG9oZXgobC5lKSxiNjR1dG9oZXgobC5kKSxiNjR1dG9oZXgobC5wKSxiNjR1dG9oZXgobC5xKSxiNjR1dG9oZXgobC5kcCksYjY0dXRvaGV4KGwuZHEpLGI2NHV0b2hleChsLnFpKSk7cmV0dXJuIFB9aWYobC5rdHk9PT1cIlJTQVwiJiZsLm4hPT11bmRlZmluZWQmJmwuZSE9PXVuZGVmaW5lZCYmbC5kIT09dW5kZWZpbmVkKXt2YXIgUD1uZXcgdygpO1Auc2V0UHJpdmF0ZShiNjR1dG9oZXgobC5uKSxiNjR1dG9oZXgobC5lKSxiNjR1dG9oZXgobC5kKSk7cmV0dXJuIFB9aWYobC5rdHk9PT1cIkVDXCImJmwuY3J2IT09dW5kZWZpbmVkJiZsLnghPT11bmRlZmluZWQmJmwueSE9PXVuZGVmaW5lZCYmbC5kPT09dW5kZWZpbmVkKXt2YXIgaj1uZXcgaSh7Y3VydmU6bC5jcnZ9KTt2YXIgdD1qLmVjcGFyYW1zLmtleWxlbi80O3ZhciBCPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgobC54KSkuc2xpY2UoLXQpO3ZhciB6PShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgobC55KSkuc2xpY2UoLXQpO3ZhciB1PVwiMDRcIitCK3o7ai5zZXRQdWJsaWNLZXlIZXgodSk7cmV0dXJuIGp9aWYobC5rdHk9PT1cIkVDXCImJmwuY3J2IT09dW5kZWZpbmVkJiZsLnghPT11bmRlZmluZWQmJmwueSE9PXVuZGVmaW5lZCYmbC5kIT09dW5kZWZpbmVkKXt2YXIgaj1uZXcgaSh7Y3VydmU6bC5jcnZ9KTt2YXIgdD1qLmVjcGFyYW1zLmtleWxlbi80O3ZhciBCPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgobC54KSkuc2xpY2UoLXQpO3ZhciB6PShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgobC55KSkuc2xpY2UoLXQpO3ZhciB1PVwiMDRcIitCK3o7dmFyIGI9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChsLmQpKS5zbGljZSgtdCk7ai5zZXRQdWJsaWNLZXlIZXgodSk7ai5zZXRQcml2YXRlS2V5SGV4KGIpO3JldHVybiBqfWlmKG49PT1cInBrY3M1cHJ2XCIpe3ZhciBKPWwsRz1BU04xSEVYLE4sUDtOPUwoSiwwKTtpZihOLmxlbmd0aD09PTkpe1A9bmV3IHcoKTtQLnJlYWRQS0NTNVBydktleUhleChKKX1lbHNle2lmKE4ubGVuZ3RoPT09Nil7UD1uZXcgQygpO1AucmVhZFBLQ1M1UHJ2S2V5SGV4KEopfWVsc2V7aWYoTi5sZW5ndGg+MiYmSi5zdWJzdHIoTlsxXSwyKT09PVwiMDRcIil7UD1uZXcgaSgpO1AucmVhZFBLQ1M1UHJ2S2V5SGV4KEopfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIFBLQ1MjMS81IGhleGFkZWNpbWFsIGtleVwifX19cmV0dXJuIFB9aWYobj09PVwicGtjczhwcnZcIil7dmFyIFA9Ri5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgobCk7cmV0dXJuIFB9aWYobj09PVwicGtjczhwdWJcIil7cmV0dXJuIEYuX2dldEtleUZyb21QdWJsaWNQS0NTOEhleChsKX1pZihuPT09XCJ4NTA5cHViXCIpe3JldHVybiBYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0SGV4KGwpfWlmKGwuaW5kZXhPZihcIi1FTkQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxsLmluZGV4T2YoXCItRU5EIFg1MDkgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxsLmluZGV4T2YoXCItRU5EIFRSVVNURUQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xKXtyZXR1cm4gWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTShsKX1pZihsLmluZGV4T2YoXCItRU5EIFBVQkxJQyBLRVktXCIpIT0tMSl7dmFyIE89cGVtdG9oZXgobCxcIlBVQkxJQyBLRVlcIik7cmV0dXJuIEYuX2dldEtleUZyb21QdWJsaWNQS0NTOEhleChPKX1pZihsLmluZGV4T2YoXCItRU5EIFJTQSBQUklWQVRFIEtFWS1cIikhPS0xJiZsLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKT09LTEpe3ZhciBtPU0obCxcIlJTQSBQUklWQVRFIEtFWVwiKTtyZXR1cm4gRi5nZXRLZXkobSxudWxsLFwicGtjczVwcnZcIil9aWYobC5pbmRleE9mKFwiLUVORCBEU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmbC5pbmRleE9mKFwiNCxFTkNSWVBURURcIik9PS0xKXt2YXIgST1NKGwsXCJEU0EgUFJJVkFURSBLRVlcIik7dmFyIEU9ZChJLDAsWzFdLFwiMDJcIik7dmFyIEQ9ZChJLDAsWzJdLFwiMDJcIik7dmFyIEs9ZChJLDAsWzNdLFwiMDJcIik7dmFyIHI9ZChJLDAsWzRdLFwiMDJcIik7dmFyIHM9ZChJLDAsWzVdLFwiMDJcIik7dmFyIFA9bmV3IEMoKTtQLnNldFByaXZhdGUobmV3IEJpZ0ludGVnZXIoRSwxNiksbmV3IEJpZ0ludGVnZXIoRCwxNiksbmV3IEJpZ0ludGVnZXIoSywxNiksbmV3IEJpZ0ludGVnZXIociwxNiksbmV3IEJpZ0ludGVnZXIocywxNikpO3JldHVybiBQfWlmKGwuaW5kZXhPZihcIi1FTkQgUFJJVkFURSBLRVktXCIpIT0tMSl7cmV0dXJuIEYuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNKGwpfWlmKGwuaW5kZXhPZihcIi1FTkQgUlNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmwuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7dmFyIG89Ri5nZXREZWNyeXB0ZWRLZXlIZXgobCxrKTt2YXIgSD1uZXcgUlNBS2V5KCk7SC5yZWFkUEtDUzVQcnZLZXlIZXgobyk7cmV0dXJuIEh9aWYobC5pbmRleE9mKFwiLUVORCBFQyBQUklWQVRFIEtFWS1cIikhPS0xJiZsLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKSE9LTEpe3ZhciBJPUYuZ2V0RGVjcnlwdGVkS2V5SGV4KGwsayk7dmFyIFA9ZChJLDAsWzFdLFwiMDRcIik7dmFyIGY9ZChJLDAsWzIsMF0sXCIwNlwiKTt2YXIgQT1kKEksMCxbMywwXSxcIjAzXCIpLnN1YnN0cigyKTt2YXIgZT1cIlwiO2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtmXSE9PXVuZGVmaW5lZCl7ZT1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbZl19ZWxzZXt0aHJvd1widW5kZWZpbmVkIE9JRChoZXgpIGluIEtKVVIuY3J5cHRvLk9JRDogXCIrZn12YXIgaj1uZXcgaSh7Y3VydmU6ZX0pO2ouc2V0UHVibGljS2V5SGV4KEEpO2ouc2V0UHJpdmF0ZUtleUhleChQKTtqLmlzUHVibGljPWZhbHNlO3JldHVybiBqfWlmKGwuaW5kZXhPZihcIi1FTkQgRFNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmwuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7dmFyIEk9Ri5nZXREZWNyeXB0ZWRLZXlIZXgobCxrKTt2YXIgRT1kKEksMCxbMV0sXCIwMlwiKTt2YXIgRD1kKEksMCxbMl0sXCIwMlwiKTt2YXIgSz1kKEksMCxbM10sXCIwMlwiKTt2YXIgcj1kKEksMCxbNF0sXCIwMlwiKTt2YXIgcz1kKEksMCxbNV0sXCIwMlwiKTt2YXIgUD1uZXcgQygpO1Auc2V0UHJpdmF0ZShuZXcgQmlnSW50ZWdlcihFLDE2KSxuZXcgQmlnSW50ZWdlcihELDE2KSxuZXcgQmlnSW50ZWdlcihLLDE2KSxuZXcgQmlnSW50ZWdlcihyLDE2KSxuZXcgQmlnSW50ZWdlcihzLDE2KSk7cmV0dXJuIFB9aWYobC5pbmRleE9mKFwiLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktXCIpIT0tMSl7cmV0dXJuIEYuZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKGwsayl9dGhyb3dcIm5vdCBzdXBwb3J0ZWQgYXJndW1lbnRcIn07S0VZVVRJTC5nZW5lcmF0ZUtleXBhaXI9ZnVuY3Rpb24oYSxjKXtpZihhPT1cIlJTQVwiKXt2YXIgYj1jO3ZhciBoPW5ldyBSU0FLZXkoKTtoLmdlbmVyYXRlKGIsXCIxMDAwMVwiKTtoLmlzUHJpdmF0ZT10cnVlO2guaXNQdWJsaWM9dHJ1ZTt2YXIgZj1uZXcgUlNBS2V5KCk7dmFyIGU9aC5uLnRvU3RyaW5nKDE2KTt2YXIgaT1oLmUudG9TdHJpbmcoMTYpO2Yuc2V0UHVibGljKGUsaSk7Zi5pc1ByaXZhdGU9ZmFsc2U7Zi5pc1B1YmxpYz10cnVlO3ZhciBrPXt9O2sucHJ2S2V5T2JqPWg7ay5wdWJLZXlPYmo9ZjtyZXR1cm4ga31lbHNle2lmKGE9PVwiRUNcIil7dmFyIGQ9Yzt2YXIgZz1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmR9KTt2YXIgaj1nLmdlbmVyYXRlS2V5UGFpckhleCgpO3ZhciBoPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZH0pO2guc2V0UHVibGljS2V5SGV4KGouZWNwdWJoZXgpO2guc2V0UHJpdmF0ZUtleUhleChqLmVjcHJ2aGV4KTtoLmlzUHJpdmF0ZT10cnVlO2guaXNQdWJsaWM9ZmFsc2U7dmFyIGY9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpkfSk7Zi5zZXRQdWJsaWNLZXlIZXgoai5lY3B1YmhleCk7Zi5pc1ByaXZhdGU9ZmFsc2U7Zi5pc1B1YmxpYz10cnVlO3ZhciBrPXt9O2sucHJ2S2V5T2JqPWg7ay5wdWJLZXlPYmo9ZjtyZXR1cm4ga31lbHNle3Rocm93XCJ1bmtub3duIGFsZ29yaXRobTogXCIrYX19fTtLRVlVVElMLmdldFBFTT1mdW5jdGlvbihiLEQseSxtLHEsail7dmFyIEY9S0pVUixrPUYuYXNuMSx6PWsuREVST2JqZWN0SWRlbnRpZmllcixmPWsuREVSSW50ZWdlcixsPWsuQVNOMVV0aWwubmV3T2JqZWN0LGE9ay54NTA5LEM9YS5TdWJqZWN0UHVibGljS2V5SW5mbyxlPUYuY3J5cHRvLHU9ZS5EU0Escj1lLkVDRFNBLG49UlNBS2V5O2Z1bmN0aW9uIEEocyl7dmFyIEc9bCh7c2VxOlt7XCJpbnRcIjowfSx7XCJpbnRcIjp7YmlnaW50OnMubn19LHtcImludFwiOnMuZX0se1wiaW50XCI6e2JpZ2ludDpzLmR9fSx7XCJpbnRcIjp7YmlnaW50OnMucH19LHtcImludFwiOntiaWdpbnQ6cy5xfX0se1wiaW50XCI6e2JpZ2ludDpzLmRtcDF9fSx7XCJpbnRcIjp7YmlnaW50OnMuZG1xMX19LHtcImludFwiOntiaWdpbnQ6cy5jb2VmZn19XX0pO3JldHVybiBHfWZ1bmN0aW9uIEIoRyl7dmFyIHM9bCh7c2VxOlt7XCJpbnRcIjoxfSx7b2N0c3RyOntoZXg6Ry5wcnZLZXlIZXh9fSx7dGFnOltcImEwXCIsdHJ1ZSx7b2lkOntuYW1lOkcuY3VydmVOYW1lfX1dfSx7dGFnOltcImExXCIsdHJ1ZSx7Yml0c3RyOntoZXg6XCIwMFwiK0cucHViS2V5SGV4fX1dfV19KTtyZXR1cm4gc31mdW5jdGlvbiB4KHMpe3ZhciBHPWwoe3NlcTpbe1wiaW50XCI6MH0se1wiaW50XCI6e2JpZ2ludDpzLnB9fSx7XCJpbnRcIjp7YmlnaW50OnMucX19LHtcImludFwiOntiaWdpbnQ6cy5nfX0se1wiaW50XCI6e2JpZ2ludDpzLnl9fSx7XCJpbnRcIjp7YmlnaW50OnMueH19XX0pO3JldHVybiBHfWlmKCgobiE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIG4pfHwodSE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIHUpfHwociE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIHIpKSYmYi5pc1B1YmxpYz09dHJ1ZSYmKEQ9PT11bmRlZmluZWR8fEQ9PVwiUEtDUzhQVUJcIikpe3ZhciBFPW5ldyBDKGIpO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiBoZXh0b3BlbSh3LFwiUFVCTElDIEtFWVwiKX1pZihEPT1cIlBLQ1MxUFJWXCImJm4hPT11bmRlZmluZWQmJmIgaW5zdGFuY2VvZiBuJiYoeT09PXVuZGVmaW5lZHx8eT09bnVsbCkmJmIuaXNQcml2YXRlPT10cnVlKXt2YXIgRT1BKGIpO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiBoZXh0b3BlbSh3LFwiUlNBIFBSSVZBVEUgS0VZXCIpfWlmKEQ9PVwiUEtDUzFQUlZcIiYmciE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIHImJih5PT09dW5kZWZpbmVkfHx5PT1udWxsKSYmYi5pc1ByaXZhdGU9PXRydWUpe3ZhciBpPW5ldyB6KHtuYW1lOmIuY3VydmVOYW1lfSk7dmFyIHY9aS5nZXRFbmNvZGVkSGV4KCk7dmFyIGg9QihiKTt2YXIgdD1oLmdldEVuY29kZWRIZXgoKTt2YXIgcD1cIlwiO3ArPWhleHRvcGVtKHYsXCJFQyBQQVJBTUVURVJTXCIpO3ArPWhleHRvcGVtKHQsXCJFQyBQUklWQVRFIEtFWVwiKTtyZXR1cm4gcH1pZihEPT1cIlBLQ1MxUFJWXCImJnUhPT11bmRlZmluZWQmJmIgaW5zdGFuY2VvZiB1JiYoeT09PXVuZGVmaW5lZHx8eT09bnVsbCkmJmIuaXNQcml2YXRlPT10cnVlKXt2YXIgRT14KGIpO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiBoZXh0b3BlbSh3LFwiRFNBIFBSSVZBVEUgS0VZXCIpfWlmKEQ9PVwiUEtDUzVQUlZcIiYmbiE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIG4mJih5IT09dW5kZWZpbmVkJiZ5IT1udWxsKSYmYi5pc1ByaXZhdGU9PXRydWUpe3ZhciBFPUEoYik7dmFyIHc9RS5nZXRFbmNvZGVkSGV4KCk7aWYobT09PXVuZGVmaW5lZCl7bT1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIlJTQVwiLHcseSxtLGopfWlmKEQ9PVwiUEtDUzVQUlZcIiYmciE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIHImJih5IT09dW5kZWZpbmVkJiZ5IT1udWxsKSYmYi5pc1ByaXZhdGU9PXRydWUpe3ZhciBFPUIoYik7dmFyIHc9RS5nZXRFbmNvZGVkSGV4KCk7aWYobT09PXVuZGVmaW5lZCl7bT1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIkVDXCIsdyx5LG0sail9aWYoRD09XCJQS0NTNVBSVlwiJiZ1IT09dW5kZWZpbmVkJiZiIGluc3RhbmNlb2YgdSYmKHkhPT11bmRlZmluZWQmJnkhPW51bGwpJiZiLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIEU9eChiKTt2YXIgdz1FLmdldEVuY29kZWRIZXgoKTtpZihtPT09dW5kZWZpbmVkKXttPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiRFNBXCIsdyx5LG0sail9dmFyIG89ZnVuY3Rpb24oRyxzKXt2YXIgST1jKEcscyk7dmFyIEg9bmV3IGwoe3NlcTpbe3NlcTpbe29pZDp7bmFtZTpcInBrY3M1UEJFUzJcIn19LHtzZXE6W3tzZXE6W3tvaWQ6e25hbWU6XCJwa2NzNVBCS0RGMlwifX0se3NlcTpbe29jdHN0cjp7aGV4OkkucGJrZGYyU2FsdH19LHtcImludFwiOkkucGJrZGYySXRlcn1dfV19LHtzZXE6W3tvaWQ6e25hbWU6XCJkZXMtRURFMy1DQkNcIn19LHtvY3RzdHI6e2hleDpJLmVuY3J5cHRpb25TY2hlbWVJVn19XX1dfV19LHtvY3RzdHI6e2hleDpJLmNpcGhlcnRleHR9fV19KTtyZXR1cm4gSC5nZXRFbmNvZGVkSGV4KCl9O3ZhciBjPWZ1bmN0aW9uKE4sTyl7dmFyIEg9MTAwO3ZhciBNPUNyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKDgpO3ZhciBMPVwiREVTLUVERTMtQ0JDXCI7dmFyIHM9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oOCk7dmFyIEk9Q3J5cHRvSlMuUEJLREYyKE8sTSx7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczpIfSk7dmFyIEo9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShOKTt2YXIgSz1DcnlwdG9KUy5UcmlwbGVERVMuZW5jcnlwdChKLEkse2l2OnN9KStcIlwiO3ZhciBHPXt9O0cuY2lwaGVydGV4dD1LO0cucGJrZGYyU2FsdD1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShNKTtHLnBia2RmMkl0ZXI9SDtHLmVuY3J5cHRpb25TY2hlbWVBbGc9TDtHLmVuY3J5cHRpb25TY2hlbWVJVj1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShzKTtyZXR1cm4gR307aWYoRD09XCJQS0NTOFBSVlwiJiZuIT11bmRlZmluZWQmJmIgaW5zdGFuY2VvZiBuJiZiLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIGc9QShiKTt2YXIgZD1nLmdldEVuY29kZWRIZXgoKTt2YXIgRT1sKHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJyc2FFbmNyeXB0aW9uXCJ9fSx7XCJudWxsXCI6dHJ1ZX1dfSx7b2N0c3RyOntoZXg6ZH19XX0pO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO2lmKHk9PT11bmRlZmluZWR8fHk9PW51bGwpe3JldHVybiBoZXh0b3BlbSh3LFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgdD1vKHcseSk7cmV0dXJuIGhleHRvcGVtKHQsXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fWlmKEQ9PVwiUEtDUzhQUlZcIiYmciE9PXVuZGVmaW5lZCYmYiBpbnN0YW5jZW9mIHImJmIuaXNQcml2YXRlPT10cnVlKXt2YXIgZz1uZXcgbCh7c2VxOlt7XCJpbnRcIjoxfSx7b2N0c3RyOntoZXg6Yi5wcnZLZXlIZXh9fSx7dGFnOltcImExXCIsdHJ1ZSx7Yml0c3RyOntoZXg6XCIwMFwiK2IucHViS2V5SGV4fX1dfV19KTt2YXIgZD1nLmdldEVuY29kZWRIZXgoKTt2YXIgRT1sKHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJlY1B1YmxpY0tleVwifX0se29pZDp7bmFtZTpiLmN1cnZlTmFtZX19XX0se29jdHN0cjp7aGV4OmR9fV19KTt2YXIgdz1FLmdldEVuY29kZWRIZXgoKTtpZih5PT09dW5kZWZpbmVkfHx5PT1udWxsKXtyZXR1cm4gaGV4dG9wZW0odyxcIlBSSVZBVEUgS0VZXCIpfWVsc2V7dmFyIHQ9byh3LHkpO3JldHVybiBoZXh0b3BlbSh0LFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX1pZihEPT1cIlBLQ1M4UFJWXCImJnUhPT11bmRlZmluZWQmJmIgaW5zdGFuY2VvZiB1JiZiLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIGc9bmV3IGYoe2JpZ2ludDpiLnh9KTt2YXIgZD1nLmdldEVuY29kZWRIZXgoKTt2YXIgRT1sKHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJkc2FcIn19LHtzZXE6W3tcImludFwiOntiaWdpbnQ6Yi5wfX0se1wiaW50XCI6e2JpZ2ludDpiLnF9fSx7XCJpbnRcIjp7YmlnaW50OmIuZ319XX1dfSx7b2N0c3RyOntoZXg6ZH19XX0pO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO2lmKHk9PT11bmRlZmluZWR8fHk9PW51bGwpe3JldHVybiBoZXh0b3BlbSh3LFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgdD1vKHcseSk7cmV0dXJuIGhleHRvcGVtKHQsXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fXRocm93XCJ1bnN1cHBvcnRlZCBvYmplY3Qgbm9yIGZvcm1hdFwifTtLRVlVVElMLmdldEtleUZyb21DU1JQRU09ZnVuY3Rpb24oYil7dmFyIGE9cGVtdG9oZXgoYixcIkNFUlRJRklDQVRFIFJFUVVFU1RcIik7dmFyIGM9S0VZVVRJTC5nZXRLZXlGcm9tQ1NSSGV4KGEpO3JldHVybiBjfTtLRVlVVElMLmdldEtleUZyb21DU1JIZXg9ZnVuY3Rpb24oYSl7dmFyIGM9S0VZVVRJTC5wYXJzZUNTUkhleChhKTt2YXIgYj1LRVlVVElMLmdldEtleShjLnA4cHVia2V5aGV4LG51bGwsXCJwa2NzOHB1YlwiKTtyZXR1cm4gYn07S0VZVVRJTC5wYXJzZUNTUkhleD1mdW5jdGlvbihkKXt2YXIgaT1BU04xSEVYO3ZhciBmPWkuZ2V0Q2hpbGRJZHg7dmFyIGM9aS5nZXRUTFY7dmFyIGI9e307dmFyIGc9ZDtpZihnLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAxKVwifXZhciBlPWYoZywwKTtpZihlLmxlbmd0aDwxKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwMilcIn1pZihnLnN1YnN0cihlWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAzKVwifXZhciBhPWYoZyxlWzBdKTtpZihhLmxlbmd0aDwzKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwNClcIn1iLnA4cHVia2V5aGV4PWMoZyxhWzJdKTtyZXR1cm4gYn07S0VZVVRJTC5nZXRKV0tGcm9tS2V5PWZ1bmN0aW9uKGQpe3ZhciBiPXt9O2lmKGQgaW5zdGFuY2VvZiBSU0FLZXkmJmQuaXNQcml2YXRlKXtiLmt0eT1cIlJTQVwiO2Iubj1oZXh0b2I2NHUoZC5uLnRvU3RyaW5nKDE2KSk7Yi5lPWhleHRvYjY0dShkLmUudG9TdHJpbmcoMTYpKTtiLmQ9aGV4dG9iNjR1KGQuZC50b1N0cmluZygxNikpO2IucD1oZXh0b2I2NHUoZC5wLnRvU3RyaW5nKDE2KSk7Yi5xPWhleHRvYjY0dShkLnEudG9TdHJpbmcoMTYpKTtiLmRwPWhleHRvYjY0dShkLmRtcDEudG9TdHJpbmcoMTYpKTtiLmRxPWhleHRvYjY0dShkLmRtcTEudG9TdHJpbmcoMTYpKTtiLnFpPWhleHRvYjY0dShkLmNvZWZmLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGJ9ZWxzZXtpZihkIGluc3RhbmNlb2YgUlNBS2V5JiZkLmlzUHVibGljKXtiLmt0eT1cIlJTQVwiO2Iubj1oZXh0b2I2NHUoZC5uLnRvU3RyaW5nKDE2KSk7Yi5lPWhleHRvYjY0dShkLmUudG9TdHJpbmcoMTYpKTtyZXR1cm4gYn1lbHNle2lmKGQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSYmZC5pc1ByaXZhdGUpe3ZhciBhPWQuZ2V0U2hvcnROSVNUUEN1cnZlTmFtZSgpO2lmKGEhPT1cIlAtMjU2XCImJmEhPT1cIlAtMzg0XCIpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lIGZvciBKV1Q6IFwiK2F9dmFyIGM9ZC5nZXRQdWJsaWNLZXlYWUhleCgpO2Iua3R5PVwiRUNcIjtiLmNydj1hO2IueD1oZXh0b2I2NHUoYy54KTtiLnk9aGV4dG9iNjR1KGMueSk7Yi5kPWhleHRvYjY0dShkLnBydktleUhleCk7cmV0dXJuIGJ9ZWxzZXtpZihkIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJmQuaXNQdWJsaWMpe3ZhciBhPWQuZ2V0U2hvcnROSVNUUEN1cnZlTmFtZSgpO2lmKGEhPT1cIlAtMjU2XCImJmEhPT1cIlAtMzg0XCIpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lIGZvciBKV1Q6IFwiK2F9dmFyIGM9ZC5nZXRQdWJsaWNLZXlYWUhleCgpO2Iua3R5PVwiRUNcIjtiLmNydj1hO2IueD1oZXh0b2I2NHUoYy54KTtiLnk9aGV4dG9iNjR1KGMueSk7cmV0dXJuIGJ9fX19dGhyb3dcIm5vdCBzdXBwb3J0ZWQga2V5IG9iamVjdFwifTtcblJTQUtleS5nZXRQb3NBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4PWZ1bmN0aW9uKGEpe3JldHVybiBBU04xSEVYLmdldENoaWxkSWR4KGEsMCl9O1JTQUtleS5nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXg9ZnVuY3Rpb24oZil7dmFyIG49QVNOMUhFWDt2YXIgaT1uLmdldFY7dmFyIGs9UlNBS2V5LmdldFBvc0FycmF5T2ZDaGlsZHJlbkZyb21IZXgoZik7dmFyIGU9aShmLGtbMF0pO3ZhciBqPWkoZixrWzFdKTt2YXIgYj1pKGYsa1syXSk7dmFyIGM9aShmLGtbM10pO3ZhciBoPWkoZixrWzRdKTt2YXIgZz1pKGYsa1s1XSk7dmFyIG09aShmLGtbNl0pO3ZhciBsPWkoZixrWzddKTt2YXIgZD1pKGYsa1s4XSk7dmFyIGs9bmV3IEFycmF5KCk7ay5wdXNoKGUsaixiLGMsaCxnLG0sbCxkKTtyZXR1cm4ga307UlNBS2V5LnByb3RvdHlwZS5yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmc9ZnVuY3Rpb24oZCl7dmFyIGM9cGVtdG9oZXgoZCk7dmFyIGI9UlNBS2V5LmdldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChjKTt0aGlzLnNldFByaXZhdGVFeChiWzFdLGJbMl0sYlszXSxiWzRdLGJbNV0sYls2XSxiWzddLGJbOF0pfTtSU0FLZXkucHJvdG90eXBlLnJlYWRQS0NTNVBydktleUhleD1mdW5jdGlvbihjKXt2YXIgYj1SU0FLZXkuZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGMpO3RoaXMuc2V0UHJpdmF0ZUV4KGJbMV0sYlsyXSxiWzNdLGJbNF0sYls1XSxiWzZdLGJbN10sYls4XSl9O1JTQUtleS5wcm90b3R5cGUucmVhZFBLQ1M4UHJ2S2V5SGV4PWZ1bmN0aW9uKGUpe3ZhciBjLGosbCxiLGEsZixkLGs7dmFyIG09QVNOMUhFWDt2YXIgZz1tLmdldFZieUxpc3Q7aWYobS5pc0FTTjFIRVgoZSk9PT1mYWxzZSl7dGhyb3dcIm5vdCBBU04uMSBoZXggc3RyaW5nXCJ9dHJ5e2M9ZyhlLDAsWzIsMCwxXSxcIjAyXCIpO2o9ZyhlLDAsWzIsMCwyXSxcIjAyXCIpO2w9ZyhlLDAsWzIsMCwzXSxcIjAyXCIpO2I9ZyhlLDAsWzIsMCw0XSxcIjAyXCIpO2E9ZyhlLDAsWzIsMCw1XSxcIjAyXCIpO2Y9ZyhlLDAsWzIsMCw2XSxcIjAyXCIpO2Q9ZyhlLDAsWzIsMCw3XSxcIjAyXCIpO2s9ZyhlLDAsWzIsMCw4XSxcIjAyXCIpfWNhdGNoKGkpe3Rocm93XCJtYWxmb3JtZWQgUEtDUyM4IHBsYWluIFJTQSBwcml2YXRlIGtleVwifXRoaXMuc2V0UHJpdmF0ZUV4KGMsaixsLGIsYSxmLGQsayl9O1JTQUtleS5wcm90b3R5cGUucmVhZFBLQ1M1UHViS2V5SGV4PWZ1bmN0aW9uKGMpe3ZhciBlPUFTTjFIRVg7dmFyIGI9ZS5nZXRWO2lmKGUuaXNBU04xSEVYKGMpPT09ZmFsc2Upe3Rocm93XCJrZXlIZXggaXMgbm90IEFTTi4xIGhleCBzdHJpbmdcIn12YXIgYT1lLmdldENoaWxkSWR4KGMsMCk7aWYoYS5sZW5ndGghPT0yfHxjLnN1YnN0cihhWzBdLDIpIT09XCIwMlwifHxjLnN1YnN0cihhWzFdLDIpIT09XCIwMlwiKXt0aHJvd1wid3JvbmcgaGV4IGZvciBQS0NTIzUgcHVibGljIGtleVwifXZhciBmPWIoYyxhWzBdKTt2YXIgZD1iKGMsYVsxXSk7dGhpcy5zZXRQdWJsaWMoZixkKX07UlNBS2V5LnByb3RvdHlwZS5yZWFkUEtDUzhQdWJLZXlIZXg9ZnVuY3Rpb24oYil7dmFyIGM9QVNOMUhFWDtpZihjLmlzQVNOMUhFWChiKT09PWZhbHNlKXt0aHJvd1wibm90IEFTTi4xIGhleCBzdHJpbmdcIn1pZihjLmdldFRMVmJ5TGlzdChiLDAsWzAsMF0pIT09XCIwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3Rocm93XCJub3QgUEtDUzggUlNBIHB1YmxpYyBrZXlcIn12YXIgYT1jLmdldFRMVmJ5TGlzdChiLDAsWzEsMF0pO3RoaXMucmVhZFBLQ1M1UHViS2V5SGV4KGEpfTtSU0FLZXkucHJvdG90eXBlLnJlYWRDZXJ0UHViS2V5SGV4PWZ1bmN0aW9uKGIsZCl7dmFyIGEsYzthPW5ldyBYNTA5KCk7YS5yZWFkQ2VydEhleChiKTtjPWEuZ2V0UHVibGljS2V5SGV4KCk7dGhpcy5yZWFkUEtDUzhQdWJLZXlIZXgoYyl9O1xudmFyIF9SRV9IRVhERUNPTkxZPW5ldyBSZWdFeHAoXCJcIik7X1JFX0hFWERFQ09OTFkuY29tcGlsZShcIlteMC05YS1mXVwiLFwiZ2lcIik7ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0SGV4UGFkZGVkRGlnZXN0SW5mb0ZvclN0cmluZyhkLGUsYSl7dmFyIGI9ZnVuY3Rpb24oZil7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhmLGEpfTt2YXIgYz1iKGQpO3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmdldFBhZGRlZERpZ2VzdEluZm9IZXgoYyxhLGUpfWZ1bmN0aW9uIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKGUsZCl7dmFyIGM9XCJcIjt2YXIgYT1kLzQtZS5sZW5ndGg7Zm9yKHZhciBiPTA7YjxhO2IrKyl7Yz1jK1wiMFwifXJldHVybiBjK2V9UlNBS2V5LnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKGQsYSl7dmFyIGI9ZnVuY3Rpb24oZSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhlLGEpfTt2YXIgYz1iKGQpO3JldHVybiB0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2goYyxhKX07UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKGUsYyl7dmFyIGY9S0pVUi5jcnlwdG8uVXRpbC5nZXRQYWRkZWREaWdlc3RJbmZvSGV4KGUsYyx0aGlzLm4uYml0TGVuZ3RoKCkpO3ZhciBiPXBhcnNlQmlnSW50KGYsMTYpO3ZhciBkPXRoaXMuZG9Qcml2YXRlKGIpO3ZhciBhPWQudG9TdHJpbmcoMTYpO3JldHVybiBfemVyb1BhZGRpbmdPZlNpZ25hdHVyZShhLHRoaXMubi5iaXRMZW5ndGgoKSl9O2Z1bmN0aW9uIHBzc19tZ2YxX3N0cihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9aGV4dG9yc3RyKGUocnN0cnRvaGV4KGMrU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKSkpO2QrPTF9cmV0dXJuIGJ9UlNBS2V5LnByb3RvdHlwZS5zaWduUFNTPWZ1bmN0aW9uKGUsYSxkKXt2YXIgYz1mdW5jdGlvbihmKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGYsYSl9O3ZhciBiPWMocnN0cnRvaGV4KGUpKTtpZihkPT09dW5kZWZpbmVkKXtkPS0xfXJldHVybiB0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2hQU1MoYixhLGQpfTtSU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoTWVzc2FnZUhhc2hQU1M9ZnVuY3Rpb24obCxhLGspe3ZhciBiPWhleHRvcnN0cihsKTt2YXIgZz1iLmxlbmd0aDt2YXIgbT10aGlzLm4uYml0TGVuZ3RoKCktMTt2YXIgYz1NYXRoLmNlaWwobS84KTt2YXIgZDt2YXIgbz1mdW5jdGlvbihpKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGksYSl9O2lmKGs9PT0tMXx8az09PXVuZGVmaW5lZCl7az1nfWVsc2V7aWYoaz09PS0yKXtrPWMtZy0yfWVsc2V7aWYoazwtMil7dGhyb3dcImludmFsaWQgc2FsdCBsZW5ndGhcIn19fWlmKGM8KGcraysyKSl7dGhyb3dcImRhdGEgdG9vIGxvbmdcIn12YXIgZj1cIlwiO2lmKGs+MCl7Zj1uZXcgQXJyYXkoayk7bmV3IFNlY3VyZVJhbmRvbSgpLm5leHRCeXRlcyhmKTtmPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGYpfXZhciBuPWhleHRvcnN0cihvKHJzdHJ0b2hleChcIlxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcIitiK2YpKSk7dmFyIGo9W107Zm9yKGQ9MDtkPGMtay1nLTI7ZCs9MSl7altkXT0wfXZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGopK1wiXFx4MDFcIitmO3ZhciBoPXBzc19tZ2YxX3N0cihuLGUubGVuZ3RoLG8pO3ZhciBxPVtdO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKz0xKXtxW2RdPWUuY2hhckNvZGVBdChkKV5oLmNoYXJDb2RlQXQoZCl9dmFyIHA9KDY1MjgwPj4oOCpjLW0pKSYyNTU7cVswXSY9fnA7Zm9yKGQ9MDtkPGc7ZCsrKXtxLnB1c2gobi5jaGFyQ29kZUF0KGQpKX1xLnB1c2goMTg4KTtyZXR1cm4gX3plcm9QYWRkaW5nT2ZTaWduYXR1cmUodGhpcy5kb1ByaXZhdGUobmV3IEJpZ0ludGVnZXIocSkpLnRvU3RyaW5nKDE2KSx0aGlzLm4uYml0TGVuZ3RoKCkpfTtmdW5jdGlvbiBfcnNhc2lnbl9nZXREZWNyeXB0U2lnbmF0dXJlQkkoYSxkLGMpe3ZhciBiPW5ldyBSU0FLZXkoKTtiLnNldFB1YmxpYyhkLGMpO3ZhciBlPWIuZG9QdWJsaWMoYSk7cmV0dXJuIGV9ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0SGV4RGlnZXN0SW5mb0Zyb21TaWcoYSxjLGIpe3ZhciBlPV9yc2FzaWduX2dldERlY3J5cHRTaWduYXR1cmVCSShhLGMsYik7dmFyIGQ9ZS50b1N0cmluZygxNikucmVwbGFjZSgvXjFmKzAwLyxcIlwiKTtyZXR1cm4gZH1mdW5jdGlvbiBfcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhmKXtmb3IodmFyIGUgaW4gS0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRCl7dmFyIGQ9S0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRFtlXTt2YXIgYj1kLmxlbmd0aDtpZihmLnN1YnN0cmluZygwLGIpPT1kKXt2YXIgYz1bZSxmLnN1YnN0cmluZyhiKV07cmV0dXJuIGN9fXJldHVybltdfVJTQUtleS5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uKGYsail7aj1qLnJlcGxhY2UoX1JFX0hFWERFQ09OTFksXCJcIik7aj1qLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTt2YXIgYj1wYXJzZUJpZ0ludChqLDE2KTtpZihiLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIDB9dmFyIGk9dGhpcy5kb1B1YmxpYyhiKTt2YXIgZT1pLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3ZhciBnPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGUpO2lmKGcubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9Z1swXTt2YXIgaD1nWzFdO3ZhciBhPWZ1bmN0aW9uKGspe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoayxkKX07dmFyIGM9YShmKTtyZXR1cm4oaD09Yyl9O1JTQUtleS5wcm90b3R5cGUudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKGUsYSl7YT1hLnJlcGxhY2UoX1JFX0hFWERFQ09OTFksXCJcIik7YT1hLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTt2YXIgYj1wYXJzZUJpZ0ludChhLDE2KTtpZihiLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIDB9dmFyIGg9dGhpcy5kb1B1YmxpYyhiKTt2YXIgZz1oLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3ZhciBjPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGcpO2lmKGMubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9Y1swXTt2YXIgZj1jWzFdO3JldHVybihmPT1lKX07UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlQU1M9ZnVuY3Rpb24oYyxiLGEsZil7dmFyIGU9ZnVuY3Rpb24oZyl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChnLGEpfTt2YXIgZD1lKHJzdHJ0b2hleChjKSk7aWYoZj09PXVuZGVmaW5lZCl7Zj0tMX1yZXR1cm4gdGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1MoZCxiLGEsZil9O1JTQUtleS5wcm90b3R5cGUudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTPWZ1bmN0aW9uKGYscyxsLGMpe3ZhciBrPW5ldyBCaWdJbnRlZ2VyKHMsMTYpO2lmKGsuYml0TGVuZ3RoKCk+dGhpcy5uLmJpdExlbmd0aCgpKXtyZXR1cm4gZmFsc2V9dmFyIHI9ZnVuY3Rpb24oaSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChpLGwpfTt2YXIgaj1oZXh0b3JzdHIoZik7dmFyIGg9ai5sZW5ndGg7dmFyIGc9dGhpcy5uLmJpdExlbmd0aCgpLTE7dmFyIG09TWF0aC5jZWlsKGcvOCk7dmFyIHE7aWYoYz09PS0xfHxjPT09dW5kZWZpbmVkKXtjPWh9ZWxzZXtpZihjPT09LTIpe2M9bS1oLTJ9ZWxzZXtpZihjPC0yKXt0aHJvd1wiaW52YWxpZCBzYWx0IGxlbmd0aFwifX19aWYobTwoaCtjKzIpKXt0aHJvd1wiZGF0YSB0b28gbG9uZ1wifXZhciBhPXRoaXMuZG9QdWJsaWMoaykudG9CeXRlQXJyYXkoKTtmb3IocT0wO3E8YS5sZW5ndGg7cSs9MSl7YVtxXSY9MjU1fXdoaWxlKGEubGVuZ3RoPG0pe2EudW5zaGlmdCgwKX1pZihhW20tMV0hPT0xODgpe3Rocm93XCJlbmNvZGVkIG1lc3NhZ2UgZG9lcyBub3QgZW5kIGluIDB4YmNcIn1hPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGEpO3ZhciBkPWEuc3Vic3RyKDAsbS1oLTEpO3ZhciBlPWEuc3Vic3RyKGQubGVuZ3RoLGgpO3ZhciBwPSg2NTI4MD4+KDgqbS1nKSkmMjU1O2lmKChkLmNoYXJDb2RlQXQoMCkmcCkhPT0wKXt0aHJvd1wiYml0cyBiZXlvbmQga2V5c2l6ZSBub3QgemVyb1wifXZhciBuPXBzc19tZ2YxX3N0cihlLGQubGVuZ3RoLHIpO3ZhciBvPVtdO2ZvcihxPTA7cTxkLmxlbmd0aDtxKz0xKXtvW3FdPWQuY2hhckNvZGVBdChxKV5uLmNoYXJDb2RlQXQocSl9b1swXSY9fnA7dmFyIGI9bS1oLWMtMjtmb3IocT0wO3E8YjtxKz0xKXtpZihvW3FdIT09MCl7dGhyb3dcImxlZnRtb3N0IG9jdGV0cyBub3QgemVyb1wifX1pZihvW2JdIT09MSl7dGhyb3dcIjB4MDEgbWFya2VyIG5vdCBmb3VuZFwifXJldHVybiBlPT09aGV4dG9yc3RyKHIocnN0cnRvaGV4KFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiK2orU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsby5zbGljZSgtYykpKSkpfTtSU0FLZXkuU0FMVF9MRU5fSExFTj0tMTtSU0FLZXkuU0FMVF9MRU5fTUFYPS0yO1JTQUtleS5TQUxUX0xFTl9SRUNPVkVSPS0yO1xuZnVuY3Rpb24gWDUwOSgpe3ZhciBrPUFTTjFIRVgsaj1rLmdldENoaWxkSWR4LGg9ay5nZXRWLGI9ay5nZXRUTFYsZj1rLmdldFZieUxpc3QsYz1rLmdldFRMVmJ5TGlzdCxnPWsuZ2V0SWR4YnlMaXN0LGQ9ay5nZXRWaWR4LGk9ay5vaWRuYW1lLGE9WDUwOSxlPXBlbXRvaGV4O3RoaXMuaGV4PW51bGw7dGhpcy52ZXJzaW9uPTA7dGhpcy5mb2Zmc2V0PTA7dGhpcy5hRXh0SW5mbz1udWxsO3RoaXMuZ2V0VmVyc2lvbj1mdW5jdGlvbigpe2lmKHRoaXMuaGV4PT09bnVsbHx8dGhpcy52ZXJzaW9uIT09MCl7cmV0dXJuIHRoaXMudmVyc2lvbn1pZihjKHRoaXMuaGV4LDAsWzAsMF0pIT09XCJhMDAzMDIwMTAyXCIpe3RoaXMudmVyc2lvbj0xO3RoaXMuZm9mZnNldD0tMTtyZXR1cm4gMX10aGlzLnZlcnNpb249MztyZXR1cm4gM307dGhpcy5nZXRTZXJpYWxOdW1iZXJIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gZih0aGlzLmhleCwwLFswLDErdGhpcy5mb2Zmc2V0XSxcIjAyXCIpfTt0aGlzLmdldFNpZ25hdHVyZUFsZ29yaXRobUZpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIGkoZih0aGlzLmhleCwwLFswLDIrdGhpcy5mb2Zmc2V0LDBdLFwiMDZcIikpfTt0aGlzLmdldElzc3VlckhleD1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMuaGV4LDAsWzAsMyt0aGlzLmZvZmZzZXRdLFwiMzBcIil9O3RoaXMuZ2V0SXNzdWVyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGEuaGV4MmRuKHRoaXMuZ2V0SXNzdWVySGV4KCkpfTt0aGlzLmdldFN1YmplY3RIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gYyh0aGlzLmhleCwwLFswLDUrdGhpcy5mb2Zmc2V0XSxcIjMwXCIpfTt0aGlzLmdldFN1YmplY3RTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5oZXgyZG4odGhpcy5nZXRTdWJqZWN0SGV4KCkpfTt0aGlzLmdldE5vdEJlZm9yZT1mdW5jdGlvbigpe3ZhciBsPWYodGhpcy5oZXgsMCxbMCw0K3RoaXMuZm9mZnNldCwwXSk7bD1sLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTtsPWRlY29kZVVSSUNvbXBvbmVudChsKTtyZXR1cm4gbH07dGhpcy5nZXROb3RBZnRlcj1mdW5jdGlvbigpe3ZhciBsPWYodGhpcy5oZXgsMCxbMCw0K3RoaXMuZm9mZnNldCwxXSk7bD1sLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTtsPWRlY29kZVVSSUNvbXBvbmVudChsKTtyZXR1cm4gbH07dGhpcy5nZXRQdWJsaWNLZXlIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gay5nZXRUTFZieUxpc3QodGhpcy5oZXgsMCxbMCw2K3RoaXMuZm9mZnNldF0sXCIzMFwiKX07dGhpcy5nZXRQdWJsaWNLZXlJZHg9ZnVuY3Rpb24oKXtyZXR1cm4gZyh0aGlzLmhleCwwLFswLDYrdGhpcy5mb2Zmc2V0XSxcIjMwXCIpfTt0aGlzLmdldFB1YmxpY0tleUNvbnRlbnRJZHg9ZnVuY3Rpb24oKXt2YXIgbD10aGlzLmdldFB1YmxpY0tleUlkeCgpO3JldHVybiBnKHRoaXMuaGV4LGwsWzEsMF0sXCIzMFwiKX07dGhpcy5nZXRQdWJsaWNLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXkodGhpcy5nZXRQdWJsaWNLZXlIZXgoKSxudWxsLFwicGtjczhwdWJcIil9O3RoaXMuZ2V0U2lnbmF0dXJlQWxnb3JpdGhtTmFtZT1mdW5jdGlvbigpe3JldHVybiBpKGYodGhpcy5oZXgsMCxbMSwwXSxcIjA2XCIpKX07dGhpcy5nZXRTaWduYXR1cmVWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiBmKHRoaXMuaGV4LDAsWzJdLFwiMDNcIix0cnVlKX07dGhpcy52ZXJpZnlTaWduYXR1cmU9ZnVuY3Rpb24obil7dmFyIG89dGhpcy5nZXRTaWduYXR1cmVBbGdvcml0aG1OYW1lKCk7dmFyIGw9dGhpcy5nZXRTaWduYXR1cmVWYWx1ZUhleCgpO3ZhciBtPWModGhpcy5oZXgsMCxbMF0sXCIzMFwiKTt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6b30pO3AuaW5pdChuKTtwLnVwZGF0ZUhleChtKTtyZXR1cm4gcC52ZXJpZnkobCl9O3RoaXMucGFyc2VFeHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnZlcnNpb24hPT0zKXtyZXR1cm4gLTF9dmFyIHA9Zyh0aGlzLmhleCwwLFswLDcsMF0sXCIzMFwiKTt2YXIgbT1qKHRoaXMuaGV4LHApO3RoaXMuYUV4dEluZm89bmV3IEFycmF5KCk7Zm9yKHZhciBuPTA7bjxtLmxlbmd0aDtuKyspe3ZhciBxPXt9O3EuY3JpdGljYWw9ZmFsc2U7dmFyIGw9aih0aGlzLmhleCxtW25dKTt2YXIgcj0wO2lmKGwubGVuZ3RoPT09Myl7cS5jcml0aWNhbD10cnVlO3I9MX1xLm9pZD1rLmhleHRvb2lkc3RyKGYodGhpcy5oZXgsbVtuXSxbMF0sXCIwNlwiKSk7dmFyIG89Zyh0aGlzLmhleCxtW25dLFsxK3JdKTtxLnZpZHg9ZCh0aGlzLmhleCxvKTt0aGlzLmFFeHRJbmZvLnB1c2gocSl9fTt0aGlzLmdldEV4dEluZm89ZnVuY3Rpb24obil7dmFyIGw9dGhpcy5hRXh0SW5mbzt2YXIgbz1uO2lmKCFuLm1hdGNoKC9eWzAtOS5dKyQvKSl7bz1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWQobil9aWYobz09PVwiXCIpe3JldHVybiB1bmRlZmluZWR9Zm9yKHZhciBtPTA7bTxsLmxlbmd0aDttKyspe2lmKGxbbV0ub2lkPT09byl7cmV0dXJuIGxbbV19fXJldHVybiB1bmRlZmluZWR9O3RoaXMuZ2V0RXh0QmFzaWNDb25zdHJhaW50cz1mdW5jdGlvbigpe3ZhciBuPXRoaXMuZ2V0RXh0SW5mbyhcImJhc2ljQ29uc3RyYWludHNcIik7aWYobj09PXVuZGVmaW5lZCl7cmV0dXJuIG59dmFyIGw9aCh0aGlzLmhleCxuLnZpZHgpO2lmKGw9PT1cIlwiKXtyZXR1cm57fX1pZihsPT09XCIwMTAxZmZcIil7cmV0dXJue2NBOnRydWV9fWlmKGwuc3Vic3RyKDAsOCk9PT1cIjAxMDFmZjAyXCIpe3ZhciBvPWgobCw2KTt2YXIgbT1wYXJzZUludChvLDE2KTtyZXR1cm57Y0E6dHJ1ZSxwYXRoTGVuOm19fXRocm93XCJiYXNpY0NvbnN0cmFpbnRzIHBhcnNlIGVycm9yXCJ9O3RoaXMuZ2V0RXh0S2V5VXNhZ2VCaW49ZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEV4dEluZm8oXCJrZXlVc2FnZVwiKTtpZihvPT09dW5kZWZpbmVkKXtyZXR1cm5cIlwifXZhciBtPWgodGhpcy5oZXgsby52aWR4KTtpZihtLmxlbmd0aCUyIT0wfHxtLmxlbmd0aDw9Mil7dGhyb3dcIm1hbGZvcm1lZCBrZXkgdXNhZ2UgdmFsdWVcIn12YXIgbD1wYXJzZUludChtLnN1YnN0cigwLDIpKTt2YXIgbj1wYXJzZUludChtLnN1YnN0cigyKSwxNikudG9TdHJpbmcoMik7cmV0dXJuIG4uc3Vic3RyKDAsbi5sZW5ndGgtbCl9O3RoaXMuZ2V0RXh0S2V5VXNhZ2VTdHJpbmc9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmdldEV4dEtleVVzYWdlQmluKCk7dmFyIGw9bmV3IEFycmF5KCk7Zm9yKHZhciBtPTA7bTxuLmxlbmd0aDttKyspe2lmKG4uc3Vic3RyKG0sMSk9PVwiMVwiKXtsLnB1c2goWDUwOS5LRVlVU0FHRV9OQU1FW21dKX19cmV0dXJuIGwuam9pbihcIixcIil9O3RoaXMuZ2V0RXh0U3ViamVjdEtleUlkZW50aWZpZXI9ZnVuY3Rpb24oKXt2YXIgbD10aGlzLmdldEV4dEluZm8oXCJzdWJqZWN0S2V5SWRlbnRpZmllclwiKTtpZihsPT09dW5kZWZpbmVkKXtyZXR1cm4gbH1yZXR1cm4gaCh0aGlzLmhleCxsLnZpZHgpfTt0aGlzLmdldEV4dEF1dGhvcml0eUtleUlkZW50aWZpZXI9ZnVuY3Rpb24oKXt2YXIgcD10aGlzLmdldEV4dEluZm8oXCJhdXRob3JpdHlLZXlJZGVudGlmaWVyXCIpO2lmKHA9PT11bmRlZmluZWQpe3JldHVybiBwfXZhciBsPXt9O3ZhciBvPWIodGhpcy5oZXgscC52aWR4KTt2YXIgbT1qKG8sMCk7Zm9yKHZhciBuPTA7bjxtLmxlbmd0aDtuKyspe2lmKG8uc3Vic3RyKG1bbl0sMik9PT1cIjgwXCIpe2wua2lkPWgobyxtW25dKX19cmV0dXJuIGx9O3RoaXMuZ2V0RXh0RXh0S2V5VXNhZ2VOYW1lPWZ1bmN0aW9uKCl7dmFyIHA9dGhpcy5nZXRFeHRJbmZvKFwiZXh0S2V5VXNhZ2VcIik7aWYocD09PXVuZGVmaW5lZCl7cmV0dXJuIHB9dmFyIGw9bmV3IEFycmF5KCk7dmFyIG89Yih0aGlzLmhleCxwLnZpZHgpO2lmKG89PT1cIlwiKXtyZXR1cm4gbH12YXIgbT1qKG8sMCk7Zm9yKHZhciBuPTA7bjxtLmxlbmd0aDtuKyspe2wucHVzaChpKGgobyxtW25dKSkpfXJldHVybiBsfTt0aGlzLmdldEV4dFN1YmplY3RBbHROYW1lPWZ1bmN0aW9uKCl7dmFyIG09dGhpcy5nZXRFeHRTdWJqZWN0QWx0TmFtZTIoKTt2YXIgbD1uZXcgQXJyYXkoKTtmb3IodmFyIG49MDtuPG0ubGVuZ3RoO24rKyl7aWYobVtuXVswXT09PVwiRE5TXCIpe2wucHVzaChtW25dWzFdKX19cmV0dXJuIGx9O3RoaXMuZ2V0RXh0U3ViamVjdEFsdE5hbWUyPWZ1bmN0aW9uKCl7dmFyIHAscyxyO3ZhciBxPXRoaXMuZ2V0RXh0SW5mbyhcInN1YmplY3RBbHROYW1lXCIpO2lmKHE9PT11bmRlZmluZWQpe3JldHVybiBxfXZhciBsPW5ldyBBcnJheSgpO3ZhciBvPWIodGhpcy5oZXgscS52aWR4KTt2YXIgbT1qKG8sMCk7Zm9yKHZhciBuPTA7bjxtLmxlbmd0aDtuKyspe3I9by5zdWJzdHIobVtuXSwyKTtwPWgobyxtW25dKTtpZihyPT09XCI4MVwiKXtzPWhleHRvdXRmOChwKTtsLnB1c2goW1wiTUFJTFwiLHNdKX1pZihyPT09XCI4MlwiKXtzPWhleHRvdXRmOChwKTtsLnB1c2goW1wiRE5TXCIsc10pfWlmKHI9PT1cIjg0XCIpe3M9WDUwOS5oZXgyZG4ocCwwKTtsLnB1c2goW1wiRE5cIixzXSl9aWYocj09PVwiODZcIil7cz1oZXh0b3V0ZjgocCk7bC5wdXNoKFtcIlVSSVwiLHNdKX1pZihyPT09XCI4N1wiKXtzPWhleHRvaXAocCk7bC5wdXNoKFtcIklQXCIsc10pfX1yZXR1cm4gbH07dGhpcy5nZXRFeHRDUkxEaXN0cmlidXRpb25Qb2ludHNVUkk9ZnVuY3Rpb24oKXt2YXIgcT10aGlzLmdldEV4dEluZm8oXCJjUkxEaXN0cmlidXRpb25Qb2ludHNcIik7aWYocT09PXVuZGVmaW5lZCl7cmV0dXJuIHF9dmFyIGw9bmV3IEFycmF5KCk7dmFyIG09aih0aGlzLmhleCxxLnZpZHgpO2Zvcih2YXIgbz0wO288bS5sZW5ndGg7bysrKXt0cnl7dmFyIHI9Zih0aGlzLmhleCxtW29dLFswLDAsMF0sXCI4NlwiKTt2YXIgcD1oZXh0b3V0Zjgocik7bC5wdXNoKHApfWNhdGNoKG4pe319cmV0dXJuIGx9O3RoaXMuZ2V0RXh0QUlBSW5mbz1mdW5jdGlvbigpe3ZhciBwPXRoaXMuZ2V0RXh0SW5mbyhcImF1dGhvcml0eUluZm9BY2Nlc3NcIik7aWYocD09PXVuZGVmaW5lZCl7cmV0dXJuIHB9dmFyIGw9e29jc3A6W10sY2Fpc3N1ZXI6W119O3ZhciBtPWoodGhpcy5oZXgscC52aWR4KTtmb3IodmFyIG49MDtuPG0ubGVuZ3RoO24rKyl7dmFyIHE9Zih0aGlzLmhleCxtW25dLFswXSxcIjA2XCIpO3ZhciBvPWYodGhpcy5oZXgsbVtuXSxbMV0sXCI4NlwiKTtpZihxPT09XCIyYjA2MDEwNTA1MDczMDAxXCIpe2wub2NzcC5wdXNoKGhleHRvdXRmOChvKSl9aWYocT09PVwiMmIwNjAxMDUwNTA3MzAwMlwiKXtsLmNhaXNzdWVyLnB1c2goaGV4dG91dGY4KG8pKX19cmV0dXJuIGx9O3RoaXMuZ2V0RXh0Q2VydGlmaWNhdGVQb2xpY2llcz1mdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0RXh0SW5mbyhcImNlcnRpZmljYXRlUG9saWNpZXNcIik7aWYobz09PXVuZGVmaW5lZCl7cmV0dXJuIG99dmFyIGw9Yih0aGlzLmhleCxvLnZpZHgpO3ZhciB1PVtdO3ZhciBzPWoobCwwKTtmb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyl7dmFyIHQ9e307dmFyIG49aihsLHNbcl0pO3QuaWQ9aShoKGwsblswXSkpO2lmKG4ubGVuZ3RoPT09Mil7dmFyIG09aihsLG5bMV0pO2Zvcih2YXIgcT0wO3E8bS5sZW5ndGg7cSsrKXt2YXIgcD1mKGwsbVtxXSxbMF0sXCIwNlwiKTtpZihwPT09XCIyYjA2MDEwNTA1MDcwMjAxXCIpe3QuY3BzPWhleHRvdXRmOChmKGwsbVtxXSxbMV0pKX1lbHNle2lmKHA9PT1cIjJiMDYwMTA1MDUwNzAyMDJcIil7dC51bm90aWNlPWhleHRvdXRmOChmKGwsbVtxXSxbMSwwXSkpfX19fXUucHVzaCh0KX1yZXR1cm4gdX07dGhpcy5yZWFkQ2VydFBFTT1mdW5jdGlvbihsKXt0aGlzLnJlYWRDZXJ0SGV4KGUobCkpfTt0aGlzLnJlYWRDZXJ0SGV4PWZ1bmN0aW9uKGwpe3RoaXMuaGV4PWw7dGhpcy5nZXRWZXJzaW9uKCk7dHJ5e2codGhpcy5oZXgsMCxbMCw3XSxcImEzXCIpO3RoaXMucGFyc2VFeHQoKX1jYXRjaChtKXt9fTt0aGlzLmdldEluZm89ZnVuY3Rpb24oKXt2YXIgbT1YNTA5O3ZhciBCLHUsejtCPVwiQmFzaWMgRmllbGRzXFxuXCI7Qis9XCIgIHNlcmlhbCBudW1iZXI6IFwiK3RoaXMuZ2V0U2VyaWFsTnVtYmVySGV4KCkrXCJcXG5cIjtCKz1cIiAgc2lnbmF0dXJlIGFsZ29yaXRobTogXCIrdGhpcy5nZXRTaWduYXR1cmVBbGdvcml0aG1GaWVsZCgpK1wiXFxuXCI7Qis9XCIgIGlzc3VlcjogXCIrdGhpcy5nZXRJc3N1ZXJTdHJpbmcoKStcIlxcblwiO0IrPVwiICBub3RCZWZvcmU6IFwiK3RoaXMuZ2V0Tm90QmVmb3JlKCkrXCJcXG5cIjtCKz1cIiAgbm90QWZ0ZXI6IFwiK3RoaXMuZ2V0Tm90QWZ0ZXIoKStcIlxcblwiO0IrPVwiICBzdWJqZWN0OiBcIit0aGlzLmdldFN1YmplY3RTdHJpbmcoKStcIlxcblwiO0IrPVwiICBzdWJqZWN0IHB1YmxpYyBrZXkgaW5mbzogXFxuXCI7dT10aGlzLmdldFB1YmxpY0tleSgpO0IrPVwiICAgIGtleSBhbGdvcml0aG06IFwiK3UudHlwZStcIlxcblwiO2lmKHUudHlwZT09PVwiUlNBXCIpe0IrPVwiICAgIG49XCIraGV4dG9wb3NoZXgodS5uLnRvU3RyaW5nKDE2KSkuc3Vic3RyKDAsMTYpK1wiLi4uXFxuXCI7Qis9XCIgICAgZT1cIitoZXh0b3Bvc2hleCh1LmUudG9TdHJpbmcoMTYpKStcIlxcblwifXo9dGhpcy5hRXh0SW5mbztpZih6IT09dW5kZWZpbmVkJiZ6IT09bnVsbCl7Qis9XCJYNTA5djMgRXh0ZW5zaW9uczpcXG5cIjtmb3IodmFyIHI9MDtyPHoubGVuZ3RoO3IrKyl7dmFyIG49eltyXTt2YXIgQT1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUobi5vaWQpO2lmKEE9PT1cIlwiKXtBPW4ub2lkfXZhciB4PVwiXCI7aWYobi5jcml0aWNhbD09PXRydWUpe3g9XCJDUklUSUNBTFwifUIrPVwiICBcIitBK1wiIFwiK3grXCI6XFxuXCI7aWYoQT09PVwiYmFzaWNDb25zdHJhaW50c1wiKXt2YXIgdj10aGlzLmdldEV4dEJhc2ljQ29uc3RyYWludHMoKTtpZih2LmNBPT09dW5kZWZpbmVkKXtCKz1cIiAgICB7fVxcblwifWVsc2V7Qis9XCIgICAgY0E9dHJ1ZVwiO2lmKHYucGF0aExlbiE9PXVuZGVmaW5lZCl7Qis9XCIsIHBhdGhMZW49XCIrdi5wYXRoTGVufUIrPVwiXFxuXCJ9fWVsc2V7aWYoQT09PVwia2V5VXNhZ2VcIil7Qis9XCIgICAgXCIrdGhpcy5nZXRFeHRLZXlVc2FnZVN0cmluZygpK1wiXFxuXCJ9ZWxzZXtpZihBPT09XCJzdWJqZWN0S2V5SWRlbnRpZmllclwiKXtCKz1cIiAgICBcIit0aGlzLmdldEV4dFN1YmplY3RLZXlJZGVudGlmaWVyKCkrXCJcXG5cIn1lbHNle2lmKEE9PT1cImF1dGhvcml0eUtleUlkZW50aWZpZXJcIil7dmFyIGw9dGhpcy5nZXRFeHRBdXRob3JpdHlLZXlJZGVudGlmaWVyKCk7aWYobC5raWQhPT11bmRlZmluZWQpe0IrPVwiICAgIGtpZD1cIitsLmtpZCtcIlxcblwifX1lbHNle2lmKEE9PT1cImV4dEtleVVzYWdlXCIpe3ZhciB3PXRoaXMuZ2V0RXh0RXh0S2V5VXNhZ2VOYW1lKCk7Qis9XCIgICAgXCIrdy5qb2luKFwiLCBcIikrXCJcXG5cIn1lbHNle2lmKEE9PT1cInN1YmplY3RBbHROYW1lXCIpe3ZhciB0PXRoaXMuZ2V0RXh0U3ViamVjdEFsdE5hbWUyKCk7Qis9XCIgICAgXCIrdCtcIlxcblwifWVsc2V7aWYoQT09PVwiY1JMRGlzdHJpYnV0aW9uUG9pbnRzXCIpe3ZhciB5PXRoaXMuZ2V0RXh0Q1JMRGlzdHJpYnV0aW9uUG9pbnRzVVJJKCk7Qis9XCIgICAgXCIreStcIlxcblwifWVsc2V7aWYoQT09PVwiYXV0aG9yaXR5SW5mb0FjY2Vzc1wiKXt2YXIgcD10aGlzLmdldEV4dEFJQUluZm8oKTtpZihwLm9jc3AhPT11bmRlZmluZWQpe0IrPVwiICAgIG9jc3A6IFwiK3Aub2NzcC5qb2luKFwiLFwiKStcIlxcblwifWlmKHAuY2Fpc3N1ZXIhPT11bmRlZmluZWQpe0IrPVwiICAgIGNhaXNzdWVyOiBcIitwLmNhaXNzdWVyLmpvaW4oXCIsXCIpK1wiXFxuXCJ9fWVsc2V7aWYoQT09PVwiY2VydGlmaWNhdGVQb2xpY2llc1wiKXt2YXIgbz10aGlzLmdldEV4dENlcnRpZmljYXRlUG9saWNpZXMoKTtmb3IodmFyIHE9MDtxPG8ubGVuZ3RoO3ErKyl7aWYob1txXS5pZCE9PXVuZGVmaW5lZCl7Qis9XCIgICAgcG9saWN5IG9pZDogXCIrb1txXS5pZCtcIlxcblwifWlmKG9bcV0uY3BzIT09dW5kZWZpbmVkKXtCKz1cIiAgICBjcHM6IFwiK29bcV0uY3BzK1wiXFxuXCJ9fX19fX19fX19fX19Qis9XCJzaWduYXR1cmUgYWxnb3JpdGhtOiBcIit0aGlzLmdldFNpZ25hdHVyZUFsZ29yaXRobU5hbWUoKStcIlxcblwiO0IrPVwic2lnbmF0dXJlOiBcIit0aGlzLmdldFNpZ25hdHVyZVZhbHVlSGV4KCkuc3Vic3RyKDAsMTYpK1wiLi4uXFxuXCI7cmV0dXJuIEJ9fVg1MDkuaGV4MmRuPWZ1bmN0aW9uKGYsYil7aWYoYj09PXVuZGVmaW5lZCl7Yj0wfWlmKGYuc3Vic3RyKGIsMikhPT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgRE5cIn12YXIgYz1uZXcgQXJyYXkoKTt2YXIgZD1BU04xSEVYLmdldENoaWxkSWR4KGYsYik7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe2MucHVzaChYNTA5LmhleDJyZG4oZixkW2VdKSl9Yz1jLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKFwiL1wiLFwiXFxcXC9cIil9KTtyZXR1cm5cIi9cIitjLmpvaW4oXCIvXCIpfTtYNTA5LmhleDJyZG49ZnVuY3Rpb24oZixiKXtpZihiPT09dW5kZWZpbmVkKXtiPTB9aWYoZi5zdWJzdHIoYiwyKSE9PVwiMzFcIil7dGhyb3dcIm1hbGZvcm1lZCBSRE5cIn12YXIgYz1uZXcgQXJyYXkoKTt2YXIgZD1BU04xSEVYLmdldENoaWxkSWR4KGYsYik7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe2MucHVzaChYNTA5LmhleDJhdHRyVHlwZVZhbHVlKGYsZFtlXSkpfWM9Yy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShcIitcIixcIlxcXFwrXCIpfSk7cmV0dXJuIGMuam9pbihcIitcIil9O1g1MDkuaGV4MmF0dHJUeXBlVmFsdWU9ZnVuY3Rpb24oZCxpKXt2YXIgaj1BU04xSEVYO3ZhciBoPWouZ2V0VjtpZihpPT09dW5kZWZpbmVkKXtpPTB9aWYoZC5zdWJzdHIoaSwyKSE9PVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBhdHRyaWJ1dGUgdHlwZSBhbmQgdmFsdWVcIn12YXIgZz1qLmdldENoaWxkSWR4KGQsaSk7aWYoZy5sZW5ndGghPT0yfHxkLnN1YnN0cihnWzBdLDIpIT09XCIwNlwiKXtcIm1hbGZvcm1lZCBhdHRyaWJ1dGUgdHlwZSBhbmQgdmFsdWVcIn12YXIgYj1oKGQsZ1swXSk7dmFyIGY9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGIpO3ZhciBlPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQyYXR5cGUoZik7dmFyIGE9aChkLGdbMV0pO3ZhciBjPWhleHRvcnN0cihhKTtyZXR1cm4gZStcIj1cIitjfTtYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0SGV4PWZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBYNTA5KCk7YS5yZWFkQ2VydEhleChiKTtyZXR1cm4gYS5nZXRQdWJsaWNLZXkoKX07WDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTT1mdW5jdGlvbihiKXt2YXIgYT1uZXcgWDUwOSgpO2EucmVhZENlcnRQRU0oYik7cmV0dXJuIGEuZ2V0UHVibGljS2V5KCl9O1g1MDkuZ2V0UHVibGljS2V5SW5mb1Byb3BPZkNlcnRQRU09ZnVuY3Rpb24oYyl7dmFyIGU9QVNOMUhFWDt2YXIgZz1lLmdldFZieUxpc3Q7dmFyIGI9e307dmFyIGEsZixkO2IuYWxncGFyYW09bnVsbDthPW5ldyBYNTA5KCk7YS5yZWFkQ2VydFBFTShjKTtmPWEuZ2V0UHVibGljS2V5SGV4KCk7Yi5rZXloZXg9ZyhmLDAsWzFdLFwiMDNcIikuc3Vic3RyKDIpO2IuYWxnb2lkPWcoZiwwLFswLDBdLFwiMDZcIik7aWYoYi5hbGdvaWQ9PT1cIjJhODY0OGNlM2QwMjAxXCIpe2IuYWxncGFyYW09ZyhmLDAsWzAsMV0sXCIwNlwiKX1yZXR1cm4gYn07WDUwOS5LRVlVU0FHRV9OQU1FPVtcImRpZ2l0YWxTaWduYXR1cmVcIixcIm5vblJlcHVkaWF0aW9uXCIsXCJrZXlFbmNpcGhlcm1lbnRcIixcImRhdGFFbmNpcGhlcm1lbnRcIixcImtleUFncmVlbWVudFwiLFwia2V5Q2VydFNpZ25cIixcImNSTFNpZ25cIixcImVuY2lwaGVyT25seVwiLFwiZGVjaXBoZXJPbmx5XCJdO1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmp3cz09XCJ1bmRlZmluZWRcInx8IUtKVVIuandzKXtLSlVSLmp3cz17fX1LSlVSLmp3cy5KV1M9ZnVuY3Rpb24oKXt2YXIgYj1LSlVSLGE9Yi5qd3MuSldTLGM9YS5pc1NhZmVKU09OU3RyaW5nO3RoaXMucGFyc2VKV1M9ZnVuY3Rpb24oZyxqKXtpZigodGhpcy5wYXJzZWRKV1MhPT11bmRlZmluZWQpJiYoanx8KHRoaXMucGFyc2VkSldTLnNpZ3ZhbEghPT11bmRlZmluZWQpKSl7cmV0dXJufXZhciBpPWcubWF0Y2goL14oW14uXSspXFwuKFteLl0rKVxcLihbXi5dKykkLyk7aWYoaT09bnVsbCl7dGhyb3dcIkpXUyBzaWduYXR1cmUgaXMgbm90IGEgZm9ybSBvZiAnSGVhZC5QYXlsb2FkLlNpZ1ZhbHVlJy5cIn12YXIgaz1pWzFdO3ZhciBlPWlbMl07dmFyIGw9aVszXTt2YXIgbj1rK1wiLlwiK2U7dGhpcy5wYXJzZWRKV1M9e307dGhpcy5wYXJzZWRKV1MuaGVhZEI2NFU9azt0aGlzLnBhcnNlZEpXUy5wYXlsb2FkQjY0VT1lO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEI2NFU9bDt0aGlzLnBhcnNlZEpXUy5zaT1uO2lmKCFqKXt2YXIgaD1iNjR1dG9oZXgobCk7dmFyIGY9cGFyc2VCaWdJbnQoaCwxNik7dGhpcy5wYXJzZWRKV1Muc2lndmFsSD1oO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEJJPWZ9dmFyIGQ9YjY0dXRvdXRmOChrKTt2YXIgbT1iNjR1dG91dGY4KGUpO3RoaXMucGFyc2VkSldTLmhlYWRTPWQ7dGhpcy5wYXJzZWRKV1MucGF5bG9hZFM9bTtpZighYyhkLHRoaXMucGFyc2VkSldTLFwiaGVhZFBcIikpe3Rocm93XCJtYWxmb3JtZWQgSlNPTiBzdHJpbmcgZm9yIEpXUyBIZWFkOiBcIitkfX19O0tKVVIuandzLkpXUy5zaWduPWZ1bmN0aW9uKGksdix5LHosYSl7dmFyIHc9S0pVUixtPXcuandzLHE9bS5KV1MsZz1xLnJlYWRTYWZlSlNPTlN0cmluZyxwPXEuaXNTYWZlSlNPTlN0cmluZyxkPXcuY3J5cHRvLGs9ZC5FQ0RTQSxvPWQuTWFjLGM9ZC5TaWduYXR1cmUsdD1KU09OO3ZhciBzLGosbjtpZih0eXBlb2YgdiE9XCJzdHJpbmdcIiYmdHlwZW9mIHYhPVwib2JqZWN0XCIpe3Rocm93XCJzcEhlYWRlciBtdXN0IGJlIEpTT04gc3RyaW5nIG9yIG9iamVjdDogXCIrdn1pZih0eXBlb2Ygdj09XCJvYmplY3RcIil7aj12O3M9dC5zdHJpbmdpZnkoail9aWYodHlwZW9mIHY9PVwic3RyaW5nXCIpe3M9djtpZighcChzKSl7dGhyb3dcIkpXUyBIZWFkIGlzIG5vdCBzYWZlIEpTT04gc3RyaW5nOiBcIitzfWo9ZyhzKX1uPXk7aWYodHlwZW9mIHk9PVwib2JqZWN0XCIpe249dC5zdHJpbmdpZnkoeSl9aWYoKGk9PVwiXCJ8fGk9PW51bGwpJiZqLmFsZyE9PXVuZGVmaW5lZCl7aT1qLmFsZ31pZigoaSE9XCJcIiYmaSE9bnVsbCkmJmouYWxnPT09dW5kZWZpbmVkKXtqLmFsZz1pO3M9dC5zdHJpbmdpZnkoail9aWYoaSE9PWouYWxnKXt0aHJvd1wiYWxnIGFuZCBzSGVhZGVyLmFsZyBkb2Vzbid0IG1hdGNoOiBcIitpK1wiIT1cIitqLmFsZ312YXIgcj1udWxsO2lmKHEuandzYWxnMnNpZ2FsZ1tpXT09PXVuZGVmaW5lZCl7dGhyb3dcInVuc3VwcG9ydGVkIGFsZyBuYW1lOiBcIitpfWVsc2V7cj1xLmp3c2FsZzJzaWdhbGdbaV19dmFyIGU9dXRmOHRvYjY0dShzKTt2YXIgbD11dGY4dG9iNjR1KG4pO3ZhciBiPWUrXCIuXCIrbDt2YXIgeD1cIlwiO2lmKHIuc3Vic3RyKDAsNCk9PVwiSG1hY1wiKXtpZih6PT09dW5kZWZpbmVkKXt0aHJvd1wibWFjIGtleSBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yIEhTKiBhbGdcIn12YXIgaD1uZXcgbyh7YWxnOnIscHJvdjpcImNyeXB0b2pzXCIscGFzczp6fSk7aC51cGRhdGVTdHJpbmcoYik7eD1oLmRvRmluYWwoKX1lbHNle2lmKHIuaW5kZXhPZihcIndpdGhFQ0RTQVwiKSE9LTEpe3ZhciBmPW5ldyBjKHthbGc6cn0pO2YuaW5pdCh6LGEpO2YudXBkYXRlU3RyaW5nKGIpO2hBU04xU2lnPWYuc2lnbigpO3g9S0pVUi5jcnlwdG8uRUNEU0EuYXNuMVNpZ1RvQ29uY2F0U2lnKGhBU04xU2lnKX1lbHNle2lmKHIhPVwibm9uZVwiKXt2YXIgZj1uZXcgYyh7YWxnOnJ9KTtmLmluaXQoeixhKTtmLnVwZGF0ZVN0cmluZyhiKTt4PWYuc2lnbigpfX19dmFyIHU9aGV4dG9iNjR1KHgpO3JldHVybiBiK1wiLlwiK3V9O0tKVVIuandzLkpXUy52ZXJpZnk9ZnVuY3Rpb24odyxCLG4pe3ZhciB4PUtKVVIscT14Lmp3cyx0PXEuSldTLGk9dC5yZWFkU2FmZUpTT05TdHJpbmcsZT14LmNyeXB0byxwPWUuRUNEU0Escz1lLk1hYyxkPWUuU2lnbmF0dXJlLG07aWYodHlwZW9mIFJTQUtleSE9PXVuZGVmaW5lZCl7bT1SU0FLZXl9dmFyIHk9dy5zcGxpdChcIi5cIik7aWYoeS5sZW5ndGghPT0zKXtyZXR1cm4gZmFsc2V9dmFyIGY9eVswXTt2YXIgcj15WzFdO3ZhciBjPWYrXCIuXCIrcjt2YXIgQT1iNjR1dG9oZXgoeVsyXSk7dmFyIGw9aShiNjR1dG91dGY4KHlbMF0pKTt2YXIgaz1udWxsO3ZhciB6PW51bGw7aWYobC5hbGc9PT11bmRlZmluZWQpe3Rocm93XCJhbGdvcml0aG0gbm90IHNwZWNpZmllZCBpbiBoZWFkZXJcIn1lbHNle2s9bC5hbGc7ej1rLnN1YnN0cigwLDIpfWlmKG4hPW51bGwmJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKT09PVwiW29iamVjdCBBcnJheV1cIiYmbi5sZW5ndGg+MCl7dmFyIGI9XCI6XCIrbi5qb2luKFwiOlwiKStcIjpcIjtpZihiLmluZGV4T2YoXCI6XCIraytcIjpcIik9PS0xKXt0aHJvd1wiYWxnb3JpdGhtICdcIitrK1wiJyBub3QgYWNjZXB0ZWQgaW4gdGhlIGxpc3RcIn19aWYoayE9XCJub25lXCImJkI9PT1udWxsKXt0aHJvd1wia2V5IHNoYWxsIGJlIHNwZWNpZmllZCB0byB2ZXJpZnkuXCJ9aWYodHlwZW9mIEI9PVwic3RyaW5nXCImJkIuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7Qj1LRVlVVElMLmdldEtleShCKX1pZih6PT1cIlJTXCJ8fHo9PVwiUFNcIil7aWYoIShCIGluc3RhbmNlb2YgbSkpe3Rocm93XCJrZXkgc2hhbGwgYmUgYSBSU0FLZXkgb2JqIGZvciBSUyogYW5kIFBTKiBhbGdzXCJ9fWlmKHo9PVwiRVNcIil7aWYoIShCIGluc3RhbmNlb2YgcCkpe3Rocm93XCJrZXkgc2hhbGwgYmUgYSBFQ0RTQSBvYmogZm9yIEVTKiBhbGdzXCJ9fWlmKGs9PVwibm9uZVwiKXt9dmFyIHU9bnVsbDtpZih0Lmp3c2FsZzJzaWdhbGdbbC5hbGddPT09dW5kZWZpbmVkKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnIG5hbWU6IFwiK2t9ZWxzZXt1PXQuandzYWxnMnNpZ2FsZ1trXX1pZih1PT1cIm5vbmVcIil7dGhyb3dcIm5vdCBzdXBwb3J0ZWRcIn1lbHNle2lmKHUuc3Vic3RyKDAsNCk9PVwiSG1hY1wiKXt2YXIgbz1udWxsO2lmKEI9PT11bmRlZmluZWQpe3Rocm93XCJoZXhhZGVjaW1hbCBrZXkgc2hhbGwgYmUgc3BlY2lmaWVkIGZvciBITUFDXCJ9dmFyIGo9bmV3IHMoe2FsZzp1LHBhc3M6Qn0pO2oudXBkYXRlU3RyaW5nKGMpO289ai5kb0ZpbmFsKCk7cmV0dXJuIEE9PW99ZWxzZXtpZih1LmluZGV4T2YoXCJ3aXRoRUNEU0FcIikhPS0xKXt2YXIgaD1udWxsO3RyeXtoPXAuY29uY2F0U2lnVG9BU04xU2lnKEEpfWNhdGNoKHYpe3JldHVybiBmYWxzZX12YXIgZz1uZXcgZCh7YWxnOnV9KTtnLmluaXQoQik7Zy51cGRhdGVTdHJpbmcoYyk7cmV0dXJuIGcudmVyaWZ5KGgpfWVsc2V7dmFyIGc9bmV3IGQoe2FsZzp1fSk7Zy5pbml0KEIpO2cudXBkYXRlU3RyaW5nKGMpO3JldHVybiBnLnZlcmlmeShBKX19fX07S0pVUi5qd3MuSldTLnBhcnNlPWZ1bmN0aW9uKGcpe3ZhciBjPWcuc3BsaXQoXCIuXCIpO3ZhciBiPXt9O3ZhciBmLGUsZDtpZihjLmxlbmd0aCE9MiYmYy5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgc0pXUzogd3JvbmcgbnVtYmVyIG9mICcuJyBzcGxpdHRlZCBlbGVtZW50c1wifWY9Y1swXTtlPWNbMV07aWYoYy5sZW5ndGg9PTMpe2Q9Y1syXX1iLmhlYWRlck9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZikpO2IucGF5bG9hZE9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZSkpO2IuaGVhZGVyUFA9SlNPTi5zdHJpbmdpZnkoYi5oZWFkZXJPYmosbnVsbCxcIiAgXCIpO2lmKGIucGF5bG9hZE9iaj09bnVsbCl7Yi5wYXlsb2FkUFA9YjY0dXRvdXRmOChlKX1lbHNle2IucGF5bG9hZFBQPUpTT04uc3RyaW5naWZ5KGIucGF5bG9hZE9iaixudWxsLFwiICBcIil9aWYoZCE9PXVuZGVmaW5lZCl7Yi5zaWdIZXg9YjY0dXRvaGV4KGQpfXJldHVybiBifTtLSlVSLmp3cy5KV1MudmVyaWZ5SldUPWZ1bmN0aW9uKGUsbCxyKXt2YXIgZD1LSlVSLGo9ZC5qd3Msbz1qLkpXUyxuPW8ucmVhZFNhZmVKU09OU3RyaW5nLHA9by5pbkFycmF5LGY9by5pbmNsdWRlZEFycmF5O3ZhciBrPWUuc3BsaXQoXCIuXCIpO3ZhciBjPWtbMF07dmFyIGk9a1sxXTt2YXIgcT1jK1wiLlwiK2k7dmFyIG09YjY0dXRvaGV4KGtbMl0pO3ZhciBoPW4oYjY0dXRvdXRmOChjKSk7dmFyIGc9bihiNjR1dG91dGY4KGkpKTtpZihoLmFsZz09PXVuZGVmaW5lZCl7cmV0dXJuIGZhbHNlfWlmKHIuYWxnPT09dW5kZWZpbmVkKXt0aHJvd1wiYWNjZXB0RmllbGQuYWxnIHNoYWxsIGJlIHNwZWNpZmllZFwifWlmKCFwKGguYWxnLHIuYWxnKSl7cmV0dXJuIGZhbHNlfWlmKGcuaXNzIT09dW5kZWZpbmVkJiZ0eXBlb2Ygci5pc3M9PT1cIm9iamVjdFwiKXtpZighcChnLmlzcyxyLmlzcykpe3JldHVybiBmYWxzZX19aWYoZy5zdWIhPT11bmRlZmluZWQmJnR5cGVvZiByLnN1Yj09PVwib2JqZWN0XCIpe2lmKCFwKGcuc3ViLHIuc3ViKSl7cmV0dXJuIGZhbHNlfX1pZihnLmF1ZCE9PXVuZGVmaW5lZCYmdHlwZW9mIHIuYXVkPT09XCJvYmplY3RcIil7aWYodHlwZW9mIGcuYXVkPT1cInN0cmluZ1wiKXtpZighcChnLmF1ZCxyLmF1ZCkpe3JldHVybiBmYWxzZX19ZWxzZXtpZih0eXBlb2YgZy5hdWQ9PVwib2JqZWN0XCIpe2lmKCFmKGcuYXVkLHIuYXVkKSl7cmV0dXJuIGZhbHNlfX19fXZhciBiPWouSW50RGF0ZS5nZXROb3coKTtpZihyLnZlcmlmeUF0IT09dW5kZWZpbmVkJiZ0eXBlb2Ygci52ZXJpZnlBdD09PVwibnVtYmVyXCIpe2I9ci52ZXJpZnlBdH1pZihyLmdyYWNlUGVyaW9kPT09dW5kZWZpbmVkfHx0eXBlb2Ygci5ncmFjZVBlcmlvZCE9PVwibnVtYmVyXCIpe3IuZ3JhY2VQZXJpb2Q9MH1pZihnLmV4cCE9PXVuZGVmaW5lZCYmdHlwZW9mIGcuZXhwPT1cIm51bWJlclwiKXtpZihnLmV4cCtyLmdyYWNlUGVyaW9kPGIpe3JldHVybiBmYWxzZX19aWYoZy5uYmYhPT11bmRlZmluZWQmJnR5cGVvZiBnLm5iZj09XCJudW1iZXJcIil7aWYoYjxnLm5iZi1yLmdyYWNlUGVyaW9kKXtyZXR1cm4gZmFsc2V9fWlmKGcuaWF0IT09dW5kZWZpbmVkJiZ0eXBlb2YgZy5pYXQ9PVwibnVtYmVyXCIpe2lmKGI8Zy5pYXQtci5ncmFjZVBlcmlvZCl7cmV0dXJuIGZhbHNlfX1pZihnLmp0aSE9PXVuZGVmaW5lZCYmci5qdGkhPT11bmRlZmluZWQpe2lmKGcuanRpIT09ci5qdGkpe3JldHVybiBmYWxzZX19aWYoIW8udmVyaWZ5KGUsbCxyLmFsZykpe3JldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX07S0pVUi5qd3MuSldTLmluY2x1ZGVkQXJyYXk9ZnVuY3Rpb24oYixhKXt2YXIgYz1LSlVSLmp3cy5KV1MuaW5BcnJheTtpZihiPT09bnVsbCl7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiIT09XCJvYmplY3RcIil7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiLmxlbmd0aCE9PVwibnVtYmVyXCIpe3JldHVybiBmYWxzZX1mb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7aWYoIWMoYltkXSxhKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX07S0pVUi5qd3MuSldTLmluQXJyYXk9ZnVuY3Rpb24oZCxiKXtpZihiPT09bnVsbCl7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiIT09XCJvYmplY3RcIil7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiLmxlbmd0aCE9PVwibnVtYmVyXCIpe3JldHVybiBmYWxzZX1mb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7aWYoYltjXT09ZCl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX07S0pVUi5qd3MuSldTLmp3c2FsZzJzaWdhbGc9e0hTMjU2OlwiSG1hY1NIQTI1NlwiLEhTMzg0OlwiSG1hY1NIQTM4NFwiLEhTNTEyOlwiSG1hY1NIQTUxMlwiLFJTMjU2OlwiU0hBMjU2d2l0aFJTQVwiLFJTMzg0OlwiU0hBMzg0d2l0aFJTQVwiLFJTNTEyOlwiU0hBNTEyd2l0aFJTQVwiLEVTMjU2OlwiU0hBMjU2d2l0aEVDRFNBXCIsRVMzODQ6XCJTSEEzODR3aXRoRUNEU0FcIixQUzI1NjpcIlNIQTI1NndpdGhSU0FhbmRNR0YxXCIsUFMzODQ6XCJTSEEzODR3aXRoUlNBYW5kTUdGMVwiLFBTNTEyOlwiU0hBNTEyd2l0aFJTQWFuZE1HRjFcIixub25lOlwibm9uZVwiLH07S0pVUi5qd3MuSldTLmlzU2FmZUpTT05TdHJpbmc9ZnVuY3Rpb24oYyxiLGQpe3ZhciBlPW51bGw7dHJ5e2U9anNvblBhcnNlKGMpO2lmKHR5cGVvZiBlIT1cIm9iamVjdFwiKXtyZXR1cm4gMH1pZihlLmNvbnN0cnVjdG9yPT09QXJyYXkpe3JldHVybiAwfWlmKGIpe2JbZF09ZX1yZXR1cm4gMX1jYXRjaChhKXtyZXR1cm4gMH19O0tKVVIuandzLkpXUy5yZWFkU2FmZUpTT05TdHJpbmc9ZnVuY3Rpb24oYil7dmFyIGM9bnVsbDt0cnl7Yz1qc29uUGFyc2UoYik7aWYodHlwZW9mIGMhPVwib2JqZWN0XCIpe3JldHVybiBudWxsfWlmKGMuY29uc3RydWN0b3I9PT1BcnJheSl7cmV0dXJuIG51bGx9cmV0dXJuIGN9Y2F0Y2goYSl7cmV0dXJuIG51bGx9fTtLSlVSLmp3cy5KV1MuZ2V0RW5jb2RlZFNpZ25hdHVyZVZhbHVlRnJvbUpXUz1mdW5jdGlvbihiKXt2YXIgYT1iLm1hdGNoKC9eW14uXStcXC5bXi5dK1xcLihbXi5dKykkLyk7aWYoYT09bnVsbCl7dGhyb3dcIkpXUyBzaWduYXR1cmUgaXMgbm90IGEgZm9ybSBvZiAnSGVhZC5QYXlsb2FkLlNpZ1ZhbHVlJy5cIn1yZXR1cm4gYVsxXX07S0pVUi5qd3MuSldTLmdldEpXS3RodW1icHJpbnQ9ZnVuY3Rpb24oZCl7aWYoZC5rdHkhPT1cIlJTQVwiJiZkLmt0eSE9PVwiRUNcIiYmZC5rdHkhPT1cIm9jdFwiKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnb3JpdGhtIGZvciBKV0sgVGh1bXByaW50XCJ9dmFyIGE9XCJ7XCI7aWYoZC5rdHk9PT1cIlJTQVwiKXtpZih0eXBlb2YgZC5uIT1cInN0cmluZ1wifHx0eXBlb2YgZC5lIT1cInN0cmluZ1wiKXt0aHJvd1wid3JvbmcgbiBhbmQgZSB2YWx1ZSBmb3IgUlNBIGtleVwifWErPSdcImVcIjpcIicrZC5lKydcIiwnO2ErPSdcImt0eVwiOlwiJytkLmt0eSsnXCIsJzthKz0nXCJuXCI6XCInK2QubisnXCJ9J31lbHNle2lmKGQua3R5PT09XCJFQ1wiKXtpZih0eXBlb2YgZC5jcnYhPVwic3RyaW5nXCJ8fHR5cGVvZiBkLnghPVwic3RyaW5nXCJ8fHR5cGVvZiBkLnkhPVwic3RyaW5nXCIpe3Rocm93XCJ3cm9uZyBjcnYsIHggYW5kIHkgdmFsdWUgZm9yIEVDIGtleVwifWErPSdcImNydlwiOlwiJytkLmNydisnXCIsJzthKz0nXCJrdHlcIjpcIicrZC5rdHkrJ1wiLCc7YSs9J1wieFwiOlwiJytkLngrJ1wiLCc7YSs9J1wieVwiOlwiJytkLnkrJ1wifSd9ZWxzZXtpZihkLmt0eT09PVwib2N0XCIpe2lmKHR5cGVvZiBkLmshPVwic3RyaW5nXCIpe3Rocm93XCJ3cm9uZyBrIHZhbHVlIGZvciBvY3Qoc3ltbWV0cmljKSBrZXlcIn1hKz0nXCJrdHlcIjpcIicrZC5rdHkrJ1wiLCc7YSs9J1wia1wiOlwiJytkLmsrJ1wifSd9fX12YXIgYj1yc3RydG9oZXgoYSk7dmFyIGM9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGIsXCJzaGEyNTZcIik7dmFyIGU9aGV4dG9iNjR1KGMpO3JldHVybiBlfTtLSlVSLmp3cy5JbnREYXRlPXt9O0tKVVIuandzLkludERhdGUuZ2V0PWZ1bmN0aW9uKGMpe3ZhciBiPUtKVVIuandzLkludERhdGUsZD1iLmdldE5vdyxhPWIuZ2V0WnVsdTtpZihjPT1cIm5vd1wiKXtyZXR1cm4gZCgpfWVsc2V7aWYoYz09XCJub3cgKyAxaG91clwiKXtyZXR1cm4gZCgpKzYwKjYwfWVsc2V7aWYoYz09XCJub3cgKyAxZGF5XCIpe3JldHVybiBkKCkrNjAqNjAqMjR9ZWxzZXtpZihjPT1cIm5vdyArIDFtb250aFwiKXtyZXR1cm4gZCgpKzYwKjYwKjI0KjMwfWVsc2V7aWYoYz09XCJub3cgKyAxeWVhclwiKXtyZXR1cm4gZCgpKzYwKjYwKjI0KjM2NX1lbHNle2lmKGMubWF0Y2goL1okLykpe3JldHVybiBhKGMpfWVsc2V7aWYoYy5tYXRjaCgvXlswLTldKyQvKSl7cmV0dXJuIHBhcnNlSW50KGMpfX19fX19fXRocm93XCJ1bnN1cHBvcnRlZCBmb3JtYXQ6IFwiK2N9O0tKVVIuandzLkludERhdGUuZ2V0WnVsdT1mdW5jdGlvbihhKXtyZXR1cm4genVsdXRvc2VjKGEpfTtLSlVSLmp3cy5JbnREYXRlLmdldE5vdz1mdW5jdGlvbigpe3ZhciBhPX5+KG5ldyBEYXRlKCkvMTAwMCk7cmV0dXJuIGF9O0tKVVIuandzLkludERhdGUuaW50RGF0ZTJVVENTdHJpbmc9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGUoYSoxMDAwKTtyZXR1cm4gYi50b1VUQ1N0cmluZygpfTtLSlVSLmp3cy5JbnREYXRlLmludERhdGUyWnVsdT1mdW5jdGlvbihlKXt2YXIgaT1uZXcgRGF0ZShlKjEwMDApLGg9KFwiMDAwMFwiK2kuZ2V0VVRDRnVsbFllYXIoKSkuc2xpY2UoLTQpLGc9KFwiMDBcIisoaS5nZXRVVENNb250aCgpKzEpKS5zbGljZSgtMiksYj0oXCIwMFwiK2kuZ2V0VVRDRGF0ZSgpKS5zbGljZSgtMiksYT0oXCIwMFwiK2kuZ2V0VVRDSG91cnMoKSkuc2xpY2UoLTIpLGM9KFwiMDBcIitpLmdldFVUQ01pbnV0ZXMoKSkuc2xpY2UoLTIpLGY9KFwiMDBcIitpLmdldFVUQ1NlY29uZHMoKSkuc2xpY2UoLTIpO3JldHVybiBoK2crYithK2MrZitcIlpcIn07XG5leHBvcnQgeyBTZWN1cmVSYW5kb20gfTtcclxuZXhwb3J0IHsgcm5nX3NlZWRfdGltZSB9O1xyXG5cclxuZXhwb3J0IHsgQmlnSW50ZWdlciB9O1xyXG5leHBvcnQgeyBSU0FLZXkgfTtcclxuZXhwb3J0IGNvbnN0IHsgRURTQSB9ID0gS0pVUi5jcnlwdG87XHJcbmV4cG9ydCBjb25zdCB7IERTQSB9ID0gS0pVUi5jcnlwdG87XHJcbmV4cG9ydCBjb25zdCB7IFNpZ25hdHVyZSB9ID0gS0pVUi5jcnlwdG87XHJcbmV4cG9ydCBjb25zdCB7IE1lc3NhZ2VEaWdlc3QgfSA9ICBLSlVSLmNyeXB0bztcclxuZXhwb3J0IGNvbnN0IHsgTWFjIH0gPSBLSlVSLmNyeXB0bztcclxuZXhwb3J0IGNvbnN0IHsgQ2lwaGVyIH0gPSAgS0pVUi5jcnlwdG87XHJcbmV4cG9ydCB7IEtFWVVUSUwgfTtcclxuZXhwb3J0IHsgQVNOMUhFWCB9O1xyXG5leHBvcnQgeyBYNTA5IH07XHJcbmV4cG9ydCB7IENyeXB0b0pTIH07XHJcblxyXG4vLyBleHQvYmFzZTY0LmpzXHJcbmV4cG9ydCB7IGI2NHRvaGV4IH07XHJcbmV4cG9ydCB7IGI2NHRvQkEgfTtcclxuXHJcbi8vIGJhc2U2NHguanNcclxuZXhwb3J0IHsgc3RvQkEgfTtcclxuZXhwb3J0IHsgQkF0b3MgfTtcclxuZXhwb3J0IHsgQkF0b2hleCB9O1xyXG5leHBvcnQgeyBzdG9oZXggfTtcclxuZXhwb3J0IHsgc3RvYjY0IH07XHJcbmV4cG9ydCB7IHN0b2I2NHUgfTtcclxuZXhwb3J0IHsgYjY0dXRvcyB9O1xyXG5leHBvcnQgeyBiNjR0b2I2NHUgfTtcclxuZXhwb3J0IHsgYjY0dXRvYjY0IH07XHJcbmV4cG9ydCB7IGhleDJiNjQgfTtcclxuZXhwb3J0IHsgaGV4dG9iNjR1IH07XHJcbmV4cG9ydCB7IGI2NHV0b2hleCB9O1xyXG5leHBvcnQgeyB1dGY4dG9iNjR1IH07XHJcbmV4cG9ydCB7IGI2NHV0b3V0ZjggfTtcclxuZXhwb3J0IHsgdXRmOHRvYjY0IH07XHJcbmV4cG9ydCB7IGI2NHRvdXRmOCB9O1xyXG5leHBvcnQgeyB1dGY4dG9oZXggfTtcclxuZXhwb3J0IHsgaGV4dG91dGY4IH07XHJcbmV4cG9ydCB7IGhleHRvcnN0ciB9O1xyXG5leHBvcnQgeyByc3RydG9oZXggfTtcclxuZXhwb3J0IHsgaGV4dG9iNjQgfTtcclxuZXhwb3J0IHsgaGV4dG9iNjRubCB9O1xyXG5leHBvcnQgeyBiNjRubHRvaGV4IH07XHJcbmV4cG9ydCB7IGhleHRvcGVtIH07XHJcbmV4cG9ydCB7IHBlbXRvaGV4IH07XHJcbmV4cG9ydCB7IGhleHRvQXJyYXlCdWZmZXIgfTtcclxuZXhwb3J0IHsgQXJyYXlCdWZmZXJ0b2hleCB9O1xyXG5leHBvcnQgeyB6dWx1dG9tc2VjIH07XHJcbmV4cG9ydCB7IHp1bHV0b3NlYyB9O1xyXG5leHBvcnQgeyB6dWx1dG9kYXRlIH07XHJcbmV4cG9ydCB7IGRhdGV0b3p1bHUgfTtcclxuZXhwb3J0IHsgdXJpY21wdG9oZXggfTtcclxuZXhwb3J0IHsgaGV4dG91cmljbXAgfTtcclxuZXhwb3J0IHsgaXB2NnRvaGV4IH07XHJcbmV4cG9ydCB7IGhleHRvaXB2NiB9O1xyXG5leHBvcnQgeyBoZXh0b2lwIH07XHJcbmV4cG9ydCB7IGlwdG9oZXggfTtcclxuZXhwb3J0IHsgZW5jb2RlVVJJQ29tcG9uZW50QWxsIH07XHJcbmV4cG9ydCB7IG5ld2xpbmVfdG9Vbml4IH07XHJcbmV4cG9ydCB7IG5ld2xpbmVfdG9Eb3MgfTtcclxuZXhwb3J0IHsgaGV4dG9wb3NoZXggfTtcclxuZXhwb3J0IHsgaW50YXJ5c3RydG9oZXggfTtcclxuZXhwb3J0IHsgc3RyZGlmZmlkeCB9O1xyXG5cclxuLy8gbmFtZSBzcGFjZXNcclxuZXhwb3J0IHsgS0pVUiB9O1xyXG5jb25zdCBfY3J5cHRvID0gIEtKVVIuY3J5cHRvO1xyXG5leHBvcnQgeyBfY3J5cHRvIGFzIGNyeXB0byB9O1xyXG5leHBvcnQgY29uc3QgeyBhc24xIH0gPSBLSlVSO1xyXG5leHBvcnQgY29uc3QgeyBqd3MgfSA9IEtKVVI7XHJcbmV4cG9ydCBjb25zdCB7IGxhbmcgfSA9IEtKVVI7XHJcblxyXG5cclxuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayhcbiAgICAgIHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aClcbiAgICApKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xudmFyIGJ5dGVUb0hleCA9IFtdO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXhbaV0gPSAoaSArIDB4MTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpO1xufVxuXG5mdW5jdGlvbiBieXRlc1RvVXVpZChidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IG9mZnNldCB8fCAwO1xuICB2YXIgYnRoID0gYnl0ZVRvSGV4O1xuICAvLyBqb2luIHVzZWQgdG8gZml4IG1lbW9yeSBpc3N1ZSBjYXVzZWQgYnkgY29uY2F0ZW5hdGlvbjogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzE3NSNjNFxuICByZXR1cm4gKFtidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCBcblx0YnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuXHRidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsXG5cdGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJyxcblx0YnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuXHRidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLFxuXHRidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLFxuXHRidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dXSkuam9pbignJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYnl0ZXNUb1V1aWQ7XG4iLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiAgSW4gdGhlXG4vLyBicm93c2VyIHRoaXMgaXMgYSBsaXR0bGUgY29tcGxpY2F0ZWQgZHVlIHRvIHVua25vd24gcXVhbGl0eSBvZiBNYXRoLnJhbmRvbSgpXG4vLyBhbmQgaW5jb25zaXN0ZW50IHN1cHBvcnQgZm9yIHRoZSBgY3J5cHRvYCBBUEkuICBXZSBkbyB0aGUgYmVzdCB3ZSBjYW4gdmlhXG4vLyBmZWF0dXJlLWRldGVjdGlvblxuXG4vLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG9cbi8vIGltcGxlbWVudGF0aW9uLiBBbHNvLCBmaW5kIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBjcnlwdG8gb24gSUUxMS5cbnZhciBnZXRSYW5kb21WYWx1ZXMgPSAodHlwZW9mKGNyeXB0bykgIT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mKG1zQ3J5cHRvKSAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PSAnZnVuY3Rpb24nICYmIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSk7XG5cbmlmIChnZXRSYW5kb21WYWx1ZXMpIHtcbiAgLy8gV0hBVFdHIGNyeXB0byBSTkcgLSBodHRwOi8vd2lraS53aGF0d2cub3JnL3dpa2kvQ3J5cHRvXG4gIHZhciBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gd2hhdHdnUk5HKCkge1xuICAgIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG4gICAgcmV0dXJuIHJuZHM4O1xuICB9O1xufSBlbHNlIHtcbiAgLy8gTWF0aC5yYW5kb20oKS1iYXNlZCAoUk5HKVxuICAvL1xuICAvLyBJZiBhbGwgZWxzZSBmYWlscywgdXNlIE1hdGgucmFuZG9tKCkuICBJdCdzIGZhc3QsIGJ1dCBpcyBvZiB1bnNwZWNpZmllZFxuICAvLyBxdWFsaXR5LlxuICB2YXIgcm5kcyA9IG5ldyBBcnJheSgxNik7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtYXRoUk5HKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCByOyBpIDwgMTY7IGkrKykge1xuICAgICAgaWYgKChpICYgMHgwMykgPT09IDApIHIgPSBNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwMDA7XG4gICAgICBybmRzW2ldID0gciA+Pj4gKChpICYgMHgwMykgPDwgMykgJiAweGZmO1xuICAgIH1cblxuICAgIHJldHVybiBybmRzO1xuICB9O1xufVxuIiwidmFyIHJuZyA9IHJlcXVpcmUoJy4vbGliL3JuZycpO1xudmFyIGJ5dGVzVG9VdWlkID0gcmVxdWlyZSgnLi9saWIvYnl0ZXNUb1V1aWQnKTtcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG5cbiAgaWYgKHR5cGVvZihvcHRpb25zKSA9PSAnc3RyaW5nJykge1xuICAgIGJ1ZiA9IG9wdGlvbnMgPT09ICdiaW5hcnknID8gbmV3IEFycmF5KDE2KSA6IG51bGw7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gIC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcbiAgcm5kc1s2XSA9IChybmRzWzZdICYgMHgwZikgfCAweDQwO1xuICBybmRzWzhdID0gKHJuZHNbOF0gJiAweDNmKSB8IDB4ODA7XG5cbiAgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG4gIGlmIChidWYpIHtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgMTY7ICsraWkpIHtcbiAgICAgIGJ1ZltpICsgaWldID0gcm5kc1tpaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZiB8fCBieXRlc1RvVXVpZChybmRzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2NDtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgVGltZXIgfSBmcm9tICcuL1RpbWVyLmpzJztcclxuXHJcbmNvbnN0IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IDYwOyAvLyBzZWNvbmRzXHJcblxyXG5leHBvcnQgY2xhc3MgQWNjZXNzVG9rZW5FdmVudHMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHtcclxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSxcclxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyaW5nVGltZXIgPSBuZXcgVGltZXIoXCJBY2Nlc3MgdG9rZW4gZXhwaXJpbmdcIiksXHJcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVkVGltZXIgPSBuZXcgVGltZXIoXCJBY2Nlc3MgdG9rZW4gZXhwaXJlZFwiKVxyXG4gICAgfSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcclxuXHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZyA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lcjtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQgPSBhY2Nlc3NUb2tlbkV4cGlyZWRUaW1lcjtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkKGNvbnRhaW5lcikge1xyXG4gICAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZXZlbnRzIGlmIHRoZXJlJ3MgYW4gYWNjZXNzIHRva2VuIGFuZCBpdCBoYXMgYW4gZXhwaXJhdGlvblxyXG4gICAgICAgIGlmIChjb250YWluZXIuYWNjZXNzX3Rva2VuICYmIGNvbnRhaW5lci5leHBpcmVzX2luICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IGR1cmF0aW9uID0gY29udGFpbmVyLmV4cGlyZXNfaW47XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkFjY2Vzc1Rva2VuRXZlbnRzLmxvYWQ6IGFjY2VzcyB0b2tlbiBwcmVzZW50LCByZW1haW5pbmcgZHVyYXRpb246XCIsIGR1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZXhwaXJpbmcgaWYgd2Ugc3RpbGwgaGF2ZSB0aW1lXHJcbiAgICAgICAgICAgICAgICBsZXQgZXhwaXJpbmcgPSBkdXJhdGlvbiAtIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV4cGlyaW5nIDw9IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGV4cGlyaW5nID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiQWNjZXNzVG9rZW5FdmVudHMubG9hZDogcmVnaXN0ZXJpbmcgZXhwaXJpbmcgdGltZXIgaW46XCIsIGV4cGlyaW5nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmcuaW5pdChleHBpcmluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJBY2Nlc3NUb2tlbkV2ZW50cy5sb2FkOiBjYW5jZWxpbmcgZXhpc3RpbmcgZXhwaXJpbmcgdGltZXIgYmVjYXNlIHdlJ3JlIHBhc3QgZXhwaXJhdGlvbi5cIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBpZiBpdCdzIG5lZ2F0aXZlLCBpdCB3aWxsIHN0aWxsIGZpcmVcclxuICAgICAgICAgICAgbGV0IGV4cGlyZWQgPSBkdXJhdGlvbiArIDE7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkFjY2Vzc1Rva2VuRXZlbnRzLmxvYWQ6IHJlZ2lzdGVyaW5nIGV4cGlyZWQgdGltZXIgaW46XCIsIGV4cGlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQuaW5pdChleHBpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmcuY2FuY2VsKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5jYW5jZWwoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2FkKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkFjY2Vzc1Rva2VuRXZlbnRzLnVubG9hZDogY2FuY2VsaW5nIGV4aXN0aW5nIGFjY2VzcyB0b2tlbiB0aW1lcnNcIik7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5jYW5jZWwoKTtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQuY2FuY2VsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQWNjZXNzVG9rZW5FeHBpcmluZyhjYikge1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmcuYWRkSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVBY2Nlc3NUb2tlbkV4cGlyaW5nKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBY2Nlc3NUb2tlbkV4cGlyZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQuYWRkSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVBY2Nlc3NUb2tlbkV4cGlyZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQucmVtb3ZlSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuY29uc3QgRGVmYXVsdEludGVydmFsID0gMjAwMDtcclxuXHJcbmV4cG9ydCBjbGFzcyBDaGVja1Nlc3Npb25JRnJhbWUge1xyXG4gICAgY29uc3RydWN0b3IoY2FsbGJhY2ssIGNsaWVudF9pZCwgdXJsLCBpbnRlcnZhbCwgc3RvcE9uRXJyb3IgPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSBjbGllbnRfaWQ7XHJcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsO1xyXG4gICAgICAgIHRoaXMuX2ludGVydmFsID0gaW50ZXJ2YWwgfHwgRGVmYXVsdEludGVydmFsO1xyXG4gICAgICAgIHRoaXMuX3N0b3BPbkVycm9yID0gc3RvcE9uRXJyb3I7XHJcblxyXG4gICAgICAgIHZhciBpZHggPSB1cmwuaW5kZXhPZihcIi9cIiwgdXJsLmluZGV4T2YoXCIvL1wiKSArIDIpO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lX29yaWdpbiA9IHVybC5zdWJzdHIoMCwgaWR4KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZnJhbWUgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcclxuXHJcbiAgICAgICAgLy8gc2hvdGd1biBhcHByb2FjaFxyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS53aWR0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuaGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3JjID0gdXJsO1xyXG4gICAgfVxyXG4gICAgbG9hZCgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZnJhbWUub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9mcmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gdGhpcy5fbWVzc2FnZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9tZXNzYWdlKGUpIHtcclxuICAgICAgICBpZiAoZS5vcmlnaW4gPT09IHRoaXMuX2ZyYW1lX29yaWdpbiAmJlxyXG4gICAgICAgICAgICBlLnNvdXJjZSA9PT0gdGhpcy5fZnJhbWUuY29udGVudFdpbmRvd1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAoZS5kYXRhID09PSBcImVycm9yXCIpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkNoZWNrU2Vzc2lvbklGcmFtZTogZXJyb3IgbWVzc2FnZSBmcm9tIGNoZWNrIHNlc3Npb24gb3AgaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3BPbkVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZS5kYXRhID09PSBcImNoYW5nZWRcIikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiQ2hlY2tTZXNzaW9uSUZyYW1lOiBjaGFuZ2VkIG1lc3NhZ2UgZnJvbSBjaGVjayBzZXNzaW9uIG9wIGlmcmFtZVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkNoZWNrU2Vzc2lvbklGcmFtZTogXCIgKyBlLmRhdGEgKyBcIiBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGFydChzZXNzaW9uX3N0YXRlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25fc3RhdGUgIT09IHNlc3Npb25fc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiQ2hlY2tTZXNzaW9uSUZyYW1lLnN0YXJ0XCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uX3N0YXRlID0gc2Vzc2lvbl9zdGF0ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzZW5kID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh0aGlzLl9jbGllbnRfaWQgKyBcIiBcIiArIHRoaXMuX3Nlc3Npb25fc3RhdGUsIHRoaXMuX2ZyYW1lX29yaWdpbik7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIG5vd1xyXG4gICAgICAgICAgICBzZW5kKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBhbmQgc2V0dXAgdGltZXJcclxuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoc2VuZCwgdGhpcy5faW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuX3Nlc3Npb25fc3RhdGUgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGltZXIpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiQ2hlY2tTZXNzaW9uSUZyYW1lLnN0b3BcIik7XHJcblxyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl90aW1lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgQ29yZG92YVBvcHVwV2luZG93IH0gZnJvbSAnLi9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvcmRvdmFJRnJhbWVOYXZpZ2F0b3Ige1xyXG5cclxuICAgIHByZXBhcmUocGFyYW1zKSB7XHJcbiAgICAgICAgcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgPSAnaGlkZGVuPXllcyc7XHJcbiAgICAgICAgbGV0IHBvcHVwID0gbmV3IENvcmRvdmFQb3B1cFdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9wdXApO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IENvcmRvdmFQb3B1cFdpbmRvdyB9IGZyb20gJy4vQ29yZG92YVBvcHVwV2luZG93LmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3Ige1xyXG5cclxuICAgIHByZXBhcmUocGFyYW1zKSB7XHJcbiAgICAgICAgbGV0IHBvcHVwID0gbmV3IENvcmRvdmFQb3B1cFdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9wdXApO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuXHJcbmNvbnN0IERlZmF1bHRQb3B1cEZlYXR1cmVzID0gJ2xvY2F0aW9uPW5vLHRvb2xiYXI9bm8sem9vbT1ubyc7XHJcbmNvbnN0IERlZmF1bHRQb3B1cFRhcmdldCA9IFwiX2JsYW5rXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29yZG92YVBvcHVwV2luZG93IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZlYXR1cmVzID0gcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgRGVmYXVsdFBvcHVwRmVhdHVyZXM7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSBwYXJhbXMucG9wdXBXaW5kb3dUYXJnZXQgfHwgRGVmYXVsdFBvcHVwVGFyZ2V0O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucmVkaXJlY3RfdXJpID0gcGFyYW1zLnN0YXJ0VXJsO1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkNvcmRvdmFQb3B1cFdpbmRvdy5jdG9yOiByZWRpcmVjdF91cmk6IFwiICsgdGhpcy5yZWRpcmVjdF91cmkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9pc0luQXBwQnJvd3Nlckluc3RhbGxlZChjb3Jkb3ZhTWV0YWRhdGEpIHtcclxuICAgICAgICByZXR1cm4gW1wiY29yZG92YS1wbHVnaW4taW5hcHBicm93c2VyXCIsIFwiY29yZG92YS1wbHVnaW4taW5hcHBicm93c2VyLmluYXBwYnJvd3NlclwiLCBcIm9yZy5hcGFjaGUuY29yZG92YS5pbmFwcGJyb3dzZXJcIl0uc29tZShmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29yZG92YU1ldGFkYXRhLmhhc093blByb3BlcnR5KG5hbWUpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIFxyXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29yZG92YSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKFwiY29yZG92YSBpcyB1bmRlZmluZWRcIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdmFyIGNvcmRvdmFNZXRhZGF0YSA9IHdpbmRvdy5jb3Jkb3ZhLnJlcXVpcmUoXCJjb3Jkb3ZhL3BsdWdpbl9saXN0XCIpLm1ldGFkYXRhO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNJbkFwcEJyb3dzZXJJbnN0YWxsZWQoY29yZG92YU1ldGFkYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcihcIkluQXBwQnJvd3NlciBwbHVnaW4gbm90IGZvdW5kXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBjb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKHBhcmFtcy51cmwsIHRoaXMudGFyZ2V0LCB0aGlzLmZlYXR1cmVzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJDb3Jkb3ZhUG9wdXBXaW5kb3cubmF2aWdhdGU6IHBvcHVwIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCA9IHRoaXMuX2V4aXRDYWxsYmFjay5iaW5kKHRoaXMpOyBcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRTdGFydENhbGxiYWNrRXZlbnQgPSB0aGlzLl9sb2FkU3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cC5hZGRFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRzdGFydFwiLCB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihcIkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRTdGFydENhbGxiYWNrKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnVybC5pbmRleE9mKHRoaXMucmVkaXJlY3RfdXJpKSA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiBldmVudC51cmwgfSk7XHJcbiAgICAgICAgfSAgICBcclxuICAgIH1cclxuICAgIF9leGl0Q2FsbGJhY2sobWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX2Vycm9yKG1lc3NhZ2UpOyAgICBcclxuICAgIH1cclxuICAgIFxyXG4gICAgX3N1Y2Nlc3MoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93OiBTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gY29yZG92YSBwb3B1cCB3aW5kb3dcIik7XHJcbiAgICAgICAgdGhpcy5fcmVzb2x2ZShkYXRhKTtcclxuICAgIH1cclxuICAgIF9lcnJvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG5cclxuICAgICAgICBMb2cuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5fcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jbGVhbnVwKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCl7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkNvcmRvdmFQb3B1cFdpbmRvdzogY2xlYW5pbmcgdXAgcG9wdXBcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJleGl0XCIsIHRoaXMuX2V4aXRDYWxsYmFja0V2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2Fkc3RhcnRcIiwgdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVycm9yUmVzcG9uc2UgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7ZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uLCBlcnJvcl91cmksIHN0YXRlfT17fVxyXG4gICAgKSB7XHJcbiAgICAgICAgIGlmICghZXJyb3Ipe1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBlcnJvciBwYXNzZWQgdG8gRXJyb3JSZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXJyb3JcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlcihlcnJvcl9kZXNjcmlwdGlvbiB8fCBlcnJvcik7XHJcblxyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiRXJyb3JSZXNwb25zZVwiO1xyXG5cclxuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IGVycm9yX2Rlc2NyaXB0aW9uO1xyXG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gZXJyb3JfdXJpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XHJcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSGFuZGxlcihjYikge1xyXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVIYW5kbGVyKGNiKSB7XHJcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2NhbGxiYWNrcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSBjYik7XHJcbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmFpc2UoLi4ucGFyYW1zKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiRXZlbnQ6IFJhaXNpbmcgZXZlbnQ6IFwiICsgdGhpcy5fbmFtZSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzW2ldKC4uLnBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmNvbnN0IHRpbWVyID0ge1xyXG4gICAgc2V0SW50ZXJ2YWw6IGZ1bmN0aW9uIChjYiwgZHVyYXRpb24pIHtcclxuICAgICAgICByZXR1cm4gc2V0SW50ZXJ2YWwoY2IsIGR1cmF0aW9uKTtcclxuICAgIH0sXHJcbiAgICBjbGVhckludGVydmFsOiBmdW5jdGlvbiAoaGFuZGxlKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsZWFySW50ZXJ2YWwoaGFuZGxlKTtcclxuICAgIH1cclxufTtcclxuXHJcbmxldCB0ZXN0aW5nID0gZmFsc2U7XHJcbmxldCByZXF1ZXN0ID0gbnVsbDtcclxuXHJcbmV4cG9ydCBjbGFzcyBHbG9iYWwge1xyXG5cclxuICAgIHN0YXRpYyBfdGVzdGluZygpIHtcclxuICAgICAgICB0ZXN0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGxvY2F0aW9uKCkge1xyXG4gICAgICAgIGlmICghdGVzdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgbG9jYWxTdG9yYWdlKCkge1xyXG4gICAgICAgIGlmICghdGVzdGluZyAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IHNlc3Npb25TdG9yYWdlKCkge1xyXG4gICAgICAgIGlmICghdGVzdGluZyAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzZXRYTUxIdHRwUmVxdWVzdChuZXdSZXF1ZXN0KSB7XHJcbiAgICAgICAgcmVxdWVzdCA9IG5ld1JlcXVlc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBYTUxIdHRwUmVxdWVzdCgpIHtcclxuICAgICAgICBpZiAoIXRlc3RpbmcgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QgfHwgWE1MSHR0cFJlcXVlc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgdGltZXIoKSB7XHJcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aW1lcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBJRnJhbWVXaW5kb3cgfSBmcm9tICcuL0lGcmFtZVdpbmRvdy5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgSUZyYW1lTmF2aWdhdG9yIHtcclxuXHJcbiAgICBwcmVwYXJlKHBhcmFtcykge1xyXG4gICAgICAgIGxldCBmcmFtZSA9IG5ldyBJRnJhbWVXaW5kb3cocGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZyYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBjYWxsYmFjayh1cmwpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVOYXZpZ2F0b3IuY2FsbGJhY2tcIik7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIElGcmFtZVdpbmRvdy5ub3RpZnlQYXJlbnQodXJsKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuXHJcbmNvbnN0IERlZmF1bHRUaW1lb3V0ID0gMTAwMDA7XHJcblxyXG5leHBvcnQgY2xhc3MgSUZyYW1lV2luZG93IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCA9IHRoaXMuX21lc3NhZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZnJhbWUgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcclxuXHJcbiAgICAgICAgLy8gc2hvdGd1biBhcHByb2FjaFxyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS53aWR0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuaGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZnJhbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xyXG4gICAgICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRpbWVvdXQgPSBwYXJhbXMuc2lsZW50UmVxdWVzdFRpbWVvdXQgfHwgRGVmYXVsdFRpbWVvdXQ7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdy5uYXZpZ2F0ZTogVXNpbmcgdGltZW91dCBvZjpcIiwgdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gd2luZG93LnNldFRpbWVvdXQodGhpcy5fdGltZW91dC5iaW5kKHRoaXMpLCB0aW1lb3V0KTtcclxuICAgICAgICAgICAgdGhpcy5fZnJhbWUuc3JjID0gcGFyYW1zLnVybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX3N1Y2Nlc3MoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93OiBTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gZnJhbWUgd2luZG93XCIpO1xyXG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBfZXJyb3IobWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuX3JlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuICAgIH1cclxuXHJcbiAgICBfY2xlYW51cCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZnJhbWUpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93OiBjbGVhbnVwXCIpO1xyXG5cclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xyXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9mcmFtZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfdGltZW91dCgpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cudGltZW91dFwiKTtcclxuICAgICAgICB0aGlzLl9lcnJvcihcIkZyYW1lIHdpbmRvdyB0aW1lZCBvdXRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgX21lc3NhZ2UoZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdy5tZXNzYWdlXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGltZXIgJiZcclxuICAgICAgICAgICAgZS5vcmlnaW4gPT09IHRoaXMuX29yaWdpbiAmJlxyXG4gICAgICAgICAgICBlLnNvdXJjZSA9PT0gdGhpcy5fZnJhbWUuY29udGVudFdpbmRvd1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBsZXQgdXJsID0gZS5kYXRhO1xyXG4gICAgICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiB1cmwgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihcIkludmFsaWQgcmVzcG9uc2UgZnJvbSBmcmFtZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgX29yaWdpbigpIHtcclxuICAgICAgICByZXR1cm4gbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBub3RpZnlQYXJlbnQodXJsKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Lm5vdGlmeVBhcmVudFwiKTtcclxuICAgICAgICBpZiAod2luZG93LmZyYW1lRWxlbWVudCkge1xyXG4gICAgICAgICAgICB1cmwgPSB1cmwgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdy5ub3RpZnlQYXJlbnQ6IHBvc3RpbmcgdXJsIG1lc3NhZ2UgdG8gcGFyZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh1cmwsIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEluTWVtb3J5V2ViU3RvcmFnZXtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEl0ZW0oa2V5KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSW5NZW1vcnlXZWJTdG9yYWdlLmdldEl0ZW1cIiwga2V5KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSl7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSW5NZW1vcnlXZWJTdG9yYWdlLnNldEl0ZW1cIiwga2V5KTtcclxuICAgICAgICB0aGlzLl9kYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVJdGVtKGtleSl7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSW5NZW1vcnlXZWJTdG9yYWdlLnJlbW92ZUl0ZW1cIiwga2V5KTtcclxuICAgICAgICBkZWxldGUgdGhpcy5fZGF0YVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsZW5ndGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX2RhdGEpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBrZXkoaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5fZGF0YSlbaW5kZXhdO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IGp3cywgS0VZVVRJTCBhcyBLZXlVdGlsLCBYNTA5LCBjcnlwdG8sIGhleHRvYjY0dSwgYjY0dG9oZXggfSBmcm9tICcuLi9qc3JzYXNpZ24vZGlzdC9qc3JzYXNpZ24uanMnO1xyXG4vL2ltcG9ydCB7IGp3cywgS0VZVVRJTCBhcyBLZXlVdGlsLCBYNTA5LCBjcnlwdG8sIGhleHRvYjY0dSwgYjY0dG9oZXggfSBmcm9tICdqc3JzYXNpZ24nO1xyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcblxyXG5jb25zdCBBbGxvd2VkU2lnbmluZ0FsZ3MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJywgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJywgJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ107XHJcblxyXG5leHBvcnQgY2xhc3MgSm9zZVV0aWwge1xyXG5cclxuICAgIHN0YXRpYyBwYXJzZUp3dChqd3QpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJKb3NlVXRpbC5wYXJzZUp3dFwiKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdG9rZW4gPSBqd3MuSldTLnBhcnNlKGp3dCk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXI6IHRva2VuLmhlYWRlck9iaixcclxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHRva2VuLnBheWxvYWRPYmpcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB2YWxpZGF0ZUp3dChqd3QsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3LCBub3csIHRpbWVJbnNlbnNpdGl2ZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLnZhbGlkYXRlSnd0XCIpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoa2V5Lmt0eSA9PT0gXCJSU0FcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleS5lICYmIGtleS5uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gS2V5VXRpbC5nZXRLZXkoa2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleS54NWMgJiYga2V5Lng1Yy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaGV4ID0gYjY0dG9oZXgoa2V5Lng1Y1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydEhleChoZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwudmFsaWRhdGVKd3Q6IFJTQSBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIiwga2V5KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiUlNBIGtleSBtaXNzaW5nIGtleSBtYXRlcmlhbFwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5Lmt0eSA9PT0gXCJFQ1wiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmNydiAmJiBrZXkueCAmJiBrZXkueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKb3NlVXRpbC52YWxpZGF0ZUp3dDogRUMga2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVDIGtleSBtaXNzaW5nIGtleSBtYXRlcmlhbFwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKb3NlVXRpbC52YWxpZGF0ZUp3dDogVW5zdXBwb3J0ZWQga2V5IHR5cGVcIiwga2V5ICYmIGtleS5rdHkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGtleSB0eXBlOiBcIiArIGtleSAmJiBrZXkua3R5KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBKb3NlVXRpbC5fdmFsaWRhdGVKd3Qoand0LCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93LCB0aW1lSW5zZW5zaXRpdmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoZSAmJiBlLm1lc3NhZ2UgfHwgZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkpXVCB2YWxpZGF0aW9uIGZhaWxlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHZhbGlkYXRlSnd0QXR0cmlidXRlcyhqd3QsIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93LCB0aW1lSW5zZW5zaXRpdmUpIHtcclxuICAgICAgICBpZiAoIWNsb2NrU2tldykge1xyXG4gICAgICAgICAgICBjbG9ja1NrZXcgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFub3cpIHtcclxuICAgICAgICAgICAgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBheWxvYWQgPSBKb3NlVXRpbC5wYXJzZUp3dChqd3QpLnBheWxvYWQ7XHJcblxyXG4gICAgICAgIGlmICghcGF5bG9hZC5pc3MpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0OiBpc3N1ZXIgd2FzIG5vdCBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImlzc3VlciB3YXMgbm90IHByb3ZpZGVkXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBheWxvYWQuaXNzICE9PSBpc3N1ZXIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0OiBJbnZhbGlkIGlzc3VlciBpbiB0b2tlblwiLCBwYXlsb2FkLmlzcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGlzc3VlciBpbiB0b2tlbjogXCIgKyBwYXlsb2FkLmlzcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwYXlsb2FkLmF1ZCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJKb3NlVXRpbC5fdmFsaWRhdGVKd3Q6IGF1ZCB3YXMgbm90IHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiYXVkIHdhcyBub3QgcHJvdmlkZWRcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdmFsaWRBdWRpZW5jZSA9IHBheWxvYWQuYXVkID09PSBhdWRpZW5jZSB8fCAoQXJyYXkuaXNBcnJheShwYXlsb2FkLmF1ZCkgJiYgcGF5bG9hZC5hdWQuaW5kZXhPZihhdWRpZW5jZSkgPj0gMCk7XHJcbiAgICAgICAgaWYgKCF2YWxpZEF1ZGllbmNlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dDogSW52YWxpZCBhdWRpZW5jZSBpbiB0b2tlblwiLCBwYXlsb2FkLmF1ZCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGF1ZGllbmNlIGluIHRva2VuOiBcIiArIHBheWxvYWQuYXVkKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXlsb2FkLmF6cCAmJiBwYXlsb2FkLmF6cCAhPT0gYXVkaWVuY2UpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0OiBJbnZhbGlkIGF6cCBpbiB0b2tlblwiLCBwYXlsb2FkLmF6cCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGF6cCBpbiB0b2tlbjogXCIgKyBwYXlsb2FkLmF6cCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aW1lSW5zZW5zaXRpdmUpIHtcclxuICAgICAgICAgICAgdmFyIGxvd2VyTm93ID0gbm93ICsgY2xvY2tTa2V3O1xyXG4gICAgICAgICAgICB2YXIgdXBwZXJOb3cgPSBub3cgLSBjbG9ja1NrZXc7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXBheWxvYWQuaWF0KSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKb3NlVXRpbC5fdmFsaWRhdGVKd3Q6IGlhdCB3YXMgbm90IHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImlhdCB3YXMgbm90IHByb3ZpZGVkXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobG93ZXJOb3cgPCBwYXlsb2FkLmlhdCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0OiBpYXQgaXMgaW4gdGhlIGZ1dHVyZVwiLCBwYXlsb2FkLmlhdCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiaWF0IGlzIGluIHRoZSBmdXR1cmU6IFwiICsgcGF5bG9hZC5pYXQpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBheWxvYWQubmJmICYmIGxvd2VyTm93IDwgcGF5bG9hZC5uYmYpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dDogbmJmIGlzIGluIHRoZSBmdXR1cmVcIiwgcGF5bG9hZC5uYmYpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5iZiBpcyBpbiB0aGUgZnV0dXJlOiBcIiArIHBheWxvYWQubmJmKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghcGF5bG9hZC5leHApIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dDogZXhwIHdhcyBub3QgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiZXhwIHdhcyBub3QgcHJvdmlkZWRcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXlsb2FkLmV4cCA8IHVwcGVyTm93KSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKb3NlVXRpbC5fdmFsaWRhdGVKd3Q6IGV4cCBpcyBpbiB0aGUgcGFzdFwiLCBwYXlsb2FkLmV4cCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiZXhwIGlzIGluIHRoZSBwYXN0OlwiICsgcGF5bG9hZC5leHApKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwYXlsb2FkKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgX3ZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdywgdGltZUluc2Vuc2l0aXZlKSB7XHJcblxyXG4gICAgICAgIHJldHVybiBKb3NlVXRpbC52YWxpZGF0ZUp3dEF0dHJpYnV0ZXMoand0LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdywgdGltZUluc2Vuc2l0aXZlKS50aGVuKHBheWxvYWQgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFqd3MuSldTLnZlcmlmeShqd3QsIGtleSwgQWxsb3dlZFNpZ25pbmdBbGdzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dDogc2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoZSAmJiBlLm1lc3NhZ2UgfHwgZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwic2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBoYXNoU3RyaW5nKHZhbHVlLCBhbGcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gY3J5cHRvLlV0aWwuaGFzaFN0cmluZyh2YWx1ZSwgYWxnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaGV4VG9CYXNlNjRVcmwodmFsdWUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gaGV4dG9iNjR1KHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4vR2xvYmFsLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBKc29uU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBhZGRpdGlvbmFsQ29udGVudFR5cGVzID0gbnVsbCwgXHJcbiAgICAgICAgWE1MSHR0cFJlcXVlc3RDdG9yID0gR2xvYmFsLlhNTEh0dHBSZXF1ZXN0LCBcclxuICAgICAgICBqd3RIYW5kbGVyID0gbnVsbFxyXG4gICAgKSB7XHJcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxDb250ZW50VHlwZXMgJiYgQXJyYXkuaXNBcnJheShhZGRpdGlvbmFsQ29udGVudFR5cGVzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRUeXBlcyA9IGFkZGl0aW9uYWxDb250ZW50VHlwZXMuc2xpY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudFR5cGVzID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRUeXBlcy5wdXNoKCdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICAgICAgaWYgKGp3dEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudFR5cGVzLnB1c2goJ2FwcGxpY2F0aW9uL2p3dCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fWE1MSHR0cFJlcXVlc3QgPSBYTUxIdHRwUmVxdWVzdEN0b3I7XHJcbiAgICAgICAgdGhpcy5fand0SGFuZGxlciA9IGp3dEhhbmRsZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SnNvbih1cmwsIHRva2VuKSB7XHJcbiAgICAgICAgaWYgKCF1cmwpe1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJKc29uU2VydmljZS5nZXRKc29uOiBObyB1cmwgcGFzc2VkXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBMb2cuZGVidWcoXCJKc29uU2VydmljZS5nZXRKc29uLCB1cmw6IFwiLCB1cmwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlcSA9IG5ldyB0aGlzLl9YTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICByZXEub3BlbignR0VUJywgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBhbGxvd2VkQ29udGVudFR5cGVzID0gdGhpcy5fY29udGVudFR5cGVzO1xyXG4gICAgICAgICAgICB2YXIgand0SGFuZGxlciA9IHRoaXMuX2p3dEhhbmRsZXI7XHJcblxyXG4gICAgICAgICAgICByZXEub25sb2FkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJKc29uU2VydmljZS5nZXRKc29uOiBIVFRQIHJlc3BvbnNlIHJlY2VpdmVkLCBzdGF0dXNcIiwgcmVxLnN0YXR1cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDIwMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudFR5cGUgPSByZXEuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVR5cGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBhbGxvd2VkQ29udGVudFR5cGVzLmZpbmQoaXRlbT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT0gXCJhcHBsaWNhdGlvbi9qd3RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgand0SGFuZGxlcihyZXEpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKc29uU2VydmljZS5nZXRKc29uOiBFcnJvciBwYXJzaW5nIEpTT04gcmVzcG9uc2VcIiwgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlIENvbnRlbnQtVHlwZTogXCIgKyBjb250ZW50VHlwZSArIFwiLCBmcm9tIFVSTDogXCIgKyB1cmwpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihyZXEuc3RhdHVzVGV4dCArIFwiIChcIiArIHJlcS5zdGF0dXMgKyBcIilcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpzb25TZXJ2aWNlLmdldEpzb246IG5ldHdvcmsgZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoXCJOZXR3b3JrIEVycm9yXCIpKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSnNvblNlcnZpY2UuZ2V0SnNvbjogdG9rZW4gcGFzc2VkLCBzZXR0aW5nIEF1dGhvcml6YXRpb24gaGVhZGVyXCIpO1xyXG4gICAgICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgdG9rZW4pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXEuc2VuZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RGb3JtKHVybCwgcGF5bG9hZCkge1xyXG4gICAgICAgIGlmICghdXJsKXtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiSnNvblNlcnZpY2UucG9zdEZvcm06IE5vIHVybCBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkpzb25TZXJ2aWNlLnBvc3RGb3JtLCB1cmw6IFwiLCB1cmwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlcSA9IG5ldyB0aGlzLl9YTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICByZXEub3BlbignUE9TVCcsIHVybCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgYWxsb3dlZENvbnRlbnRUeXBlcyA9IHRoaXMuX2NvbnRlbnRUeXBlcztcclxuXHJcbiAgICAgICAgICAgIHJlcS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkpzb25TZXJ2aWNlLnBvc3RGb3JtOiBIVFRQIHJlc3BvbnNlIHJlY2VpdmVkLCBzdGF0dXNcIiwgcmVxLnN0YXR1cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDIwMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudFR5cGUgPSByZXEuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVR5cGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBhbGxvd2VkQ29udGVudFR5cGVzLmZpbmQoaXRlbT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKHJlcS5yZXNwb25zZVRleHQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkpzb25TZXJ2aWNlLnBvc3RGb3JtOiBFcnJvciBwYXJzaW5nIEpTT04gcmVzcG9uc2VcIiwgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlIENvbnRlbnQtVHlwZTogXCIgKyBjb250ZW50VHlwZSArIFwiLCBmcm9tIFVSTDogXCIgKyB1cmwpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDQwMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudFR5cGUgPSByZXEuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVR5cGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBhbGxvd2VkQ29udGVudFR5cGVzLmZpbmQoaXRlbT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBKU09OLnBhcnNlKHJlcS5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkICYmIHBheWxvYWQuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiSnNvblNlcnZpY2UucG9zdEZvcm06IEVycm9yIGZyb20gc2VydmVyOiBcIiwgcGF5bG9hZC5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IocGF5bG9hZC5lcnJvcikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKc29uU2VydmljZS5wb3N0Rm9ybTogRXJyb3IgcGFyc2luZyBKU09OIHJlc3BvbnNlXCIsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IocmVxLnN0YXR1c1RleHQgKyBcIiAoXCIgKyByZXEuc3RhdHVzICsgXCIpXCIpKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJKc29uU2VydmljZS5wb3N0Rm9ybTogbmV0d29yayBlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihcIk5ldHdvcmsgRXJyb3JcIikpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbGV0IGJvZHkgPSBcIlwiO1xyXG4gICAgICAgICAgICBmb3IobGV0IGtleSBpbiBwYXlsb2FkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gcGF5bG9hZFtrZXldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYm9keS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gXCImXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gXCI9XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcclxuICAgICAgICAgICAgcmVxLnNlbmQoYm9keSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxubGV0IG5vcExvZ2dlciA9IHtcclxuICAgIGRlYnVnKCl7fSxcclxuICAgIGluZm8oKXt9LFxyXG4gICAgd2Fybigpe30sXHJcbiAgICBlcnJvcigpe31cclxufTtcclxuXHJcbmNvbnN0IE5PTkUgPSAwO1xyXG5jb25zdCBFUlJPUiA9IDE7XHJcbmNvbnN0IFdBUk4gPSAyO1xyXG5jb25zdCBJTkZPID0gMztcclxuY29uc3QgREVCVUcgPSA0O1xyXG5cclxubGV0IGxvZ2dlcjtcclxubGV0IGxldmVsO1xyXG5cclxuZXhwb3J0IGNsYXNzIExvZyB7XHJcbiAgICBzdGF0aWMgZ2V0IE5PTkUoKSB7cmV0dXJuIE5PTkV9O1xyXG4gICAgc3RhdGljIGdldCBFUlJPUigpIHtyZXR1cm4gRVJST1J9O1xyXG4gICAgc3RhdGljIGdldCBXQVJOKCkge3JldHVybiBXQVJOfTtcclxuICAgIHN0YXRpYyBnZXQgSU5GTygpIHtyZXR1cm4gSU5GT307XHJcbiAgICBzdGF0aWMgZ2V0IERFQlVHKCkge3JldHVybiBERUJVR307XHJcbiAgICBcclxuICAgIHN0YXRpYyByZXNldCgpe1xyXG4gICAgICAgIGxldmVsID0gSU5GTztcclxuICAgICAgICBsb2dnZXIgPSBub3BMb2dnZXI7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBnZXQgbGV2ZWwoKXtcclxuICAgICAgICByZXR1cm4gbGV2ZWw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgc2V0IGxldmVsKHZhbHVlKXtcclxuICAgICAgICBpZiAoTk9ORSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBERUJVRyl7XHJcbiAgICAgICAgICAgIGxldmVsID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBnZXQgbG9nZ2VyKCl7XHJcbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBzZXQgbG9nZ2VyKHZhbHVlKXtcclxuICAgICAgICBpZiAoIXZhbHVlLmRlYnVnICYmIHZhbHVlLmluZm8pIHtcclxuICAgICAgICAgICAgLy8ganVzdCB0byBzdGF5IGJhY2t3YXJkcyBjb21wYXQuIGNhbiByZW1vdmUgaW4gMi4wXHJcbiAgICAgICAgICAgIHZhbHVlLmRlYnVnID0gdmFsdWUuaW5mbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5kZWJ1ZyAmJiB2YWx1ZS5pbmZvICYmIHZhbHVlLndhcm4gJiYgdmFsdWUuZXJyb3Ipe1xyXG4gICAgICAgICAgICBsb2dnZXIgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nZ2VyXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIGRlYnVnKC4uLmFyZ3Mpe1xyXG4gICAgICAgIGlmIChsZXZlbCA+PSBERUJVRyl7XHJcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zy5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBpbmZvKC4uLmFyZ3Mpe1xyXG4gICAgICAgIGlmIChsZXZlbCA+PSBJTkZPKXtcclxuICAgICAgICAgICAgbG9nZ2VyLmluZm8uYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgd2FybiguLi5hcmdzKXtcclxuICAgICAgICBpZiAobGV2ZWwgPj0gV0FSTil7XHJcbiAgICAgICAgICAgIGxvZ2dlci53YXJuLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGVycm9yKC4uLmFyZ3Mpe1xyXG4gICAgICAgIGlmIChsZXZlbCA+PSBFUlJPUil7XHJcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvci5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuTG9nLnJlc2V0KCk7XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgSnNvblNlcnZpY2UgfSBmcm9tICcuL0pzb25TZXJ2aWNlLmpzJztcclxuXHJcbmNvbnN0IE9pZGNNZXRhZGF0YVVybFBhdGggPSAnLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1ldGFkYXRhU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk1ldGFkYXRhU2VydmljZTogTm8gc2V0dGluZ3MgcGFzc2VkIHRvIE1ldGFkYXRhU2VydmljZVwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0dGluZ3NcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xyXG4gICAgICAgIHRoaXMuX2pzb25TZXJ2aWNlID0gbmV3IEpzb25TZXJ2aWNlQ3RvcihbJ2FwcGxpY2F0aW9uL2p3ay1zZXQranNvbiddKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWV0YWRhdGFVcmwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9tZXRhZGF0YVVybCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubWV0YWRhdGFVcmwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gdGhpcy5fc2V0dGluZ3MubWV0YWRhdGFVcmw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCA9IHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmwgJiYgdGhpcy5fbWV0YWRhdGFVcmwuaW5kZXhPZihPaWRjTWV0YWRhdGFVcmxQYXRoKSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmxbdGhpcy5fbWV0YWRhdGFVcmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSAnLyc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsICs9IE9pZGNNZXRhZGF0YVVybFBhdGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVVybDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNZXRhZGF0YSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubWV0YWRhdGEpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldE1ldGFkYXRhOiBSZXR1cm5pbmcgbWV0YWRhdGEgZnJvbSBzZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFVcmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTWV0YWRhdGFTZXJ2aWNlLmdldE1ldGFkYXRhOiBObyBhdXRob3JpdHkgb3IgbWV0YWRhdGFVcmwgY29uZmlndXJlZCBvbiBzZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF1dGhvcml0eSBvciBtZXRhZGF0YVVybCBjb25maWd1cmVkIG9uIHNldHRpbmdzXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRNZXRhZGF0YTogZ2V0dGluZyBtZXRhZGF0YSBmcm9tXCIsIHRoaXMubWV0YWRhdGFVcmwpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbih0aGlzLm1ldGFkYXRhVXJsKVxyXG4gICAgICAgICAgICAudGhlbihtZXRhZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0TWV0YWRhdGE6IGpzb24gcmVjZWl2ZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJc3N1ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJpc3N1ZXJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXV0aG9yaXphdGlvbkVuZHBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiYXV0aG9yaXphdGlvbl9lbmRwb2ludFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2VySW5mb0VuZHBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwidXNlcmluZm9fZW5kcG9pbnRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG9rZW5FbmRwb2ludChvcHRpb25hbD10cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJ0b2tlbl9lbmRwb2ludFwiLCBvcHRpb25hbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiY2hlY2tfc2Vzc2lvbl9pZnJhbWVcIiwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RW5kU2Vzc2lvbkVuZHBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiZW5kX3Nlc3Npb25fZW5kcG9pbnRcIiwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmV2b2NhdGlvbkVuZHBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwicmV2b2NhdGlvbl9lbmRwb2ludFwiLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRLZXlzRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJqd2tzX3VyaVwiLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0TWV0YWRhdGFQcm9wZXJ0eShuYW1lLCBvcHRpb25hbD1mYWxzZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRNZXRhZGF0YVByb3BlcnR5IGZvcjogXCIgKyBuYW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGEoKS50aGVuKG1ldGFkYXRhID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldE1ldGFkYXRhUHJvcGVydHk6IG1ldGFkYXRhIHJlY2lldmVkXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhW25hbWVdID09PSB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cud2FybihcIk1ldGFkYXRhU2VydmljZS5nZXRNZXRhZGF0YVByb3BlcnR5OiBNZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIG9wdGlvbmFsIHByb3BlcnR5IFwiICsgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk1ldGFkYXRhU2VydmljZS5nZXRNZXRhZGF0YVByb3BlcnR5OiBNZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIHByb3BlcnR5IFwiICsgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0YWRhdGEgZG9lcyBub3QgY29udGFpbiBwcm9wZXJ0eSBcIiArIG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFbbmFtZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2lnbmluZ0tleXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRTaWduaW5nS2V5czogUmV0dXJuaW5nIHNpZ25pbmdLZXlzIGZyb20gc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJqd2tzX3VyaVwiKS50aGVuKGp3a3NfdXJpID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzOiBqd2tzX3VyaSByZWNlaXZlZFwiLCBqd2tzX3VyaSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbihqd2tzX3VyaSkudGhlbihrZXlTZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzOiBrZXkgc2V0IHJlY2VpdmVkXCIsIGtleVNldCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFrZXlTZXQua2V5cykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk1ldGFkYXRhU2VydmljZS5nZXRTaWduaW5nS2V5czogTWlzc2luZyBrZXlzIG9uIGtleXNldFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGtleXMgb24ga2V5c2V0XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzID0ga2V5U2V0LmtleXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgT2lkY0NsaWVudFNldHRpbmdzIH0gZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MuanMnO1xyXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi9FcnJvclJlc3BvbnNlLmpzJztcclxuaW1wb3J0IHsgU2lnbmluUmVxdWVzdCB9IGZyb20gJy4vU2lnbmluUmVxdWVzdC5qcyc7XHJcbmltcG9ydCB7IFNpZ25pblJlc3BvbnNlIH0gZnJvbSAnLi9TaWduaW5SZXNwb25zZS5qcyc7XHJcbmltcG9ydCB7IFNpZ25vdXRSZXF1ZXN0IH0gZnJvbSAnLi9TaWdub3V0UmVxdWVzdC5qcyc7XHJcbmltcG9ydCB7IFNpZ25vdXRSZXNwb25zZSB9IGZyb20gJy4vU2lnbm91dFJlc3BvbnNlLmpzJztcclxuaW1wb3J0IHsgU2lnbmluU3RhdGUgfSBmcm9tICcuL1NpZ25pblN0YXRlLmpzJztcclxuaW1wb3J0IHsgU3RhdGUgfSBmcm9tICcuL1N0YXRlLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBPaWRjQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzID0ge30pIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MgaW5zdGFuY2VvZiBPaWRjQ2xpZW50U2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzID0gbmV3IE9pZGNDbGllbnRTZXR0aW5ncyhzZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBfc3RhdGVTdG9yZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5zdGF0ZVN0b3JlO1xyXG4gICAgfVxyXG4gICAgZ2V0IF92YWxpZGF0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudmFsaWRhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9tZXRhZGF0YVNlcnZpY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgICBnZXQgbWV0YWRhdGFTZXJ2aWNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlU2lnbmluUmVxdWVzdCh7XHJcbiAgICAgICAgcmVzcG9uc2VfdHlwZSwgc2NvcGUsIHJlZGlyZWN0X3VyaSxcclxuICAgICAgICAvLyBkYXRhIHdhcyBtZWFudCB0byBiZSB0aGUgcGxhY2UgYSBjYWxsZXIgY291bGQgaW5kaWNhdGUgdGhlIGRhdGEgdG9cclxuICAgICAgICAvLyBoYXZlIHJvdW5kIHRyaXBwZWQsIGJ1dCBwZW9wbGUgd2VyZSBnZXR0aW5nIGNvbmZ1c2VkLCBzbyBpIGFkZGVkIHN0YXRlIChzaW5jZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWMpXHJcbiAgICAgICAgLy8gYW5kIHNvIG5vdyBpZiBkYXRhIGlzIG5vdCBwYXNzZWQsIGJ1dCBzdGF0ZSBpcyB0aGVuIHN0YXRlIHdpbGwgYmUgdXNlZFxyXG4gICAgICAgIGRhdGEsIHN0YXRlLCBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsXHJcbiAgICAgICAgcmVzb3VyY2UsIHJlcXVlc3QsIHJlcXVlc3RfdXJpLCByZXNwb25zZV9tb2RlLCBleHRyYVF1ZXJ5UGFyYW1zIH0gPSB7fSxcclxuICAgICAgICBzdGF0ZVN0b3JlXHJcbiAgICApIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25pblJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgIGxldCBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgcmVzcG9uc2VfdHlwZSA9IHJlc3BvbnNlX3R5cGUgfHwgdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfdHlwZTtcclxuICAgICAgICBzY29wZSA9IHNjb3BlIHx8IHRoaXMuX3NldHRpbmdzLnNjb3BlO1xyXG4gICAgICAgIHJlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIC8vIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQgYXJlbid0IGFsbG93ZWQgb24gX3NldHRpbmdzXHJcbiAgICAgICAgcHJvbXB0ID0gcHJvbXB0IHx8IHRoaXMuX3NldHRpbmdzLnByb21wdDtcclxuICAgICAgICBkaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLl9zZXR0aW5ncy5kaXNwbGF5O1xyXG4gICAgICAgIG1heF9hZ2UgPSBtYXhfYWdlIHx8IHRoaXMuX3NldHRpbmdzLm1heF9hZ2U7XHJcbiAgICAgICAgdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXMgfHwgdGhpcy5fc2V0dGluZ3MudWlfbG9jYWxlcztcclxuICAgICAgICBhY3JfdmFsdWVzID0gYWNyX3ZhbHVlcyB8fCB0aGlzLl9zZXR0aW5ncy5hY3JfdmFsdWVzO1xyXG4gICAgICAgIHJlc291cmNlID0gcmVzb3VyY2UgfHwgdGhpcy5fc2V0dGluZ3MucmVzb3VyY2U7XHJcbiAgICAgICAgcmVzcG9uc2VfbW9kZSA9IHJlc3BvbnNlX21vZGUgfHwgdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfbW9kZTtcclxuICAgICAgICBleHRyYVF1ZXJ5UGFyYW1zID0gZXh0cmFRdWVyeVBhcmFtcyB8fCB0aGlzLl9zZXR0aW5ncy5leHRyYVF1ZXJ5UGFyYW1zO1xyXG5cclxuICAgICAgICBsZXQgYXV0aG9yaXR5ID0gdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5O1xyXG5cclxuICAgICAgICBpZiAoU2lnbmluUmVxdWVzdC5pc0NvZGUocmVzcG9uc2VfdHlwZSkgJiYgcmVzcG9uc2VfdHlwZSAhPT0gXCJjb2RlXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk9wZW5JRCBDb25uZWN0IGh5YnJpZCBmbG93IGlzIG5vdCBzdXBwb3J0ZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRBdXRob3JpemF0aW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQuY3JlYXRlU2lnbmluUmVxdWVzdDogUmVjZWl2ZWQgYXV0aG9yaXphdGlvbiBlbmRwb2ludFwiLCB1cmwpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNpZ25pblJlcXVlc3QgPSBuZXcgU2lnbmluUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQsXHJcbiAgICAgICAgICAgICAgICByZWRpcmVjdF91cmksXHJcbiAgICAgICAgICAgICAgICByZXNwb25zZV90eXBlLFxyXG4gICAgICAgICAgICAgICAgc2NvcGUsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhIHx8IHN0YXRlLFxyXG4gICAgICAgICAgICAgICAgYXV0aG9yaXR5LFxyXG4gICAgICAgICAgICAgICAgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50LCBhY3JfdmFsdWVzLFxyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2UsIHJlcXVlc3QsIHJlcXVlc3RfdXJpLCBleHRyYVF1ZXJ5UGFyYW1zLCByZXNwb25zZV9tb2RlXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdmFyIHNpZ25pblN0YXRlID0gc2lnbmluUmVxdWVzdC5zdGF0ZTtcclxuICAgICAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZVN0b3JlLnNldChzaWduaW5TdGF0ZS5pZCwgc2lnbmluU3RhdGUudG9TdG9yYWdlU3RyaW5nKCkpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25pblJlcXVlc3Q7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NTaWduaW5SZXNwb25zZSh1cmwsIHN0YXRlU3RvcmUpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWduaW5SZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IHVzZVF1ZXJ5ID0gdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfbW9kZSA9PT0gXCJxdWVyeVwiIHx8IFxyXG4gICAgICAgICAgICAoIXRoaXMuX3NldHRpbmdzLnJlc3BvbnNlX21vZGUgJiYgU2lnbmluUmVxdWVzdC5pc0NvZGUodGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfdHlwZSkpO1xyXG4gICAgICAgIGxldCBkZWxpbWl0ZXIgPSB1c2VRdWVyeSA/IFwiP1wiIDogXCIjXCI7XHJcblxyXG4gICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBTaWduaW5SZXNwb25zZSh1cmwsIGRlbGltaXRlcik7XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiT2lkY0NsaWVudC5wcm9jZXNzU2lnbmluUmVzcG9uc2U6IE5vIHN0YXRlIGluIHJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUucmVtb3ZlKHJlc3BvbnNlLnN0YXRlKS50aGVuKHN0b3JlZFN0YXRlU3RyaW5nID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzdG9yZWRTdGF0ZVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiT2lkY0NsaWVudC5wcm9jZXNzU2lnbmluUmVzcG9uc2U6IE5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBTaWduaW5TdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhzdG9yZWRTdGF0ZVN0cmluZyk7XHJcblxyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWduaW5SZXNwb25zZTogUmVjZWl2ZWQgc3RhdGUgZnJvbSBzdG9yYWdlOyB2YWxpZGF0aW5nIHJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yLnZhbGlkYXRlU2lnbmluUmVzcG9uc2Uoc3RhdGUsIHJlc3BvbnNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTaWdub3V0UmVxdWVzdCh7aWRfdG9rZW5faGludCwgZGF0YSwgc3RhdGUsIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSwgZXh0cmFRdWVyeVBhcmFtcyB9ID0ge30sXHJcbiAgICAgICAgc3RhdGVTdG9yZVxyXG4gICAgKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jcmVhdGVTaWdub3V0UmVxdWVzdFwiKTtcclxuXHJcbiAgICAgICAgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIHx8IHRoaXMuX3NldHRpbmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcclxuICAgICAgICBleHRyYVF1ZXJ5UGFyYW1zID0gZXh0cmFRdWVyeVBhcmFtcyB8fCB0aGlzLl9zZXR0aW5ncy5leHRyYVF1ZXJ5UGFyYW1zO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldEVuZFNlc3Npb25FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcclxuICAgICAgICAgICAgaWYgKCF1cmwpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk9pZGNDbGllbnQuY3JlYXRlU2lnbm91dFJlcXVlc3Q6IE5vIGVuZCBzZXNzaW9uIGVuZHBvaW50IHVybCByZXR1cm5lZFwiKTtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGVuZCBzZXNzaW9uIGVuZHBvaW50XCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25vdXRSZXF1ZXN0OiBSZWNlaXZlZCBlbmQgc2Vzc2lvbiBlbmRwb2ludFwiLCB1cmwpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgU2lnbm91dFJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgdXJsLFxyXG4gICAgICAgICAgICAgICAgaWRfdG9rZW5faGludCxcclxuICAgICAgICAgICAgICAgIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSxcclxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgfHwgc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBleHRyYVF1ZXJ5UGFyYW1zXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdmFyIHNpZ25vdXRTdGF0ZSA9IHJlcXVlc3Quc3RhdGU7XHJcbiAgICAgICAgICAgIGlmIChzaWdub3V0U3RhdGUpIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQuY3JlYXRlU2lnbm91dFJlcXVlc3Q6IFNpZ25vdXQgcmVxdWVzdCBoYXMgc3RhdGUgdG8gcGVyc2lzdFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xyXG4gICAgICAgICAgICAgICAgc3RhdGVTdG9yZS5zZXQoc2lnbm91dFN0YXRlLmlkLCBzaWdub3V0U3RhdGUudG9TdG9yYWdlU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzU2lnbm91dFJlc3BvbnNlKHVybCwgc3RhdGVTdG9yZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQucHJvY2Vzc1NpZ25vdXRSZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gbmV3IFNpZ25vdXRSZXNwb25zZSh1cmwpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5wcm9jZXNzU2lnbm91dFJlc3BvbnNlOiBObyBzdGF0ZSBpbiByZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgTG9nLndhcm4oXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWdub3V0UmVzcG9uc2U6IFJlc3BvbnNlIHdhcyBlcnJvcjogXCIsIHJlc3BvbnNlLmVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzdGF0ZUtleSA9IHJlc3BvbnNlLnN0YXRlO1xyXG5cclxuICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RhdGVTdG9yZS5yZW1vdmUoc3RhdGVLZXkpLnRoZW4oc3RvcmVkU3RhdGVTdHJpbmcgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXN0b3JlZFN0YXRlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWdub3V0UmVzcG9uc2U6IE5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhzdG9yZWRTdGF0ZVN0cmluZyk7XHJcblxyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWdub3V0UmVzcG9uc2U6IFJlY2VpdmVkIHN0YXRlIGZyb20gc3RvcmFnZTsgdmFsaWRhdGluZyByZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZVNpZ25vdXRSZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyU3RhbGVTdGF0ZShzdGF0ZVN0b3JlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jbGVhclN0YWxlU3RhdGVcIik7XHJcblxyXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XHJcblxyXG4gICAgICAgIHJldHVybiBTdGF0ZS5jbGVhclN0YWxlU3RhdGUoc3RhdGVTdG9yZSwgdGhpcy5zZXR0aW5ncy5zdGFsZVN0YXRlQWdlKTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlIH0gZnJvbSAnLi9XZWJTdG9yYWdlU3RhdGVTdG9yZS5qcyc7XHJcbmltcG9ydCB7IFJlc3BvbnNlVmFsaWRhdG9yIH0gZnJvbSAnLi9SZXNwb25zZVZhbGlkYXRvci5qcyc7XHJcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlLmpzJztcclxuXHJcbmNvbnN0IE9pZGNNZXRhZGF0YVVybFBhdGggPSAnLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xyXG5cclxuY29uc3QgRGVmYXVsdFJlc3BvbnNlVHlwZSA9IFwiaWRfdG9rZW5cIjtcclxuY29uc3QgRGVmYXVsdFNjb3BlID0gXCJvcGVuaWRcIjtcclxuY29uc3QgRGVmYXVsdFN0YWxlU3RhdGVBZ2UgPSA2MCAqIDE1OyAvLyBzZWNvbmRzXHJcbmNvbnN0IERlZmF1bHRDbG9ja1NrZXdJblNlY29uZHMgPSA2MCAqIDU7XHJcblxyXG5leHBvcnQgY2xhc3MgT2lkY0NsaWVudFNldHRpbmdzIHtcclxuICAgIGNvbnN0cnVjdG9yKHtcclxuICAgICAgICAvLyBtZXRhZGF0YSByZWxhdGVkXHJcbiAgICAgICAgYXV0aG9yaXR5LCBtZXRhZGF0YVVybCwgbWV0YWRhdGEsIHNpZ25pbmdLZXlzLFxyXG4gICAgICAgIC8vIGNsaWVudCByZWxhdGVkXHJcbiAgICAgICAgY2xpZW50X2lkLCBjbGllbnRfc2VjcmV0LCByZXNwb25zZV90eXBlID0gRGVmYXVsdFJlc3BvbnNlVHlwZSwgc2NvcGUgPSBEZWZhdWx0U2NvcGUsXHJcbiAgICAgICAgcmVkaXJlY3RfdXJpLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgLy8gb3B0aW9uYWwgcHJvdG9jb2xcclxuICAgICAgICBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGFjcl92YWx1ZXMsIHJlc291cmNlLCByZXNwb25zZV9tb2RlLFxyXG4gICAgICAgIC8vIGJlaGF2aW9yIGZsYWdzXHJcbiAgICAgICAgZmlsdGVyUHJvdG9jb2xDbGFpbXMgPSB0cnVlLCBsb2FkVXNlckluZm8gPSB0cnVlLFxyXG4gICAgICAgIHN0YWxlU3RhdGVBZ2UgPSBEZWZhdWx0U3RhbGVTdGF0ZUFnZSwgY2xvY2tTa2V3ID0gRGVmYXVsdENsb2NrU2tld0luU2Vjb25kcyxcclxuICAgICAgICB1c2VySW5mb0p3dElzc3VlciA9ICdPUCcsXHJcbiAgICAgICAgLy8gb3RoZXIgYmVoYXZpb3JcclxuICAgICAgICBzdGF0ZVN0b3JlID0gbmV3IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlKCksXHJcbiAgICAgICAgUmVzcG9uc2VWYWxpZGF0b3JDdG9yID0gUmVzcG9uc2VWYWxpZGF0b3IsXHJcbiAgICAgICAgTWV0YWRhdGFTZXJ2aWNlQ3RvciA9IE1ldGFkYXRhU2VydmljZSxcclxuICAgICAgICAvLyBleHRyYSBxdWVyeSBwYXJhbXNcclxuICAgICAgICBleHRyYVF1ZXJ5UGFyYW1zID0ge31cclxuICAgIH0gPSB7fSkge1xyXG5cclxuICAgICAgICB0aGlzLl9hdXRob3JpdHkgPSBhdXRob3JpdHk7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSBtZXRhZGF0YVVybDtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhO1xyXG4gICAgICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gc2lnbmluZ0tleXM7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcclxuICAgICAgICB0aGlzLl9jbGllbnRfc2VjcmV0ID0gY2xpZW50X3NlY3JldDtcclxuICAgICAgICB0aGlzLl9yZXNwb25zZV90eXBlID0gcmVzcG9uc2VfdHlwZTtcclxuICAgICAgICB0aGlzLl9zY29wZSA9IHNjb3BlO1xyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb21wdCA9IHByb21wdDtcclxuICAgICAgICB0aGlzLl9kaXNwbGF5ID0gZGlzcGxheTtcclxuICAgICAgICB0aGlzLl9tYXhfYWdlID0gbWF4X2FnZTtcclxuICAgICAgICB0aGlzLl91aV9sb2NhbGVzID0gdWlfbG9jYWxlcztcclxuICAgICAgICB0aGlzLl9hY3JfdmFsdWVzID0gYWNyX3ZhbHVlcztcclxuICAgICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xyXG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlX21vZGUgPSByZXNwb25zZV9tb2RlO1xyXG5cclxuICAgICAgICB0aGlzLl9maWx0ZXJQcm90b2NvbENsYWltcyA9ICEhZmlsdGVyUHJvdG9jb2xDbGFpbXM7XHJcbiAgICAgICAgdGhpcy5fbG9hZFVzZXJJbmZvID0gISFsb2FkVXNlckluZm87XHJcbiAgICAgICAgdGhpcy5fc3RhbGVTdGF0ZUFnZSA9IHN0YWxlU3RhdGVBZ2U7XHJcbiAgICAgICAgdGhpcy5fY2xvY2tTa2V3ID0gY2xvY2tTa2V3O1xyXG4gICAgICAgIHRoaXMuX3VzZXJJbmZvSnd0SXNzdWVyID0gdXNlckluZm9Kd3RJc3N1ZXI7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlO1xyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvciA9IG5ldyBSZXNwb25zZVZhbGlkYXRvckN0b3IodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2V4dHJhUXVlcnlQYXJhbXMgPSB0eXBlb2YgZXh0cmFRdWVyeVBhcmFtcyA9PT0gJ29iamVjdCcgPyBleHRyYVF1ZXJ5UGFyYW1zIDoge307XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2xpZW50IGNvbmZpZ1xyXG4gICAgZ2V0IGNsaWVudF9pZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2lkO1xyXG4gICAgfVxyXG4gICAgc2V0IGNsaWVudF9pZCh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2xpZW50X2lkKSB7XHJcbiAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldCBvbmx5XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiT2lkY0NsaWVudFNldHRpbmdzLnNldF9jbGllbnRfaWQ6IGNsaWVudF9pZCBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjbGllbnRfaWQgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgY2xpZW50X3NlY3JldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X3NlY3JldDtcclxuICAgIH1cclxuICAgIGdldCByZXNwb25zZV90eXBlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNwb25zZV90eXBlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHNjb3BlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY29wZTtcclxuICAgIH1cclxuICAgIGdldCByZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuICAgIGdldCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gb3B0aW9uYWwgcHJvdG9jb2wgcGFyYW1zXHJcbiAgICBnZXQgcHJvbXB0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9tcHQ7XHJcbiAgICB9XHJcbiAgICBnZXQgZGlzcGxheSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGxheTtcclxuICAgIH1cclxuICAgIGdldCBtYXhfYWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhfYWdlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHVpX2xvY2FsZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VpX2xvY2FsZXM7XHJcbiAgICB9XHJcbiAgICBnZXQgYWNyX3ZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWNyX3ZhbHVlcztcclxuICAgIH1cclxuICAgIGdldCByZXNvdXJjZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2U7XHJcbiAgICB9XHJcbiAgICBnZXQgcmVzcG9uc2VfbW9kZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VfbW9kZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gbWV0YWRhdGFcclxuICAgIGdldCBhdXRob3JpdHkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGhvcml0eTtcclxuICAgIH1cclxuICAgIHNldCBhdXRob3JpdHkodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2F1dGhvcml0eSkge1xyXG4gICAgICAgICAgICAvLyBvbmUtdGltZSBzZXQgb25seVxyXG4gICAgICAgICAgICB0aGlzLl9hdXRob3JpdHkgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk9pZGNDbGllbnRTZXR0aW5ncy5zZXRfYXV0aG9yaXR5OiBhdXRob3JpdHkgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXR5IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhVXJsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbWV0YWRhdGFVcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSB0aGlzLmF1dGhvcml0eTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybCAmJiB0aGlzLl9tZXRhZGF0YVVybC5pbmRleE9mKE9pZGNNZXRhZGF0YVVybFBhdGgpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21ldGFkYXRhVXJsW3RoaXMuX21ldGFkYXRhVXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSAnLyc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSBPaWRjTWV0YWRhdGFVcmxQYXRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFVcmw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2V0dGFibGUvY2FjaGFibGUgbWV0YWRhdGEgdmFsdWVzXHJcbiAgICBnZXQgbWV0YWRhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhO1xyXG4gICAgfVxyXG4gICAgc2V0IG1ldGFkYXRhKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lnbmluZ0tleXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbmdLZXlzO1xyXG4gICAgfVxyXG4gICAgc2V0IHNpZ25pbmdLZXlzKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fc2lnbmluZ0tleXMgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBiZWhhdmlvciBmbGFnc1xyXG4gICAgZ2V0IGZpbHRlclByb3RvY29sQ2xhaW1zKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJQcm90b2NvbENsYWltcztcclxuICAgIH1cclxuICAgIGdldCBsb2FkVXNlckluZm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VySW5mbztcclxuICAgIH1cclxuICAgIGdldCBzdGFsZVN0YXRlQWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFsZVN0YXRlQWdlO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNsb2NrU2tldygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvY2tTa2V3O1xyXG4gICAgfVxyXG4gICAgZ2V0IHVzZXJJbmZvSnd0SXNzdWVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VySW5mb0p3dElzc3VlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3RhdGVTdG9yZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVTdG9yZTtcclxuICAgIH1cclxuICAgIGdldCB2YWxpZGF0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBtZXRhZGF0YVNlcnZpY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBleHRyYSBxdWVyeSBwYXJhbXNcclxuICAgIGdldCBleHRyYVF1ZXJ5UGFyYW1zKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9leHRyYVF1ZXJ5UGFyYW1zO1xyXG4gICAgfVxyXG4gICAgc2V0IGV4dHJhUXVlcnlQYXJhbXModmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhUXVlcnlQYXJhbXMgPSB2YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9leHRyYVF1ZXJ5UGFyYW1zID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgUG9wdXBXaW5kb3cgfSBmcm9tICcuL1BvcHVwV2luZG93LmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBQb3B1cE5hdmlnYXRvciB7XHJcblxyXG4gICAgcHJlcGFyZShwYXJhbXMpIHtcclxuICAgICAgICBsZXQgcG9wdXAgPSBuZXcgUG9wdXBXaW5kb3cocGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvcHVwKTtcclxuICAgIH1cclxuXHJcbiAgICBjYWxsYmFjayh1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cE5hdmlnYXRvci5jYWxsYmFja1wiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgUG9wdXBXaW5kb3cubm90aWZ5T3BlbmVyKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IFVybFV0aWxpdHkgfSBmcm9tICcuL1VybFV0aWxpdHkuanMnO1xyXG5cclxuY29uc3QgQ2hlY2tGb3JQb3B1cENsb3NlZEludGVydmFsID0gNTAwO1xyXG5jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHdpZHRoPTUwMCxoZWlnaHQ9NTAwLGxlZnQ9MTAwLHRvcD0xMDA7JztcclxuLy9jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHdpZHRoPTUwMCxoZWlnaHQ9NTAwLGxlZnQ9MTAwLHRvcD0xMDA7cmVzaXphYmxlPXllcyc7XHJcblxyXG5jb25zdCBEZWZhdWx0UG9wdXBUYXJnZXQgPSBcIl9ibGFua1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBvcHVwV2luZG93IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0ID0gcGFyYW1zLnBvcHVwV2luZG93VGFyZ2V0IHx8IERlZmF1bHRQb3B1cFRhcmdldDtcclxuICAgICAgICBsZXQgZmVhdHVyZXMgPSBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCBEZWZhdWx0UG9wdXBGZWF0dXJlcztcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wdXAgPSB3aW5kb3cub3BlbignJywgdGFyZ2V0LCBmZWF0dXJlcyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93LmN0b3I6IHBvcHVwIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZC5iaW5kKHRoaXMpLCBDaGVja0ZvclBvcHVwQ2xvc2VkSW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJvbWlzZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXBXaW5kb3cubmF2aWdhdGU6IEVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXBXaW5kb3cubmF2aWdhdGU6IG5vIHVybCBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5uYXZpZ2F0ZTogU2V0dGluZyBVUkwgaW4gcG9wdXBcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9pZCA9IHBhcmFtcy5pZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lkKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3dbXCJwb3B1cENhbGxiYWNrX1wiICsgcGFyYW1zLmlkXSA9IHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLndpbmRvdy5sb2NhdGlvbiA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9zdWNjZXNzKGRhdGEpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5jYWxsYmFjazogU3VjY2Vzc2Z1bCByZXNwb25zZSBmcm9tIHBvcHVwIHdpbmRvd1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBfZXJyb3IobWVzc2FnZSkge1xyXG4gICAgICAgIExvZy5lcnJvcihcIlBvcHVwV2luZG93LmVycm9yOiBcIiwgbWVzc2FnZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gICAgICAgIHRoaXMuX3JlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jbGVhbnVwKGtlZXBPcGVuKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuY2xlYW51cFwiKTtcclxuXHJcbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyKTtcclxuICAgICAgICB0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIgPSBudWxsO1xyXG5cclxuICAgICAgICBkZWxldGUgd2luZG93W1wicG9wdXBDYWxsYmFja19cIiArIHRoaXMuX2lkXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmICFrZWVwT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgX2NoZWNrRm9yUG9wdXBDbG9zZWQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9wb3B1cCB8fCB0aGlzLl9wb3B1cC5jbG9zZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJQb3B1cCB3aW5kb3cgY2xvc2VkXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfY2FsbGJhY2sodXJsLCBrZWVwT3Blbikge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoa2VlcE9wZW4pO1xyXG5cclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93LmNhbGxiYWNrIHN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3MoeyB1cmw6IHVybCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93LmNhbGxiYWNrOiBJbnZhbGlkIHJlc3BvbnNlIGZyb20gcG9wdXBcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiSW52YWxpZCByZXNwb25zZSBmcm9tIHBvcHVwXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbm90aWZ5T3BlbmVyKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcikge1xyXG4gICAgICAgIGlmICh3aW5kb3cub3BlbmVyKSB7XHJcbiAgICAgICAgICAgIHVybCA9IHVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBkZWxpbWl0ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBcInBvcHVwQ2FsbGJhY2tfXCIgKyBkYXRhLnN0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IHdpbmRvdy5vcGVuZXJbbmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lcjogcGFzc2luZyB1cmwgbWVzc2FnZSB0byBvcGVuZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVybCwga2VlcE9wZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJQb3B1cFdpbmRvdy5ub3RpZnlPcGVuZXI6IG5vIG1hdGNoaW5nIGNhbGxiYWNrIGZvdW5kIG9uIG9wZW5lclwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cud2FybihcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lcjogbm8gc3RhdGUgZm91bmQgaW4gcmVzcG9uc2UgdXJsXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cud2FybihcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lcjogbm8gd2luZG93Lm9wZW5lci4gQ2FuJ3QgY29tcGxldGUgbm90aWZpY2F0aW9uLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlZGlyZWN0TmF2aWdhdG9yIHtcclxuXHJcbiAgICBwcmVwYXJlKCkge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVkaXJlY3ROYXZpZ2F0b3IubmF2aWdhdGU6IE5vIHVybCBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBwYXJhbXMudXJsO1xyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHVybCgpIHtcclxuICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuL01ldGFkYXRhU2VydmljZS5qcyc7XHJcbmltcG9ydCB7IFVzZXJJbmZvU2VydmljZSB9IGZyb20gJy4vVXNlckluZm9TZXJ2aWNlLmpzJztcclxuaW1wb3J0IHsgVG9rZW5DbGllbnQgfSBmcm9tICcuL1Rva2VuQ2xpZW50LmpzJztcclxuaW1wb3J0IHsgRXJyb3JSZXNwb25zZSB9IGZyb20gJy4vRXJyb3JSZXNwb25zZS5qcyc7XHJcbmltcG9ydCB7IEpvc2VVdGlsIH0gZnJvbSAnLi9Kb3NlVXRpbC5qcyc7XHJcblxyXG5jb25zdCBQcm90b2NvbENsYWltcyA9IFtcIm5vbmNlXCIsIFwiYXRfaGFzaFwiLCBcImlhdFwiLCBcIm5iZlwiLCBcImV4cFwiLCBcImF1ZFwiLCBcImlzc1wiLCBcImNfaGFzaFwiXTtcclxuXHJcbmV4cG9ydCBjbGFzcyBSZXNwb25zZVZhbGlkYXRvciB7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIFxyXG4gICAgICAgIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UsXHJcbiAgICAgICAgVXNlckluZm9TZXJ2aWNlQ3RvciA9IFVzZXJJbmZvU2VydmljZSwgXHJcbiAgICAgICAgam9zZVV0aWwgPSBKb3NlVXRpbCxcclxuICAgICAgICBUb2tlbkNsaWVudEN0b3IgPSBUb2tlbkNsaWVudCkge1xyXG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuY3RvcjogTm8gc2V0dGluZ3MgcGFzc2VkIHRvIFJlc3BvbnNlVmFsaWRhdG9yXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXR0aW5nc1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJJbmZvU2VydmljZSA9IG5ldyBVc2VySW5mb1NlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcclxuICAgICAgICB0aGlzLl9qb3NlVXRpbCA9IGpvc2VVdGlsO1xyXG4gICAgICAgIHRoaXMuX3Rva2VuQ2xpZW50ID0gbmV3IFRva2VuQ2xpZW50Q3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGVTaWduaW5SZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25pblJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1NpZ25pblBhcmFtcyhzdGF0ZSwgcmVzcG9uc2UpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25pblJlc3BvbnNlOiBzdGF0ZSBwcm9jZXNzZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVRva2VucyhzdGF0ZSwgcmVzcG9uc2UpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IudmFsaWRhdGVTaWduaW5SZXNwb25zZTogdG9rZW5zIHZhbGlkYXRlZFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzQ2xhaW1zKHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25pblJlc3BvbnNlOiBjbGFpbXMgcHJvY2Vzc2VkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVNpZ25vdXRSZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAoc3RhdGUuaWQgIT09IHJlc3BvbnNlLnN0YXRlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLnZhbGlkYXRlU2lnbm91dFJlc3BvbnNlOiBTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlN0YXRlIGRvZXMgbm90IG1hdGNoXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIHN0YXRlIG1hdGNoZXMsIHRha2UgdGhlIHN0b3JlZCBkYXRhXHJcbiAgICAgICAgLy8gYW5kIHNldCBpdCBpbnRvIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBnZXQgdGhlaXIgc3RhdGVcclxuICAgICAgICAvLyB0aGlzIGlzIGltcG9ydGFudCBmb3IgYm90aCBzdWNjZXNzICYgZXJyb3Igb3V0Y29tZXNcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25vdXRSZXNwb25zZTogc3RhdGUgdmFsaWRhdGVkXCIpO1xyXG4gICAgICAgIHJlc3BvbnNlLnN0YXRlID0gc3RhdGUuZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XHJcbiAgICAgICAgICAgIExvZy53YXJuKFwiUmVzcG9uc2VWYWxpZGF0b3IudmFsaWRhdGVTaWdub3V0UmVzcG9uc2U6IFJlc3BvbnNlIHdhcyBlcnJvclwiLCByZXNwb25zZS5lcnJvcik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Byb2Nlc3NTaWduaW5QYXJhbXMoc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgaWYgKHN0YXRlLmlkICE9PSByZXNwb25zZS5zdGF0ZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogU3RhdGUgZG9lcyBub3QgbWF0Y2hcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXN0YXRlLmNsaWVudF9pZCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogTm8gY2xpZW50X2lkIG9uIHN0YXRlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gY2xpZW50X2lkIG9uIHN0YXRlXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc3RhdGUuYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBObyBhdXRob3JpdHkgb24gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBhdXRob3JpdHkgb24gc3RhdGVcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlIGF1dGhvcml0eSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgc2lnbmluIHN0YXRlXHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5ID0gc3RhdGUuYXV0aG9yaXR5O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBlbnN1cmUgd2UncmUgdXNpbmcgdGhlIGNvcnJlY3QgYXV0aG9yaXR5IGlmIHRoZSBhdXRob3JpdHkgaXMgbm90IGxvYWRlZCBmcm9tIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSAmJiB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkgIT09IHN0YXRlLmF1dGhvcml0eSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogYXV0aG9yaXR5IG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJhdXRob3JpdHkgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBjbGllbnRfaWQgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCA9IHN0YXRlLmNsaWVudF9pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZW5zdXJlIHdlJ3JlIHVzaW5nIHRoZSBjb3JyZWN0IGNsaWVudF9pZCBpZiB0aGUgY2xpZW50X2lkIGlzIG5vdCBsb2FkZWQgZnJvbSBzaWduaW4gc3RhdGVcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQgJiYgdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkICE9PSBzdGF0ZS5jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3Byb2Nlc3NTaWduaW5QYXJhbXM6IGNsaWVudF9pZCBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiY2xpZW50X2lkIG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgc3RhdGUgbWF0Y2hlcywgdGFrZSB0aGUgc3RvcmVkIGRhdGFcclxuICAgICAgICAvLyBhbmQgc2V0IGl0IGludG8gdGhlIHJlc3BvbnNlIHNvIGNhbGxlcnMgY2FuIGdldCB0aGVpciBzdGF0ZVxyXG4gICAgICAgIC8vIHRoaXMgaXMgaW1wb3J0YW50IGZvciBib3RoIHN1Y2Nlc3MgJiBlcnJvciBvdXRjb21lc1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBzdGF0ZSB2YWxpZGF0ZWRcIik7XHJcbiAgICAgICAgcmVzcG9uc2Uuc3RhdGUgPSBzdGF0ZS5kYXRhO1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcclxuICAgICAgICAgICAgTG9nLndhcm4oXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogUmVzcG9uc2Ugd2FzIGVycm9yXCIsIHJlc3BvbnNlLmVycm9yKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdGUubm9uY2UgJiYgIXJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBFeHBlY3RpbmcgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXN0YXRlLm5vbmNlICYmIHJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBOb3QgZXhwZWN0aW5nIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5leHBlY3RlZCBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdGUuY29kZV92ZXJpZmllciAmJiAhcmVzcG9uc2UuY29kZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtczogRXhwZWN0aW5nIGNvZGUgaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBjb2RlIGluIHJlc3BvbnNlXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc3RhdGUuY29kZV92ZXJpZmllciAmJiByZXNwb25zZS5jb2RlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zOiBOb3QgZXhwZWN0aW5nIGNvZGUgaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNvZGUgaW4gcmVzcG9uc2VcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Byb2Nlc3NDbGFpbXMocmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAocmVzcG9uc2UuaXNPcGVuSWRDb25uZWN0KSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ2xhaW1zOiByZXNwb25zZSBpcyBPSURDLCBwcm9jZXNzaW5nIGNsYWltc1wiKTtcclxuXHJcbiAgICAgICAgICAgIHJlc3BvbnNlLnByb2ZpbGUgPSB0aGlzLl9maWx0ZXJQcm90b2NvbENsYWltcyhyZXNwb25zZS5wcm9maWxlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5sb2FkVXNlckluZm8gJiYgcmVzcG9uc2UuYWNjZXNzX3Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NsYWltczogbG9hZGluZyB1c2VyIGluZm9cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJJbmZvU2VydmljZS5nZXRDbGFpbXMocmVzcG9uc2UuYWNjZXNzX3Rva2VuKS50aGVuKGNsYWltcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3Byb2Nlc3NDbGFpbXM6IHVzZXIgaW5mbyBjbGFpbXMgcmVjZWl2ZWQgZnJvbSB1c2VyIGluZm8gZW5kcG9pbnRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjbGFpbXMuc3ViICE9PSByZXNwb25zZS5wcm9maWxlLnN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NsYWltczogc3ViIGZyb20gdXNlciBpbmZvIGVuZHBvaW50IGRvZXMgbm90IG1hdGNoIHN1YiBpbiBhY2Nlc3NfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzdWIgZnJvbSB1c2VyIGluZm8gZW5kcG9pbnQgZG9lcyBub3QgbWF0Y2ggc3ViIGluIGFjY2Vzc190b2tlblwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gdGhpcy5fbWVyZ2VDbGFpbXMocmVzcG9uc2UucHJvZmlsZSwgY2xhaW1zKTtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NsYWltczogdXNlciBpbmZvIGNsYWltcyByZWNlaXZlZCwgdXBkYXRlZCBwcm9maWxlOlwiLCByZXNwb25zZS5wcm9maWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NsYWltczogbm90IGxvYWRpbmcgdXNlciBpbmZvXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NsYWltczogcmVzcG9uc2UgaXMgbm90IE9JREMsIG5vdCBwcm9jZXNzaW5nIGNsYWltc1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIF9tZXJnZUNsYWltcyhjbGFpbXMxLCBjbGFpbXMyKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGNsYWltczEpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGNsYWltczIpIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGNsYWltczJbbmFtZV07XHJcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHZhbHVlc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W25hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtuYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0W25hbWVdLmluZGV4T2YodmFsdWUpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0ucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0W25hbWVdICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHRoaXMuX21lcmdlQ2xhaW1zKHJlc3VsdFtuYW1lXSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IFtyZXN1bHRbbmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgX2ZpbHRlclByb3RvY29sQ2xhaW1zKGNsYWltcykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9maWx0ZXJQcm90b2NvbENsYWltcywgaW5jb21pbmcgY2xhaW1zOlwiLCBjbGFpbXMpO1xyXG5cclxuICAgICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgY2xhaW1zKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLl9maWx0ZXJQcm90b2NvbENsYWltcykge1xyXG4gICAgICAgICAgICBQcm90b2NvbENsYWltcy5mb3JFYWNoKHR5cGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFt0eXBlXTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fZmlsdGVyUHJvdG9jb2xDbGFpbXM6IHByb3RvY29sIGNsYWltcyBmaWx0ZXJlZFwiLCByZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX2ZpbHRlclByb3RvY29sQ2xhaW1zOiBwcm90b2NvbCBjbGFpbXMgbm90IGZpbHRlcmVkXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZVRva2VucyhzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAocmVzcG9uc2UuY29kZSkge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVUb2tlbnM6IFZhbGlkYXRpbmcgY29kZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NDb2RlKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UuaWRfdG9rZW4pIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFjY2Vzc190b2tlbikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlVG9rZW5zOiBWYWxpZGF0aW5nIGlkX3Rva2VuIGFuZCBhY2Nlc3NfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW4oc3RhdGUsIHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlVG9rZW5zOiBWYWxpZGF0aW5nIGlkX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVUb2tlbnM6IE5vIGNvZGUgdG8gcHJvY2VzcyBvciBpZF90b2tlbiB0byB2YWxpZGF0ZVwiKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBfcHJvY2Vzc0NvZGUoc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogc3RhdGUuY2xpZW50X2lkLFxyXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9zZXR0aW5ncy5jbGllbnRfc2VjcmV0LFxyXG4gICAgICAgICAgICBjb2RlIDogcmVzcG9uc2UuY29kZSxcclxuICAgICAgICAgICAgcmVkaXJlY3RfdXJpOiBzdGF0ZS5yZWRpcmVjdF91cmksXHJcbiAgICAgICAgICAgIGNvZGVfdmVyaWZpZXI6IHN0YXRlLmNvZGVfdmVyaWZpZXIsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5DbGllbnQuZXhjaGFuZ2VDb2RlKHJlcXVlc3QpLnRoZW4odG9rZW5SZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmb3IodmFyIGtleSBpbiB0b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVtrZXldID0gdG9rZW5SZXNwb25zZVtrZXldO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuaWRfdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ29kZTogdG9rZW4gcmVzcG9uc2Ugc3VjY2Vzc2Z1bCwgcHJvY2Vzc2luZyBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUlkVG9rZW5BdHRyaWJ1dGVzKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NvZGU6IHRva2VuIHJlc3BvbnNlIHN1Y2Nlc3NmdWwsIHJldHVybmluZyByZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZUlkVG9rZW5BdHRyaWJ1dGVzKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0SXNzdWVyKCkudGhlbihpc3N1ZXIgPT4ge1xyXG5cclxuICAgICAgICAgICAgbGV0IGF1ZGllbmNlID0gc3RhdGUuY2xpZW50X2lkO1xyXG4gICAgICAgICAgICBsZXQgY2xvY2tTa2V3SW5TZWNvbmRzID0gdGhpcy5fc2V0dGluZ3MuY2xvY2tTa2V3O1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuQXR0cmlidXRlczogVmFsaWRhaW5nIEpXVCBhdHRyaWJ1dGVzOyB1c2luZyBjbG9jayBza2V3IChpbiBzZWNvbmRzKSBvZjogXCIsIGNsb2NrU2tld0luU2Vjb25kcyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fam9zZVV0aWwudmFsaWRhdGVKd3RBdHRyaWJ1dGVzKHJlc3BvbnNlLmlkX3Rva2VuLCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXdJblNlY29uZHMpLnRoZW4ocGF5bG9hZCA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLm5vbmNlICYmIHN0YXRlLm5vbmNlICE9PSBwYXlsb2FkLm5vbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbkF0dHJpYnV0ZXM6IEludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghcGF5bG9hZC5zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuQXR0cmlidXRlczogTm8gc3ViIHByZXNlbnQgaW4gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHN1YiBwcmVzZW50IGluIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgaWYgKCFzdGF0ZS5ub25jZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuOiBObyBub25jZSBvbiBzdGF0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIG5vbmNlIG9uIHN0YXRlXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXNwb25zZS5pZF90b2tlbik7XHJcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIgfHwgIWp3dC5wYXlsb2FkKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IEZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5ub25jZSAhPT0gand0LnBheWxvYWQubm9uY2UpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbjogSW52YWxpZCBub25jZSBpbiBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGtpZCA9IGp3dC5oZWFkZXIua2lkO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldElzc3VlcigpLnRoZW4oaXNzdWVyID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbjogUmVjZWl2ZWQgaXNzdWVyXCIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRTaWduaW5nS2V5cygpLnRoZW4oa2V5cyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuOiBObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc2lnbmluZyBrZXlzIGZyb20gbWV0YWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IFJlY2VpdmVkIHNpZ25pbmcga2V5c1wiKTtcclxuICAgICAgICAgICAgICAgIGxldCBrZXk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleXMgPSB0aGlzLl9maWx0ZXJCeUFsZyhrZXlzLCBqd3QuaGVhZGVyLmFsZyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbjogTm8ga2lkIGZvdW5kIGluIGlkX3Rva2VuIGFuZCBtb3JlIHRoYW4gb25lIGtleSBmb3VuZCBpbiBtZXRhZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGtpZCBmb3VuZCBpbiBpZF90b2tlbiBhbmQgbW9yZSB0aGFuIG9uZSBrZXkgZm91bmQgaW4gbWV0YWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lkIGlzIG1hbmRhdG9yeSBvbmx5IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGtleXMgaW4gdGhlIHJlZmVyZW5jZWQgSldLIFNldCBkb2N1bWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cDovL29wZW5pZC5uZXQvc3BlY3Mvb3BlbmlkLWNvbm5lY3QtY29yZS0xXzAuaHRtbCNTaWduaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5cy5maWx0ZXIoa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5raWQgPT09IGtpZDtcclxuICAgICAgICAgICAgICAgICAgICB9KVswXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IE5vIGtleSBtYXRjaGluZyBraWQgb3IgYWxnIGZvdW5kIGluIHNpZ25pbmcga2V5c1wiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8ga2V5IG1hdGNoaW5nIGtpZCBvciBhbGcgZm91bmQgaW4gc2lnbmluZyBrZXlzXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgYXVkaWVuY2UgPSBzdGF0ZS5jbGllbnRfaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGNsb2NrU2tld0luU2Vjb25kcyA9IHRoaXMuX3NldHRpbmdzLmNsb2NrU2tldztcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW46IFZhbGlkYWluZyBKV1Q7IHVzaW5nIGNsb2NrIHNrZXcgKGluIHNlY29uZHMpIG9mOiBcIiwgY2xvY2tTa2V3SW5TZWNvbmRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fam9zZVV0aWwudmFsaWRhdGVKd3QocmVzcG9uc2UuaWRfdG9rZW4sIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3SW5TZWNvbmRzKS50aGVuKCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbjogSldUIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqd3QucGF5bG9hZC5zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbjogTm8gc3ViIHByZXNlbnQgaW4gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzdWIgcHJlc2VudCBpbiBpZF90b2tlblwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gand0LnBheWxvYWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfZmlsdGVyQnlBbGcoa2V5cywgYWxnKXtcclxuICAgICAgICB2YXIga3R5ID0gbnVsbDtcclxuICAgICAgICBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJSU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIlJTQVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhbGcuc3RhcnRzV2l0aChcIlBTXCIpKSB7XHJcbiAgICAgICAgICAgIGt0eSA9IFwiUFNcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJFU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIkVDXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fZmlsdGVyQnlBbGc6IGFsZyBub3Qgc3VwcG9ydGVkOiBcIiwgYWxnKTtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX2ZpbHRlckJ5QWxnOiBMb29raW5nIGZvciBrZXlzIHRoYXQgbWF0Y2gga3R5OiBcIiwga3R5KTtcclxuXHJcbiAgICAgICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXkua3R5ID09PSBrdHk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9maWx0ZXJCeUFsZzogTnVtYmVyIG9mIGtleXMgdGhhdCBtYXRjaCBrdHk6IFwiLCBrdHksIGtleXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9XHJcblxyXG4gICAgX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLnByb2ZpbGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlQWNjZXNzVG9rZW46IE5vIHByb2ZpbGUgbG9hZGVkIGZyb20gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwcm9maWxlIGxvYWRlZCBmcm9tIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuOiBObyBhdF9oYXNoIGluIGlkX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gYXRfaGFzaCBpbiBpZF90b2tlblwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuOiBObyBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXNwb25zZS5pZF90b2tlbik7XHJcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlQWNjZXNzVG9rZW46IEZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBoYXNoQWxnID0gand0LmhlYWRlci5hbGc7XHJcbiAgICAgICAgaWYgKCFoYXNoQWxnIHx8IGhhc2hBbGcubGVuZ3RoICE9PSA1KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuOiBVbnN1cHBvcnRlZCBhbGc6XCIsIGhhc2hBbGcpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBoYXNoQml0cyA9IGhhc2hBbGcuc3Vic3RyKDIsIDMpO1xyXG4gICAgICAgIGlmICghaGFzaEJpdHMpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlQWNjZXNzVG9rZW46IFVuc3VwcG9ydGVkIGFsZzpcIiwgaGFzaEFsZywgaGFzaEJpdHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGhhc2hCaXRzID0gcGFyc2VJbnQoaGFzaEJpdHMpO1xyXG4gICAgICAgIGlmIChoYXNoQml0cyAhPT0gMjU2ICYmIGhhc2hCaXRzICE9PSAzODQgJiYgaGFzaEJpdHMgIT09IDUxMikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVBY2Nlc3NUb2tlbjogVW5zdXBwb3J0ZWQgYWxnOlwiLCBoYXNoQWxnLCBoYXNoQml0cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNoYSA9IFwic2hhXCIgKyBoYXNoQml0cztcclxuICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2pvc2VVdGlsLmhhc2hTdHJpbmcocmVzcG9uc2UuYWNjZXNzX3Rva2VuLCBzaGEpO1xyXG4gICAgICAgIGlmICghaGFzaCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVBY2Nlc3NUb2tlbjogYWNjZXNzX3Rva2VuIGhhc2ggZmFpbGVkOlwiLCBzaGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHZhbGlkYXRlIGF0X2hhc2hcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGxlZnQgPSBoYXNoLnN1YnN0cigwLCBoYXNoLmxlbmd0aCAvIDIpO1xyXG4gICAgICAgIHZhciBsZWZ0X2I2NHUgPSB0aGlzLl9qb3NlVXRpbC5oZXhUb0Jhc2U2NFVybChsZWZ0KTtcclxuICAgICAgICBpZiAobGVmdF9iNjR1ICE9PSByZXNwb25zZS5wcm9maWxlLmF0X2hhc2gpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlQWNjZXNzVG9rZW46IEZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIsIGxlZnRfYjY0dSwgcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuOiBzdWNjZXNzXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IENoZWNrU2Vzc2lvbklGcmFtZSB9IGZyb20gJy4vQ2hlY2tTZXNzaW9uSUZyYW1lLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXNzaW9uTW9uaXRvciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IodXNlck1hbmFnZXIsIENoZWNrU2Vzc2lvbklGcmFtZUN0b3IgPSBDaGVja1Nlc3Npb25JRnJhbWUpIHtcclxuICAgICAgICBpZiAoIXVzZXJNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNlc3Npb25Nb25pdG9yLmN0b3I6IE5vIHVzZXIgbWFuYWdlciBwYXNzZWQgdG8gU2Vzc2lvbk1vbml0b3JcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVzZXJNYW5hZ2VyXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIgPSB1c2VyTWFuYWdlcjtcclxuICAgICAgICB0aGlzLl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yID0gQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvcjtcclxuXHJcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLmFkZFVzZXJMb2FkZWQodGhpcy5fc3RhcnQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLmFkZFVzZXJVbmxvYWRlZCh0aGlzLl9zdG9wLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5nZXRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgLy8gZG9pbmcgdGhpcyBtYW51YWxseSBoZXJlIHNpbmNlIGNhbGxpbmcgZ2V0VXNlciBcclxuICAgICAgICAgICAgLy8gZG9lc24ndCB0cmlnZ2VyIGxvYWQgZXZlbnQuXHJcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydCh1c2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGN0b3JcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU2Vzc2lvbk1vbml0b3IgY3RvcjogZXJyb3IgZnJvbSBnZXRVc2VyOlwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF9zZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIuc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgICBnZXQgX21ldGFkYXRhU2VydmljZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIubWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9jbGllbnRfaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcclxuICAgIH1cclxuICAgIGdldCBfY2hlY2tTZXNzaW9uSW50ZXJ2YWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNoZWNrU2Vzc2lvbkludGVydmFsO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9zdG9wQ2hlY2tTZXNzaW9uT25FcnJvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3Muc3RvcENoZWNrU2Vzc2lvbk9uRXJyb3I7XHJcbiAgICB9XHJcblxyXG4gICAgX3N0YXJ0KHVzZXIpIHtcclxuICAgICAgICBsZXQgc2Vzc2lvbl9zdGF0ZSA9IHVzZXIuc2Vzc2lvbl9zdGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKHNlc3Npb25fc3RhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3ViID0gdXNlci5wcm9maWxlLnN1YjtcclxuICAgICAgICAgICAgdGhpcy5fc2lkID0gdXNlci5wcm9maWxlLnNpZDtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX3N0YXJ0OiBzZXNzaW9uX3N0YXRlOlwiLCBzZXNzaW9uX3N0YXRlLCBcIiwgc3ViOlwiLCB0aGlzLl9zdWIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRDaGVja1Nlc3Npb25JZnJhbWUoKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fc3RhcnQ6IEluaXRpYWxpemluZyBjaGVjayBzZXNzaW9uIGlmcmFtZVwiKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsaWVudF9pZCA9IHRoaXMuX2NsaWVudF9pZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGludGVydmFsID0gdGhpcy5fY2hlY2tTZXNzaW9uSW50ZXJ2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdG9wT25FcnJvciA9IHRoaXMuX3N0b3BDaGVja1Nlc3Npb25PbkVycm9yO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lID0gbmV3IHRoaXMuX0NoZWNrU2Vzc2lvbklGcmFtZUN0b3IodGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSwgY2xpZW50X2lkLCB1cmwsIGludGVydmFsLCBzdG9wT25FcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZS5sb2FkKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJTZXNzaW9uTW9uaXRvci5fc3RhcnQ6IE5vIGNoZWNrIHNlc3Npb24gaWZyYW1lIGZvdW5kIGluIHRoZSBtZXRhZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBub24tcHJvbWlzZSBjYWxsYmFja1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlNlc3Npb25Nb25pdG9yLl9zdGFydDogRXJyb3IgZnJvbSBnZXRDaGVja1Nlc3Npb25JZnJhbWU6XCIsIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lLnN0YXJ0KHNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9zdG9wKCkge1xyXG4gICAgICAgIHRoaXMuX3N1YiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc2lkID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZSkge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fc3RvcFwiKTtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lLnN0b3AoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2NhbGxiYWNrKCkge1xyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLnF1ZXJ5U2Vzc2lvblN0YXR1cygpLnRoZW4oc2Vzc2lvbiA9PiB7XHJcbiAgICAgICAgICAgIHZhciByYWlzZVVzZXJTaWduZWRPdXRFdmVudCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uc3ViID09PSB0aGlzLl9zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICByYWlzZVVzZXJTaWduZWRPdXRFdmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZS5zdGFydChzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5zaWQgPT09IHRoaXMuX3NpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fY2FsbGJhY2s6IFNhbWUgc3ViIHN0aWxsIGxvZ2dlZCBpbiBhdCBPUCwgcmVzdGFydGluZyBjaGVjayBzZXNzaW9uIGlmcmFtZTsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbi5zZXNzaW9uX3N0YXRlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9jYWxsYmFjazogU2FtZSBzdWIgc3RpbGwgbG9nZ2VkIGluIGF0IE9QLCBzZXNzaW9uIHN0YXRlIGhhcyBjaGFuZ2VkLCByZXN0YXJ0aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lOyBzZXNzaW9uX3N0YXRlOlwiLCBzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuX3JhaXNlVXNlclNlc3Npb25DaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX2NhbGxiYWNrOiBEaWZmZXJlbnQgc3ViamVjdCBzaWduZWQgaW50byBPUDpcIiwgc2Vzc2lvbi5zdWIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX2NhbGxiYWNrOiBTdWJqZWN0IG5vIGxvbmdlciBzaWduZWQgaW50byBPUFwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJhaXNlVXNlclNpZ25lZE91dEV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fY2FsbGJhY2s6IFNlc3Npb25Nb25pdG9yLl9jYWxsYmFjazsgcmFpc2luZyBzaWduZWQgb3V0IGV2ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9jYWxsYmFjazogRXJyb3IgY2FsbGluZyBxdWVyeUN1cnJlbnRTaWduaW5TZXNzaW9uOyByYWlzaW5nIHNpZ25lZCBvdXQgZXZlbnRcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuX3JhaXNlVXNlclNpZ25lZE91dCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgVXJsVXRpbGl0eSB9IGZyb20gJy4vVXJsVXRpbGl0eS5qcyc7XHJcbmltcG9ydCB7IFNpZ25pblN0YXRlIH0gZnJvbSAnLi9TaWduaW5TdGF0ZS5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgU2lnbmluUmVxdWVzdCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7XHJcbiAgICAgICAgLy8gbWFuZGF0b3J5XHJcbiAgICAgICAgdXJsLCBjbGllbnRfaWQsIHJlZGlyZWN0X3VyaSwgcmVzcG9uc2VfdHlwZSwgc2NvcGUsIGF1dGhvcml0eSxcclxuICAgICAgICAvLyBvcHRpb25hbFxyXG4gICAgICAgIGRhdGEsIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlcywgcmVzb3VyY2UsIHJlc3BvbnNlX21vZGUsXHJcbiAgICAgICAgcmVxdWVzdCwgcmVxdWVzdF91cmksIGV4dHJhUXVlcnlQYXJhbXMsXHJcbiAgICB9KSB7XHJcbiAgICAgICAgaWYgKCF1cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU2lnbmluUmVxdWVzdC5jdG9yOiBObyB1cmwgcGFzc2VkXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmxcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY2xpZW50X2lkKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNpZ25pblJlcXVlc3QuY3RvcjogTm8gY2xpZW50X2lkIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2xpZW50X2lkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXJlZGlyZWN0X3VyaSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTaWduaW5SZXF1ZXN0LmN0b3I6IE5vIHJlZGlyZWN0X3VyaSBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlZGlyZWN0X3VyaVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFyZXNwb25zZV90eXBlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNpZ25pblJlcXVlc3QuY3RvcjogTm8gcmVzcG9uc2VfdHlwZSBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlX3R5cGVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc2NvcGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU2lnbmluUmVxdWVzdC5jdG9yOiBObyBzY29wZSBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNjb3BlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWF1dGhvcml0eSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTaWduaW5SZXF1ZXN0LmN0b3I6IE5vIGF1dGhvcml0eSBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF1dGhvcml0eVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBvaWRjID0gU2lnbmluUmVxdWVzdC5pc09pZGMocmVzcG9uc2VfdHlwZSk7XHJcbiAgICAgICAgbGV0IGNvZGUgPSBTaWduaW5SZXF1ZXN0LmlzQ29kZShyZXNwb25zZV90eXBlKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IFNpZ25pblN0YXRlKHsgbm9uY2U6IG9pZGMsIGRhdGEsIGNsaWVudF9pZCwgYXV0aG9yaXR5LCByZWRpcmVjdF91cmksIGNvZGVfdmVyaWZpZXI6IGNvZGUgfSk7XHJcblxyXG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiY2xpZW50X2lkXCIsIGNsaWVudF9pZCk7XHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJyZWRpcmVjdF91cmlcIiwgcmVkaXJlY3RfdXJpKTtcclxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlc3BvbnNlX3R5cGVcIiwgcmVzcG9uc2VfdHlwZSk7XHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzY29wZVwiLCBzY29wZSk7XHJcblxyXG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwic3RhdGVcIiwgdGhpcy5zdGF0ZS5pZCk7XHJcbiAgICAgICAgaWYgKG9pZGMpIHtcclxuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJub25jZVwiLCB0aGlzLnN0YXRlLm5vbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvZGUpIHtcclxuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJjb2RlX2NoYWxsZW5nZVwiLCB0aGlzLnN0YXRlLmNvZGVfY2hhbGxlbmdlKTtcclxuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJjb2RlX2NoYWxsZW5nZV9tZXRob2RcIiwgXCJTMjU2XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG9wdGlvbmFsID0geyBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsIHJlc291cmNlLCByZXF1ZXN0LCByZXF1ZXN0X3VyaSwgcmVzcG9uc2VfbW9kZSB9O1xyXG4gICAgICAgIGZvcihsZXQga2V5IGluIG9wdGlvbmFsKXtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbmFsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIGtleSwgb3B0aW9uYWxba2V5XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvcihsZXQga2V5IGluIGV4dHJhUXVlcnlQYXJhbXMpe1xyXG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBrZXksIGV4dHJhUXVlcnlQYXJhbXNba2V5XSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc09pZGMocmVzcG9uc2VfdHlwZSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSByZXNwb25zZV90eXBlLnNwbGl0KC9cXHMrL2cpLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtID09PSBcImlkX3Rva2VuXCI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICEhKHJlc3VsdFswXSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzT0F1dGgocmVzcG9uc2VfdHlwZSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSByZXNwb25zZV90eXBlLnNwbGl0KC9cXHMrL2cpLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtID09PSBcInRva2VuXCI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICEhKHJlc3VsdFswXSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBpc0NvZGUocmVzcG9uc2VfdHlwZSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSByZXNwb25zZV90eXBlLnNwbGl0KC9cXHMrL2cpLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtID09PSBcImNvZGVcIjtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gISEocmVzdWx0WzBdKTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBVcmxVdGlsaXR5IH0gZnJvbSAnLi9VcmxVdGlsaXR5LmpzJztcclxuXHJcbmNvbnN0IE9pZGNTY29wZSA9IFwib3BlbmlkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2lnbmluUmVzcG9uc2Uge1xyXG4gICAgY29uc3RydWN0b3IodXJsLCBkZWxpbWl0ZXIgPSBcIiNcIikge1xyXG5cclxuICAgICAgICB2YXIgdmFsdWVzID0gVXJsVXRpbGl0eS5wYXJzZVVybEZyYWdtZW50KHVybCwgZGVsaW1pdGVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5lcnJvciA9IHZhbHVlcy5lcnJvcjtcclxuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gdmFsdWVzLmVycm9yX2Rlc2NyaXB0aW9uO1xyXG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gdmFsdWVzLmVycm9yX3VyaTtcclxuXHJcbiAgICAgICAgdGhpcy5jb2RlID0gdmFsdWVzLmNvZGU7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlcy5zdGF0ZTtcclxuICAgICAgICB0aGlzLmlkX3Rva2VuID0gdmFsdWVzLmlkX3Rva2VuO1xyXG4gICAgICAgIHRoaXMuc2Vzc2lvbl9zdGF0ZSA9IHZhbHVlcy5zZXNzaW9uX3N0YXRlO1xyXG4gICAgICAgIHRoaXMuYWNjZXNzX3Rva2VuID0gdmFsdWVzLmFjY2Vzc190b2tlbjtcclxuICAgICAgICB0aGlzLnRva2VuX3R5cGUgPSB2YWx1ZXMudG9rZW5fdHlwZTtcclxuICAgICAgICB0aGlzLnNjb3BlID0gdmFsdWVzLnNjb3BlO1xyXG4gICAgICAgIHRoaXMucHJvZmlsZSA9IHVuZGVmaW5lZDsgLy8gd2lsbCBiZSBzZXQgZnJvbSBSZXNwb25zZVZhbGlkYXRvclxyXG5cclxuICAgICAgICB0aGlzLmV4cGlyZXNfaW4gPSB2YWx1ZXMuZXhwaXJlc19pbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZXhwaXJlc19pbigpIHtcclxuICAgICAgICBpZiAodGhpcy5leHBpcmVzX2F0KSB7XHJcbiAgICAgICAgICAgIGxldCBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGlyZXNfYXQgLSBub3c7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBzZXQgZXhwaXJlc19pbih2YWx1ZSl7XHJcbiAgICAgICAgbGV0IGV4cGlyZXNfaW4gPSBwYXJzZUludCh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBleHBpcmVzX2luID09PSAnbnVtYmVyJyAmJiBleHBpcmVzX2luID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgICAgICB0aGlzLmV4cGlyZXNfYXQgPSBub3cgKyBleHBpcmVzX2luO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZXhwaXJlZCgpIHtcclxuICAgICAgICBsZXQgZXhwaXJlc19pbiA9IHRoaXMuZXhwaXJlc19pbjtcclxuICAgICAgICBpZiAoZXhwaXJlc19pbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBleHBpcmVzX2luIDw9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNjb3BlcygpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuc2NvcGUgfHwgXCJcIikuc3BsaXQoXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc09wZW5JZENvbm5lY3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVzLmluZGV4T2YoT2lkY1Njb3BlKSA+PSAwIHx8ICEhdGhpcy5pZF90b2tlbjtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IFN0YXRlIH0gZnJvbSAnLi9TdGF0ZS5qcyc7XHJcbmltcG9ydCB7IEpvc2VVdGlsIH0gZnJvbSAnLi9Kb3NlVXRpbC5qcyc7XHJcbmltcG9ydCByYW5kb20gZnJvbSAnLi9yYW5kb20uanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNpZ25pblN0YXRlIGV4dGVuZHMgU3RhdGUge1xyXG4gICAgY29uc3RydWN0b3Ioe25vbmNlLCBhdXRob3JpdHksIGNsaWVudF9pZCwgcmVkaXJlY3RfdXJpLCBjb2RlX3ZlcmlmaWVyfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIoYXJndW1lbnRzWzBdKTtcclxuXHJcbiAgICAgICAgaWYgKG5vbmNlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gcmFuZG9tKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vbmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gbm9uY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29kZV92ZXJpZmllciA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAvLyByYW5kb20oKSBwcm9kdWNlcyAzMiBsZW5ndGhcclxuICAgICAgICAgICAgdGhpcy5fY29kZV92ZXJpZmllciA9IHJhbmRvbSgpICsgcmFuZG9tKCkgKyByYW5kb20oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29kZV92ZXJpZmllcikge1xyXG4gICAgICAgICAgICB0aGlzLl9jb2RlX3ZlcmlmaWVyID0gY29kZV92ZXJpZmllcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuY29kZV92ZXJpZmllcikge1xyXG4gICAgICAgICAgICBsZXQgaGFzaCA9IEpvc2VVdGlsLmhhc2hTdHJpbmcodGhpcy5jb2RlX3ZlcmlmaWVyLCBcIlNIQTI1NlwiKTtcclxuICAgICAgICAgICAgdGhpcy5fY29kZV9jaGFsbGVuZ2UgPSBKb3NlVXRpbC5oZXhUb0Jhc2U2NFVybChoYXNoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9hdXRob3JpdHkgPSBhdXRob3JpdHk7XHJcbiAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gY2xpZW50X2lkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBub25jZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm9uY2U7XHJcbiAgICB9XHJcbiAgICBnZXQgYXV0aG9yaXR5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRob3JpdHk7XHJcbiAgICB9XHJcbiAgICBnZXQgY2xpZW50X2lkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRfaWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgcmVkaXJlY3RfdXJpKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdF91cmk7XHJcbiAgICB9XHJcbiAgICBnZXQgY29kZV92ZXJpZmllcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29kZV92ZXJpZmllcjtcclxuICAgIH1cclxuICAgIGdldCBjb2RlX2NoYWxsZW5nZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29kZV9jaGFsbGVuZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgdG9TdG9yYWdlU3RyaW5nKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlNpZ25pblN0YXRlLnRvU3RvcmFnZVN0cmluZ1wiKTtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxyXG4gICAgICAgICAgICBjcmVhdGVkOiB0aGlzLmNyZWF0ZWQsXHJcbiAgICAgICAgICAgIG5vbmNlOiB0aGlzLm5vbmNlLFxyXG4gICAgICAgICAgICBjb2RlX3ZlcmlmaWVyOiB0aGlzLmNvZGVfdmVyaWZpZXIsXHJcbiAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogdGhpcy5yZWRpcmVjdF91cmksXHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogdGhpcy5hdXRob3JpdHksXHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRfaWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlNpZ25pblN0YXRlLmZyb21TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzdG9yYWdlU3RyaW5nKTtcclxuICAgICAgICByZXR1cm4gbmV3IFNpZ25pblN0YXRlKGRhdGEpO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgVXJsVXRpbGl0eSB9IGZyb20gJy4vVXJsVXRpbGl0eS5qcyc7XHJcbmltcG9ydCB7IFN0YXRlIH0gZnJvbSAnLi9TdGF0ZS5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgU2lnbm91dFJlcXVlc3Qge1xyXG4gICAgY29uc3RydWN0b3Ioe3VybCwgaWRfdG9rZW5faGludCwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLCBkYXRhLCBleHRyYVF1ZXJ5UGFyYW1zfSkge1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNpZ25vdXRSZXF1ZXN0LmN0b3I6IE5vIHVybCBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZF90b2tlbl9oaW50KSB7XHJcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiaWRfdG9rZW5faGludFwiLCBpZF90b2tlbl9oaW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpIHtcclxuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmlcIiwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKHsgZGF0YSB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInN0YXRlXCIsIHRoaXMuc3RhdGUuaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IobGV0IGtleSBpbiBleHRyYVF1ZXJ5UGFyYW1zKXtcclxuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwga2V5LCBleHRyYVF1ZXJ5UGFyYW1zW2tleV0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVybCA9IHVybDtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBVcmxVdGlsaXR5IH0gZnJvbSAnLi9VcmxVdGlsaXR5LmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTaWdub3V0UmVzcG9uc2Uge1xyXG4gICAgY29uc3RydWN0b3IodXJsKSB7XHJcblxyXG4gICAgICAgIHZhciB2YWx1ZXMgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBcIj9cIik7XHJcblxyXG4gICAgICAgIHRoaXMuZXJyb3IgPSB2YWx1ZXMuZXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IHZhbHVlcy5lcnJvcl9kZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB2YWx1ZXMuc3RhdGU7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNpbGVudFJlbmV3U2VydmljZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IodXNlck1hbmFnZXIpIHtcclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlciA9IHVzZXJNYW5hZ2VyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSB0aGlzLl90b2tlbkV4cGlyaW5nLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5hZGRBY2Nlc3NUb2tlbkV4cGlyaW5nKHRoaXMuX2NhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCB0cmlnZ2VyIGxvYWRpbmcgb2YgdGhlIHVzZXIgc28gdGhlIGV4cGlyaW5nIGV2ZW50cyBjYW4gYmUgaW5pdGlhbGl6ZWRcclxuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZ2V0VXNlcigpLnRoZW4odXNlcj0+e1xyXG4gICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZSBub3BcclxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyPT57XHJcbiAgICAgICAgICAgICAgICAvLyBjYXRjaCB0byBzdXBwcmVzcyBlcnJvcnMgc2luY2Ugd2UncmUgaW4gYSBjdG9yXHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJTaWxlbnRSZW5ld1NlcnZpY2Uuc3RhcnQ6IEVycm9yIGZyb20gZ2V0VXNlcjpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLnJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJpbmcodGhpcy5fY2FsbGJhY2spO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2s7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF90b2tlbkV4cGlyaW5nKCkge1xyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLnNpZ25pblNpbGVudCgpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNpbGVudFJlbmV3U2VydmljZS5fdG9rZW5FeHBpcmluZzogU2lsZW50IHRva2VuIHJlbmV3YWwgc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTaWxlbnRSZW5ld1NlcnZpY2UuX3Rva2VuRXhwaXJpbmc6IEVycm9yIGZyb20gc2lnbmluU2lsZW50OlwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5fcmFpc2VTaWxlbnRSZW5ld0Vycm9yKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgcmFuZG9tIGZyb20gJy4vcmFuZG9tLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTdGF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7aWQsIGRhdGEsIGNyZWF0ZWR9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9pZCA9IGlkIHx8IHJhbmRvbSgpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGNyZWF0ZWQgPT09ICdudW1iZXInICYmIGNyZWF0ZWQgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZWQgPSBjcmVhdGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlZCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcclxuICAgIH1cclxuICAgIGdldCBkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNyZWF0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgdG9TdG9yYWdlU3RyaW5nKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN0YXRlLnRvU3RvcmFnZVN0cmluZ1wiKTtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxyXG4gICAgICAgICAgICBjcmVhdGVkOiB0aGlzLmNyZWF0ZWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN0YXRlLmZyb21TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgU3RhdGUoSlNPTi5wYXJzZShzdG9yYWdlU3RyaW5nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNsZWFyU3RhbGVTdGF0ZShzdG9yYWdlLCBhZ2UpIHtcclxuXHJcbiAgICAgICAgdmFyIGN1dG9mZiA9IERhdGUubm93KCkgLyAxMDAwIC0gYWdlO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RvcmFnZS5nZXRBbGxLZXlzKCkudGhlbihrZXlzID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiU3RhdGUuY2xlYXJTdGFsZVN0YXRlOiBnb3Qga2V5c1wiLCBrZXlzKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBrZXlzW2ldO1xyXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBzdG9yYWdlLmdldChrZXkpLnRoZW4oaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW92ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmcoaXRlbSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5jbGVhclN0YWxlU3RhdGU6IGdvdCBpdGVtIGZyb20ga2V5OiBcIiwga2V5LCBzdGF0ZS5jcmVhdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuY3JlYXRlZCA8PSBjdXRvZmYpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJTdGF0ZS5jbGVhclN0YWxlU3RhdGU6IEVycm9yIHBhcnNpbmcgc3RhdGUgZm9yIGtleVwiLCBrZXksIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5jbGVhclN0YWxlU3RhdGU6IG5vIGl0ZW0gaW4gc3RvcmFnZSBmb3Iga2V5OiBcIiwga2V5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU3RhdGUuY2xlYXJTdGFsZVN0YXRlOiByZW1vdmVkIGl0ZW0gZm9yIGtleTogXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlN0YXRlLmNsZWFyU3RhbGVTdGF0ZTogd2FpdGluZyBvbiBwcm9taXNlIGNvdW50OlwiLCBwcm9taXNlcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi9HbG9iYWwuanMnO1xyXG5pbXBvcnQgeyBFdmVudCB9IGZyb20gJy4vRXZlbnQuanMnO1xyXG5cclxuY29uc3QgVGltZXJEdXJhdGlvbiA9IDU7IC8vIHNlY29uZHNcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lciBleHRlbmRzIEV2ZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB0aW1lciA9IEdsb2JhbC50aW1lciwgbm93RnVuYyA9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgICAgIHRoaXMuX3RpbWVyID0gdGltZXI7XHJcblxyXG4gICAgICAgIGlmIChub3dGdW5jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd0Z1bmMgPSBub3dGdW5jO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbm93RnVuYyA9ICgpID0+IERhdGUubm93KCkgLyAxMDAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm93KCkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLl9ub3dGdW5jKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoZHVyYXRpb24pIHtcclxuICAgICAgICBpZiAoZHVyYXRpb24gPD0gMCkge1xyXG4gICAgICAgICAgICBkdXJhdGlvbiA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGR1cmF0aW9uID0gcGFyc2VJbnQoZHVyYXRpb24pO1xyXG5cclxuICAgICAgICB2YXIgZXhwaXJhdGlvbiA9IHRoaXMubm93ICsgZHVyYXRpb247XHJcbiAgICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvbiA9PT0gZXhwaXJhdGlvbiAmJiB0aGlzLl90aW1lckhhbmRsZSkge1xyXG4gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHJlaW5pdGlhbGl6ZSB0byBzYW1lIGV4cGlyYXRpb24sIHNvIGJhaWwgb3V0XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlRpbWVyLmluaXQgdGltZXIgXCIgKyB0aGlzLl9uYW1lICsgXCIgc2tpcHBpbmcgaW5pdGlhbGl6YXRpb24gc2luY2UgYWxyZWFkeSBpbml0aWFsaXplZCBmb3IgZXhwaXJhdGlvbjpcIiwgdGhpcy5leHBpcmF0aW9uKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jYW5jZWwoKTtcclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVGltZXIuaW5pdCB0aW1lciBcIiArIHRoaXMuX25hbWUgKyBcIiBmb3IgZHVyYXRpb246XCIsIGR1cmF0aW9uKTtcclxuICAgICAgICB0aGlzLl9leHBpcmF0aW9uID0gZXhwaXJhdGlvbjtcclxuXHJcbiAgICAgICAgLy8gd2UncmUgdXNpbmcgYSBmYWlybHkgc2hvcnQgdGltZXIgYW5kIHRoZW4gY2hlY2tpbmcgdGhlIGV4cGlyYXRpb24gaW4gdGhlXHJcbiAgICAgICAgLy8gY2FsbGJhY2sgdG8gaGFuZGxlIHNjZW5hcmlvcyB3aGVyZSB0aGUgYnJvd3NlciBkZXZpY2Ugc2xlZXBzLCBhbmQgdGhlblxyXG4gICAgICAgIC8vIHRoZSB0aW1lcnMgZW5kIHVwIGdldHRpbmcgZGVsYXllZC5cclxuICAgICAgICB2YXIgdGltZXJEdXJhdGlvbiA9IFRpbWVyRHVyYXRpb247XHJcbiAgICAgICAgaWYgKGR1cmF0aW9uIDwgdGltZXJEdXJhdGlvbikge1xyXG4gICAgICAgICAgICB0aW1lckR1cmF0aW9uID0gZHVyYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gdGhpcy5fdGltZXIuc2V0SW50ZXJ2YWwodGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSwgdGltZXJEdXJhdGlvbiAqIDEwMDApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgZXhwaXJhdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZXhwaXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBjYW5jZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVySGFuZGxlKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlRpbWVyLmNhbmNlbDogXCIsIHRoaXMuX25hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lci5jbGVhckludGVydmFsKHRoaXMuX3RpbWVySGFuZGxlKTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZXJIYW5kbGUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfY2FsbGJhY2soKSB7XHJcbiAgICAgICAgdmFyIGRpZmYgPSB0aGlzLl9leHBpcmF0aW9uIC0gdGhpcy5ub3c7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVGltZXIuY2FsbGJhY2s7IFwiICsgdGhpcy5fbmFtZSArIFwiIHRpbWVyIGV4cGlyZXMgaW46XCIsIGRpZmYpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZXhwaXJhdGlvbiA8PSB0aGlzLm5vdykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICBzdXBlci5yYWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBKc29uU2VydmljZSB9IGZyb20gJy4vSnNvblNlcnZpY2UuanMnO1xyXG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuL01ldGFkYXRhU2VydmljZS5qcyc7XHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBUb2tlbkNsaWVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlRva2VuQ2xpZW50LmN0b3I6IE5vIHNldHRpbmdzIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0dGluZ3NcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xyXG4gICAgICAgIHRoaXMuX2pzb25TZXJ2aWNlID0gbmV3IEpzb25TZXJ2aWNlQ3RvcigpO1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBleGNoYW5nZUNvZGUoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgYXJncy5ncmFudF90eXBlID0gYXJncy5ncmFudF90eXBlIHx8IFwiYXV0aG9yaXphdGlvbl9jb2RlXCI7XHJcbiAgICAgICAgYXJncy5jbGllbnRfaWQgPSBhcmdzLmNsaWVudF9pZCB8fCB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIGlmICghYXJncy5jb2RlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlRva2VuQ2xpZW50LmV4Y2hhbmdlQ29kZTogTm8gY29kZSBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJBIGNvZGUgaXMgcmVxdWlyZWRcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFyZ3MucmVkaXJlY3RfdXJpKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlRva2VuQ2xpZW50LmV4Y2hhbmdlQ29kZTogTm8gcmVkaXJlY3RfdXJpIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgcmVkaXJlY3RfdXJpIGlzIHJlcXVpcmVkXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhcmdzLmNvZGVfdmVyaWZpZXIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVG9rZW5DbGllbnQuZXhjaGFuZ2VDb2RlOiBObyBjb2RlX3ZlcmlmaWVyIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgY29kZV92ZXJpZmllciBpcyByZXF1aXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghYXJncy5jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVG9rZW5DbGllbnQuZXhjaGFuZ2VDb2RlOiBObyBjbGllbnRfaWQgcGFzc2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQSBjbGllbnRfaWQgaXMgcmVxdWlyZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRUb2tlbkVuZHBvaW50KGZhbHNlKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlRva2VuQ2xpZW50LmV4Y2hhbmdlQ29kZTogUmVjZWl2ZWQgdG9rZW4gZW5kcG9pbnRcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UucG9zdEZvcm0odXJsLCBhcmdzKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlRva2VuQ2xpZW50LmV4Y2hhbmdlQ29kZTogcmVzcG9uc2UgcmVjZWl2ZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGV4Y2hhbmdlUmVmcmVzaFRva2VuKGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIGFyZ3MuZ3JhbnRfdHlwZSA9IGFyZ3MuZ3JhbnRfdHlwZSB8fCBcInJlZnJlc2hfdG9rZW5cIjtcclxuICAgICAgICBhcmdzLmNsaWVudF9pZCA9IGFyZ3MuY2xpZW50X2lkIHx8IHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcclxuXHJcbiAgICAgICAgaWYgKCFhcmdzLnJlZnJlc2hfdG9rZW4pIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVG9rZW5DbGllbnQuZXhjaGFuZ2VSZWZyZXNoVG9rZW46IE5vIHJlZnJlc2hfdG9rZW4gcGFzc2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQSByZWZyZXNoX3Rva2VuIGlzIHJlcXVpcmVkXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhcmdzLmNsaWVudF9pZCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJUb2tlbkNsaWVudC5leGNoYW5nZVJlZnJlc2hUb2tlbjogTm8gY2xpZW50X2lkIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgY2xpZW50X2lkIGlzIHJlcXVpcmVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0VG9rZW5FbmRwb2ludChmYWxzZSkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJUb2tlbkNsaWVudC5leGNoYW5nZVJlZnJlc2hUb2tlbjogUmVjZWl2ZWQgdG9rZW4gZW5kcG9pbnRcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UucG9zdEZvcm0odXJsLCBhcmdzKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlRva2VuQ2xpZW50LmV4Y2hhbmdlUmVmcmVzaFRva2VuOiByZXNwb25zZSByZWNlaXZlZFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuL01ldGFkYXRhU2VydmljZS5qcyc7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4vR2xvYmFsLmpzJztcclxuXHJcbmNvbnN0IEFjY2Vzc1Rva2VuVHlwZUhpbnQgPSBcImFjY2Vzc190b2tlblwiO1xyXG5jb25zdCBSZWZyZXNoVG9rZW5UeXBlSGludCA9IFwicmVmcmVzaF90b2tlblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRva2VuUmV2b2NhdGlvbkNsaWVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgWE1MSHR0cFJlcXVlc3RDdG9yID0gR2xvYmFsLlhNTEh0dHBSZXF1ZXN0LCBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlKSB7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJUb2tlblJldm9jYXRpb25DbGllbnQuY3RvcjogTm8gc2V0dGluZ3MgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNldHRpbmdzIHByb3ZpZGVkLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5fWE1MSHR0cFJlcXVlc3RDdG9yID0gWE1MSHR0cFJlcXVlc3RDdG9yO1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXZva2UodG9rZW4sIHJlcXVpcmVkLCB0eXBlID0gXCJhY2Nlc3NfdG9rZW5cIikge1xyXG4gICAgICAgIGlmICghdG9rZW4pIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZTogTm8gdG9rZW4gcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHRva2VuIHByb3ZpZGVkLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlICE9PSBBY2Nlc3NUb2tlblR5cGVIaW50ICYmIHR5cGUgIT0gUmVmcmVzaFRva2VuVHlwZUhpbnQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZTogSW52YWxpZCB0b2tlbiB0eXBlXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRva2VuIHR5cGUuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRSZXZvY2F0aW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJUb2tlblJldm9jYXRpb25DbGllbnQucmV2b2tlOiBSZXZvY2F0aW9uIG5vdCBzdXBwb3J0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmV2b2NhdGlvbiBub3Qgc3VwcG9ydGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIG5vdCByZXF1aXJlZCwgc28gZG9uJ3QgZXJyb3IgYW5kIGp1c3QgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlRva2VuUmV2b2NhdGlvbkNsaWVudC5yZXZva2U6IFJldm9raW5nIFwiICsgdHlwZSk7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnRfc2VjcmV0ID0gdGhpcy5fc2V0dGluZ3MuY2xpZW50X3NlY3JldDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jldm9rZSh1cmwsIGNsaWVudF9pZCwgY2xpZW50X3NlY3JldCwgdG9rZW4sIHR5cGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9yZXZva2UodXJsLCBjbGllbnRfaWQsIGNsaWVudF9zZWNyZXQsIHRva2VuLCB0eXBlKSB7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB2YXIgeGhyID0gbmV3IHRoaXMuX1hNTEh0dHBSZXF1ZXN0Q3RvcigpO1xyXG4gICAgICAgICAgICB4aHIub3BlbihcIlBPU1RcIiwgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJUb2tlblJldm9jYXRpb25DbGllbnQucmV2b2tlOiBIVFRQIHJlc3BvbnNlIHJlY2VpdmVkLCBzdGF0dXNcIiwgeGhyLnN0YXR1cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcih4aHIuc3RhdHVzVGV4dCArIFwiIChcIiArIHhoci5zdGF0dXMgKyBcIilcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHsgXHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJUb2tlblJldm9jYXRpb25DbGllbnQucmV2b2tlOiBOZXR3b3JrIEVycm9yLlwiKVxyXG4gICAgICAgICAgICAgICAgcmVqZWN0KFwiTmV0d29yayBFcnJvclwiKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHZhciBib2R5ID0gXCJjbGllbnRfaWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoY2xpZW50X2lkKTtcclxuICAgICAgICAgICAgaWYgKGNsaWVudF9zZWNyZXQpIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgKz0gXCImY2xpZW50X3NlY3JldD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChjbGllbnRfc2VjcmV0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBib2R5ICs9IFwiJnRva2VuX3R5cGVfaGludD1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0eXBlKTtcclxuICAgICAgICAgICAgYm9keSArPSBcIiZ0b2tlbj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0b2tlbik7XHJcblxyXG4gICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcclxuICAgICAgICAgICAgeGhyLnNlbmQoYm9keSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tICcuL0dsb2JhbC5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgVXJsVXRpbGl0eSB7XHJcbiAgICBzdGF0aWMgYWRkUXVlcnlQYXJhbSh1cmwsIG5hbWUsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgPCAwKSB7XHJcbiAgICAgICAgICAgIHVybCArPSBcIj9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSBcIj9cIikge1xyXG4gICAgICAgICAgICB1cmwgKz0gXCImXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB1cmwgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpO1xyXG4gICAgICAgIHVybCArPSBcIj1cIjtcclxuICAgICAgICB1cmwgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHVybDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcGFyc2VVcmxGcmFnbWVudCh2YWx1ZSwgZGVsaW1pdGVyID0gXCIjXCIsIGdsb2JhbCA9IEdsb2JhbCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKXtcclxuICAgICAgICAgICAgdmFsdWUgPSBnbG9iYWwubG9jYXRpb24uaHJlZjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpZHggPSB2YWx1ZS5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xyXG4gICAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cihpZHggKyAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkZWxpbWl0ZXIgPT09IFwiP1wiKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGRvaW5nIHF1ZXJ5LCB0aGVuIHN0cmlwIG9mZiBoYXNoIGZyYWdtZW50IGJlZm9yZSB3ZSBwYXJzZVxyXG4gICAgICAgICAgICBpZHggPSB2YWx1ZS5pbmRleE9mKCcjJyk7XHJcbiAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHIoMCwgaWR4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBhcmFtcyA9IHt9LFxyXG4gICAgICAgICAgICByZWdleCA9IC8oW14mPV0rKT0oW14mXSopL2csXHJcbiAgICAgICAgICAgIG07XHJcblxyXG4gICAgICAgIHZhciBjb3VudGVyID0gMDtcclxuICAgICAgICB3aGlsZSAobSA9IHJlZ2V4LmV4ZWModmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobVsxXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KG1bMl0pO1xyXG4gICAgICAgICAgICBpZiAoY291bnRlcisrID4gNTApIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudDogcmVzcG9uc2UgZXhjZWVkZWQgZXhwZWN0ZWQgbnVtYmVyIG9mIHBhcmFtZXRlcnNcIiwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogXCJSZXNwb25zZSBleGNlZWRlZCBleHBlY3RlZCBudW1iZXIgb2YgcGFyYW1ldGVyc1wiXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBwcm9wIGluIHBhcmFtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBVc2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKHtpZF90b2tlbiwgc2Vzc2lvbl9zdGF0ZSwgYWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCB0b2tlbl90eXBlLCBzY29wZSwgcHJvZmlsZSwgZXhwaXJlc19hdCwgc3RhdGV9KSB7XHJcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IGlkX3Rva2VuO1xyXG4gICAgICAgIHRoaXMuc2Vzc2lvbl9zdGF0ZSA9IHNlc3Npb25fc3RhdGU7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NfdG9rZW4gPSBhY2Nlc3NfdG9rZW47XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoX3Rva2VuID0gcmVmcmVzaF90b2tlbjtcclxuICAgICAgICB0aGlzLnRva2VuX3R5cGUgPSB0b2tlbl90eXBlO1xyXG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcclxuICAgICAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlO1xyXG4gICAgICAgIHRoaXMuZXhwaXJlc19hdCA9IGV4cGlyZXNfYXQ7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBleHBpcmVzX2luKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmV4cGlyZXNfYXQpIHtcclxuICAgICAgICAgICAgbGV0IG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwaXJlc19hdCAtIG5vdztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHNldCBleHBpcmVzX2luKHZhbHVlKSB7XHJcbiAgICAgICAgbGV0IGV4cGlyZXNfaW4gPSBwYXJzZUludCh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBleHBpcmVzX2luID09PSAnbnVtYmVyJyAmJiBleHBpcmVzX2luID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgICAgICB0aGlzLmV4cGlyZXNfYXQgPSBub3cgKyBleHBpcmVzX2luO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZXhwaXJlZCgpIHtcclxuICAgICAgICBsZXQgZXhwaXJlc19pbiA9IHRoaXMuZXhwaXJlc19pbjtcclxuICAgICAgICBpZiAoZXhwaXJlc19pbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBleHBpcmVzX2luIDw9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNjb3BlcygpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuc2NvcGUgfHwgXCJcIikuc3BsaXQoXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvU3RvcmFnZVN0cmluZygpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyLnRvU3RvcmFnZVN0cmluZ1wiKTtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBpZF90b2tlbjogdGhpcy5pZF90b2tlbixcclxuICAgICAgICAgICAgc2Vzc2lvbl9zdGF0ZTogdGhpcy5zZXNzaW9uX3N0YXRlLFxyXG4gICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHRoaXMuYWNjZXNzX3Rva2VuLFxyXG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiB0aGlzLnJlZnJlc2hfdG9rZW4sXHJcbiAgICAgICAgICAgIHRva2VuX3R5cGU6IHRoaXMudG9rZW5fdHlwZSxcclxuICAgICAgICAgICAgc2NvcGU6IHRoaXMuc2NvcGUsXHJcbiAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcclxuICAgICAgICAgICAgZXhwaXJlc19hdDogdGhpcy5leHBpcmVzX2F0XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZyb21TdG9yYWdlU3RyaW5nKHN0b3JhZ2VTdHJpbmcpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyLmZyb21TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVXNlcihKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpKTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBKc29uU2VydmljZSB9IGZyb20gJy4vSnNvblNlcnZpY2UuanMnO1xyXG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuL01ldGFkYXRhU2VydmljZS5qcyc7XHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgSm9zZVV0aWwgfSBmcm9tICcuL0pvc2VVdGlsLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBVc2VySW5mb1NlcnZpY2Uge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgc2V0dGluZ3MsIFxyXG4gICAgICAgIEpzb25TZXJ2aWNlQ3RvciA9IEpzb25TZXJ2aWNlLCBcclxuICAgICAgICBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlLCBcclxuICAgICAgICBqb3NlVXRpbCA9IEpvc2VVdGlsXHJcbiAgICApIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJJbmZvU2VydmljZS5jdG9yOiBObyBzZXR0aW5ncyBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9qc29uU2VydmljZSA9IG5ldyBKc29uU2VydmljZUN0b3IodW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMuX2dldENsYWltc0Zyb21Kd3QuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX2pvc2VVdGlsID0gam9zZVV0aWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2xhaW1zKHRva2VuKSB7XHJcbiAgICAgICAgaWYgKCF0b2tlbikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VySW5mb1NlcnZpY2UuZ2V0Q2xhaW1zOiBObyB0b2tlbiBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJBIHRva2VuIGlzIHJlcXVpcmVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0VXNlckluZm9FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlckluZm9TZXJ2aWNlLmdldENsYWltczogcmVjZWl2ZWQgdXNlcmluZm8gdXJsXCIsIHVybCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbih1cmwsIHRva2VuKS50aGVuKGNsYWltcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VySW5mb1NlcnZpY2UuZ2V0Q2xhaW1zOiBjbGFpbXMgcmVjZWl2ZWRcIiwgY2xhaW1zKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFpbXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRDbGFpbXNGcm9tSnd0KHJlcSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXEucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIgfHwgIWp3dC5wYXlsb2FkKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VySW5mb1NlcnZpY2UuX2dldENsYWltc0Zyb21Kd3Q6IEZhaWxlZCB0byBwYXJzZSBKV1RcIiwgand0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgaWRfdG9rZW5cIikpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIga2lkID0gand0LmhlYWRlci5raWQ7XHJcblxyXG4gICAgICAgICAgICBsZXQgaXNzdWVyUHJvbWlzZTtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLl9zZXR0aW5ncy51c2VySW5mb0p3dElzc3Vlcikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnT1AnOlxyXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlclByb21pc2UgPSB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0SXNzdWVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdBTlknOlxyXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlclByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoand0LnBheWxvYWQuaXNzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVyUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy51c2VySW5mb0p3dElzc3Vlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpc3N1ZXJQcm9taXNlLnRoZW4oaXNzdWVyID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJJbmZvU2VydmljZS5fZ2V0Q2xhaW1zRnJvbUp3dDogUmVjZWl2ZWQgaXNzdWVyOlwiICsgaXNzdWVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzKCkudGhlbihrZXlzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWtleXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlckluZm9TZXJ2aWNlLl9nZXRDbGFpbXNGcm9tSnd0OiBObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpZ25pbmcga2V5cyBmcm9tIG1ldGFkYXRhXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJJbmZvU2VydmljZS5fZ2V0Q2xhaW1zRnJvbUp3dDogUmVjZWl2ZWQgc2lnbmluZyBrZXlzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFraWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IHRoaXMuX2ZpbHRlckJ5QWxnKGtleXMsIGp3dC5oZWFkZXIuYWxnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJJbmZvU2VydmljZS5fZ2V0Q2xhaW1zRnJvbUp3dDogTm8ga2lkIGZvdW5kIGluIGlkX3Rva2VuIGFuZCBtb3JlIHRoYW4gb25lIGtleSBmb3VuZCBpbiBtZXRhZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBraWQgZm91bmQgaW4gaWRfdG9rZW4gYW5kIG1vcmUgdGhhbiBvbmUga2V5IGZvdW5kIGluIG1ldGFkYXRhXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpZCBpcyBtYW5kYXRvcnkgb25seSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBrZXlzIGluIHRoZSByZWZlcmVuY2VkIEpXSyBTZXQgZG9jdW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1NpZ25pbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXMuZmlsdGVyKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmtpZCA9PT0ga2lkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVswXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJJbmZvU2VydmljZS5fZ2V0Q2xhaW1zRnJvbUp3dDogTm8ga2V5IG1hdGNoaW5nIGtpZCBvciBhbGcgZm91bmQgaW4gc2lnbmluZyBrZXlzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8ga2V5IG1hdGNoaW5nIGtpZCBvciBhbGcgZm91bmQgaW4gc2lnbmluZyBrZXlzXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhdWRpZW5jZSA9IHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsb2NrU2tld0luU2Vjb25kcyA9IHRoaXMuX3NldHRpbmdzLmNsb2NrU2tldztcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VySW5mb1NlcnZpY2UuX2dldENsYWltc0Zyb21Kd3Q6IFZhbGlkYWluZyBKV1Q7IHVzaW5nIGNsb2NrIHNrZXcgKGluIHNlY29uZHMpIG9mOiBcIiwgY2xvY2tTa2V3SW5TZWNvbmRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pvc2VVdGlsLnZhbGlkYXRlSnd0KHJlcS5yZXNwb25zZVRleHQsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3SW5TZWNvbmRzLCB1bmRlZmluZWQsIHRydWUpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VySW5mb1NlcnZpY2UuX2dldENsYWltc0Zyb21Kd3Q6IEpXVCB2YWxpZGF0aW9uIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqd3QucGF5bG9hZDtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VySW5mb1NlcnZpY2UuX2dldENsYWltc0Zyb21Kd3Q6IEVycm9yIHBhcnNpbmcgSldUIHJlc3BvbnNlXCIsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfZmlsdGVyQnlBbGcoa2V5cywgYWxnKSB7XHJcbiAgICAgICAgdmFyIGt0eSA9IG51bGw7XHJcbiAgICAgICAgaWYgKGFsZy5zdGFydHNXaXRoKFwiUlNcIikpIHtcclxuICAgICAgICAgICAga3R5ID0gXCJSU0FcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJQU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIlBTXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGFsZy5zdGFydHNXaXRoKFwiRVNcIikpIHtcclxuICAgICAgICAgICAga3R5ID0gXCJFQ1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlckluZm9TZXJ2aWNlLl9maWx0ZXJCeUFsZzogYWxnIG5vdCBzdXBwb3J0ZWQ6IFwiLCBhbGcpO1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VySW5mb1NlcnZpY2UuX2ZpbHRlckJ5QWxnOiBMb29raW5nIGZvciBrZXlzIHRoYXQgbWF0Y2gga3R5OiBcIiwga3R5KTtcclxuXHJcbiAgICAgICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXkua3R5ID09PSBrdHk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJJbmZvU2VydmljZS5fZmlsdGVyQnlBbGc6IE51bWJlciBvZiBrZXlzIHRoYXQgbWF0Y2gga3R5OiBcIiwga3R5LCBrZXlzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXlzO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vTG9nLmpzJztcclxuaW1wb3J0IHsgT2lkY0NsaWVudCB9IGZyb20gJy4vT2lkY0NsaWVudC5qcyc7XHJcbmltcG9ydCB7IFVzZXJNYW5hZ2VyU2V0dGluZ3MgfSBmcm9tICcuL1VzZXJNYW5hZ2VyU2V0dGluZ3MuanMnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi9Vc2VyLmpzJztcclxuaW1wb3J0IHsgVXNlck1hbmFnZXJFdmVudHMgfSBmcm9tICcuL1VzZXJNYW5hZ2VyRXZlbnRzLmpzJztcclxuaW1wb3J0IHsgU2lsZW50UmVuZXdTZXJ2aWNlIH0gZnJvbSAnLi9TaWxlbnRSZW5ld1NlcnZpY2UuanMnO1xyXG5pbXBvcnQgeyBTZXNzaW9uTW9uaXRvciB9IGZyb20gJy4vU2Vzc2lvbk1vbml0b3IuanMnO1xyXG5pbXBvcnQgeyBUb2tlblJldm9jYXRpb25DbGllbnQgfSBmcm9tICcuL1Rva2VuUmV2b2NhdGlvbkNsaWVudC5qcyc7XHJcbmltcG9ydCB7IFRva2VuQ2xpZW50IH0gZnJvbSAnLi9Ub2tlbkNsaWVudC5qcyc7XHJcbmltcG9ydCB7IEpvc2VVdGlsIH0gZnJvbSAnLi9Kb3NlVXRpbC5qcyc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VyIGV4dGVuZHMgT2lkY0NsaWVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncyA9IHt9LFxyXG4gICAgICAgIFNpbGVudFJlbmV3U2VydmljZUN0b3IgPSBTaWxlbnRSZW5ld1NlcnZpY2UsXHJcbiAgICAgICAgU2Vzc2lvbk1vbml0b3JDdG9yID0gU2Vzc2lvbk1vbml0b3IsXHJcbiAgICAgICAgVG9rZW5SZXZvY2F0aW9uQ2xpZW50Q3RvciA9IFRva2VuUmV2b2NhdGlvbkNsaWVudCxcclxuICAgICAgICBUb2tlbkNsaWVudEN0b3IgPSBUb2tlbkNsaWVudCxcclxuICAgICAgICBqb3NlVXRpbCA9IEpvc2VVdGlsXHJcbiAgICApIHtcclxuXHJcbiAgICAgICAgaWYgKCEoc2V0dGluZ3MgaW5zdGFuY2VvZiBVc2VyTWFuYWdlclNldHRpbmdzKSkge1xyXG4gICAgICAgICAgICBzZXR0aW5ncyA9IG5ldyBVc2VyTWFuYWdlclNldHRpbmdzKHNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIoc2V0dGluZ3MpO1xyXG5cclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgVXNlck1hbmFnZXJFdmVudHMoc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3U2VydmljZSA9IG5ldyBTaWxlbnRSZW5ld1NlcnZpY2VDdG9yKHRoaXMpO1xyXG5cclxuICAgICAgICAvLyBvcmRlciBpcyBpbXBvcnRhbnQgZm9yIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczsgdGhlc2Ugc2VydmljZXMgZGVwZW5kIHVwb24gdGhlIGV2ZW50cy5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5hdXRvbWF0aWNTaWxlbnRSZW5ldykge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5jdG9yOiBhdXRvbWF0aWNTaWxlbnRSZW5ldyBpcyBjb25maWd1cmVkLCBzZXR0aW5nIHVwIHNpbGVudCByZW5ld1wiKTtcclxuICAgICAgICAgICAgdGhpcy5zdGFydFNpbGVudFJlbmV3KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5tb25pdG9yU2Vzc2lvbikge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5jdG9yOiBtb25pdG9yU2Vzc2lvbiBpcyBjb25maWd1cmVkLCBzZXR0aW5nIHVwIHNlc3Npb24gbW9uaXRvclwiKTtcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbk1vbml0b3IgPSBuZXcgU2Vzc2lvbk1vbml0b3JDdG9yKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdG9rZW5SZXZvY2F0aW9uQ2xpZW50ID0gbmV3IFRva2VuUmV2b2NhdGlvbkNsaWVudEN0b3IodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX3Rva2VuQ2xpZW50ID0gbmV3IFRva2VuQ2xpZW50Q3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5fam9zZVV0aWwgPSBqb3NlVXRpbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgX3JlZGlyZWN0TmF2aWdhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnJlZGlyZWN0TmF2aWdhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9wb3B1cE5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5wb3B1cE5hdmlnYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBfaWZyYW1lTmF2aWdhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmlmcmFtZU5hdmlnYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBfdXNlclN0b3JlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnVzZXJTdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZXZlbnRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VXNlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFVzZXIoKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5nZXRVc2VyOiB1c2VyIGxvYWRlZFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMubG9hZCh1c2VyLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLmdldFVzZXI6IHVzZXIgbm90IGZvdW5kIGluIHN0b3JhZ2VcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVVzZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVVc2VyKG51bGwpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnJlbW92ZVVzZXI6IHVzZXIgcmVtb3ZlZCBmcm9tIHN0b3JhZ2VcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cy51bmxvYWQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaWduaW5SZWRpcmVjdChhcmdzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yKS50aGVuKCgpPT57XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUmVkaXJlY3Q6IHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWduaW5SZWRpcmVjdENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5FbmQodXJsIHx8IHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yLnVybCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLnN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUmVkaXJlY3RDYWxsYmFjazogc3VjY2Vzc2Z1bCwgc2lnbmVkIGluIHN1YjogXCIsIHVzZXIucHJvZmlsZS5zdWIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWduaW5SZWRpcmVjdENhbGxiYWNrOiBubyBzdWJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25pblBvcHVwKGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnBvcHVwX3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnJlZGlyZWN0X3VyaTtcclxuICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cDogTm8gcG9wdXBfcmVkaXJlY3RfdXJpIG9yIHJlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gcG9wdXBfcmVkaXJlY3RfdXJpIG9yIHJlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFyZ3MucmVkaXJlY3RfdXJpID0gdXJsO1xyXG4gICAgICAgIGFyZ3MuZGlzcGxheSA9IFwicG9wdXBcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbihhcmdzLCB0aGlzLl9wb3B1cE5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd0ZlYXR1cmVzOiBhcmdzLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cFdpbmRvd0ZlYXR1cmVzLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd1RhcmdldDogYXJncy5wb3B1cFdpbmRvd1RhcmdldCB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93VGFyZ2V0XHJcbiAgICAgICAgfSkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLnN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUG9wdXA6IHNpZ25pblBvcHVwIHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUG9wdXA6IG5vIHN1YlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWduaW5Qb3B1cENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5DYWxsYmFjayh1cmwsIHRoaXMuX3BvcHVwTmF2aWdhdG9yKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cENhbGxiYWNrOiBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwQ2FsbGJhY2s6IG5vIHN1YlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICAgICAgfSkuY2F0Y2goZXJyPT57XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwQ2FsbGJhY2sgZXJyb3I6IFwiICsgZXJyICYmIGVyci5tZXNzYWdlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaWduaW5TaWxlbnQoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgLy8gZmlyc3QgZGV0ZXJtaW5lIGlmIHdlIGhhdmUgYSByZWZyZXNoIHRva2VuLCBvciBuZWVkIHRvIHVzZSBpZnJhbWVcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFVzZXIoKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlciAmJiB1c2VyLnJlZnJlc2hfdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGFyZ3MucmVmcmVzaF90b2tlbiA9IHVzZXIucmVmcmVzaF90b2tlbjtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VSZWZyZXNoVG9rZW4oYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhcmdzLmlkX3Rva2VuX2hpbnQgPSBhcmdzLmlkX3Rva2VuX2hpbnQgfHwgKHRoaXMuc2V0dGluZ3MuaW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3ICYmIHVzZXIgJiYgdXNlci5pZF90b2tlbik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluU2lsZW50SWZyYW1lKGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3VzZVJlZnJlc2hUb2tlbihhcmdzID0ge30pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5DbGllbnQuZXhjaGFuZ2VSZWZyZXNoVG9rZW4oYXJncykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlck1hbmFnZXIuX3VzZVJlZnJlc2hUb2tlbjogTm8gcmVzcG9uc2UgcmV0dXJuZWQgZnJvbSB0b2tlbiBlbmRwb2ludFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIk5vIHJlc3BvbnNlIHJldHVybmVkIGZyb20gdG9rZW4gZW5kcG9pbnRcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFyZXN1bHQuYWNjZXNzX3Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VyTWFuYWdlci5fdXNlUmVmcmVzaFRva2VuOiBObyBhY2Nlc3MgdG9rZW4gcmV0dXJuZWQgZnJvbSB0b2tlbiBlbmRwb2ludFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIk5vIGFjY2VzcyB0b2tlbiByZXR1cm5lZCBmcm9tIHRva2VuIGVuZHBvaW50XCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFVzZXIoKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaWRUb2tlblZhbGlkYXRpb24gPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5WYWxpZGF0aW9uID0gdGhpcy5fdmFsaWRhdGVJZFRva2VuRnJvbVRva2VuUmVmcmVzaFRva2VuKHVzZXIucHJvZmlsZSwgcmVzdWx0LmlkX3Rva2VuKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZFRva2VuVmFsaWRhdGlvbi50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX3VzZVJlZnJlc2hUb2tlbjogcmVmcmVzaCB0b2tlbiByZXNwb25zZSBzdWNjZXNzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmFjY2Vzc190b2tlbiA9IHJlc3VsdC5hY2Nlc3NfdG9rZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIucmVmcmVzaF90b2tlbiA9IHJlc3VsdC5yZWZyZXNoX3Rva2VuIHx8IHVzZXIucmVmcmVzaF90b2tlbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5leHBpcmVzX2luID0gcmVzdWx0LmV4cGlyZXNfaW47XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVVzZXIodXNlcikudGhlbigoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmxvYWQodXNlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3ZhbGlkYXRlSWRUb2tlbkZyb21Ub2tlblJlZnJlc2hUb2tlbihwcm9maWxlLCBpZF90b2tlbikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0SXNzdWVyKCkudGhlbihpc3N1ZXIgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fam9zZVV0aWwudmFsaWRhdGVKd3RBdHRyaWJ1dGVzKGlkX3Rva2VuLCBpc3N1ZXIsIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCwgdGhpcy5fc2V0dGluZ3MuY2xvY2tTa2V3KS50aGVuKHBheWxvYWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFwYXlsb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlck1hbmFnZXIuX3ZhbGlkYXRlSWRUb2tlbkZyb21Ub2tlblJlZnJlc2hUb2tlbjogRmFpbGVkIHRvIHZhbGlkYXRlIGlkX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgaWRfdG9rZW5cIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHBheWxvYWQuc3ViICE9PSBwcm9maWxlLnN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJNYW5hZ2VyLl92YWxpZGF0ZUlkVG9rZW5Gcm9tVG9rZW5SZWZyZXNoVG9rZW46IHN1YiBpbiBpZF90b2tlbiBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IHN1YlwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwic3ViIGluIGlkX3Rva2VuIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgc3ViXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmF1dGhfdGltZSAmJiBwYXlsb2FkLmF1dGhfdGltZSAhPT0gcHJvZmlsZS5hdXRoX3RpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VyTWFuYWdlci5fdmFsaWRhdGVJZFRva2VuRnJvbVRva2VuUmVmcmVzaFRva2VuOiBhdXRoX3RpbWUgaW4gaWRfdG9rZW4gZG9lcyBub3QgbWF0Y2ggb3JpZ2luYWwgYXV0aF90aW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJhdXRoX3RpbWUgaW4gaWRfdG9rZW4gZG9lcyBub3QgbWF0Y2ggb3JpZ2luYWwgYXV0aF90aW1lXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmF6cCAmJiBwYXlsb2FkLmF6cCAhPT0gcHJvZmlsZS5henApIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VyTWFuYWdlci5fdmFsaWRhdGVJZFRva2VuRnJvbVRva2VuUmVmcmVzaFRva2VuOiBhenAgaW4gaWRfdG9rZW4gZG9lcyBub3QgbWF0Y2ggb3JpZ2luYWwgYXpwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJhenAgaW4gaWRfdG9rZW4gZG9lcyBub3QgbWF0Y2ggb3JpZ2luYWwgYXpwXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghcGF5bG9hZC5henAgJiYgcHJvZmlsZS5henApIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJVc2VyTWFuYWdlci5fdmFsaWRhdGVJZFRva2VuRnJvbVRva2VuUmVmcmVzaFRva2VuOiBhenAgbm90IGluIGlkX3Rva2VuLCBidXQgcHJlc2VudCBpbiBvcmlnaW5hbCBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiYXpwIG5vdCBpbiBpZF90b2tlbiwgYnV0IHByZXNlbnQgaW4gb3JpZ2luYWwgaWRfdG9rZW5cIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgX3NpZ25pblNpbGVudElmcmFtZShhcmdzID0ge30pIHtcclxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5zaWxlbnRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudDogTm8gc2lsZW50X3JlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc2lsZW50X3JlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFyZ3MucmVkaXJlY3RfdXJpID0gdXJsO1xyXG4gICAgICAgIGFyZ3MucHJvbXB0ID0gYXJncy5wcm9tcHQgfHwgXCJub25lXCI7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW4oYXJncywgdGhpcy5faWZyYW1lTmF2aWdhdG9yLCB7XHJcbiAgICAgICAgICAgIHN0YXJ0VXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0OiBhcmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0IHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50UmVxdWVzdFRpbWVvdXRcclxuICAgICAgICB9KS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWduaW5TaWxlbnQ6IHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50OiBubyBzdWJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25pblNpbGVudENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5DYWxsYmFjayh1cmwsIHRoaXMuX2lmcmFtZU5hdmlnYXRvcikudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLnN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50Q2FsbGJhY2s6IHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50Q2FsbGJhY2s6IG5vIHN1YlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcXVlcnlTZXNzaW9uU3RhdHVzKGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnNpbGVudF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgaWYgKCF1cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzOiBObyBzaWxlbnRfcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWxlbnRfcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XHJcbiAgICAgICAgYXJncy5wcm9tcHQgPSBcIm5vbmVcIjtcclxuICAgICAgICBhcmdzLnJlc3BvbnNlX3R5cGUgPSBhcmdzLnJlc3BvbnNlX3R5cGUgfHwgdGhpcy5zZXR0aW5ncy5xdWVyeV9zdGF0dXNfcmVzcG9uc2VfdHlwZTtcclxuICAgICAgICBhcmdzLnNjb3BlID0gXCJvcGVuaWRcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBzaWxlbnRSZXF1ZXN0VGltZW91dDogYXJncy5zaWxlbnRSZXF1ZXN0VGltZW91dCB8fCB0aGlzLnNldHRpbmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0XHJcbiAgICAgICAgfSkudGhlbihuYXZSZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWduaW5SZXNwb25zZShuYXZSZXNwb25zZS51cmwpLnRoZW4oc2lnbmluUmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzOiBnb3Qgc2lnbmluIHJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaWduaW5SZXNwb25zZS5zZXNzaW9uX3N0YXRlICYmIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5xdWVyeVNlc3Npb25TdGF0dXM6IHF1ZXJ5U2Vzc2lvblN0YXR1cyBzdWNjZXNzIGZvciBzdWI6IFwiLCAgc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zdWIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fc3RhdGU6IHNpZ25pblJlc3BvbnNlLnNlc3Npb25fc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yjogc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zdWIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZDogc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zaWRcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJxdWVyeVNlc3Npb25TdGF0dXMgc3VjY2Vzc2Z1bCwgdXNlciBub3QgYXV0aGVudGljYXRlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3NpZ25pbihhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zKS50aGVuKG5hdlJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkVuZChuYXZSZXNwb25zZS51cmwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25pblN0YXJ0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5wcmVwYXJlKG5hdmlnYXRvclBhcmFtcykudGhlbihoYW5kbGUgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5fc2lnbmluU3RhcnQ6IGdvdCBuYXZpZ2F0b3Igd2luZG93IGhhbmRsZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25pblJlcXVlc3QoYXJncykudGhlbihzaWduaW5SZXF1ZXN0ID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWduaW5TdGFydDogZ290IHNpZ25pbiByZXF1ZXN0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy51cmwgPSBzaWduaW5SZXF1ZXN0LnVybDtcclxuICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy5pZCA9IHNpZ25pblJlcXVlc3Quc3RhdGUuaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS5uYXZpZ2F0ZShuYXZpZ2F0b3JQYXJhbXMpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5jbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWduaW5TdGFydDogRXJyb3IgYWZ0ZXIgcHJlcGFyaW5nIG5hdmlnYXRvciwgY2xvc2luZyBuYXZpZ2F0b3Igd2luZG93XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9zaWduaW5FbmQodXJsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25pblJlc3BvbnNlKHVybCkudGhlbihzaWduaW5SZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWduaW5FbmQ6IGdvdCBzaWduaW4gcmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgICAgICBsZXQgdXNlciA9IG5ldyBVc2VyKHNpZ25pblJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcih1c2VyKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWduaW5FbmQ6IHVzZXIgc3RvcmVkXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9zaWduaW5DYWxsYmFjayh1cmwsIG5hdmlnYXRvcikge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWduaW5DYWxsYmFja1wiKTtcclxuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLmNhbGxiYWNrKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbm91dFJlZGlyZWN0KGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIGxldCBwb3N0TG9nb3V0UmVkaXJlY3RVcmkgPSBhcmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcclxuICAgICAgICBpZiAocG9zdExvZ291dFJlZGlyZWN0VXJpKXtcclxuICAgICAgICAgICAgYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0TG9nb3V0UmVkaXJlY3RVcmk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IpLnRoZW4oKCk9PntcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWdub3V0UmVkaXJlY3Q6IHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWdub3V0UmVkaXJlY3RDYWxsYmFjayh1cmwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dEVuZCh1cmwgfHwgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IudXJsKS50aGVuKHJlc3BvbnNlPT57XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbm91dFJlZGlyZWN0Q2FsbGJhY2s6IHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaWdub3V0UG9wdXAoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgbGV0IHVybCA9IGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gdXJsO1xyXG4gICAgICAgIGFyZ3MuZGlzcGxheSA9IFwicG9wdXBcIjtcclxuICAgICAgICBpZiAoYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpe1xyXG4gICAgICAgICAgICAvLyB3ZSdyZSBwdXR0aW5nIGEgZHVtbXkgZW50cnkgaW4gaGVyZSBiZWNhdXNlIHdlXHJcbiAgICAgICAgICAgIC8vIG5lZWQgYSB1bmlxdWUgaWQgZnJvbSB0aGUgc3RhdGUgZm9yIG5vdGlmaWNhdGlvblxyXG4gICAgICAgICAgICAvLyB0byB0aGUgcGFyZW50IHdpbmRvdywgd2hpY2ggaXMgbmVjZXNzYXJ5IGlmIHdlXHJcbiAgICAgICAgICAgIC8vIHBsYW4gdG8gcmV0dXJuIGJhY2sgdG8gdGhlIGNsaWVudCBhZnRlciBzaWdub3V0XHJcbiAgICAgICAgICAgIC8vIGFuZCBzbyB3ZSBjYW4gY2xvc2UgdGhlIHBvcHVwIGFmdGVyIHNpZ25vdXRcclxuICAgICAgICAgICAgYXJncy5zdGF0ZSA9IGFyZ3Muc3RhdGUgfHwge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dChhcmdzLCB0aGlzLl9wb3B1cE5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd0ZlYXR1cmVzOiBhcmdzLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cFdpbmRvd0ZlYXR1cmVzLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd1RhcmdldDogYXJncy5wb3B1cFdpbmRvd1RhcmdldCB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93VGFyZ2V0XHJcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbm91dFBvcHVwOiBzdWNjZXNzZnVsXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2lnbm91dFBvcHVwQ2FsbGJhY2sodXJsLCBrZWVwT3Blbikge1xyXG4gICAgICAgIGlmICh0eXBlb2Yoa2VlcE9wZW4pID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YodXJsKSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgIGtlZXBPcGVuID0gdXJsO1xyXG4gICAgICAgICAgICB1cmwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGRlbGltaXRlciA9ICc/JztcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBOYXZpZ2F0b3IuY2FsbGJhY2sodXJsLCBrZWVwT3BlbiwgZGVsaW1pdGVyKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWdub3V0UG9wdXBDYWxsYmFjazogc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfc2lnbm91dChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25vdXRTdGFydChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcykudGhlbihuYXZSZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0RW5kKG5hdlJlc3BvbnNlLnVybCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfc2lnbm91dFN0YXJ0KGFyZ3MgPSB7fSwgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IucHJlcGFyZShuYXZpZ2F0b3JQYXJhbXMpLnRoZW4oaGFuZGxlID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX3NpZ25vdXRTdGFydDogZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWdub3V0U3RhcnQ6IGxvYWRlZCBjdXJyZW50IHVzZXIgZnJvbSBzdG9yYWdlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciByZXZva2VQcm9taXNlID0gdGhpcy5fc2V0dGluZ3MucmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQgPyB0aGlzLl9yZXZva2VJbnRlcm5hbCh1c2VyKSA6IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldm9rZVByb21pc2UudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZF90b2tlbiA9IGFyZ3MuaWRfdG9rZW5faGludCB8fCB1c2VyICYmIHVzZXIuaWRfdG9rZW47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWdub3V0U3RhcnQ6IFNldHRpbmcgaWRfdG9rZW4gaW50byBzaWdub3V0IHJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuaWRfdG9rZW5faGludCA9IGlkX3Rva2VuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlVXNlcigpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5fc2lnbm91dFN0YXJ0OiB1c2VyIHJlbW92ZWQsIGNyZWF0aW5nIHNpZ25vdXQgcmVxdWVzdFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25vdXRSZXF1ZXN0KGFyZ3MpLnRoZW4oc2lnbm91dFJlcXVlc3QgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX3NpZ25vdXRTdGFydDogZ290IHNpZ25vdXQgcmVxdWVzdFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3JQYXJhbXMudXJsID0gc2lnbm91dFJlcXVlc3QudXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25vdXRSZXF1ZXN0LnN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yUGFyYW1zLmlkID0gc2lnbm91dFJlcXVlc3Quc3RhdGUuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX3NpZ25vdXRTdGFydDogRXJyb3IgYWZ0ZXIgcHJlcGFyaW5nIG5hdmlnYXRvciwgY2xvc2luZyBuYXZpZ2F0b3Igd2luZG93XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9zaWdub3V0RW5kKHVybCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWdub3V0UmVzcG9uc2UodXJsKS50aGVuKHNpZ25vdXRSZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLl9zaWdub3V0RW5kOiBnb3Qgc2lnbm91dCByZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzaWdub3V0UmVzcG9uc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2b2tlQWNjZXNzVG9rZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jldm9rZUludGVybmFsKHVzZXIsIHRydWUpLnRoZW4oc3VjY2VzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnJldm9rZUFjY2Vzc1Rva2VuOiByZW1vdmluZyB0b2tlbiBwcm9wZXJ0aWVzIGZyb20gdXNlciBhbmQgcmUtc3RvcmluZ1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlci5hY2Nlc3NfdG9rZW4gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIucmVmcmVzaF90b2tlbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlci5leHBpcmVzX2F0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyLnRva2VuX3R5cGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVVzZXIodXNlcikudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnJldm9rZUFjY2Vzc1Rva2VuOiB1c2VyIHN0b3JlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmxvYWQodXNlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oKCk9PntcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5yZXZva2VBY2Nlc3NUb2tlbjogYWNjZXNzIHRva2VuIHJldm9rZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9yZXZva2VJbnRlcm5hbCh1c2VyLCByZXF1aXJlZCkge1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIHZhciBhY2Nlc3NfdG9rZW4gPSB1c2VyLmFjY2Vzc190b2tlbjtcclxuICAgICAgICAgICAgdmFyIHJlZnJlc2hfdG9rZW4gPSB1c2VyLnJlZnJlc2hfdG9rZW47XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlQWNjZXNzVG9rZW5JbnRlcm5hbChhY2Nlc3NfdG9rZW4sIHJlcXVpcmVkKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oYXRTdWNjZXNzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlUmVmcmVzaFRva2VuSW50ZXJuYWwocmVmcmVzaF90b2tlbiwgcmVxdWlyZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJ0U3VjY2VzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0U3VjY2VzcyAmJiAhcnRTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIucmV2b2tlQWNjZXNzVG9rZW46IG5vIG5lZWQgdG8gcmV2b2tlIGR1ZSB0byBubyB0b2tlbihzKSwgb3IgSldUIGZvcm1hdFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0U3VjY2VzcyB8fCBydFN1Y2Nlc3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBfcmV2b2tlQWNjZXNzVG9rZW5JbnRlcm5hbChhY2Nlc3NfdG9rZW4sIHJlcXVpcmVkKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIEpXVCB2cy4gcmVmZXJlbmNlIHRva2VuXHJcbiAgICAgICAgaWYgKCFhY2Nlc3NfdG9rZW4gfHwgYWNjZXNzX3Rva2VuLmluZGV4T2YoJy4nKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuUmV2b2NhdGlvbkNsaWVudC5yZXZva2UoYWNjZXNzX3Rva2VuLCByZXF1aXJlZCkudGhlbigoKSA9PiB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBfcmV2b2tlUmVmcmVzaFRva2VuSW50ZXJuYWwocmVmcmVzaF90b2tlbiwgcmVxdWlyZWQpIHtcclxuICAgICAgICBpZiAoIXJlZnJlc2hfdG9rZW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZShyZWZyZXNoX3Rva2VuLCByZXF1aXJlZCwgXCJyZWZyZXNoX3Rva2VuXCIpLnRoZW4oKCkgPT4gdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRTaWxlbnRSZW5ldygpIHtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld1NlcnZpY2Uuc3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wU2lsZW50UmVuZXcoKSB7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdTZXJ2aWNlLnN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgX3VzZXJTdG9yZUtleSgpIHtcclxuICAgICAgICByZXR1cm4gYHVzZXI6JHt0aGlzLnNldHRpbmdzLmF1dGhvcml0eX06JHt0aGlzLnNldHRpbmdzLmNsaWVudF9pZH1gO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkVXNlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLmdldCh0aGlzLl91c2VyU3RvcmVLZXkpLnRoZW4oc3RvcmFnZVN0cmluZyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdG9yYWdlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5fbG9hZFVzZXI6IHVzZXIgc3RvcmFnZVN0cmluZyBsb2FkZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVXNlci5mcm9tU3RvcmFnZVN0cmluZyhzdG9yYWdlU3RyaW5nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuX2xvYWRVc2VyOiBubyB1c2VyIHN0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlVXNlcih1c2VyKSB7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc3RvcmVVc2VyOiBzdG9yaW5nIHVzZXJcIik7XHJcblxyXG4gICAgICAgICAgICB2YXIgc3RvcmFnZVN0cmluZyA9IHVzZXIudG9TdG9yYWdlU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyU3RvcmUuc2V0KHRoaXMuX3VzZXJTdG9yZUtleSwgc3RvcmFnZVN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJzdG9yZVVzZXIuc3RvcmVVc2VyOiByZW1vdmluZyB1c2VyXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLnJlbW92ZSh0aGlzLl91c2VyU3RvcmVLZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IEFjY2Vzc1Rva2VuRXZlbnRzIH0gZnJvbSAnLi9BY2Nlc3NUb2tlbkV2ZW50cy5qcyc7XHJcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi9FdmVudC5qcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlck1hbmFnZXJFdmVudHMgZXh0ZW5kcyBBY2Nlc3NUb2tlbkV2ZW50cyB7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcclxuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZCA9IG5ldyBFdmVudChcIlVzZXIgbG9hZGVkXCIpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZCA9IG5ldyBFdmVudChcIlVzZXIgdW5sb2FkZWRcIik7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvciA9IG5ldyBFdmVudChcIlNpbGVudCByZW5ldyBlcnJvclwiKTtcclxuICAgICAgICB0aGlzLl91c2VyU2lnbmVkT3V0ID0gbmV3IEV2ZW50KFwiVXNlciBzaWduZWQgb3V0XCIpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZXNzaW9uQ2hhbmdlZCA9IG5ldyBFdmVudChcIlVzZXIgc2Vzc2lvbiBjaGFuZ2VkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWQodXNlciwgcmFpc2VFdmVudD10cnVlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMubG9hZFwiKTtcclxuICAgICAgICBzdXBlci5sb2FkKHVzZXIpO1xyXG4gICAgICAgIGlmIChyYWlzZUV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2FkZWQucmFpc2UodXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdW5sb2FkKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLnVubG9hZFwiKTtcclxuICAgICAgICBzdXBlci51bmxvYWQoKTtcclxuICAgICAgICB0aGlzLl91c2VyVW5sb2FkZWQucmFpc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRVc2VyTG9hZGVkKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVVzZXJMb2FkZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRTaWxlbnRSZW5ld0Vycm9yKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVNpbGVudFJlbmV3RXJyb3IoY2IpIHtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgX3JhaXNlU2lsZW50UmVuZXdFcnJvcihlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMuX3JhaXNlU2lsZW50UmVuZXdFcnJvclwiLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3RXJyb3IucmFpc2UoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkVXNlclNpZ25lZE91dChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJTaWduZWRPdXQuYWRkSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVVc2VyU2lnbmVkT3V0KGNiKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIF9yYWlzZVVzZXJTaWduZWRPdXQoZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXRcIik7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5yYWlzZShlKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQuYWRkSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQucmVtb3ZlSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICBfcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWQoZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLl9yYWlzZVVzZXJTZXNzaW9uQ2hhbmdlZFwiKTtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQucmFpc2UoZSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi9Mb2cuanMnO1xyXG5pbXBvcnQgeyBPaWRjQ2xpZW50U2V0dGluZ3MgfSBmcm9tICcuL09pZGNDbGllbnRTZXR0aW5ncy5qcyc7XHJcbmltcG9ydCB7IFJlZGlyZWN0TmF2aWdhdG9yIH0gZnJvbSAnLi9SZWRpcmVjdE5hdmlnYXRvci5qcyc7XHJcbmltcG9ydCB7IFBvcHVwTmF2aWdhdG9yIH0gZnJvbSAnLi9Qb3B1cE5hdmlnYXRvci5qcyc7XHJcbmltcG9ydCB7IElGcmFtZU5hdmlnYXRvciB9IGZyb20gJy4vSUZyYW1lTmF2aWdhdG9yLmpzJztcclxuaW1wb3J0IHsgV2ViU3RvcmFnZVN0YXRlU3RvcmUgfSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzJztcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSAnLi9HbG9iYWwuanMnO1xyXG5cclxuY29uc3QgRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gNjA7XHJcbmNvbnN0IERlZmF1bHRDaGVja1Nlc3Npb25JbnRlcnZhbCA9IDIwMDA7XHJcbmNvbnN0IERlZmF1bHRRdWVyeVNlc3Npb25TdGF0dXNSZXNwb25zZVR5cGUgPSBcImlkX3Rva2VuXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlck1hbmFnZXJTZXR0aW5ncyBleHRlbmRzIE9pZGNDbGllbnRTZXR0aW5ncyB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7XHJcbiAgICAgICAgcG9wdXBfcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgIHBvcHVwX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSxcclxuICAgICAgICBwb3B1cFdpbmRvd0ZlYXR1cmVzLFxyXG4gICAgICAgIHBvcHVwV2luZG93VGFyZ2V0LFxyXG4gICAgICAgIHNpbGVudF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgc2lsZW50UmVxdWVzdFRpbWVvdXQsXHJcbiAgICAgICAgYXV0b21hdGljU2lsZW50UmVuZXcgPSBmYWxzZSxcclxuICAgICAgICBpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcgPSB0cnVlLFxyXG4gICAgICAgIG1vbml0b3JTZXNzaW9uID0gdHJ1ZSxcclxuICAgICAgICBjaGVja1Nlc3Npb25JbnRlcnZhbCA9IERlZmF1bHRDaGVja1Nlc3Npb25JbnRlcnZhbCxcclxuICAgICAgICBzdG9wQ2hlY2tTZXNzaW9uT25FcnJvciA9IHRydWUsXHJcbiAgICAgICAgcXVlcnlfc3RhdHVzX3Jlc3BvbnNlX3R5cGUgPSBEZWZhdWx0UXVlcnlTZXNzaW9uU3RhdHVzUmVzcG9uc2VUeXBlLFxyXG4gICAgICAgIHJldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0ID0gZmFsc2UsXHJcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUsXHJcbiAgICAgICAgcmVkaXJlY3ROYXZpZ2F0b3IgPSBuZXcgUmVkaXJlY3ROYXZpZ2F0b3IoKSxcclxuICAgICAgICBwb3B1cE5hdmlnYXRvciA9IG5ldyBQb3B1cE5hdmlnYXRvcigpLFxyXG4gICAgICAgIGlmcmFtZU5hdmlnYXRvciA9IG5ldyBJRnJhbWVOYXZpZ2F0b3IoKSxcclxuICAgICAgICB1c2VyU3RvcmUgPSBuZXcgV2ViU3RvcmFnZVN0YXRlU3RvcmUoeyBzdG9yZTogR2xvYmFsLnNlc3Npb25TdG9yYWdlIH0pXHJcbiAgICB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihhcmd1bWVudHNbMF0pO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3B1cF9yZWRpcmVjdF91cmkgPSBwb3B1cF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwV2luZG93RmVhdHVyZXMgPSBwb3B1cFdpbmRvd0ZlYXR1cmVzO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwV2luZG93VGFyZ2V0ID0gcG9wdXBXaW5kb3dUYXJnZXQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3NpbGVudF9yZWRpcmVjdF91cmkgPSBzaWxlbnRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlcXVlc3RUaW1lb3V0ID0gc2lsZW50UmVxdWVzdFRpbWVvdXQ7XHJcbiAgICAgICAgdGhpcy5fYXV0b21hdGljU2lsZW50UmVuZXcgPSAhIWF1dG9tYXRpY1NpbGVudFJlbmV3O1xyXG4gICAgICAgIHRoaXMuX2luY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldyA9IGluY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldztcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xyXG5cclxuICAgICAgICB0aGlzLl9tb25pdG9yU2Vzc2lvbiA9IG1vbml0b3JTZXNzaW9uO1xyXG4gICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbkludGVydmFsID0gY2hlY2tTZXNzaW9uSW50ZXJ2YWw7XHJcbiAgICAgICAgdGhpcy5fc3RvcENoZWNrU2Vzc2lvbk9uRXJyb3IgPSBzdG9wQ2hlY2tTZXNzaW9uT25FcnJvcjtcclxuICAgICAgICB0aGlzLl9xdWVyeV9zdGF0dXNfcmVzcG9uc2VfdHlwZSA9IHF1ZXJ5X3N0YXR1c19yZXNwb25zZV90eXBlO1xyXG4gICAgICAgIHRoaXMuX3Jldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0ID0gcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yID0gcmVkaXJlY3ROYXZpZ2F0b3I7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBOYXZpZ2F0b3IgPSBwb3B1cE5hdmlnYXRvcjtcclxuICAgICAgICB0aGlzLl9pZnJhbWVOYXZpZ2F0b3IgPSBpZnJhbWVOYXZpZ2F0b3I7XHJcblxyXG4gICAgICAgIHRoaXMuX3VzZXJTdG9yZSA9IHVzZXJTdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcG9wdXBfcmVkaXJlY3RfdXJpKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cF9yZWRpcmVjdF91cmk7XHJcbiAgICB9XHJcbiAgICBnZXQgcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcbiAgICB9XHJcbiAgICBnZXQgcG9wdXBXaW5kb3dGZWF0dXJlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dGZWF0dXJlcztcclxuICAgIH1cclxuICAgIGdldCBwb3B1cFdpbmRvd1RhcmdldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dUYXJnZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpbGVudF9yZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpbGVudF9yZWRpcmVjdF91cmk7XHJcbiAgICB9XHJcbiAgICAgZ2V0IHNpbGVudFJlcXVlc3RUaW1lb3V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWxlbnRSZXF1ZXN0VGltZW91dDtcclxuICAgIH1cclxuICAgIGdldCBhdXRvbWF0aWNTaWxlbnRSZW5ldygpIHtcclxuICAgICAgICByZXR1cm4gISEodGhpcy5zaWxlbnRfcmVkaXJlY3RfdXJpICYmIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3KTtcclxuICAgIH1cclxuICAgIGdldCBpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldztcclxuICAgIH1cclxuICAgIGdldCBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vbml0b3JTZXNzaW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tb25pdG9yU2Vzc2lvbjtcclxuICAgIH1cclxuICAgIGdldCBjaGVja1Nlc3Npb25JbnRlcnZhbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tTZXNzaW9uSW50ZXJ2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgc3RvcENoZWNrU2Vzc2lvbk9uRXJyb3IoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcENoZWNrU2Vzc2lvbk9uRXJyb3I7XHJcbiAgICB9XHJcbiAgICBnZXQgcXVlcnlfc3RhdHVzX3Jlc3BvbnNlX3R5cGUoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnlfc3RhdHVzX3Jlc3BvbnNlX3R5cGU7XHJcbiAgICB9XHJcbiAgICBnZXQgcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByZWRpcmVjdE5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgcG9wdXBOYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwTmF2aWdhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IGlmcmFtZU5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faWZyYW1lTmF2aWdhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB1c2VyU3RvcmUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuL0xvZy5qcyc7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4vR2xvYmFsLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBXZWJTdG9yYWdlU3RhdGVTdG9yZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7cHJlZml4ID0gXCJvaWRjLlwiLCBzdG9yZSA9IEdsb2JhbC5sb2NhbFN0b3JhZ2V9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xyXG4gICAgICAgIHRoaXMuX3ByZWZpeCA9IHByZWZpeDtcclxuICAgIH1cclxuXHJcbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLnNldFwiLCBrZXkpO1xyXG5cclxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b3JlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQoa2V5KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuZ2V0XCIsIGtleSk7XHJcblxyXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcclxuXHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLl9zdG9yZS5nZXRJdGVtKGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlKGtleSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLnJlbW92ZVwiLCBrZXkpO1xyXG5cclxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XHJcblxyXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5fc3RvcmUuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIHRoaXMuX3N0b3JlLnJlbW92ZUl0ZW0oa2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxLZXlzKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLmdldEFsbEtleXNcIik7XHJcblxyXG4gICAgICAgIHZhciBrZXlzID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9zdG9yZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuX3N0b3JlLmtleShpbmRleCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5fcHJlZml4KSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleS5zdWJzdHIodGhpcy5fcHJlZml4Lmxlbmd0aCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGtleXMpO1xyXG4gICAgfVxyXG59XHJcbiIsInZhciB1dWlkNCA9IHJlcXVpcmUoJ3V1aWQvdjQnKVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBSRkM0MTIyIHZlcnNpb24gNCBndWlkICgpXHJcbiAqL1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZG9tKCkge1xyXG4gIHJldHVybiB1dWlkNCgpLnJlcGxhY2UoLy0vZywgJycpO1xyXG59XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=