diff --git a/dist/oidc-client.js b/dist/oidc-client.js index d0eb1e534..6bb8bc98d 100644 --- a/dist/oidc-client.js +++ b/dist/oidc-client.js @@ -8891,21 +8891,21 @@ var Oidc = // 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 = exports.Log = __webpack_require__(328); - var OidcClient = exports.OidcClient = __webpack_require__(329); - var OidcClientSettings = exports.OidcClientSettings = __webpack_require__(330); - var WebStorageStateStore = exports.WebStorageStateStore = __webpack_require__(331); - var InMemoryWebStorage = exports.InMemoryWebStorage = __webpack_require__(353); - var UserManager = exports.UserManager = __webpack_require__(354); - var AccessTokenEvents = exports.AccessTokenEvents = __webpack_require__(363); - var MetadataService = exports.MetadataService = __webpack_require__(334); - var CordovaPopupNavigator = exports.CordovaPopupNavigator = __webpack_require__(370); - var CordovaIFrameNavigator = exports.CordovaIFrameNavigator = __webpack_require__(372); - var CheckSessionIFrame = exports.CheckSessionIFrame = __webpack_require__(368); - var TokenRevocationClient = exports.TokenRevocationClient = __webpack_require__(369); - var SessionMonitor = exports.SessionMonitor = __webpack_require__(367); - var Global = exports.Global = __webpack_require__(332); - var User = exports.User = __webpack_require__(361); + var Log = exports.Log = __webpack_require__(328).Log; + var OidcClient = exports.OidcClient = __webpack_require__(329).OidcClient; + var OidcClientSettings = exports.OidcClientSettings = __webpack_require__(330).OidcClientSettings; + var WebStorageStateStore = exports.WebStorageStateStore = __webpack_require__(331).WebStorageStateStore; + var InMemoryWebStorage = exports.InMemoryWebStorage = __webpack_require__(349).InMemoryWebStorage; + var UserManager = exports.UserManager = __webpack_require__(350).UserManager; + var AccessTokenEvents = exports.AccessTokenEvents = __webpack_require__(359).AccessTokenEvents; + var MetadataService = exports.MetadataService = __webpack_require__(334).MetadataService; + var CordovaPopupNavigator = exports.CordovaPopupNavigator = __webpack_require__(366).CordovaPopupNavigator; + var CordovaIFrameNavigator = exports.CordovaIFrameNavigator = __webpack_require__(368).CordovaIFrameNavigator; + var CheckSessionIFrame = exports.CheckSessionIFrame = __webpack_require__(364).CheckSessionIFrame; + var TokenRevocationClient = exports.TokenRevocationClient = __webpack_require__(365).TokenRevocationClient; + var SessionMonitor = exports.SessionMonitor = __webpack_require__(363).SessionMonitor; + var Global = exports.Global = __webpack_require__(332).Global; + var User = exports.User = __webpack_require__(357).User; exports.default = { Log: Log, @@ -8958,7 +8958,7 @@ var Oidc = var logger = void 0; var level = void 0; - var Log = function () { + var Log = exports.Log = function () { function Log() { _classCallCheck(this, Log); } @@ -9067,11 +9067,7 @@ var Oidc = return Log; }(); - exports.default = Log; - - Log.reset(); - module.exports = exports['default']; /***/ }), /* 329 */ @@ -9082,6 +9078,7 @@ var Oidc = 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. @@ -9098,27 +9095,27 @@ var Oidc = var _ErrorResponse2 = _interopRequireDefault(_ErrorResponse); - var _SigninRequest = __webpack_require__(345); + var _SigninRequest = __webpack_require__(341); var _SigninRequest2 = _interopRequireDefault(_SigninRequest); - var _SigninResponse = __webpack_require__(350); + var _SigninResponse = __webpack_require__(346); var _SigninResponse2 = _interopRequireDefault(_SigninResponse); - var _SignoutRequest = __webpack_require__(351); + var _SignoutRequest = __webpack_require__(347); var _SignoutRequest2 = _interopRequireDefault(_SignoutRequest); - var _SignoutResponse = __webpack_require__(352); + var _SignoutResponse = __webpack_require__(348); var _SignoutResponse2 = _interopRequireDefault(_SignoutResponse); - var _SigninState = __webpack_require__(347); + var _SigninState = __webpack_require__(343); var _SigninState2 = _interopRequireDefault(_SigninState); - var _State = __webpack_require__(348); + var _State = __webpack_require__(344); var _State2 = _interopRequireDefault(_State); @@ -9126,7 +9123,7 @@ var Oidc = function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var OidcClient = function () { + var OidcClient = exports.OidcClient = function () { function OidcClient() { var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; @@ -9341,12 +9338,9 @@ var Oidc = return this._metadataService; } }]); - + return OidcClient; }(); - - exports.default = OidcClient; - module.exports = exports['default']; /***/ }), /* 330 */ @@ -9357,6 +9351,7 @@ var Oidc = 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; }; @@ -9390,7 +9385,7 @@ var Oidc = var DefaultStaleStateAge = 60 * 5; // seconds var DefaultClockSkewInSeconds = 60 * 5; - var OidcClientSettings = function () { + var OidcClientSettings = exports.OidcClientSettings = function () { function OidcClientSettings() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, authority = _ref.authority, @@ -9642,12 +9637,9 @@ var Oidc = } } }]); - + return OidcClientSettings; }(); - - exports.default = OidcClientSettings; - module.exports = exports['default']; /***/ }), /* 331 */ @@ -9658,6 +9650,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.WebStorageStateStore = undefined; var _Log = __webpack_require__(328); @@ -9672,7 +9665,7 @@ var Oidc = 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 = function () { + var WebStorageStateStore = exports.WebStorageStateStore = function () { function WebStorageStateStore() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$prefix = _ref.prefix, @@ -9735,9 +9728,6 @@ var Oidc = return WebStorageStateStore; }(); - - exports.default = WebStorageStateStore; - module.exports = exports['default']; /***/ }), /* 332 */ @@ -9788,7 +9778,7 @@ var Oidc = var testing = false; var request = null; - var Global = function () { + var Global = exports.Global = function () { function Global() { _classCallCheck(this, Global); } @@ -9841,9 +9831,7 @@ var Oidc = return Global; }(); - exports.default = Global; ; - module.exports = exports['default']; /***/ }), /* 333 */ @@ -9854,6 +9842,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.ResponseValidator = undefined; var _Log = __webpack_require__(328); @@ -9882,7 +9871,7 @@ var Oidc = var ProtocolClaims = ["nonce", "at_hash", "iat", "nbf", "exp", "aud", "iss", "c_hash"]; - var ResponseValidator = function () { + var ResponseValidator = exports.ResponseValidator = function () { function ResponseValidator(settings) { var MetadataServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _MetadataService2.default; var UserInfoServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _UserInfoService2.default; @@ -10046,36 +10035,16 @@ var Oidc = values = [values]; } - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var value = _step.value; - - 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) { - result[name] = [result[name], value]; - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; + 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) { + result[name] = [result[name], value]; } } } @@ -10293,9 +10262,6 @@ var Oidc = return ResponseValidator; }(); - - exports.default = ResponseValidator; - module.exports = exports['default']; /***/ }), /* 334 */ @@ -10306,6 +10272,7 @@ var Oidc = 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. @@ -10324,7 +10291,7 @@ var Oidc = var OidcMetadataUrlPath = '.well-known/openid-configuration'; - var MetadataService = function () { + var MetadataService = exports.MetadataService = function () { function MetadataService(settings) { var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService2.default; @@ -10469,12 +10436,9 @@ var Oidc = return this._metadataUrl; } }]); - + return MetadataService; }(); - - exports.default = MetadataService; - module.exports = exports['default']; /***/ }), /* 335 */ @@ -10485,6 +10449,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.JsonService = undefined; var _Log = __webpack_require__(328); @@ -10499,7 +10464,7 @@ var Oidc = 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 = function () { + var JsonService = exports.JsonService = function () { function JsonService() { var XMLHttpRequestCtor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _Global2.default.XMLHttpRequest; @@ -10554,9 +10519,6 @@ var Oidc = return JsonService; }(); - - exports.default = JsonService; - module.exports = exports['default']; /***/ }), /* 336 */ @@ -10567,6 +10529,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.UserInfoService = undefined; var _JsonService = __webpack_require__(335); @@ -10585,7 +10548,7 @@ var Oidc = 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 = function () { + var UserInfoService = exports.UserInfoService = function () { function UserInfoService(settings) { var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService2.default; var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService2.default; @@ -10624,9 +10587,6 @@ var Oidc = return UserInfoService; }(); - - exports.default = UserInfoService; - module.exports = exports['default']; /***/ }), /* 337 */ @@ -10637,6 +10597,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.ErrorResponse = undefined; var _Log = __webpack_require__(328); @@ -10651,7 +10612,7 @@ var Oidc = 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 = function (_Error) { + var ErrorResponse = exports.ErrorResponse = function (_Error) { _inherits(ErrorResponse, _Error); function ErrorResponse() { @@ -10682,9 +10643,6 @@ var Oidc = return ErrorResponse; }(Error); - - exports.default = ErrorResponse; - module.exports = exports['default']; /***/ }), /* 338 */ @@ -10695,6 +10653,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.JoseUtil = undefined; var _jsrsasign = __webpack_require__(339); @@ -10709,7 +10668,7 @@ var Oidc = var AllowedSigningAlgs = ['RS256', 'RS384', 'RS512', 'PS256', 'PS384', 'PS512', 'ES256', 'ES384', 'ES512']; - var JoseUtil = function () { + var JoseUtil = exports.JoseUtil = function () { function JoseUtil() { _classCallCheck(this, JoseUtil); } @@ -10850,9 +10809,6 @@ var Oidc = return JoseUtil; }(); - - exports.default = JoseUtil; - module.exports = exports['default']; /***/ }), /* 339 */ @@ -11137,2107 +11093,90 @@ var Oidc = /*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license */ function _rsapem_pemToBase64(b){var a=b;a=a.replace("-----BEGIN RSA PRIVATE KEY-----","");a=a.replace("-----END RSA PRIVATE KEY-----","");a=a.replace(/[ \n]+/g,"");return a}function _rsapem_getPosArrayOfChildrenFromHex(d){var j=new Array();var k=ASN1HEX.getStartPosOfV_AtObj(d,0);var f=ASN1HEX.getPosOfNextSibling_AtObj(d,k);var h=ASN1HEX.getPosOfNextSibling_AtObj(d,f);var b=ASN1HEX.getPosOfNextSibling_AtObj(d,h);var l=ASN1HEX.getPosOfNextSibling_AtObj(d,b);var e=ASN1HEX.getPosOfNextSibling_AtObj(d,l);var g=ASN1HEX.getPosOfNextSibling_AtObj(d,e);var c=ASN1HEX.getPosOfNextSibling_AtObj(d,g);var i=ASN1HEX.getPosOfNextSibling_AtObj(d,c);j.push(k,f,h,b,l,e,g,c,i);return j}function _rsapem_getHexValueArrayOfChildrenFromHex(i){var o=_rsapem_getPosArrayOfChildrenFromHex(i);var r=ASN1HEX.getHexOfV_AtObj(i,o[0]);var f=ASN1HEX.getHexOfV_AtObj(i,o[1]);var j=ASN1HEX.getHexOfV_AtObj(i,o[2]);var k=ASN1HEX.getHexOfV_AtObj(i,o[3]);var c=ASN1HEX.getHexOfV_AtObj(i,o[4]);var b=ASN1HEX.getHexOfV_AtObj(i,o[5]);var h=ASN1HEX.getHexOfV_AtObj(i,o[6]);var g=ASN1HEX.getHexOfV_AtObj(i,o[7]);var l=ASN1HEX.getHexOfV_AtObj(i,o[8]);var m=new Array();m.push(r,f,j,k,c,b,h,g,l);return m}function _rsapem_readPrivateKeyFromASN1HexString(c){var b=_rsapem_getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}function _rsapem_readPrivateKeyFromPEMString(e){var c=_rsapem_pemToBase64(e);var d=b64tohex(c);var b=_rsapem_getHexValueArrayOfChildrenFromHex(d);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}RSAKey.prototype.readPrivateKeyFromPEMString=_rsapem_readPrivateKeyFromPEMString;RSAKey.prototype.readPrivateKeyFromASN1HexString=_rsapem_readPrivateKeyFromASN1HexString; - /*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license - */ - var _RE_HEXDECONLY=new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]","gi");function _rsasign_getHexPaddedDigestInfoForString(d,e,a){var b=function(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>24,(d&16711680)>>16,(d&65280)>>8,d&255]))));d+=1}return b}function _rsasign_signStringPSS(e,a,d){var c=function(f){return KJUR.crypto.Util.hashHex(f,a)};var b=c(rstrtohex(e));if(d===undefined){d=-1}return this.signWithMessageHashPSS(b,a,d)}function _rsasign_signWithMessageHashPSS(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(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>(8*c-m))&255;q[0]&=~p;for(d=0;dthis.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(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(h==c)}function _rsasign_verifyWithMessageHash(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)}function _rsasign_verifyStringPSS(c,b,a,f){var e=function(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)}function _rsasign_verifyWithMessageHashPSS(f,s,l,c){var k=new BigInteger(s,16);if(k.bitLength()>this.n.bitLength()){return false}var r=function(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>(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;q0){var c=":"+j.join(":")+":";if(c.indexOf(":"+h+":")==-1){throw"algorithm '"+h+"' not accepted in the list"}}if(h!="none"&&t===null){throw"key shall be specified to verify."}if(typeof t=="string"&&t.indexOf("-----BEGIN ")!=-1){t=KEYUTIL.getKey(t)}if(s=="RS"||s=="PS"){if(!(t instanceof RSAKey)){throw"key shall be a RSAKey obj for RS* and PS* algs"}}if(s=="ES"){if(!(t instanceof KJUR.crypto.ECDSA)){throw"key shall be a ECDSA obj for ES* algs"}}if(h=="none"){}var n=null;if(m.jwsalg2sigalg[i.alg]===undefined){throw"unsupported alg name: "+h}else{n=m.jwsalg2sigalg[h]}if(n=="none"){throw"not supported"}else{if(n.substr(0,4)=="Hmac"){var k=null;if(t===undefined){throw"hexadecimal key shall be specified for HMAC"}var g=new KJUR.crypto.Mac({alg:n,pass:t});g.updateString(b);k=g.doFinal();return r==k}else{if(n.indexOf("withECDSA")!=-1){var f=null;try{f=KJUR.crypto.ECDSA.concatSigToASN1Sig(r)}catch(o){return false}var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(f)}else{var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(r)}}}};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(d,j,l){var h=KJUR.jws.JWS;var i=d.split(".");var c=i[0];var g=i[1];var m=c+"."+g;var k=b64utohex(i[2]);var f=h.readSafeJSONString(b64utoutf8(c));var e=h.readSafeJSONString(b64utoutf8(g));if(f.alg===undefined){return false}if(l.alg===undefined){throw"acceptField.alg shall be specified"}if(!h.inArray(f.alg,l.alg)){return false}if(e.iss!==undefined&&typeof l.iss==="object"){if(!h.inArray(e.iss,l.iss)){return false}}if(e.sub!==undefined&&typeof l.sub==="object"){if(!h.inArray(e.sub,l.sub)){return false}}if(e.aud!==undefined&&typeof l.aud==="object"){if(typeof e.aud=="string"){if(!h.inArray(e.aud,l.aud)){return false}}else{if(typeof e.aud=="object"){if(!h.includedArray(e.aud,l.aud)){return false}}}}var b=KJUR.jws.IntDate.getNow();if(l.verifyAt!==undefined&&typeof l.verifyAt==="number"){b=l.verifyAt}if(l.gracePeriod===undefined||typeof l.gracePeriod!=="number"){l.gracePeriod=0}if(e.exp!==undefined&&typeof e.exp=="number"){if(e.exp+l.gracePeriodj){this.aHeader.pop()}if(this.aSignature.length>j){this.aSignature.pop()}throw"addSignature failed: "+g}};this.addSignatureByHeaderKey=function(f,c){var e=b64utoutf8(this.sPayload);var d=new KJUR.jws.JWS();var g=d.generateJWSByP1PrvKey(f,e,c);this.aHeader.push(d.parsedJWS.headB64U);this.aSignature.push(d.parsedJWS.sigvalB64U)};this.addSignatureByHeaderPayloadKey=function(f,e,c){var d=new KJUR.jws.JWS();var g=d.generateJWSByP1PrvKey(f,e,c);this.aHeader.push(d.parsedJWS.headB64U);this.sPayload=d.parsedJWS.payloadB64U;this.aSignature.push(d.parsedJWS.sigvalB64U)};this.verifyAll=function(f){if(this.aHeader.length!==f.length||this.aSignature.length!==f.length){return false}for(var e=0;e0){this.aHeader=e.headers}else{throw"malformed header"}if(typeof e.payload==="string"){this.sPayload=e.payload}else{throw"malformed signatures"}if(e.signatures.length>0){this.signatures=e.signatures}else{throw"malformed signatures"}}catch(c){throw"malformed JWS-JS JSON object: "+c}}};this.getJSON=function(){return{headers:this.aHeader,payload:this.sPayload,signatures:this.aSignature}};this.isEmpty=function(){if(this.aHeader.length==0){return 1}return 0}}; - /*! nodeutil-1.0.0 (c) 2015 Kenji Urushima | kjur.github.com/jsrsasign/license - */ - function readFileUTF8(a){return __webpack_require__(344).readFileSync(a,"utf8")}function readFileHexByBin(c){var b=__webpack_require__(339);var a=__webpack_require__(344);return b.rstrtohex(a.readFileSync(c,"binary"))}function readFile(b){var a=__webpack_require__(344);return a.readFileSync(b,"binary")}function saveFile(c,b){var a=__webpack_require__(344);a.writeFileSync(c,b,"binary")}function saveFileBinByHex(e,b){var a=__webpack_require__(344);var c=__webpack_require__(339);var d=c.hextorstr(b);a.writeFileSync(e,d,"binary")}; - exports.SecureRandom = SecureRandom; - exports.rng_seed_time = rng_seed_time; - - exports.BigInteger = BigInteger; - exports.RSAKey = RSAKey; - exports.ECDSA = KJUR.crypto.ECDSA; - exports.DSA = KJUR.crypto.DSA; - exports.Signature = KJUR.crypto.Signature; - exports.MessageDigest = KJUR.crypto.MessageDigest; - exports.Mac = KJUR.crypto.Mac; - 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.b64tohex = b64tohex; - 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.newline_toUnix = newline_toUnix; - exports.newline_toDos = newline_toDos; - exports.intarystrtohex = intarystrtohex; - exports.strdiffidx = strdiffidx; - - exports.KJUR = KJUR; - exports.crypto = KJUR.crypto; - exports.asn1 = KJUR.asn1; - exports.jws = KJUR.jws; - exports.lang = KJUR.lang; - - exports.readFileUTF8 = readFileUTF8; - exports.readFileHexByBin = readFileHexByBin; - exports.readFile = readFile; - exports.saveFile = saveFile; - exports.saveFileBinByHex = saveFileBinByHex; - - - /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(340).Buffer)) - -/***/ }), -/* 340 */ -/***/ (function(module, exports, __webpack_require__) { - - /* WEBPACK VAR INJECTION */(function(global) {/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ - /* eslint-disable no-proto */ - - 'use strict' - - var base64 = __webpack_require__(341) - var ieee754 = __webpack_require__(342) - var isArray = __webpack_require__(343) - - 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.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(exports, (function() { return this; }()))) - -/***/ }), -/* 341 */ -/***/ (function(module, exports) { - - '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 - } - - revLookup['-'.charCodeAt(0)] = 62 - revLookup['_'.charCodeAt(0)] = 63 - - function placeHoldersCount (b64) { - var len = b64.length - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 - } - - function byteLength (b64) { - // base64 is 4/3 + up to two characters of the original data - return (b64.length * 3 / 4) - placeHoldersCount(b64) - } - - function toByteArray (b64) { - var i, l, tmp, placeHolders, arr - var len = b64.length - placeHolders = placeHoldersCount(b64) - - arr = new Arr((len * 3 / 4) - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len - - var L = 0 - - for (i = 0; i < l; 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[L++] = (tmp >> 16) & 0xFF - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[L++] = tmp & 0xFF - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = 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) + (uint8[i + 1] << 8) + (uint8[i + 2]) - 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 output = '' - 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] - output += lookup[tmp >> 2] - output += lookup[(tmp << 4) & 0x3F] - output += '==' - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) - output += lookup[tmp >> 10] - output += lookup[(tmp >> 4) & 0x3F] - output += lookup[(tmp << 2) & 0x3F] - output += '=' - } - - parts.push(output) - - return parts.join('') - } - - -/***/ }), -/* 342 */ -/***/ (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) {} + /*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license + */ + var _RE_HEXDECONLY=new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]","gi");function _rsasign_getHexPaddedDigestInfoForString(d,e,a){var b=function(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>24,(d&16711680)>>16,(d&65280)>>8,d&255]))));d+=1}return b}function _rsasign_signStringPSS(e,a,d){var c=function(f){return KJUR.crypto.Util.hashHex(f,a)};var b=c(rstrtohex(e));if(d===undefined){d=-1}return this.signWithMessageHashPSS(b,a,d)}function _rsasign_signWithMessageHashPSS(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(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>(8*c-m))&255;q[0]&=~p;for(d=0;dthis.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(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(h==c)}function _rsasign_verifyWithMessageHash(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)}function _rsasign_verifyStringPSS(c,b,a,f){var e=function(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)}function _rsasign_verifyWithMessageHashPSS(f,s,l,c){var k=new BigInteger(s,16);if(k.bitLength()>this.n.bitLength()){return false}var r=function(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>(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;q0){var c=":"+j.join(":")+":";if(c.indexOf(":"+h+":")==-1){throw"algorithm '"+h+"' not accepted in the list"}}if(h!="none"&&t===null){throw"key shall be specified to verify."}if(typeof t=="string"&&t.indexOf("-----BEGIN ")!=-1){t=KEYUTIL.getKey(t)}if(s=="RS"||s=="PS"){if(!(t instanceof RSAKey)){throw"key shall be a RSAKey obj for RS* and PS* algs"}}if(s=="ES"){if(!(t instanceof KJUR.crypto.ECDSA)){throw"key shall be a ECDSA obj for ES* algs"}}if(h=="none"){}var n=null;if(m.jwsalg2sigalg[i.alg]===undefined){throw"unsupported alg name: "+h}else{n=m.jwsalg2sigalg[h]}if(n=="none"){throw"not supported"}else{if(n.substr(0,4)=="Hmac"){var k=null;if(t===undefined){throw"hexadecimal key shall be specified for HMAC"}var g=new KJUR.crypto.Mac({alg:n,pass:t});g.updateString(b);k=g.doFinal();return r==k}else{if(n.indexOf("withECDSA")!=-1){var f=null;try{f=KJUR.crypto.ECDSA.concatSigToASN1Sig(r)}catch(o){return false}var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(f)}else{var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(r)}}}};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(d,j,l){var h=KJUR.jws.JWS;var i=d.split(".");var c=i[0];var g=i[1];var m=c+"."+g;var k=b64utohex(i[2]);var f=h.readSafeJSONString(b64utoutf8(c));var e=h.readSafeJSONString(b64utoutf8(g));if(f.alg===undefined){return false}if(l.alg===undefined){throw"acceptField.alg shall be specified"}if(!h.inArray(f.alg,l.alg)){return false}if(e.iss!==undefined&&typeof l.iss==="object"){if(!h.inArray(e.iss,l.iss)){return false}}if(e.sub!==undefined&&typeof l.sub==="object"){if(!h.inArray(e.sub,l.sub)){return false}}if(e.aud!==undefined&&typeof l.aud==="object"){if(typeof e.aud=="string"){if(!h.inArray(e.aud,l.aud)){return false}}else{if(typeof e.aud=="object"){if(!h.includedArray(e.aud,l.aud)){return false}}}}var b=KJUR.jws.IntDate.getNow();if(l.verifyAt!==undefined&&typeof l.verifyAt==="number"){b=l.verifyAt}if(l.gracePeriod===undefined||typeof l.gracePeriod!=="number"){l.gracePeriod=0}if(e.exp!==undefined&&typeof e.exp=="number"){if(e.exp+l.gracePeriodj){this.aHeader.pop()}if(this.aSignature.length>j){this.aSignature.pop()}throw"addSignature failed: "+g}};this.addSignatureByHeaderKey=function(f,c){var e=b64utoutf8(this.sPayload);var d=new KJUR.jws.JWS();var g=d.generateJWSByP1PrvKey(f,e,c);this.aHeader.push(d.parsedJWS.headB64U);this.aSignature.push(d.parsedJWS.sigvalB64U)};this.addSignatureByHeaderPayloadKey=function(f,e,c){var d=new KJUR.jws.JWS();var g=d.generateJWSByP1PrvKey(f,e,c);this.aHeader.push(d.parsedJWS.headB64U);this.sPayload=d.parsedJWS.payloadB64U;this.aSignature.push(d.parsedJWS.sigvalB64U)};this.verifyAll=function(f){if(this.aHeader.length!==f.length||this.aSignature.length!==f.length){return false}for(var e=0;e0){this.aHeader=e.headers}else{throw"malformed header"}if(typeof e.payload==="string"){this.sPayload=e.payload}else{throw"malformed signatures"}if(e.signatures.length>0){this.signatures=e.signatures}else{throw"malformed signatures"}}catch(c){throw"malformed JWS-JS JSON object: "+c}}};this.getJSON=function(){return{headers:this.aHeader,payload:this.sPayload,signatures:this.aSignature}};this.isEmpty=function(){if(this.aHeader.length==0){return 1}return 0}}; + /*! nodeutil-1.0.0 (c) 2015 Kenji Urushima | kjur.github.com/jsrsasign/license + */ + function readFileUTF8(a){return __webpack_require__(340).readFileSync(a,"utf8")}function readFileHexByBin(c){var b=__webpack_require__(339);var a=__webpack_require__(340);return b.rstrtohex(a.readFileSync(c,"binary"))}function readFile(b){var a=__webpack_require__(340);return a.readFileSync(b,"binary")}function saveFile(c,b){var a=__webpack_require__(340);a.writeFileSync(c,b,"binary")}function saveFileBinByHex(e,b){var a=__webpack_require__(340);var c=__webpack_require__(339);var d=c.hextorstr(b);a.writeFileSync(e,d,"binary")}; + exports.SecureRandom = SecureRandom; + exports.rng_seed_time = rng_seed_time; - 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.BigInteger = BigInteger; + exports.RSAKey = RSAKey; + exports.ECDSA = KJUR.crypto.ECDSA; + exports.DSA = KJUR.crypto.DSA; + exports.Signature = KJUR.crypto.Signature; + exports.MessageDigest = KJUR.crypto.MessageDigest; + exports.Mac = KJUR.crypto.Mac; + exports.KEYUTIL = KEYUTIL; + exports.ASN1HEX = ASN1HEX; + exports.X509 = X509; + exports.CryptoJS = CryptoJS; - 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 - } + // ext/base64.js + exports.b64tohex = b64tohex; + exports.b64toBA = b64toBA; - 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 - } - } + // 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.b64tohex = b64tohex; + 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.newline_toUnix = newline_toUnix; + exports.newline_toDos = newline_toDos; + exports.intarystrtohex = intarystrtohex; + exports.strdiffidx = strdiffidx; - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + exports.KJUR = KJUR; + exports.crypto = KJUR.crypto; + exports.asn1 = KJUR.asn1; + exports.jws = KJUR.jws; + exports.lang = KJUR.lang; - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + exports.readFileUTF8 = readFileUTF8; + exports.readFileHexByBin = readFileHexByBin; + exports.readFile = readFile; + exports.saveFile = saveFile; + exports.saveFileBinByHex = saveFileBinByHex; - buffer[offset + i - d] |= s * 128 - } - - -/***/ }), -/* 343 */ -/***/ (function(module, exports) { - - var toString = {}.toString; - module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; - }; - + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(340).Buffer)) /***/ }), -/* 344 */ +/* 340 */ /***/ (function(module, exports) { /***/ }), -/* 345 */ +/* 341 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -13245,16 +11184,17 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.SigninRequest = undefined; var _Log = __webpack_require__(328); var _Log2 = _interopRequireDefault(_Log); - var _UrlUtility = __webpack_require__(346); + var _UrlUtility = __webpack_require__(342); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); - var _SigninState = __webpack_require__(347); + var _SigninState = __webpack_require__(343); var _SigninState2 = _interopRequireDefault(_SigninState); @@ -13263,7 +11203,7 @@ var Oidc = 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 = function () { + var SigninRequest = exports.SigninRequest = function () { function SigninRequest(_ref) { var url = _ref.url, client_id = _ref.client_id, @@ -13354,12 +11294,9 @@ var Oidc = return SigninRequest; }(); - - exports.default = SigninRequest; - module.exports = exports['default']; /***/ }), -/* 346 */ +/* 342 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -13367,6 +11304,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.UrlUtility = undefined; var _Log = __webpack_require__(328); @@ -13381,7 +11319,7 @@ var Oidc = 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 = function () { + var UrlUtility = exports.UrlUtility = function () { function UrlUtility() { _classCallCheck(this, UrlUtility); } @@ -13441,12 +11379,9 @@ var Oidc = return UrlUtility; }(); - - exports.default = UrlUtility; - module.exports = exports['default']; /***/ }), -/* 347 */ +/* 343 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -13454,6 +11389,7 @@ var Oidc = 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; }; }(); @@ -13461,11 +11397,11 @@ var Oidc = var _Log2 = _interopRequireDefault(_Log); - var _State2 = __webpack_require__(348); + var _State2 = __webpack_require__(344); var _State3 = _interopRequireDefault(_State2); - var _random = __webpack_require__(349); + var _random = __webpack_require__(345); var _random2 = _interopRequireDefault(_random); @@ -13478,7 +11414,7 @@ var Oidc = 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 = function (_State) { + var SigninState = exports.SigninState = function (_State) { _inherits(SigninState, _State); function SigninState() { @@ -13536,15 +11472,12 @@ var Oidc = return this._client_id; } }]); - + return SigninState; }(_State3.default); - - exports.default = SigninState; - module.exports = exports['default']; /***/ }), -/* 348 */ +/* 344 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -13552,6 +11485,7 @@ var Oidc = 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. @@ -13560,7 +11494,7 @@ var Oidc = var _Log2 = _interopRequireDefault(_Log); - var _random = __webpack_require__(349); + var _random = __webpack_require__(345); var _random2 = _interopRequireDefault(_random); @@ -13568,7 +11502,7 @@ var Oidc = function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var State = function () { + var State = exports.State = function () { function State() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, id = _ref.id, @@ -13610,62 +11544,44 @@ var Oidc = _Log2.default.debug("got keys", keys); var promises = []; - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - var _loop = function _loop() { - var key = _step.value; - p = storage.get(key).then(function (item) { - var remove = false; - - if (item) { - try { - var state = State.fromStorageString(item); - - _Log2.default.debug("got item from key: ", key, state.created); - - if (state.created <= cutoff) { - remove = true; - } - } catch (e) { - _Log2.default.error("Error parsing state for key", key, e.message); + + 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); + + _Log2.default.debug("got item from key: ", key, state.created); + + if (state.created <= cutoff) { remove = true; } - } else { - _Log2.default.debug("no item in storage for key: ", key); + } catch (e) { + _Log2.default.error("Error parsing state for key", key, e.message); remove = true; } + } else { + _Log2.default.debug("no item in storage for key: ", key); + remove = true; + } - if (remove) { - _Log2.default.debug("removed item for key: ", key); - return storage.remove(key); - } - }); + if (remove) { + _Log2.default.debug("removed item for key: ", key); + return storage.remove(key); + } + }); - promises.push(p); - }; + promises.push(p); + }; - for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var p; + for (var i = 0; i < keys.length; i++) { + var p; - _loop(); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } + _loop(i); } _Log2.default.debug("waiting on promise count:", promises.length); @@ -13689,15 +11605,12 @@ var Oidc = return this._created; } }]); - + return State; }(); - - exports.default = State; - module.exports = exports['default']; /***/ }), -/* 349 */ +/* 345 */ /***/ (function(module, exports) { 'use strict'; @@ -13754,7 +11667,7 @@ var Oidc = module.exports = exports['default']; /***/ }), -/* 350 */ +/* 346 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13762,11 +11675,12 @@ var Oidc = 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__(346); + var _UrlUtility = __webpack_require__(342); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); @@ -13776,7 +11690,7 @@ var Oidc = var OidcScope = "openid"; - var SigninResponse = function () { + var SigninResponse = exports.SigninResponse = function () { function SigninResponse(url) { _classCallCheck(this, SigninResponse); @@ -13830,15 +11744,12 @@ var Oidc = return this.scopes.indexOf(OidcScope) >= 0 || !!this.id_token; } }]); - + return SigninResponse; }(); - - exports.default = SigninResponse; - module.exports = exports['default']; /***/ }), -/* 351 */ +/* 347 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -13846,16 +11757,17 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.SignoutRequest = undefined; var _Log = __webpack_require__(328); var _Log2 = _interopRequireDefault(_Log); - var _UrlUtility = __webpack_require__(346); + var _UrlUtility = __webpack_require__(342); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); - var _State = __webpack_require__(348); + var _State = __webpack_require__(344); var _State2 = _interopRequireDefault(_State); @@ -13864,7 +11776,7 @@ var Oidc = 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 = function SignoutRequest(_ref) { + 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, @@ -13893,21 +11805,19 @@ var Oidc = this.url = url; }; - - exports.default = SignoutRequest; - module.exports = exports['default']; /***/ }), -/* 352 */ +/* 348 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); + exports.SignoutResponse = undefined; - var _UrlUtility = __webpack_require__(346); + var _UrlUtility = __webpack_require__(342); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); @@ -13916,23 +11826,20 @@ var Oidc = 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 = function SignoutResponse(url) { - _classCallCheck(this, SignoutResponse); + var SignoutResponse = exports.SignoutResponse = function SignoutResponse(url) { + _classCallCheck(this, SignoutResponse); - var values = _UrlUtility2.default.parseUrlFragment(url, "?"); + var values = _UrlUtility2.default.parseUrlFragment(url, "?"); - this.error = values.error; - this.error_description = values.error_description; - this.error_uri = values.error_uri; + this.error = values.error; + this.error_description = values.error_description; + this.error_uri = values.error_uri; - this.state = values.state; + this.state = values.state; }; - - exports.default = SignoutResponse; - module.exports = exports['default']; /***/ }), -/* 353 */ +/* 349 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13940,6 +11847,7 @@ var Oidc = 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. @@ -13952,7 +11860,7 @@ var Oidc = function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var InMemoryWebStorage = function () { + var InMemoryWebStorage = exports.InMemoryWebStorage = function () { function InMemoryWebStorage() { _classCallCheck(this, InMemoryWebStorage); @@ -13984,15 +11892,12 @@ var Oidc = return Object.getOwnPropertyNames(this._data).length; } }]); - + return InMemoryWebStorage; }(); - - exports.default = InMemoryWebStorage; - module.exports = exports['default']; /***/ }), -/* 354 */ +/* 350 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -14000,6 +11905,7 @@ var Oidc = 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; }; }(); @@ -14011,27 +11917,27 @@ var Oidc = var _OidcClient3 = _interopRequireDefault(_OidcClient2); - var _UserManagerSettings = __webpack_require__(355); + var _UserManagerSettings = __webpack_require__(351); var _UserManagerSettings2 = _interopRequireDefault(_UserManagerSettings); - var _User = __webpack_require__(361); + var _User = __webpack_require__(357); var _User2 = _interopRequireDefault(_User); - var _UserManagerEvents = __webpack_require__(362); + var _UserManagerEvents = __webpack_require__(358); var _UserManagerEvents2 = _interopRequireDefault(_UserManagerEvents); - var _SilentRenewService = __webpack_require__(366); + var _SilentRenewService = __webpack_require__(362); var _SilentRenewService2 = _interopRequireDefault(_SilentRenewService); - var _SessionMonitor = __webpack_require__(367); + var _SessionMonitor = __webpack_require__(363); var _SessionMonitor2 = _interopRequireDefault(_SessionMonitor); - var _TokenRevocationClient = __webpack_require__(369); + var _TokenRevocationClient = __webpack_require__(365); var _TokenRevocationClient2 = _interopRequireDefault(_TokenRevocationClient); @@ -14044,7 +11950,7 @@ var Oidc = 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 = function (_OidcClient) { + var UserManager = exports.UserManager = function (_OidcClient) { _inherits(UserManager, _OidcClient); function UserManager() { @@ -14367,7 +12273,7 @@ var Oidc = 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 + // 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 @@ -14572,15 +12478,12 @@ var Oidc = return 'user:' + this.settings.authority + ':' + this.settings.client_id; } }]); - + return UserManager; }(_OidcClient3.default); - - exports.default = UserManager; - module.exports = exports['default']; /***/ }), -/* 355 */ +/* 351 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -14588,6 +12491,7 @@ var Oidc = 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; }; }(); @@ -14599,15 +12503,15 @@ var Oidc = var _OidcClientSettings3 = _interopRequireDefault(_OidcClientSettings2); - var _RedirectNavigator = __webpack_require__(356); + var _RedirectNavigator = __webpack_require__(352); var _RedirectNavigator2 = _interopRequireDefault(_RedirectNavigator); - var _PopupNavigator = __webpack_require__(357); + var _PopupNavigator = __webpack_require__(353); var _PopupNavigator2 = _interopRequireDefault(_PopupNavigator); - var _IFrameNavigator = __webpack_require__(359); + var _IFrameNavigator = __webpack_require__(355); var _IFrameNavigator2 = _interopRequireDefault(_IFrameNavigator); @@ -14631,7 +12535,7 @@ var Oidc = var DefaultAccessTokenExpiringNotificationTime = 60; var DefaultCheckSessionInterval = 2000; - var UserManagerSettings = function (_OidcClientSettings) { + var UserManagerSettings = exports.UserManagerSettings = function (_OidcClientSettings) { _inherits(UserManagerSettings, _OidcClientSettings); function UserManagerSettings() { @@ -14771,15 +12675,12 @@ var Oidc = return this._userStore; } }]); - + return UserManagerSettings; }(_OidcClientSettings3.default); - - exports.default = UserManagerSettings; - module.exports = exports['default']; /***/ }), -/* 356 */ +/* 352 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14787,6 +12688,7 @@ var Oidc = 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. @@ -14799,7 +12701,7 @@ var Oidc = function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var RedirectNavigator = function () { + var RedirectNavigator = exports.RedirectNavigator = function () { function RedirectNavigator() { _classCallCheck(this, RedirectNavigator); } @@ -14828,15 +12730,12 @@ var Oidc = return window.location.href; } }]); - + return RedirectNavigator; }(); - - exports.default = RedirectNavigator; - module.exports = exports['default']; /***/ }), -/* 357 */ +/* 353 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -14844,12 +12743,13 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.PopupNavigator = undefined; var _Log = __webpack_require__(328); var _Log2 = _interopRequireDefault(_Log); - var _PopupWindow = __webpack_require__(358); + var _PopupWindow = __webpack_require__(354); var _PopupWindow2 = _interopRequireDefault(_PopupWindow); @@ -14858,7 +12758,7 @@ var Oidc = 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 = function () { + var PopupNavigator = exports.PopupNavigator = function () { function PopupNavigator() { _classCallCheck(this, PopupNavigator); } @@ -14881,12 +12781,9 @@ var Oidc = return PopupNavigator; }(); - - exports.default = PopupNavigator; - module.exports = exports['default']; /***/ }), -/* 358 */ +/* 354 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -14894,6 +12791,7 @@ var Oidc = 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. @@ -14902,7 +12800,7 @@ var Oidc = var _Log2 = _interopRequireDefault(_Log); - var _UrlUtility = __webpack_require__(346); + var _UrlUtility = __webpack_require__(342); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); @@ -14916,7 +12814,7 @@ var Oidc = var DefaultPopupTarget = "_blank"; - var PopupWindow = function () { + var PopupWindow = exports.PopupWindow = function () { function PopupWindow(params) { var _this = this; @@ -15044,15 +12942,12 @@ var Oidc = return this._promise; } }]); - + return PopupWindow; }(); - - exports.default = PopupWindow; - module.exports = exports['default']; /***/ }), -/* 359 */ +/* 355 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -15060,12 +12955,13 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.IFrameNavigator = undefined; var _Log = __webpack_require__(328); var _Log2 = _interopRequireDefault(_Log); - var _IFrameWindow = __webpack_require__(360); + var _IFrameWindow = __webpack_require__(356); var _IFrameWindow2 = _interopRequireDefault(_IFrameWindow); @@ -15074,7 +12970,7 @@ var Oidc = 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 = function () { + var IFrameNavigator = exports.IFrameNavigator = function () { function IFrameNavigator() { _classCallCheck(this, IFrameNavigator); } @@ -15097,12 +12993,9 @@ var Oidc = return IFrameNavigator; }(); - - exports.default = IFrameNavigator; - module.exports = exports['default']; /***/ }), -/* 360 */ +/* 356 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15110,6 +13003,7 @@ var Oidc = 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. @@ -15124,7 +13018,7 @@ var Oidc = var DefaultTimeout = 10000; - var IFrameWindow = function () { + var IFrameWindow = exports.IFrameWindow = function () { function IFrameWindow(params) { var _this = this; @@ -15240,15 +13134,12 @@ var Oidc = return location.protocol + "//" + location.host; } }]); - + return IFrameWindow; }(); - - exports.default = IFrameWindow; - module.exports = exports['default']; /***/ }), -/* 361 */ +/* 357 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15256,6 +13147,7 @@ var Oidc = 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. @@ -15268,7 +13160,7 @@ var Oidc = function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var User = function () { + var User = exports.User = function () { function User(_ref) { var id_token = _ref.id_token, session_state = _ref.session_state, @@ -15333,15 +13225,12 @@ var Oidc = return (this.scope || "").split(" "); } }]); - + return User; }(); - - exports.default = User; - module.exports = exports['default']; /***/ }), -/* 362 */ +/* 358 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -15349,16 +13238,17 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.UserManagerEvents = undefined; var _Log = __webpack_require__(328); var _Log2 = _interopRequireDefault(_Log); - var _AccessTokenEvents2 = __webpack_require__(363); + var _AccessTokenEvents2 = __webpack_require__(359); var _AccessTokenEvents3 = _interopRequireDefault(_AccessTokenEvents2); - var _Event = __webpack_require__(365); + var _Event = __webpack_require__(361); var _Event2 = _interopRequireDefault(_Event); @@ -15371,7 +13261,7 @@ var Oidc = 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 = function (_AccessTokenEvents) { + var UserManagerEvents = exports.UserManagerEvents = function (_AccessTokenEvents) { _inherits(UserManagerEvents, _AccessTokenEvents); function UserManagerEvents(settings) { @@ -15460,12 +13350,9 @@ var Oidc = return UserManagerEvents; }(_AccessTokenEvents3.default); - - exports.default = UserManagerEvents; - module.exports = exports['default']; /***/ }), -/* 363 */ +/* 359 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -15473,12 +13360,13 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.AccessTokenEvents = undefined; var _Log = __webpack_require__(328); var _Log2 = _interopRequireDefault(_Log); - var _Timer = __webpack_require__(364); + var _Timer = __webpack_require__(360); var _Timer2 = _interopRequireDefault(_Timer); @@ -15489,7 +13377,7 @@ var Oidc = var DefaultAccessTokenExpiringNotificationTime = 60; // seconds - var AccessTokenEvents = function () { + var AccessTokenEvents = exports.AccessTokenEvents = function () { function AccessTokenEvents() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime, @@ -15563,12 +13451,9 @@ var Oidc = return AccessTokenEvents; }(); - - exports.default = AccessTokenEvents; - module.exports = exports['default']; /***/ }), -/* 364 */ +/* 360 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -15576,6 +13461,7 @@ var Oidc = 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; }; }(); @@ -15587,7 +13473,7 @@ var Oidc = var _Global2 = _interopRequireDefault(_Global); - var _Event2 = __webpack_require__(365); + var _Event2 = __webpack_require__(361); var _Event3 = _interopRequireDefault(_Event2); @@ -15602,7 +13488,7 @@ var Oidc = var TimerDuration = 5; // seconds - var Timer = function (_Event) { + var Timer = exports.Timer = function (_Event) { _inherits(Timer, _Event); function Timer(name) { @@ -15630,8 +13516,8 @@ var Oidc = _Log2.default.debug("Timer.init timer " + this._name + " for duration:", duration); this._expiration = this.now + duration; - // 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 + // 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) { @@ -15664,15 +13550,12 @@ var Oidc = return parseInt(this._nowFunc()); } }]); - + return Timer; }(_Event3.default); - - exports.default = Timer; - module.exports = exports['default']; /***/ }), -/* 365 */ +/* 361 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15680,6 +13563,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.Event = undefined; var _Log = __webpack_require__(328); @@ -15690,7 +13574,7 @@ var Oidc = 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 = function () { + var Event = exports.Event = function () { function Event(name) { _classCallCheck(this, Event); @@ -15713,40 +13597,18 @@ var Oidc = Event.prototype.raise = function raise() { _Log2.default.debug("Raising event: " + this._name); - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = this._callbacks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var cb = _step.value; + for (var i = 0; i < this._callbacks.length; i++) { + var _callbacks; - cb.apply(undefined, arguments); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } + (_callbacks = this._callbacks)[i].apply(_callbacks, arguments); } }; return Event; }(); - - exports.default = Event; - module.exports = exports['default']; /***/ }), -/* 366 */ +/* 362 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15754,6 +13616,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.SilentRenewService = undefined; var _Log = __webpack_require__(328); @@ -15764,7 +13627,7 @@ var Oidc = 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 = function () { + var SilentRenewService = exports.SilentRenewService = function () { function SilentRenewService(userManager) { _classCallCheck(this, SilentRenewService); @@ -15808,12 +13671,9 @@ var Oidc = return SilentRenewService; }(); - - exports.default = SilentRenewService; - module.exports = exports['default']; /***/ }), -/* 367 */ +/* 363 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -15821,6 +13681,7 @@ var Oidc = 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. @@ -15829,7 +13690,7 @@ var Oidc = var _Log2 = _interopRequireDefault(_Log); - var _CheckSessionIFrame = __webpack_require__(368); + var _CheckSessionIFrame = __webpack_require__(364); var _CheckSessionIFrame2 = _interopRequireDefault(_CheckSessionIFrame); @@ -15837,7 +13698,7 @@ var Oidc = function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var SessionMonitor = function () { + var SessionMonitor = exports.SessionMonitor = function () { function SessionMonitor(userManager) { var _this = this; @@ -15969,15 +13830,12 @@ var Oidc = return this._settings.checkSessionInterval; } }]); - + return SessionMonitor; }(); - - exports.default = SessionMonitor; - module.exports = exports['default']; /***/ }), -/* 368 */ +/* 364 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15985,6 +13843,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.CheckSessionIFrame = undefined; var _Log = __webpack_require__(328); @@ -15997,7 +13856,7 @@ var Oidc = var DefaultInterval = 2000; - var CheckSessionIFrame = function () { + var CheckSessionIFrame = exports.CheckSessionIFrame = function () { function CheckSessionIFrame(callback, client_id, url, interval) { _classCallCheck(this, CheckSessionIFrame); @@ -16079,12 +13938,9 @@ var Oidc = return CheckSessionIFrame; }(); - - exports.default = CheckSessionIFrame; - module.exports = exports['default']; /***/ }), -/* 369 */ +/* 365 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -16092,6 +13948,7 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.TokenRevocationClient = undefined; var _Log = __webpack_require__(328); @@ -16112,7 +13969,7 @@ var Oidc = var AccessTokenTypeHint = "access_token"; - var TokenRevocationClient = function () { + var TokenRevocationClient = exports.TokenRevocationClient = function () { function TokenRevocationClient(settings) { var XMLHttpRequestCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _Global2.default.XMLHttpRequest; var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService2.default; @@ -16190,12 +14047,9 @@ var Oidc = return TokenRevocationClient; }(); - - exports.default = TokenRevocationClient; - module.exports = exports['default']; /***/ }), -/* 370 */ +/* 366 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -16203,12 +14057,13 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.CordovaPopupNavigator = undefined; var _Log = __webpack_require__(328); var _Log2 = _interopRequireDefault(_Log); - var _CordovaPopupWindow = __webpack_require__(371); + var _CordovaPopupWindow = __webpack_require__(367); var _CordovaPopupWindow2 = _interopRequireDefault(_CordovaPopupWindow); @@ -16217,7 +14072,7 @@ var Oidc = 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 = function () { + var CordovaPopupNavigator = exports.CordovaPopupNavigator = function () { function CordovaPopupNavigator() { _classCallCheck(this, CordovaPopupNavigator); } @@ -16229,12 +14084,9 @@ var Oidc = return CordovaPopupNavigator; }(); - - exports.default = CordovaPopupNavigator; - module.exports = exports['default']; /***/ }), -/* 371 */ +/* 367 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -16242,6 +14094,7 @@ var Oidc = 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. @@ -16257,7 +14110,7 @@ var Oidc = var DefaultPopupFeatures = 'location=no,toolbar=no,zoom=no'; var DefaultPopupTarget = "_blank"; - var CordovaPopupWindow = function () { + var CordovaPopupWindow = exports.CordovaPopupWindow = function () { function CordovaPopupWindow(params) { var _this = this; @@ -16358,15 +14211,12 @@ var Oidc = return this._promise; } }]); - + return CordovaPopupWindow; }(); - - exports.default = CordovaPopupWindow; - module.exports = exports['default']; /***/ }), -/* 372 */ +/* 368 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -16374,12 +14224,13 @@ var Oidc = Object.defineProperty(exports, "__esModule", { value: true }); + exports.CordovaIFrameNavigator = undefined; var _Log = __webpack_require__(328); var _Log2 = _interopRequireDefault(_Log); - var _CordovaPopupWindow = __webpack_require__(371); + var _CordovaPopupWindow = __webpack_require__(367); var _CordovaPopupWindow2 = _interopRequireDefault(_CordovaPopupWindow); @@ -16388,7 +14239,7 @@ var Oidc = 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 = function () { + var CordovaIFrameNavigator = exports.CordovaIFrameNavigator = function () { function CordovaIFrameNavigator() { _classCallCheck(this, CordovaIFrameNavigator); } @@ -16401,10 +14252,7 @@ var Oidc = return CordovaIFrameNavigator; }(); - - exports.default = CordovaIFrameNavigator; - module.exports = exports['default']; /***/ }) /******/ ]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgODJlZTdmZjQ0YzMzMDcxYzlhN2QiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19oYXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19mYWlscy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19jdHguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX21ldGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLWV4dC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZW51bS1rZXlzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3RvLWlvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2lvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2NvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2VudW0tYnVnLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXNhcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc2FtZS12YWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYmluZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXdzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hLW51bWJlci12YWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXJlcGVhdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1sb2cxcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hc2luaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jYnJ0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLXNpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2x6MzIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5leHBtMS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1leHBtMS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtZnJvdW5kLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmh5cG90LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmltdWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaWduLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50cnVuYy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1jb250ZXh0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLWlzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5hbmNob3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1odG1sLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250Y29sb3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5saW5rLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdWIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUubm93LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2RhdGUtdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmpvaW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmljdC1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNsaWNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb3J0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm1hcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb21lLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWxsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1maWxsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19mbGFncy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2ZpeC1yZS13a3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fcHJvbWlzZS1yZXNvbHZlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi1zdHJvbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnNldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50OC1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1jbGFtcGVkLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQxNi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDMyLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX293bi1rZXlzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmZsYXQtbWFwLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19mbGF0dGVuLWludG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXBhZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1mb3JjZWQtcGFtLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLXNldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAudG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi10by1qc29uLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQudG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWFwLm9mLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc2V0Lm9mLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1zZXQub2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC5mcm9tLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1tYXAuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1zZXQuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zeXN0ZW0uZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5lcnJvci5pcy1lcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5jbGFtcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5kZWctcGVyLXJhZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5kZWdyZWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmZzY2FsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1zY2FsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pYWRkaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pc3ViaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pbXVsaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5yYWQtcGVyLWRlZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5yYWRpYW5zLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNjYWxlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnVtdWxoLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNpZ25iaXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lm1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5hc2FwLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL34vcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9mbi9yZWdleHAvZXNjYXBlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2NvcmUucmVnZXhwLmVzY2FwZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fcmVwbGFjZXIuanMiLCJ3ZWJwYWNrOi8vLy4vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvT2lkY0NsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvT2lkY0NsaWVudFNldHRpbmdzLmpzIiwid2VicGFjazovLy8uL3NyYy9XZWJTdG9yYWdlU3RhdGVTdG9yZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvR2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9SZXNwb25zZVZhbGlkYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvTWV0YWRhdGFTZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Kc29uU2VydmljZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlckluZm9TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9FcnJvclJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Kb3NlVXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2pzcnNhc2lnbi9saWIvanNyc2FzaWduLmpzIiwid2VicGFjazovLy8uL34vYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYmFzZTY0LWpzL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vaWVlZTc1NC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VybFV0aWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblN0YXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9TdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmFuZG9tLmpzIiwid2VicGFjazovLy8uL3NyYy9TaWduaW5SZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbm91dFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25vdXRSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSW5NZW1vcnlXZWJTdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VyTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlck1hbmFnZXJTZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvUmVkaXJlY3ROYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1BvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Qb3B1cFdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSUZyYW1lTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9JRnJhbWVXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXJNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVGltZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0V2ZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9TaWxlbnRSZW5ld1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Nlc3Npb25Nb25pdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9DaGVja1Nlc3Npb25JRnJhbWUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Rva2VuUmV2b2NhdGlvbkNsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiXSwibmFtZXMiOlsiTG9nIiwicmVxdWlyZSIsIk9pZGNDbGllbnQiLCJPaWRjQ2xpZW50U2V0dGluZ3MiLCJXZWJTdG9yYWdlU3RhdGVTdG9yZSIsIkluTWVtb3J5V2ViU3RvcmFnZSIsIlVzZXJNYW5hZ2VyIiwiQWNjZXNzVG9rZW5FdmVudHMiLCJNZXRhZGF0YVNlcnZpY2UiLCJDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3IiLCJDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yIiwiQ2hlY2tTZXNzaW9uSUZyYW1lIiwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50IiwiU2Vzc2lvbk1vbml0b3IiLCJHbG9iYWwiLCJVc2VyIiwibm9wTG9nZ2VyIiwiZGVidWciLCJpbmZvIiwid2FybiIsImVycm9yIiwiTk9ORSIsIkVSUk9SIiwiV0FSTiIsIklORk8iLCJERUJVRyIsImxvZ2dlciIsImxldmVsIiwicmVzZXQiLCJhcmdzIiwiYXBwbHkiLCJBcnJheSIsImZyb20iLCJ2YWx1ZSIsIkVycm9yIiwic2V0dGluZ3MiLCJfc2V0dGluZ3MiLCJjcmVhdGVTaWduaW5SZXF1ZXN0IiwicmVzcG9uc2VfdHlwZSIsInNjb3BlIiwicmVkaXJlY3RfdXJpIiwiZGF0YSIsInN0YXRlIiwicHJvbXB0IiwiZGlzcGxheSIsIm1heF9hZ2UiLCJ1aV9sb2NhbGVzIiwiaWRfdG9rZW5faGludCIsImxvZ2luX2hpbnQiLCJhY3JfdmFsdWVzIiwicmVzb3VyY2UiLCJyZXF1ZXN0IiwicmVxdWVzdF91cmkiLCJleHRyYVF1ZXJ5UGFyYW1zIiwic3RhdGVTdG9yZSIsImNsaWVudF9pZCIsImF1dGhvcml0eSIsIl9tZXRhZGF0YVNlcnZpY2UiLCJnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQiLCJ0aGVuIiwidXJsIiwic2lnbmluUmVxdWVzdCIsInNpZ25pblN0YXRlIiwiX3N0YXRlU3RvcmUiLCJzZXQiLCJpZCIsInRvU3RvcmFnZVN0cmluZyIsInByb2Nlc3NTaWduaW5SZXNwb25zZSIsInJlc3BvbnNlIiwiUHJvbWlzZSIsInJlamVjdCIsInJlbW92ZSIsInN0b3JlZFN0YXRlU3RyaW5nIiwiZnJvbVN0b3JhZ2VTdHJpbmciLCJfdmFsaWRhdG9yIiwidmFsaWRhdGVTaWduaW5SZXNwb25zZSIsImNyZWF0ZVNpZ25vdXRSZXF1ZXN0IiwicG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiZ2V0RW5kU2Vzc2lvbkVuZHBvaW50Iiwic2lnbm91dFN0YXRlIiwicHJvY2Vzc1NpZ25vdXRSZXNwb25zZSIsInJlc29sdmUiLCJzdGF0ZUtleSIsInZhbGlkYXRlU2lnbm91dFJlc3BvbnNlIiwiY2xlYXJTdGFsZVN0YXRlIiwic3RhbGVTdGF0ZUFnZSIsInZhbGlkYXRvciIsIm1ldGFkYXRhU2VydmljZSIsIk9pZGNNZXRhZGF0YVVybFBhdGgiLCJEZWZhdWx0UmVzcG9uc2VUeXBlIiwiRGVmYXVsdFNjb3BlIiwiRGVmYXVsdFN0YWxlU3RhdGVBZ2UiLCJEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzIiwibWV0YWRhdGFVcmwiLCJtZXRhZGF0YSIsInNpZ25pbmdLZXlzIiwiY2xpZW50X3NlY3JldCIsImZpbHRlclByb3RvY29sQ2xhaW1zIiwibG9hZFVzZXJJbmZvIiwiY2xvY2tTa2V3IiwiUmVzcG9uc2VWYWxpZGF0b3JDdG9yIiwiTWV0YWRhdGFTZXJ2aWNlQ3RvciIsIl9hdXRob3JpdHkiLCJfbWV0YWRhdGFVcmwiLCJfbWV0YWRhdGEiLCJfc2lnbmluZ0tleXMiLCJfY2xpZW50X2lkIiwiX2NsaWVudF9zZWNyZXQiLCJfcmVzcG9uc2VfdHlwZSIsIl9zY29wZSIsIl9yZWRpcmVjdF91cmkiLCJfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX3Byb21wdCIsIl9kaXNwbGF5IiwiX21heF9hZ2UiLCJfdWlfbG9jYWxlcyIsIl9hY3JfdmFsdWVzIiwiX3Jlc291cmNlIiwiX2ZpbHRlclByb3RvY29sQ2xhaW1zIiwiX2xvYWRVc2VySW5mbyIsIl9zdGFsZVN0YXRlQWdlIiwiX2Nsb2NrU2tldyIsIl9leHRyYVF1ZXJ5UGFyYW1zIiwiaW5kZXhPZiIsImxlbmd0aCIsInByZWZpeCIsInN0b3JlIiwibG9jYWxTdG9yYWdlIiwiX3N0b3JlIiwiX3ByZWZpeCIsImtleSIsInNldEl0ZW0iLCJnZXQiLCJpdGVtIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJnZXRBbGxLZXlzIiwia2V5cyIsImluZGV4IiwicHVzaCIsInN1YnN0ciIsInRpbWVyIiwic2V0SW50ZXJ2YWwiLCJjYiIsImR1cmF0aW9uIiwiY2xlYXJJbnRlcnZhbCIsImhhbmRsZSIsInRlc3RpbmciLCJfdGVzdGluZyIsInNldFhNTEh0dHBSZXF1ZXN0IiwibmV3UmVxdWVzdCIsImxvY2F0aW9uIiwic2Vzc2lvblN0b3JhZ2UiLCJYTUxIdHRwUmVxdWVzdCIsIlByb3RvY29sQ2xhaW1zIiwiUmVzcG9uc2VWYWxpZGF0b3IiLCJVc2VySW5mb1NlcnZpY2VDdG9yIiwiam9zZVV0aWwiLCJfdXNlckluZm9TZXJ2aWNlIiwiX2pvc2VVdGlsIiwiX3Byb2Nlc3NTaWduaW5QYXJhbXMiLCJfdmFsaWRhdGVUb2tlbnMiLCJfcHJvY2Vzc0NsYWltcyIsIm5vbmNlIiwiaWRfdG9rZW4iLCJpc09wZW5JZENvbm5lY3QiLCJwcm9maWxlIiwiYWNjZXNzX3Rva2VuIiwiZ2V0Q2xhaW1zIiwiY2xhaW1zIiwic3ViIiwiX21lcmdlQ2xhaW1zIiwiY2xhaW1zMSIsImNsYWltczIiLCJyZXN1bHQiLCJPYmplY3QiLCJhc3NpZ24iLCJuYW1lIiwidmFsdWVzIiwiaXNBcnJheSIsImZvckVhY2giLCJ0eXBlIiwiX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuIiwiX3ZhbGlkYXRlSWRUb2tlbiIsIl92YWxpZGF0ZUFjY2Vzc1Rva2VuIiwiand0IiwicGFyc2VKd3QiLCJoZWFkZXIiLCJwYXlsb2FkIiwia2lkIiwiZ2V0SXNzdWVyIiwiZ2V0U2lnbmluZ0tleXMiLCJfZmlsdGVyQnlBbGciLCJhbGciLCJmaWx0ZXIiLCJhdWRpZW5jZSIsImNsb2NrU2tld0luU2Vjb25kcyIsInZhbGlkYXRlSnd0IiwiaXNzdWVyIiwia3R5Iiwic3RhcnRzV2l0aCIsImF0X2hhc2giLCJoYXNoQWxnIiwiaGFzaEJpdHMiLCJwYXJzZUludCIsInNoYSIsImhhc2giLCJoYXNoU3RyaW5nIiwibGVmdCIsImxlZnRfYjY0dSIsImhleFRvQmFzZTY0VXJsIiwiSnNvblNlcnZpY2VDdG9yIiwiX2pzb25TZXJ2aWNlIiwiZ2V0TWV0YWRhdGEiLCJnZXRKc29uIiwiX2dldE1ldGFkYXRhUHJvcGVydHkiLCJnZXRVc2VySW5mb0VuZHBvaW50IiwiZ2V0VG9rZW5FbmRwb2ludCIsImdldENoZWNrU2Vzc2lvbklmcmFtZSIsImdldFJldm9jYXRpb25FbmRwb2ludCIsIm9wdGlvbmFsIiwidW5kZWZpbmVkIiwiandrc191cmkiLCJrZXlTZXQiLCJKc29uU2VydmljZSIsIlhNTEh0dHBSZXF1ZXN0Q3RvciIsIl9YTUxIdHRwUmVxdWVzdCIsInRva2VuIiwicmVxIiwib3BlbiIsIm9ubG9hZCIsInN0YXR1cyIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsImUiLCJtZXNzYWdlIiwic3RhdHVzVGV4dCIsIm9uZXJyb3IiLCJzZXRSZXF1ZXN0SGVhZGVyIiwic2VuZCIsIlVzZXJJbmZvU2VydmljZSIsIkVycm9yUmVzcG9uc2UiLCJlcnJvcl9kZXNjcmlwdGlvbiIsImVycm9yX3VyaSIsIkFsbG93ZWRTaWduaW5nQWxncyIsIkpvc2VVdGlsIiwiSldTIiwiaGVhZGVyT2JqIiwicGF5bG9hZE9iaiIsIm5vdyIsIm4iLCJnZXRLZXkiLCJ4NWMiLCJnZXRQdWJsaWNLZXlGcm9tQ2VydFBFTSIsImNydiIsIngiLCJ5IiwiX3ZhbGlkYXRlSnd0IiwiRGF0ZSIsImlzcyIsImF1ZCIsInZhbGlkQXVkaWVuY2UiLCJsb3dlck5vdyIsInVwcGVyTm93IiwiaWF0IiwibmJmIiwiZXhwIiwidmVyaWZ5IiwiVXRpbCIsIlNpZ25pblJlcXVlc3QiLCJvaWRjIiwiaXNPaWRjIiwiYWRkUXVlcnlQYXJhbSIsInNwbGl0IiwiaXNPQXV0aCIsIlVybFV0aWxpdHkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJwYXJzZVVybEZyYWdtZW50IiwiZGVsaW1pdGVyIiwiZ2xvYmFsIiwiaHJlZiIsImlkeCIsImxhc3RJbmRleE9mIiwicGFyYW1zIiwicmVnZXgiLCJtIiwiY291bnRlciIsImV4ZWMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJwcm9wIiwiU2lnbmluU3RhdGUiLCJhcmd1bWVudHMiLCJfbm9uY2UiLCJzdHJpbmdpZnkiLCJjcmVhdGVkIiwic3RvcmFnZVN0cmluZyIsIlN0YXRlIiwiX2lkIiwiX2RhdGEiLCJfY3JlYXRlZCIsInN0b3JhZ2UiLCJhZ2UiLCJjdXRvZmYiLCJwcm9taXNlcyIsInAiLCJhbGwiLCJyYW5kb20iLCJndWlkSG9sZGVyIiwiaGV4IiwiciIsImd1aWRSZXNwb25zZSIsImkiLCJNYXRoIiwiT2lkY1Njb3BlIiwiU2lnbmluUmVzcG9uc2UiLCJzZXNzaW9uX3N0YXRlIiwidG9rZW5fdHlwZSIsImV4cGlyZXNfaW4iLCJleHBpcmVzX2F0Iiwic2NvcGVzIiwiU2lnbm91dFJlcXVlc3QiLCJTaWdub3V0UmVzcG9uc2UiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciIsIlNlc3Npb25Nb25pdG9yQ3RvciIsIlRva2VuUmV2b2NhdGlvbkNsaWVudEN0b3IiLCJfZXZlbnRzIiwiX3NpbGVudFJlbmV3U2VydmljZSIsImF1dG9tYXRpY1NpbGVudFJlbmV3Iiwic3RhcnRTaWxlbnRSZW5ldyIsIm1vbml0b3JTZXNzaW9uIiwiX3Nlc3Npb25Nb25pdG9yIiwiX3Rva2VuUmV2b2NhdGlvbkNsaWVudCIsImdldFVzZXIiLCJfbG9hZFVzZXIiLCJ1c2VyIiwibG9hZCIsInJlbW92ZVVzZXIiLCJzdG9yZVVzZXIiLCJ1bmxvYWQiLCJzaWduaW5SZWRpcmVjdCIsIl9zaWduaW5TdGFydCIsIl9yZWRpcmVjdE5hdmlnYXRvciIsInNpZ25pblJlZGlyZWN0Q2FsbGJhY2siLCJfc2lnbmluRW5kIiwic2lnbmluUG9wdXAiLCJwb3B1cF9yZWRpcmVjdF91cmkiLCJfc2lnbmluIiwiX3BvcHVwTmF2aWdhdG9yIiwic3RhcnRVcmwiLCJwb3B1cFdpbmRvd0ZlYXR1cmVzIiwicG9wdXBXaW5kb3dUYXJnZXQiLCJzaWduaW5Qb3B1cENhbGxiYWNrIiwiX3NpZ25pbkNhbGxiYWNrIiwic2lnbmluU2lsZW50Iiwic2lsZW50X3JlZGlyZWN0X3VyaSIsInNldElkVG9rZW4iLCJpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXciLCJfaWZyYW1lTmF2aWdhdG9yIiwic2lsZW50UmVxdWVzdFRpbWVvdXQiLCJzaWduaW5TaWxlbnRDYWxsYmFjayIsInF1ZXJ5U2Vzc2lvblN0YXR1cyIsIm5hdlJlc3BvbnNlIiwic2lnbmluUmVzcG9uc2UiLCJzaWQiLCJuYXZpZ2F0b3IiLCJuYXZpZ2F0b3JQYXJhbXMiLCJwcmVwYXJlIiwibmF2aWdhdGUiLCJjYXRjaCIsImNsb3NlIiwiZXJyIiwiY2FsbGJhY2siLCJzaWdub3V0UmVkaXJlY3QiLCJwb3N0TG9nb3V0UmVkaXJlY3RVcmkiLCJfc2lnbm91dFN0YXJ0Iiwic2lnbm91dFJlZGlyZWN0Q2FsbGJhY2siLCJfc2lnbm91dEVuZCIsInNpZ25vdXRQb3B1cCIsInBvcHVwX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSIsIl9zaWdub3V0Iiwic2lnbm91dFBvcHVwQ2FsbGJhY2siLCJrZWVwT3BlbiIsInJldm9rZVByb21pc2UiLCJyZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCIsIl9yZXZva2VJbnRlcm5hbCIsInNpZ25vdXRSZXF1ZXN0Iiwic2lnbm91dFJlc3BvbnNlIiwicmV2b2tlQWNjZXNzVG9rZW4iLCJzdWNjZXNzIiwicmVxdWlyZWQiLCJyZXZva2UiLCJzdGFydCIsInN0b3BTaWxlbnRSZW5ldyIsInN0b3AiLCJfdXNlclN0b3JlIiwiX3VzZXJTdG9yZUtleSIsInJlZGlyZWN0TmF2aWdhdG9yIiwicG9wdXBOYXZpZ2F0b3IiLCJpZnJhbWVOYXZpZ2F0b3IiLCJ1c2VyU3RvcmUiLCJEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUiLCJEZWZhdWx0Q2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJVc2VyTWFuYWdlclNldHRpbmdzIiwiY2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSIsIl9wb3B1cF9yZWRpcmVjdF91cmkiLCJfcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX3BvcHVwV2luZG93RmVhdHVyZXMiLCJfcG9wdXBXaW5kb3dUYXJnZXQiLCJfc2lsZW50X3JlZGlyZWN0X3VyaSIsIl9zaWxlbnRSZXF1ZXN0VGltZW91dCIsIl9hdXRvbWF0aWNTaWxlbnRSZW5ldyIsIl9pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXciLCJfYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUiLCJfbW9uaXRvclNlc3Npb24iLCJfY2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJfcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQiLCJSZWRpcmVjdE5hdmlnYXRvciIsIndpbmRvdyIsIlBvcHVwTmF2aWdhdG9yIiwicG9wdXAiLCJub3RpZnlPcGVuZXIiLCJDaGVja0ZvclBvcHVwQ2xvc2VkSW50ZXJ2YWwiLCJEZWZhdWx0UG9wdXBGZWF0dXJlcyIsIkRlZmF1bHRQb3B1cFRhcmdldCIsIlBvcHVwV2luZG93IiwiX3Byb21pc2UiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJ0YXJnZXQiLCJmZWF0dXJlcyIsIl9wb3B1cCIsIl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIiLCJfY2hlY2tGb3JQb3B1cENsb3NlZCIsImJpbmQiLCJfZXJyb3IiLCJfY2FsbGJhY2siLCJmb2N1cyIsInByb21pc2UiLCJfc3VjY2VzcyIsIl9jbGVhbnVwIiwiY2xvc2VkIiwib3BlbmVyIiwiSUZyYW1lTmF2aWdhdG9yIiwiZnJhbWUiLCJub3RpZnlQYXJlbnQiLCJEZWZhdWx0VGltZW91dCIsIklGcmFtZVdpbmRvdyIsIl9ib3VuZE1lc3NhZ2VFdmVudCIsIl9tZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9mcmFtZSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwidmlzaWJpbGl0eSIsInBvc2l0aW9uIiwid2lkdGgiLCJoZWlnaHQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJ0aW1lb3V0IiwiX3RpbWVyIiwic2V0VGltZW91dCIsIl90aW1lb3V0Iiwic3JjIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNsZWFyVGltZW91dCIsInJlbW92ZUNoaWxkIiwib3JpZ2luIiwiX29yaWdpbiIsInNvdXJjZSIsImNvbnRlbnRXaW5kb3ciLCJwYXJlbnQiLCJwb3N0TWVzc2FnZSIsInByb3RvY29sIiwiaG9zdCIsIlVzZXJNYW5hZ2VyRXZlbnRzIiwiX3VzZXJMb2FkZWQiLCJfdXNlclVubG9hZGVkIiwiX3NpbGVudFJlbmV3RXJyb3IiLCJfdXNlclNpZ25lZE91dCIsIl91c2VyU2Vzc2lvbkNoYW5nZWQiLCJyYWlzZUV2ZW50IiwicmFpc2UiLCJhZGRVc2VyTG9hZGVkIiwiYWRkSGFuZGxlciIsInJlbW92ZVVzZXJMb2FkZWQiLCJyZW1vdmVIYW5kbGVyIiwiYWRkVXNlclVubG9hZGVkIiwicmVtb3ZlVXNlclVubG9hZGVkIiwiYWRkU2lsZW50UmVuZXdFcnJvciIsInJlbW92ZVNpbGVudFJlbmV3RXJyb3IiLCJfcmFpc2VTaWxlbnRSZW5ld0Vycm9yIiwiYWRkVXNlclNpZ25lZE91dCIsInJlbW92ZVVzZXJTaWduZWRPdXQiLCJfcmFpc2VVc2VyU2lnbmVkT3V0IiwiYWRkVXNlclNlc3Npb25DaGFuZ2VkIiwicmVtb3ZlVXNlclNlc3Npb25DaGFuZ2VkIiwiX3JhaXNlVXNlclNlc3Npb25DaGFuZ2VkIiwiYWNjZXNzVG9rZW5FeHBpcmluZ1RpbWVyIiwiYWNjZXNzVG9rZW5FeHBpcmVkVGltZXIiLCJfYWNjZXNzVG9rZW5FeHBpcmluZyIsIl9hY2Nlc3NUb2tlbkV4cGlyZWQiLCJjb250YWluZXIiLCJfY2FuY2VsVGltZXJzIiwiZXhwaXJpbmciLCJpbml0IiwiZXhwaXJlZCIsImNhbmNlbCIsImFkZEFjY2Vzc1Rva2VuRXhwaXJpbmciLCJyZW1vdmVBY2Nlc3NUb2tlbkV4cGlyaW5nIiwiYWRkQWNjZXNzVG9rZW5FeHBpcmVkIiwicmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmVkIiwiVGltZXJEdXJhdGlvbiIsIlRpbWVyIiwiX25vd0Z1bmMiLCJfbmFtZSIsIl9leHBpcmF0aW9uIiwidGltZXJEdXJhdGlvbiIsIl90aW1lckhhbmRsZSIsImRpZmYiLCJFdmVudCIsIl9jYWxsYmFja3MiLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJTaWxlbnRSZW5ld1NlcnZpY2UiLCJ1c2VyTWFuYWdlciIsIl91c2VyTWFuYWdlciIsIl90b2tlbkV4cGlyaW5nIiwiZXZlbnRzIiwiQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciIsIl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yIiwiX3N0YXJ0IiwiX3N0b3AiLCJfc3ViIiwiX3NpZCIsIl9jaGVja1Nlc3Npb25JRnJhbWUiLCJpbnRlcnZhbCIsInJhaXNlVXNlclNpZ25lZE91dEV2ZW50Iiwic2Vzc2lvbiIsIkRlZmF1bHRJbnRlcnZhbCIsIl91cmwiLCJfaW50ZXJ2YWwiLCJfZnJhbWVfb3JpZ2luIiwiX3Nlc3Npb25fc3RhdGUiLCJBY2Nlc3NUb2tlblR5cGVIaW50IiwiX1hNTEh0dHBSZXF1ZXN0Q3RvciIsImFjY2Vzc1Rva2VuIiwiX3Jldm9rZSIsInhociIsIkNvcmRvdmFQb3B1cFdpbmRvdyIsIl9pc0luQXBwQnJvd3Nlckluc3RhbGxlZCIsImNvcmRvdmFNZXRhZGF0YSIsInNvbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImNvcmRvdmEiLCJJbkFwcEJyb3dzZXIiLCJfZXhpdENhbGxiYWNrRXZlbnQiLCJfZXhpdENhbGxiYWNrIiwiX2xvYWRTdGFydENhbGxiYWNrRXZlbnQiLCJfbG9hZFN0YXJ0Q2FsbGJhY2siLCJldmVudCJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN0Q0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7OztBQzNCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDcE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXNCO0FBQ3RCLHVCQUFzQix1QkFBdUIsV0FBVyxJQUFJO0FBQzVELElBQUc7QUFDSCxFQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTJEO0FBQzNEO0FBQ0EsTUFBSztBQUNMO0FBQ0EsdUJBQXNCLG1DQUFtQztBQUN6RCxNQUFLO0FBQ0wsSUFB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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDWEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ0xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNqQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMEY7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDs7Ozs7OztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNO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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEVBQTZFLDRCQUE0Qjs7QUFFekc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBLEVBQUM7QUFDRDtBQUNBO0FBQ0EsOEZBQTZGO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLEVBQUM7O0FBRUQ7Ozs7Ozs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFRLFdBQVc7QUFDbkI7QUFDQTtBQUNBLFNBQVEsVUFBVTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDOzs7Ozs7O0FDVEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNQRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ1ZEO0FBQ0E7O0FBRUEsZ0NBQStCLG9DQUFrQzs7Ozs7OztBQ0hqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ1RBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDZkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUErQixXQUFXOzs7Ozs7O0FDOUIxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNkRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7Ozs7Ozs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDs7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDVEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ1hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNmQTtBQUNBOztBQUVBOzs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ1hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVTtBQUNWLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDN0JEOzs7Ozs7O0FDQUE7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNyQkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ1JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQSxZQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHlDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxVQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBLGFBQVk7QUFDWjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFhO0FBQ2I7QUFDQTs7QUFFQSxZQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsWUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztB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QUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0EsSUFBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsd0NBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYSxpQkFBaUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWdELEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXdCLGVBQWU7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0EseUJBQXdCLFFBQVE7QUFDaEM7QUFDQSxzQkFBcUIsZUFBZTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBLG9CQUFtQixjQUFjO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXVELE9BQU87QUFDOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXFCLFFBQVE7QUFDN0I7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLGdCQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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OEQsTUFBTCxHQUFjLElBQWQ7QUFDSCxNOzs7OzZCQXZDYTtBQUNWLG9CQUFPLEtBQUtMLFFBQVo7QUFDSDs7Ozs7O21CQXZEZ0I2SCxrQjs7Ozs7Ozs7Ozs7OztBQ0xyQjs7OztBQUNBOzs7Ozs7MkpBSkE7QUFDQTs7S0FLcUIvaEIsc0I7Ozs7O3NDQUVqQnNXLE8sb0JBQVFwRixNLEVBQVE7QUFDWkEsZ0JBQU9tRSxtQkFBUCxHQUE2QixZQUE3QjtBQUNBLGFBQUl1RSxRQUFRLGlDQUF1QjFJLE1BQXZCLENBQVo7QUFDQSxnQkFBT3ZOLFFBQVFZLE9BQVIsQ0FBZ0JxVixLQUFoQixDQUFQO0FBQ0gsTTs7Ozs7bUJBTmdCNVosc0IiLCJmaWxlIjoib2lkYy1jbGllbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA4MmVlN2ZmNDRjMzMwNzFjOWE3ZCIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9zaGltXCIpO1xuXG5yZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9mbi9yZWdleHAvZXNjYXBlXCIpO1xuXG5pZiAoZ2xvYmFsLl9iYWJlbFBvbHlmaWxsKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIm9ubHkgb25lIGluc3RhbmNlIG9mIGJhYmVsLXBvbHlmaWxsIGlzIGFsbG93ZWRcIik7XG59XG5nbG9iYWwuX2JhYmVsUG9seWZpbGwgPSB0cnVlO1xuXG52YXIgREVGSU5FX1BST1BFUlRZID0gXCJkZWZpbmVQcm9wZXJ0eVwiO1xuZnVuY3Rpb24gZGVmaW5lKE8sIGtleSwgdmFsdWUpIHtcbiAgT1trZXldIHx8IE9iamVjdFtERUZJTkVfUFJPUEVSVFldKE8sIGtleSwge1xuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSk7XG59XG5cbmRlZmluZShTdHJpbmcucHJvdG90eXBlLCBcInBhZExlZnRcIiwgXCJcIi5wYWRTdGFydCk7XG5kZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgXCJwYWRSaWdodFwiLCBcIlwiLnBhZEVuZCk7XG5cblwicG9wLHJldmVyc2Usc2hpZnQsa2V5cyx2YWx1ZXMsZW50cmllcyxpbmRleE9mLGV2ZXJ5LHNvbWUsZm9yRWFjaCxtYXAsZmlsdGVyLGZpbmQsZmluZEluZGV4LGluY2x1ZGVzLGpvaW4sc2xpY2UsY29uY2F0LHB1c2gsc3BsaWNlLHVuc2hpZnQsc29ydCxsYXN0SW5kZXhPZixyZWR1Y2UscmVkdWNlUmlnaHQsY29weVdpdGhpbixmaWxsXCIuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBbXVtrZXldICYmIGRlZmluZShBcnJheSwga2V5LCBGdW5jdGlvbi5jYWxsLmJpbmQoW11ba2V5XSkpO1xufSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JhYmVsLXBvbHlmaWxsL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1mcm96ZW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucGFyc2UtaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWluLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hdGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNicnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jbHozMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNvc2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5leHBtMScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmh5cG90Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguaW11bCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguc2lnbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC50YW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmF3Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy50cmltJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdGFydHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5iaWcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJsaW5rJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5maXhlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udGNvbG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcubGluaycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3ViJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS5ub3cnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmpvaW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc29ydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNvbWUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZXZlcnknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pbmRleC1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5sYXN0LWluZGV4LW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAucmVwbGFjZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuYXJyYXktYnVmZmVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQzMi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0NjQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5oYXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmZsYXQtbWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmZsYXR0ZW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLmF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtc3RhcnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tbGVmdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zZXQub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1tYXAub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1zZXQub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWFwLmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc2V0LmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1tYXAuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy53ZWFrLXNldC5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lmdsb2JhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zeXN0ZW0uZ2xvYmFsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmVycm9yLmlzLWVycm9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguY2xhbXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5kZWctcGVyLXJhZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmRlZ3JlZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5mc2NhbGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pYWRkaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaW11bGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5yYWQtcGVyLWRlZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnJhZGlhbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5zY2FsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnVtdWxoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguc2lnbmJpdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucHJvbWlzZS50cnknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5kZWZpbmUtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QubWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXNhcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYnNlcnZhYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLnRpbWVycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi5pbW1lZGlhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbW9kdWxlcy9fY29yZScpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvc2hpbS5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgTUVUQSA9IHJlcXVpcmUoJy4vX21ldGEnKS5LRVk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIHdrc0RlZmluZSA9IHJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKTtcbnZhciBlbnVtS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0ta2V5cycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIF9jcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZ09QTkV4dCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpO1xudmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkRFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QRCA9ICRHT1BELmY7XG52YXIgZFAgPSAkRFAuZjtcbnZhciBnT1BOID0gZ09QTkV4dC5mO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRKU09OID0gZ2xvYmFsLkpTT047XG52YXIgX3N0cmluZ2lmeSA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBISURERU4gPSB3a3MoJ19oaWRkZW4nKTtcbnZhciBUT19QUklNSVRJVkUgPSB3a3MoJ3RvUHJpbWl0aXZlJyk7XG52YXIgaXNFbnVtID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPUFN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyIFVTRV9OQVRJVkUgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkUCh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoaXQsIGtleSwgRCkge1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYgKHByb3RvRGVzYykgZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZiAocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bykgZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKSB7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8pICRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghRC5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhpdCwgSElEREVOKSkgZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwgeyBlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApIHtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpIHtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIGl0ID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmIChEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgdmFyIG5hbWVzID0gZ09QTih0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90bztcbiAgdmFyIG5hbWVzID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmICghVVNFX05BVElWRSkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzID09PSBPYmplY3RQcm90bykgJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYgKERFU0NSSVBUT1JTICYmIHNldHRlcikgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0IH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKSB7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoeyBhOiBTIH0pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkge1xuICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgICRyZXBsYWNlciA9IHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3ltYm9sLmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9faGFzLmpzXG4vLyBtb2R1bGUgaWQgPSA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gfHwgKGdsb2JhbFtuYW1lXSA9IHt9KSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV07XG4gIHZhciBleHBvcnRzID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSk7XG4gIHZhciBleHBQcm90byA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pO1xuICB2YXIga2V5LCBvd24sIG91dCwgZXhwO1xuICBpZiAoSVNfR0xPQkFMKSBzb3VyY2UgPSBuYW1lO1xuICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZiAodGFyZ2V0KSByZWRlZmluZSh0YXJnZXQsIGtleSwgb3V0LCB0eXBlICYgJGV4cG9ydC5VKTtcbiAgICAvLyBleHBvcnRcbiAgICBpZiAoZXhwb3J0c1trZXldICE9IG91dCkgaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYgKElTX1BST1RPICYmIGV4cFByb3RvW2tleV0gIT0gb3V0KSBleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzXG4vLyBtb2R1bGUgaWQgPSA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjUuMycgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzXG4vLyBtb2R1bGUgaWQgPSA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2hpZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanNcbi8vIG1vZHVsZSBpZCA9IDExXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gMTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanNcbi8vIG1vZHVsZSBpZCA9IDE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzXG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBTUkMgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSBGdW5jdGlvbltUT19TVFJJTkddO1xudmFyIFRQTCA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuICR0b1N0cmluZy5jYWxsKGl0KTtcbn07XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbCwgc2FmZSkge1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYgKE9ba2V5XSA9PT0gdmFsKSByZXR1cm47XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIGlmICghc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH0gZWxzZSBpZiAoT1trZXldKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlkID0gMDtcbnZhciBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL191aWQuanNcbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2N0eC5qc1xuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIE1FVEEgPSByZXF1aXJlKCcuL191aWQnKSgnbWV0YScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgc2V0RGVzYyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaWQgPSAwO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBzZXREZXNjKGl0LCBNRVRBLCB7IHZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBXS5pO1xufTtcbnZhciBnZXRXZWFrID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQSkpIHNldE1ldGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgS0VZOiBNRVRBLFxuICBORUVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2VhazogZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fbWV0YS5qc1xuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qc1xuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCB0YWcsIHN0YXQpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpIGRlZihpdCwgVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZyB9KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qc1xuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHN0b3JlID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbDtcbnZhciBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnRzLmYgPSByZXF1aXJlKCcuL193a3MnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3drcy1leHQuanNcbi8vIG1vZHVsZSBpZCA9IDI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyICRTeW1ib2wgPSBjb3JlLlN5bWJvbCB8fCAoY29yZS5TeW1ib2wgPSBMSUJSQVJZID8ge30gOiBnbG9iYWwuU3ltYm9sIHx8IHt9KTtcbiAgaWYgKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpIGRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHsgdmFsdWU6IHdrc0V4dC5mKG5hbWUpIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3drcy1kZWZpbmUuanNcbi8vIG1vZHVsZSBpZCA9IDI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSBnZXRLZXlzKGl0KTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmIChnZXRTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KTtcbiAgICB2YXIgaXNFbnVtID0gcElFLmY7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKHN5bWJvbHMubGVuZ3RoID4gaSkgaWYgKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZW51bS1rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSAyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanNcbi8vIG1vZHVsZSBpZCA9IDMwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanNcbi8vIG1vZHVsZSBpZCA9IDMxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fY29mLmpzXG4vLyBtb2R1bGUgaWQgPSAzNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZGVmaW5lZC5qc1xuLy8gbW9kdWxlIGlkID0gMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qc1xuLy8gbW9kdWxlIGlkID0gMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanNcbi8vIG1vZHVsZSBpZCA9IDM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qc1xuLy8gbW9kdWxlIGlkID0gMzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzXG4vLyBtb2R1bGUgaWQgPSA0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2VudW0tYnVnLWtleXMuanNcbi8vIG1vZHVsZSBpZCA9IDQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qc1xuLy8gbW9kdWxlIGlkID0gNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzXG4vLyBtb2R1bGUgaWQgPSA0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSA0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGRQcyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpO1xuICB2YXIgaSA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgZ3QgPSAnPic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAoaS0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSA0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzXG4vLyBtb2R1bGUgaWQgPSA0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbm1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9faHRtbC5qc1xuLy8gbW9kdWxlIGlkID0gNDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ09QTihpdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanNcbi8vIG1vZHVsZSBpZCA9IDQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qc1xuLy8gbW9kdWxlIGlkID0gNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qc1xuLy8gbW9kdWxlIGlkID0gNTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IGNyZWF0ZTogcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gNTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZiB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDUyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMyAvIDE1LjIuMy43IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0aWVzOiByZXF1aXJlKCcuL19vYmplY3QtZHBzJykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDUzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDU0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIG1vc3QgT2JqZWN0IG1ldGhvZHMgYnkgRVM2IHNob3VsZCBhY2NlcHQgcHJpbWl0aXZlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgZXhlYykge1xuICB2YXIgZm4gPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV07XG4gIHZhciBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXNhcC5qc1xuLy8gbW9kdWxlIGlkID0gNTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAkZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiAkZ2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanNcbi8vIG1vZHVsZSBpZCA9IDU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi4xNCBPYmplY3Qua2V5cyhPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2tleXMnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSA1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JykuZjtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMuanNcbi8vIG1vZHVsZSBpZCA9IDYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi41IE9iamVjdC5mcmVlemUoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZnJlZXplJywgZnVuY3Rpb24gKCRmcmVlemUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShpdCkge1xuICAgIHJldHVybiAkZnJlZXplICYmIGlzT2JqZWN0KGl0KSA/ICRmcmVlemUobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanNcbi8vIG1vZHVsZSBpZCA9IDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi4xNyBPYmplY3Quc2VhbChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdzZWFsJywgZnVuY3Rpb24gKCRzZWFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzZWFsKGl0KSB7XG4gICAgcmV0dXJuICRzZWFsICYmIGlzT2JqZWN0KGl0KSA/ICRzZWFsKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbC5qc1xuLy8gbW9kdWxlIGlkID0gNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjE1IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdwcmV2ZW50RXh0ZW5zaW9ucycsIGZ1bmN0aW9uICgkcHJldmVudEV4dGVuc2lvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKGl0KSB7XG4gICAgcmV0dXJuICRwcmV2ZW50RXh0ZW5zaW9ucyAmJiBpc09iamVjdChpdCkgPyAkcHJldmVudEV4dGVuc2lvbnMobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanNcbi8vIG1vZHVsZSBpZCA9IDYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi4xMiBPYmplY3QuaXNGcm96ZW4oTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzRnJvemVuJywgZnVuY3Rpb24gKCRpc0Zyb3plbikge1xuICByZXR1cm4gZnVuY3Rpb24gaXNGcm96ZW4oaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzRnJvemVuID8gJGlzRnJvemVuKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qc1xuLy8gbW9kdWxlIGlkID0gNjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjEzIE9iamVjdC5pc1NlYWxlZChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNTZWFsZWQnLCBmdW5jdGlvbiAoJGlzU2VhbGVkKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpc1NlYWxlZChpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNTZWFsZWQgPyAkaXNTZWFsZWQoaXQpIDogZmFsc2UgOiB0cnVlO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkLmpzXG4vLyBtb2R1bGUgaWQgPSA2NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuMTEgT2JqZWN0LmlzRXh0ZW5zaWJsZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNFeHRlbnNpYmxlJywgZnVuY3Rpb24gKCRpc0V4dGVuc2libGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1leHRlbnNpYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA2NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYsICdPYmplY3QnLCB7IGFzc2lnbjogcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qc1xuLy8gbW9kdWxlIGlkID0gNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSBpZiAoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSkgVFtrZXldID0gU1trZXldO1xuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzXG4vLyBtb2R1bGUgaWQgPSA2OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjMuMTAgT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBpczogcmVxdWlyZSgnLi9fc2FtZS12YWx1ZScpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLmpzXG4vLyBtb2R1bGUgaWQgPSA2OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuOSBTYW1lVmFsdWUoeCwgeSlcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmlzIHx8IGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4geCA9PT0geSA/IHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5IDogeCAhPSB4ICYmIHkgIT0geTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zYW1lLXZhbHVlLmpzXG4vLyBtb2R1bGUgaWQgPSA3MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDcxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbiAodGVzdCwgYnVnZ3ksIHNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgYnVnZ3kgPSB0cnVlOyB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZiAoYnVnZ3kpIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgICAgIGVsc2Ugc2V0KE8sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIE87XG4gICAgICB9O1xuICAgIH0oe30sIGZhbHNlKSA6IHVuZGVmaW5lZCksXG4gIGNoZWNrOiBjaGVja1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qc1xuLy8gbW9kdWxlIGlkID0gNzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciB0ZXN0ID0ge307XG50ZXN0W3JlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmICh0ZXN0ICsgJycgIT0gJ1tvYmplY3Qgel0nKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xuICB9LCB0cnVlKTtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDczXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIEFSRyA9IGNvZihmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanNcbi8vIG1vZHVsZSBpZCA9IDc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjIuMy4yIC8gMTUuMy40LjUgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQodGhpc0FyZywgYXJncy4uLilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnRnVuY3Rpb24nLCB7IGJpbmQ6IHJlcXVpcmUoJy4vX2JpbmQnKSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQuanNcbi8vIG1vZHVsZSBpZCA9IDc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBhcnJheVNsaWNlID0gW10uc2xpY2U7XG52YXIgZmFjdG9yaWVzID0ge307XG5cbnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoRiwgbGVuLCBhcmdzKSB7XG4gIGlmICghKGxlbiBpbiBmYWN0b3JpZXMpKSB7XG4gICAgZm9yICh2YXIgbiA9IFtdLCBpID0gMDsgaSA8IGxlbjsgaSsrKSBuW2ldID0gJ2FbJyArIGkgKyAnXSc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgZmFjdG9yaWVzW2xlbl0gPSBGdW5jdGlvbignRixhJywgJ3JldHVybiBuZXcgRignICsgbi5qb2luKCcsJykgKyAnKScpO1xuICB9IHJldHVybiBmYWN0b3JpZXNbbGVuXShGLCBhcmdzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uYmluZCB8fCBmdW5jdGlvbiBiaW5kKHRoYXQgLyogLCAuLi5hcmdzICovKSB7XG4gIHZhciBmbiA9IGFGdW5jdGlvbih0aGlzKTtcbiAgdmFyIHBhcnRBcmdzID0gYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZCA9IGZ1bmN0aW9uICgvKiBhcmdzLi4uICovKSB7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmQgPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG4gIGlmIChpc09iamVjdChmbi5wcm90b3R5cGUpKSBib3VuZC5wcm90b3R5cGUgPSBmbi5wcm90b3R5cGU7XG4gIHJldHVybiBib3VuZDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19iaW5kLmpzXG4vLyBtb2R1bGUgaWQgPSA3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanNcbi8vIG1vZHVsZSBpZCA9IDc3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgRlByb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIG5hbWVSRSA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopLztcbnZhciBOQU1FID0gJ25hbWUnO1xuXG4vLyAxOS4yLjQuMiBuYW1lXG5OQU1FIGluIEZQcm90byB8fCByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIGRQKEZQcm90bywgTkFNRSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKCcnICsgdGhpcykubWF0Y2gobmFtZVJFKVsxXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUuanNcbi8vIG1vZHVsZSBpZCA9IDc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIEhBU19JTlNUQU5DRSA9IHJlcXVpcmUoJy4vX3drcycpKCdoYXNJbnN0YW5jZScpO1xudmFyIEZ1bmN0aW9uUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyAxOS4yLjMuNiBGdW5jdGlvbi5wcm90b3R5cGVbQEBoYXNJbnN0YW5jZV0oVilcbmlmICghKEhBU19JTlNUQU5DRSBpbiBGdW5jdGlvblByb3RvKSkgcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZihGdW5jdGlvblByb3RvLCBIQVNfSU5TVEFOQ0UsIHsgdmFsdWU6IGZ1bmN0aW9uIChPKSB7XG4gIGlmICh0eXBlb2YgdGhpcyAhPSAnZnVuY3Rpb24nIHx8ICFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzT2JqZWN0KHRoaXMucHJvdG90eXBlKSkgcmV0dXJuIE8gaW5zdGFuY2VvZiB0aGlzO1xuICAvLyBmb3IgZW52aXJvbm1lbnQgdy9vIG5hdGl2ZSBgQEBoYXNJbnN0YW5jZWAgbG9naWMgZW5vdWdoIGBpbnN0YW5jZW9mYCwgYnV0IGFkZCB0aGlzOlxuICB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKSBpZiAodGhpcy5wcm90b3R5cGUgPT09IE8pIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlLmpzXG4vLyBtb2R1bGUgaWQgPSA3OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUludCA9IHJlcXVpcmUoJy4vX3BhcnNlLWludCcpO1xuLy8gMTguMi41IHBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuRiAqIChwYXJzZUludCAhPSAkcGFyc2VJbnQpLCB7IHBhcnNlSW50OiAkcGFyc2VJbnQgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1pbnQuanNcbi8vIG1vZHVsZSBpZCA9IDgwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5wYXJzZUludDtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciB3cyA9IHJlcXVpcmUoJy4vX3N0cmluZy13cycpO1xudmFyIGhleCA9IC9eWy0rXT8wW3hYXS87XG5cbm1vZHVsZS5leHBvcnRzID0gJHBhcnNlSW50KHdzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdzICsgJzB4MTYnKSAhPT0gMjIgPyBmdW5jdGlvbiBwYXJzZUludChzdHIsIHJhZGl4KSB7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHJldHVybiAkcGFyc2VJbnQoc3RyaW5nLCAocmFkaXggPj4+IDApIHx8IChoZXgudGVzdChzdHJpbmcpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWludC5qc1xuLy8gbW9kdWxlIGlkID0gODFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzcGFjZXMgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKTtcbnZhciBzcGFjZSA9ICdbJyArIHNwYWNlcyArICddJztcbnZhciBub24gPSAnXFx1MjAwYlxcdTAwODUnO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHNwYWNlICsgc3BhY2UgKyAnKicpO1xudmFyIHJ0cmltID0gUmVnRXhwKHNwYWNlICsgc3BhY2UgKyAnKiQnKTtcblxudmFyIGV4cG9ydGVyID0gZnVuY3Rpb24gKEtFWSwgZXhlYywgQUxJQVMpIHtcbiAgdmFyIGV4cCA9IHt9O1xuICB2YXIgRk9SQ0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhc3BhY2VzW0tFWV0oKSB8fCBub25bS0VZXSgpICE9IG5vbjtcbiAgfSk7XG4gIHZhciBmbiA9IGV4cFtLRVldID0gRk9SQ0UgPyBleGVjKHRyaW0pIDogc3BhY2VzW0tFWV07XG4gIGlmIChBTElBUykgZXhwW0FMSUFTXSA9IGZuO1xuICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFLCAnU3RyaW5nJywgZXhwKTtcbn07XG5cbi8vIDEgLT4gU3RyaW5nI3RyaW1MZWZ0XG4vLyAyIC0+IFN0cmluZyN0cmltUmlnaHRcbi8vIDMgLT4gU3RyaW5nI3RyaW1cbnZhciB0cmltID0gZXhwb3J0ZXIudHJpbSA9IGZ1bmN0aW9uIChzdHJpbmcsIFRZUEUpIHtcbiAgc3RyaW5nID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIGlmIChUWVBFICYgMSkgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpO1xuICByZXR1cm4gc3RyaW5nO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy10cmltLmpzXG4vLyBtb2R1bGUgaWQgPSA4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanNcbi8vIG1vZHVsZSBpZCA9IDgzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuL19wYXJzZS1mbG9hdCcpO1xuLy8gMTguMi40IHBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkYgKiAocGFyc2VGbG9hdCAhPSAkcGFyc2VGbG9hdCksIHsgcGFyc2VGbG9hdDogJHBhcnNlRmxvYXQgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdC5qc1xuLy8gbW9kdWxlIGlkID0gODRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VGbG9hdDtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcblxubW9kdWxlLmV4cG9ydHMgPSAxIC8gJHBhcnNlRmxvYXQocmVxdWlyZSgnLi9fc3RyaW5nLXdzJykgKyAnLTAnKSAhPT0gLUluZmluaXR5ID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHIpIHtcbiAgdmFyIHN0cmluZyA9ICR0cmltKFN0cmluZyhzdHIpLCAzKTtcbiAgdmFyIHJlc3VsdCA9ICRwYXJzZUZsb2F0KHN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgc3RyaW5nLmNoYXJBdCgwKSA9PSAnLScgPyAtMCA6IHJlc3VsdDtcbn0gOiAkcGFyc2VGbG9hdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWZsb2F0LmpzXG4vLyBtb2R1bGUgaWQgPSA4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciBOVU1CRVIgPSAnTnVtYmVyJztcbnZhciAkTnVtYmVyID0gZ2xvYmFsW05VTUJFUl07XG52YXIgQmFzZSA9ICROdW1iZXI7XG52YXIgcHJvdG8gPSAkTnVtYmVyLnByb3RvdHlwZTtcbi8vIE9wZXJhIH4xMiBoYXMgYnJva2VuIE9iamVjdCN0b1N0cmluZ1xudmFyIEJST0tFTl9DT0YgPSBjb2YocmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpKHByb3RvKSkgPT0gTlVNQkVSO1xudmFyIFRSSU0gPSAndHJpbScgaW4gU3RyaW5nLnByb3RvdHlwZTtcblxuLy8gNy4xLjMgVG9OdW1iZXIoYXJndW1lbnQpXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTtcbiAgaWYgKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyAmJiBpdC5sZW5ndGggPiAyKSB7XG4gICAgaXQgPSBUUklNID8gaXQudHJpbSgpIDogJHRyaW0oaXQsIDMpO1xuICAgIHZhciBmaXJzdCA9IGl0LmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHRoaXJkLCByYWRpeCwgbWF4Q29kZTtcbiAgICBpZiAoZmlyc3QgPT09IDQzIHx8IGZpcnN0ID09PSA0NSkge1xuICAgICAgdGhpcmQgPSBpdC5jaGFyQ29kZUF0KDIpO1xuICAgICAgaWYgKHRoaXJkID09PSA4OCB8fCB0aGlyZCA9PT0gMTIwKSByZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4XG4gICAgfSBlbHNlIGlmIChmaXJzdCA9PT0gNDgpIHtcbiAgICAgIHN3aXRjaCAoaXQuY2hhckNvZGVBdCgxKSkge1xuICAgICAgICBjYXNlIDY2OiBjYXNlIDk4OiByYWRpeCA9IDI7IG1heENvZGUgPSA0OTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wYlswMV0rJC9pXG4gICAgICAgIGNhc2UgNzk6IGNhc2UgMTExOiByYWRpeCA9IDg7IG1heENvZGUgPSA1NTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wb1swLTddKyQvaVxuICAgICAgICBkZWZhdWx0OiByZXR1cm4gK2l0O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgZGlnaXRzID0gaXQuc2xpY2UoMiksIGkgPSAwLCBsID0gZGlnaXRzLmxlbmd0aCwgY29kZTsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIHBhcnNlSW50IHBhcnNlcyBhIHN0cmluZyB0byBhIGZpcnN0IHVuYXZhaWxhYmxlIHN5bWJvbFxuICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9sc1xuICAgICAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiBtYXhDb2RlKSByZXR1cm4gTmFOO1xuICAgICAgfSByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCByYWRpeCk7XG4gICAgfVxuICB9IHJldHVybiAraXQ7XG59O1xuXG5pZiAoISROdW1iZXIoJyAwbzEnKSB8fCAhJE51bWJlcignMGIxJykgfHwgJE51bWJlcignKzB4MScpKSB7XG4gICROdW1iZXIgPSBmdW5jdGlvbiBOdW1iZXIodmFsdWUpIHtcbiAgICB2YXIgaXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMSA/IDAgOiB2YWx1ZTtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIHRoYXQgaW5zdGFuY2VvZiAkTnVtYmVyXG4gICAgICAvLyBjaGVjayBvbiAxLi5jb25zdHJ1Y3Rvcihmb28pIGNhc2VcbiAgICAgICYmIChCUk9LRU5fQ09GID8gZmFpbHMoZnVuY3Rpb24gKCkgeyBwcm90by52YWx1ZU9mLmNhbGwodGhhdCk7IH0pIDogY29mKHRoYXQpICE9IE5VTUJFUilcbiAgICAgICAgPyBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSh0b051bWJlcihpdCkpLCB0aGF0LCAkTnVtYmVyKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BOKEJhc2UpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVM2IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVM2IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKykge1xuICAgIGlmIChoYXMoQmFzZSwga2V5ID0ga2V5c1tqXSkgJiYgIWhhcygkTnVtYmVyLCBrZXkpKSB7XG4gICAgICBkUCgkTnVtYmVyLCBrZXksIGdPUEQoQmFzZSwga2V5KSk7XG4gICAgfVxuICB9XG4gICROdW1iZXIucHJvdG90eXBlID0gcHJvdG87XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJE51bWJlcjtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsIE5VTUJFUiwgJE51bWJlcik7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgdGFyZ2V0LCBDKSB7XG4gIHZhciBTID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICB2YXIgUDtcbiAgaWYgKFMgIT09IEMgJiYgdHlwZW9mIFMgPT0gJ2Z1bmN0aW9uJyAmJiAoUCA9IFMucHJvdG90eXBlKSAhPT0gQy5wcm90b3R5cGUgJiYgaXNPYmplY3QoUCkgJiYgc2V0UHJvdG90eXBlT2YpIHtcbiAgICBzZXRQcm90b3R5cGVPZih0aGF0LCBQKTtcbiAgfSByZXR1cm4gdGhhdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pbmhlcml0LWlmLXJlcXVpcmVkLmpzXG4vLyBtb2R1bGUgaWQgPSA4N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBhTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuL19hLW51bWJlci12YWx1ZScpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKTtcbnZhciAkdG9GaXhlZCA9IDEuMC50b0ZpeGVkO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBkYXRhID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xudmFyIEVSUk9SID0gJ051bWJlci50b0ZpeGVkOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnO1xudmFyIFpFUk8gPSAnMCc7XG5cbnZhciBtdWx0aXBseSA9IGZ1bmN0aW9uIChuLCBjKSB7XG4gIHZhciBpID0gLTE7XG4gIHZhciBjMiA9IGM7XG4gIHdoaWxlICgrK2kgPCA2KSB7XG4gICAgYzIgKz0gbiAqIGRhdGFbaV07XG4gICAgZGF0YVtpXSA9IGMyICUgMWU3O1xuICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpO1xuICB9XG59O1xudmFyIGRpdmlkZSA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciBpID0gNjtcbiAgdmFyIGMgPSAwO1xuICB3aGlsZSAoLS1pID49IDApIHtcbiAgICBjICs9IGRhdGFbaV07XG4gICAgZGF0YVtpXSA9IGZsb29yKGMgLyBuKTtcbiAgICBjID0gKGMgJSBuKSAqIDFlNztcbiAgfVxufTtcbnZhciBudW1Ub1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGkgPSA2O1xuICB2YXIgcyA9ICcnO1xuICB3aGlsZSAoLS1pID49IDApIHtcbiAgICBpZiAocyAhPT0gJycgfHwgaSA9PT0gMCB8fCBkYXRhW2ldICE9PSAwKSB7XG4gICAgICB2YXIgdCA9IFN0cmluZyhkYXRhW2ldKTtcbiAgICAgIHMgPSBzID09PSAnJyA/IHQgOiBzICsgcmVwZWF0LmNhbGwoWkVSTywgNyAtIHQubGVuZ3RoKSArIHQ7XG4gICAgfVxuICB9IHJldHVybiBzO1xufTtcbnZhciBwb3cgPSBmdW5jdGlvbiAoeCwgbiwgYWNjKSB7XG4gIHJldHVybiBuID09PSAwID8gYWNjIDogbiAlIDIgPT09IDEgPyBwb3coeCwgbiAtIDEsIGFjYyAqIHgpIDogcG93KHggKiB4LCBuIC8gMiwgYWNjKTtcbn07XG52YXIgbG9nID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIG4gPSAwO1xuICB2YXIgeDIgPSB4O1xuICB3aGlsZSAoeDIgPj0gNDA5Nikge1xuICAgIG4gKz0gMTI7XG4gICAgeDIgLz0gNDA5NjtcbiAgfVxuICB3aGlsZSAoeDIgPj0gMikge1xuICAgIG4gKz0gMTtcbiAgICB4MiAvPSAyO1xuICB9IHJldHVybiBuO1xufTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoISEkdG9GaXhlZCAmJiAoXG4gIDAuMDAwMDgudG9GaXhlZCgzKSAhPT0gJzAuMDAwJyB8fFxuICAwLjkudG9GaXhlZCgwKSAhPT0gJzEnIHx8XG4gIDEuMjU1LnRvRml4ZWQoMikgIT09ICcxLjI1JyB8fFxuICAxMDAwMDAwMDAwMDAwMDAwMTI4LjAudG9GaXhlZCgwKSAhPT0gJzEwMDAwMDAwMDAwMDAwMDAxMjgnXG4pIHx8ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgLy8gVjggfiBBbmRyb2lkIDQuMy1cbiAgJHRvRml4ZWQuY2FsbCh7fSk7XG59KSksICdOdW1iZXInLCB7XG4gIHRvRml4ZWQ6IGZ1bmN0aW9uIHRvRml4ZWQoZnJhY3Rpb25EaWdpdHMpIHtcbiAgICB2YXIgeCA9IGFOdW1iZXJWYWx1ZSh0aGlzLCBFUlJPUik7XG4gICAgdmFyIGYgPSB0b0ludGVnZXIoZnJhY3Rpb25EaWdpdHMpO1xuICAgIHZhciBzID0gJyc7XG4gICAgdmFyIG0gPSBaRVJPO1xuICAgIHZhciBlLCB6LCBqLCBrO1xuICAgIGlmIChmIDwgMCB8fCBmID4gMjApIHRocm93IFJhbmdlRXJyb3IoRVJST1IpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoeCAhPSB4KSByZXR1cm4gJ05hTic7XG4gICAgaWYgKHggPD0gLTFlMjEgfHwgeCA+PSAxZTIxKSByZXR1cm4gU3RyaW5nKHgpO1xuICAgIGlmICh4IDwgMCkge1xuICAgICAgcyA9ICctJztcbiAgICAgIHggPSAteDtcbiAgICB9XG4gICAgaWYgKHggPiAxZS0yMSkge1xuICAgICAgZSA9IGxvZyh4ICogcG93KDIsIDY5LCAxKSkgLSA2OTtcbiAgICAgIHogPSBlIDwgMCA/IHggKiBwb3coMiwgLWUsIDEpIDogeCAvIHBvdygyLCBlLCAxKTtcbiAgICAgIHogKj0gMHgxMDAwMDAwMDAwMDAwMDtcbiAgICAgIGUgPSA1MiAtIGU7XG4gICAgICBpZiAoZSA+IDApIHtcbiAgICAgICAgbXVsdGlwbHkoMCwgeik7XG4gICAgICAgIGogPSBmO1xuICAgICAgICB3aGlsZSAoaiA+PSA3KSB7XG4gICAgICAgICAgbXVsdGlwbHkoMWU3LCAwKTtcbiAgICAgICAgICBqIC09IDc7XG4gICAgICAgIH1cbiAgICAgICAgbXVsdGlwbHkocG93KDEwLCBqLCAxKSwgMCk7XG4gICAgICAgIGogPSBlIC0gMTtcbiAgICAgICAgd2hpbGUgKGogPj0gMjMpIHtcbiAgICAgICAgICBkaXZpZGUoMSA8PCAyMyk7XG4gICAgICAgICAgaiAtPSAyMztcbiAgICAgICAgfVxuICAgICAgICBkaXZpZGUoMSA8PCBqKTtcbiAgICAgICAgbXVsdGlwbHkoMSwgMSk7XG4gICAgICAgIGRpdmlkZSgyKTtcbiAgICAgICAgbSA9IG51bVRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdWx0aXBseSgwLCB6KTtcbiAgICAgICAgbXVsdGlwbHkoMSA8PCAtZSwgMCk7XG4gICAgICAgIG0gPSBudW1Ub1N0cmluZygpICsgcmVwZWF0LmNhbGwoWkVSTywgZik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmID4gMCkge1xuICAgICAgayA9IG0ubGVuZ3RoO1xuICAgICAgbSA9IHMgKyAoayA8PSBmID8gJzAuJyArIHJlcGVhdC5jYWxsKFpFUk8sIGYgLSBrKSArIG0gOiBtLnNsaWNlKDAsIGsgLSBmKSArICcuJyArIG0uc2xpY2UoayAtIGYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHMgKyBtO1xuICAgIH0gcmV0dXJuIG07XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzXG4vLyBtb2R1bGUgaWQgPSA4OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgbXNnKSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ251bWJlcicgJiYgY29mKGl0KSAhPSAnTnVtYmVyJykgdGhyb3cgVHlwZUVycm9yKG1zZyk7XG4gIHJldHVybiAraXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYS1udW1iZXItdmFsdWUuanNcbi8vIG1vZHVsZSBpZCA9IDg5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXBlYXQoY291bnQpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyhkZWZpbmVkKHRoaXMpKTtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7XG4gIGlmIChuIDwgMCB8fCBuID09IEluZmluaXR5KSB0aHJvdyBSYW5nZUVycm9yKFwiQ291bnQgY2FuJ3QgYmUgbmVnYXRpdmVcIik7XG4gIGZvciAoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSkgaWYgKG4gJiAxKSByZXMgKz0gc3RyO1xuICByZXR1cm4gcmVzO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1yZXBlYXQuanNcbi8vIG1vZHVsZSBpZCA9IDkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBhTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuL19hLW51bWJlci12YWx1ZScpO1xudmFyICR0b1ByZWNpc2lvbiA9IDEuMC50b1ByZWNpc2lvbjtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gSUU3LVxuICByZXR1cm4gJHRvUHJlY2lzaW9uLmNhbGwoMSwgdW5kZWZpbmVkKSAhPT0gJzEnO1xufSkgfHwgISRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXG4gICR0b1ByZWNpc2lvbi5jYWxsKHt9KTtcbn0pKSwgJ051bWJlcicsIHtcbiAgdG9QcmVjaXNpb246IGZ1bmN0aW9uIHRvUHJlY2lzaW9uKHByZWNpc2lvbikge1xuICAgIHZhciB0aGF0ID0gYU51bWJlclZhbHVlKHRoaXMsICdOdW1iZXIjdG9QcmVjaXNpb246IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICAgIHJldHVybiBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQpIDogJHRvUHJlY2lzaW9uLmNhbGwodGhhdCwgcHJlY2lzaW9uKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4xLjIuMSBOdW1iZXIuRVBTSUxPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IEVQU0lMT046IE1hdGgucG93KDIsIC01MikgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbi5qc1xuLy8gbW9kdWxlIGlkID0gOTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMS4yLjIgTnVtYmVyLmlzRmluaXRlKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgX2lzRmluaXRlID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuaXNGaW5pdGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc0Zpbml0ZTogZnVuY3Rpb24gaXNGaW5pdGUoaXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGl0ID09ICdudW1iZXInICYmIF9pc0Zpbml0ZShpdCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZS5qc1xuLy8gbW9kdWxlIGlkID0gOTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgaXNJbnRlZ2VyOiByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlci5qc1xuLy8gbW9kdWxlIGlkID0gOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4xLjIuNCBOdW1iZXIuaXNOYU4obnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qc1xuLy8gbW9kdWxlIGlkID0gOTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMS4yLjUgTnVtYmVyLmlzU2FmZUludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc0ludGVnZXIgPSByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJyk7XG52YXIgYWJzID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc1NhZmVJbnRlZ2VyOiBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKG51bWJlcikge1xuICAgIHJldHVybiBpc0ludGVnZXIobnVtYmVyKSAmJiBhYnMobnVtYmVyKSA8PSAweDFmZmZmZmZmZmZmZmZmO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXIuanNcbi8vIG1vZHVsZSBpZCA9IDk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjEuMi42IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgTUFYX1NBRkVfSU5URUdFUjogMHgxZmZmZmZmZmZmZmZmZiB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA5OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4xLjIuMTAgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBNSU5fU0FGRV9JTlRFR0VSOiAtMHgxZmZmZmZmZmZmZmZmZiB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA5OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fcGFyc2UtZmxvYXQnKTtcbi8vIDIwLjEuMi4xMiBOdW1iZXIucGFyc2VGbG9hdChzdHJpbmcpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VGbG9hdCAhPSAkcGFyc2VGbG9hdCksICdOdW1iZXInLCB7IHBhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19wYXJzZS1pbnQnKTtcbi8vIDIwLjEuMi4xMyBOdW1iZXIucGFyc2VJbnQoc3RyaW5nLCByYWRpeClcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKE51bWJlci5wYXJzZUludCAhPSAkcGFyc2VJbnQpLCAnTnVtYmVyJywgeyBwYXJzZUludDogJHBhcnNlSW50IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludC5qc1xuLy8gbW9kdWxlIGlkID0gMTAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbG9nMXAgPSByZXF1aXJlKCcuL19tYXRoLWxvZzFwJyk7XG52YXIgc3FydCA9IE1hdGguc3FydDtcbnZhciAkYWNvc2ggPSBNYXRoLmFjb3NoO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoXG4gIC8vIFY4IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiAgJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTlxuICAmJiAkYWNvc2goSW5maW5pdHkpID09IEluZmluaXR5XG4pLCAnTWF0aCcsIHtcbiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5sb2cxcCB8fCBmdW5jdGlvbiBsb2cxcCh4KSB7XG4gIHJldHVybiAoeCA9ICt4KSA+IC0xZS04ICYmIHggPCAxZS04ID8geCAtIHggKiB4IC8gMiA6IE1hdGgubG9nKDEgKyB4KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLWxvZzFwLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjUgTWF0aC5hc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXNpbmggPSBNYXRoLmFzaW5oO1xuXG5mdW5jdGlvbiBhc2luaCh4KSB7XG4gIHJldHVybiAhaXNGaW5pdGUoeCA9ICt4KSB8fCB4ID09IDAgPyB4IDogeCA8IDAgPyAtYXNpbmgoLXgpIDogTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCArIDEpKTtcbn1cblxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmFzaW5oKDApIC0+IC0wXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFzaW5oICYmIDEgLyAkYXNpbmgoMCkgPiAwKSwgJ01hdGgnLCB7IGFzaW5oOiBhc2luaCB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXNpbmguanNcbi8vIG1vZHVsZSBpZCA9IDEwNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuNyBNYXRoLmF0YW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhdGFuaCA9IE1hdGguYXRhbmg7XG5cbi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hdGFuaCgtMCkgLT4gMFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhdGFuaCAmJiAxIC8gJGF0YW5oKC0wKSA8IDApLCAnTWF0aCcsIHtcbiAgYXRhbmg6IGZ1bmN0aW9uIGF0YW5oKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiBNYXRoLmxvZygoMSArIHgpIC8gKDEgLSB4KSkgLyAyO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXRhbmguanNcbi8vIG1vZHVsZSBpZCA9IDEwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuOSBNYXRoLmNicnQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCkge1xuICAgIHJldHVybiBzaWduKHggPSAreCkgKiBNYXRoLnBvdyhNYXRoLmFicyh4KSwgMSAvIDMpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2JydC5qc1xuLy8gbW9kdWxlIGlkID0gMTA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zaWduIHx8IGZ1bmN0aW9uIHNpZ24oeCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiAoeCA9ICt4KSA9PSAwIHx8IHggIT0geCA/IHggOiB4IDwgMCA/IC0xIDogMTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLXNpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDEwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTEgTWF0aC5jbHozMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjbHozMjogZnVuY3Rpb24gY2x6MzIoeCkge1xuICAgIHJldHVybiAoeCA+Pj49IDApID8gMzEgLSBNYXRoLmZsb29yKE1hdGgubG9nKHggKyAwLjUpICogTWF0aC5MT0cyRSkgOiAzMjtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNsejMyLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjEyIE1hdGguY29zaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjb3NoOiBmdW5jdGlvbiBjb3NoKHgpIHtcbiAgICByZXR1cm4gKGV4cCh4ID0gK3gpICsgZXhwKC14KSkgLyAyO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY29zaC5qc1xuLy8gbW9kdWxlIGlkID0gMTA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjIuMi4xNCBNYXRoLmV4cG0xKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoJGV4cG0xICE9IE1hdGguZXhwbTEpLCAnTWF0aCcsIHsgZXhwbTE6ICRleHBtMSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEuanNcbi8vIG1vZHVsZSBpZCA9IDExMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBtMSA9IE1hdGguZXhwbTE7XG5tb2R1bGUuZXhwb3J0cyA9ICghJGV4cG0xXG4gIC8vIE9sZCBGRiBidWdcbiAgfHwgJGV4cG0xKDEwKSA+IDIyMDI1LjQ2NTc5NDgwNjcxOSB8fCAkZXhwbTEoMTApIDwgMjIwMjUuNDY1Nzk0ODA2NzE2NTE2OFxuICAvLyBUb3IgQnJvd3NlciBidWdcbiAgfHwgJGV4cG0xKC0yZS0xNykgIT0gLTJlLTE3XG4pID8gZnVuY3Rpb24gZXhwbTEoeCkge1xuICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiB4ID4gLTFlLTYgJiYgeCA8IDFlLTYgPyB4ICsgeCAqIHggLyAyIDogTWF0aC5leHAoeCkgLSAxO1xufSA6ICRleHBtMTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtZXhwbTEuanNcbi8vIG1vZHVsZSBpZCA9IDExMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgZnJvdW5kOiByZXF1aXJlKCcuL19tYXRoLWZyb3VuZCcpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanNcbi8vIG1vZHVsZSBpZCA9IDExMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciBzaWduID0gcmVxdWlyZSgnLi9fbWF0aC1zaWduJyk7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgRVBTSUxPTiA9IHBvdygyLCAtNTIpO1xudmFyIEVQU0lMT04zMiA9IHBvdygyLCAtMjMpO1xudmFyIE1BWDMyID0gcG93KDIsIDEyNykgKiAoMiAtIEVQU0lMT04zMik7XG52YXIgTUlOMzIgPSBwb3coMiwgLTEyNik7XG5cbnZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguZnJvdW5kIHx8IGZ1bmN0aW9uIGZyb3VuZCh4KSB7XG4gIHZhciAkYWJzID0gTWF0aC5hYnMoeCk7XG4gIHZhciAkc2lnbiA9IHNpZ24oeCk7XG4gIHZhciBhLCByZXN1bHQ7XG4gIGlmICgkYWJzIDwgTUlOMzIpIHJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7XG4gIGEgPSAoMSArIEVQU0lMT04zMiAvIEVQU0lMT04pICogJGFicztcbiAgcmVzdWx0ID0gYSAtIChhIC0gJGFicyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKHJlc3VsdCA+IE1BWDMyIHx8IHJlc3VsdCAhPSByZXN1bHQpIHJldHVybiAkc2lnbiAqIEluZmluaXR5O1xuICByZXR1cm4gJHNpZ24gKiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1mcm91bmQuanNcbi8vIG1vZHVsZSBpZCA9IDExM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTcgTWF0aC5oeXBvdChbdmFsdWUxWywgdmFsdWUyWywg4oCmIF1dXSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYWJzID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgaHlwb3Q6IGZ1bmN0aW9uIGh5cG90KHZhbHVlMSwgdmFsdWUyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBsYXJnID0gMDtcbiAgICB2YXIgYXJnLCBkaXY7XG4gICAgd2hpbGUgKGkgPCBhTGVuKSB7XG4gICAgICBhcmcgPSBhYnMoYXJndW1lbnRzW2krK10pO1xuICAgICAgaWYgKGxhcmcgPCBhcmcpIHtcbiAgICAgICAgZGl2ID0gbGFyZyAvIGFyZztcbiAgICAgICAgc3VtID0gc3VtICogZGl2ICogZGl2ICsgMTtcbiAgICAgICAgbGFyZyA9IGFyZztcbiAgICAgIH0gZWxzZSBpZiAoYXJnID4gMCkge1xuICAgICAgICBkaXYgPSBhcmcgLyBsYXJnO1xuICAgICAgICBzdW0gKz0gZGl2ICogZGl2O1xuICAgICAgfSBlbHNlIHN1bSArPSBhcmc7XG4gICAgfVxuICAgIHJldHVybiBsYXJnID09PSBJbmZpbml0eSA/IEluZmluaXR5IDogbGFyZyAqIE1hdGguc3FydChzdW0pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QuanNcbi8vIG1vZHVsZSBpZCA9IDExNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTggTWF0aC5pbXVsKHgsIHkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbXVsID0gTWF0aC5pbXVsO1xuXG4vLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICRpbXVsKDB4ZmZmZmZmZmYsIDUpICE9IC01IHx8ICRpbXVsLmxlbmd0aCAhPSAyO1xufSksICdNYXRoJywge1xuICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmO1xuICAgIHZhciB4biA9ICt4O1xuICAgIHZhciB5biA9ICt5O1xuICAgIHZhciB4bCA9IFVJTlQxNiAmIHhuO1xuICAgIHZhciB5bCA9IFVJTlQxNiAmIHluO1xuICAgIHJldHVybiAwIHwgeGwgKiB5bCArICgoVUlOVDE2ICYgeG4gPj4+IDE2KSAqIHlsICsgeGwgKiAoVUlOVDE2ICYgeW4gPj4+IDE2KSA8PCAxNiA+Pj4gMCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5pbXVsLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjIxIE1hdGgubG9nMTAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMTA6IGZ1bmN0aW9uIGxvZzEwKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgKiBNYXRoLkxPRzEwRTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgbG9nMXA6IHJlcXVpcmUoJy4vX21hdGgtbG9nMXAnKSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanNcbi8vIG1vZHVsZSBpZCA9IDExN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMjIgTWF0aC5sb2cyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCkge1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4yO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qc1xuLy8gbW9kdWxlIGlkID0gMTE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgc2lnbjogcmVxdWlyZSgnLi9fbWF0aC1zaWduJykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDExOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMzAgTWF0aC5zaW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGV4cG0xID0gcmVxdWlyZSgnLi9fbWF0aC1leHBtMScpO1xudmFyIGV4cCA9IE1hdGguZXhwO1xuXG4vLyBWOCBuZWFyIENocm9taXVtIDM4IGhhcyBhIHByb2JsZW0gd2l0aCB2ZXJ5IHNtYWxsIG51bWJlcnNcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhTWF0aC5zaW5oKC0yZS0xNykgIT0gLTJlLTE3O1xufSksICdNYXRoJywge1xuICBzaW5oOiBmdW5jdGlvbiBzaW5oKHgpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoeCA9ICt4KSA8IDFcbiAgICAgID8gKGV4cG0xKHgpIC0gZXhwbTEoLXgpKSAvIDJcbiAgICAgIDogKGV4cCh4IC0gMSkgLSBleHAoLXggLSAxKSkgKiAoTWF0aC5FIC8gMik7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaW5oLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjMzIE1hdGgudGFuaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB0YW5oOiBmdW5jdGlvbiB0YW5oKHgpIHtcbiAgICB2YXIgYSA9IGV4cG0xKHggPSAreCk7XG4gICAgdmFyIGIgPSBleHBtMSgteCk7XG4gICAgcmV0dXJuIGEgPT0gSW5maW5pdHkgPyAxIDogYiA9PSBJbmZpbml0eSA/IC0xIDogKGEgLSBiKSAvIChleHAoeCkgKyBleHAoLXgpKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnRhbmguanNcbi8vIG1vZHVsZSBpZCA9IDEyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMzQgTWF0aC50cnVuYyh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB0cnVuYzogZnVuY3Rpb24gdHJ1bmMoaXQpIHtcbiAgICByZXR1cm4gKGl0ID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWwpKGl0KTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnRydW5jLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgJGZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDtcblxuLy8gbGVuZ3RoIHNob3VsZCBiZSAxLCBvbGQgRkYgcHJvYmxlbVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoISEkZnJvbUNvZGVQb2ludCAmJiAkZnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMSksICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi4yIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpXG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGNvZGU7XG4gICAgd2hpbGUgKGFMZW4gPiBpKSB7XG4gICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdO1xuICAgICAgaWYgKHRvQWJzb2x1dGVJbmRleChjb2RlLCAweDEwZmZmZikgIT09IGNvZGUpIHRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgcmVzLnB1c2goY29kZSA8IDB4MTAwMDBcbiAgICAgICAgPyBmcm9tQ2hhckNvZGUoY29kZSlcbiAgICAgICAgOiBmcm9tQ2hhckNvZGUoKChjb2RlIC09IDB4MTAwMDApID4+IDEwKSArIDB4ZDgwMCwgY29kZSAlIDB4NDAwICsgMHhkYzAwKVxuICAgICAgKTtcbiAgICB9IHJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qc1xuLy8gbW9kdWxlIGlkID0gMTIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuNCBTdHJpbmcucmF3KGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKVxuICByYXc6IGZ1bmN0aW9uIHJhdyhjYWxsU2l0ZSkge1xuICAgIHZhciB0cGwgPSB0b0lPYmplY3QoY2FsbFNpdGUucmF3KTtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodHBsLmxlbmd0aCk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGxlbiA+IGkpIHtcbiAgICAgIHJlcy5wdXNoKFN0cmluZyh0cGxbaSsrXSkpO1xuICAgICAgaWYgKGkgPCBhTGVuKSByZXMucHVzaChTdHJpbmcoYXJndW1lbnRzW2ldKSk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yYXcuanNcbi8vIG1vZHVsZSBpZCA9IDEyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAyMS4xLjMuMjUgU3RyaW5nLnByb3RvdHlwZS50cmltKClcbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW0nLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDMpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbS5qc1xuLy8gbW9kdWxlIGlkID0gMTI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBpbmRleCA9IHRoaXMuX2k7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IE8ubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIHBvcykge1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICAgIHZhciBpID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSBsKSByZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qc1xuLy8gbW9kdWxlIGlkID0gMTI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gKCFCVUdHWSAmJiAkbmF0aXZlKSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gMTI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0ge307XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanNcbi8vIG1vZHVsZSBpZCA9IDEyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKShmYWxzZSk7XG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjMgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdChwb3MpXG4gIGNvZGVQb2ludEF0OiBmdW5jdGlvbiBjb2RlUG9pbnRBdChwb3MpIHtcbiAgICByZXR1cm4gJGF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanNcbi8vIG1vZHVsZSBpZCA9IDEzMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMS4xLjMuNiBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKHNlYXJjaFN0cmluZyBbLCBlbmRQb3NpdGlvbl0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgRU5EU19XSVRIID0gJ2VuZHNXaXRoJztcbnZhciAkZW5kc1dpdGggPSAnJ1tFTkRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKEVORFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBlbmRQb3NpdGlvbiA9IEBsZW5ndGggKi8pIHtcbiAgICB2YXIgdGhhdCA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBFTkRTX1dJVEgpO1xuICAgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aCh0aGF0Lmxlbmd0aCk7XG4gICAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBNYXRoLm1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbik7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkZW5kc1dpdGhcbiAgICAgID8gJGVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpXG4gICAgICA6IHRoYXQuc2xpY2UoZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGguanNcbi8vIG1vZHVsZSBpZCA9IDEzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBoZWxwZXIgZm9yIFN0cmluZyN7c3RhcnRzV2l0aCwgZW5kc1dpdGgsIGluY2x1ZGVzfVxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgc2VhcmNoU3RyaW5nLCBOQU1FKSB7XG4gIGlmIChpc1JlZ0V4cChzZWFyY2hTdHJpbmcpKSB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZyMnICsgTkFNRSArIFwiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4IVwiKTtcbiAgcmV0dXJuIFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctY29udGV4dC5qc1xuLy8gbW9kdWxlIGlkID0gMTMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qc1xuLy8gbW9kdWxlIGlkID0gMTM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBNQVRDSCA9IHJlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciByZSA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tLRVldKHJlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRyeSB7XG4gICAgICByZVtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAhJy8uLydbS0VZXShyZSk7XG4gICAgfSBjYXRjaCAoZikgeyAvKiBlbXB0eSAqLyB9XG4gIH0gcmV0dXJuIHRydWU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZmFpbHMtaXMtcmVnZXhwLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjEuMS4zLjcgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyhzZWFyY2hTdHJpbmcsIHBvc2l0aW9uID0gMClcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgSU5DTFVERVMgPSAnaW5jbHVkZXMnO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKElOQ0xVREVTKSwgJ1N0cmluZycsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5jb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgSU5DTFVERVMpXG4gICAgICAuaW5kZXhPZihzZWFyY2hTdHJpbmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanNcbi8vIG1vZHVsZSBpZCA9IDEzNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjEzIFN0cmluZy5wcm90b3R5cGUucmVwZWF0KGNvdW50KVxuICByZXBlYXQ6IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjEuMS4zLjE4IFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgWywgcG9zaXRpb24gXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJztcbnZhciAkc3RhcnRzV2l0aCA9ICcnW1NUQVJUU19XSVRIXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShTVEFSVFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgU1RBUlRTX1dJVEgpO1xuICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gJHN0YXJ0c1dpdGhcbiAgICAgID8gJHN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMiBTdHJpbmcucHJvdG90eXBlLmFuY2hvcihuYW1lKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYW5jaG9yJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFuY2hvcihuYW1lKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnbmFtZScsIG5hbWUpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBxdW90ID0gL1wiL2c7XG4vLyBCLjIuMy4yLjEgQ3JlYXRlSFRNTChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSlcbnZhciBjcmVhdGVIVE1MID0gZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIHZhciBTID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIHZhciBwMSA9ICc8JyArIHRhZztcbiAgaWYgKGF0dHJpYnV0ZSAhPT0gJycpIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9XCInICsgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKHF1b3QsICcmcXVvdDsnKSArICdcIic7XG4gIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nO1xufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUsIGV4ZWMpIHtcbiAgdmFyIE8gPSB7fTtcbiAgT1tOQU1FXSA9IGV4ZWMoY3JlYXRlSFRNTCk7XG4gICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0ZXN0ID0gJydbTkFNRV0oJ1wiJyk7XG4gICAgcmV0dXJuIHRlc3QgIT09IHRlc3QudG9Mb3dlckNhc2UoKSB8fCB0ZXN0LnNwbGl0KCdcIicpLmxlbmd0aCA+IDM7XG4gIH0pLCAnU3RyaW5nJywgTyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWh0bWwuanNcbi8vIG1vZHVsZSBpZCA9IDE0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4zIFN0cmluZy5wcm90b3R5cGUuYmlnKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JpZycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBiaWcoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JpZycsICcnLCAnJyk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5iaWcuanNcbi8vIG1vZHVsZSBpZCA9IDE0MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy40IFN0cmluZy5wcm90b3R5cGUuYmxpbmsoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYmxpbmsnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gYmxpbmsoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JsaW5rJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJsaW5rLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNSBTdHJpbmcucHJvdG90eXBlLmJvbGQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYm9sZCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBib2xkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJvbGQuanNcbi8vIG1vZHVsZSBpZCA9IDE0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy42IFN0cmluZy5wcm90b3R5cGUuZml4ZWQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZml4ZWQnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZml4ZWQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3R0JywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNyBTdHJpbmcucHJvdG90eXBlLmZvbnRjb2xvcihjb2xvcilcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZvbnRjb2xvcicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb250Y29sb3IoY29sb3IpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdjb2xvcicsIGNvbG9yKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qc1xuLy8gbW9kdWxlIGlkID0gMTQ1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjggU3RyaW5nLnByb3RvdHlwZS5mb250c2l6ZShzaXplKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZm9udHNpemUnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9udHNpemUoc2l6ZSkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ3NpemUnLCBzaXplKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRzaXplLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuOSBTdHJpbmcucHJvdG90eXBlLml0YWxpY3MoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnaXRhbGljcycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpdGFsaWNzKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdpJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MuanNcbi8vIG1vZHVsZSBpZCA9IDE0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMCBTdHJpbmcucHJvdG90eXBlLmxpbmsodXJsKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnbGluaycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBsaW5rKHVybCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ2hyZWYnLCB1cmwpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcubGluay5qc1xuLy8gbW9kdWxlIGlkID0gMTQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjExIFN0cmluZy5wcm90b3R5cGUuc21hbGwoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc21hbGwnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc21hbGwoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3NtYWxsJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnNtYWxsLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTIgU3RyaW5nLnByb3RvdHlwZS5zdHJpa2UoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc3RyaWtlJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHN0cmlrZSgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3RyaWtlJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZS5qc1xuLy8gbW9kdWxlIGlkID0gMTUwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEzIFN0cmluZy5wcm90b3R5cGUuc3ViKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1YicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdWIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1YicsICcnLCAnJyk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdWIuanNcbi8vIG1vZHVsZSBpZCA9IDE1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xNCBTdHJpbmcucHJvdG90eXBlLnN1cCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdXAnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc3VwKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdXAnLCAnJywgJycpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3VwLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMy4zLjEgLyAxNS45LjQuNCBEYXRlLm5vdygpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ0RhdGUnLCB7IG5vdzogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7IH0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLm5vdy5qc1xuLy8gbW9kdWxlIGlkID0gMTUzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbFxuICAgIHx8IERhdGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKHsgdG9JU09TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0gfSkgIT09IDE7XG59KSwgJ0RhdGUnLCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBwdiA9IHRvUHJpbWl0aXZlKE8pO1xuICAgIHJldHVybiB0eXBlb2YgcHYgPT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHB2KSA/IG51bGwgOiBPLnRvSVNPU3RyaW5nKCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1qc29uLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuL19kYXRlLXRvLWlzby1zdHJpbmcnKTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyAhPT0gdG9JU09TdHJpbmcpLCAnRGF0ZScsIHtcbiAgdG9JU09TdHJpbmc6IHRvSVNPU3RyaW5nXG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZy5qc1xuLy8gbW9kdWxlIGlkID0gMTU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIDIwLjMuNC4zNiAvIDE1LjkuNS40MyBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZygpXG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGdldFRpbWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lO1xudmFyICR0b0lTT1N0cmluZyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgbHogPSBmdW5jdGlvbiAobnVtKSB7XG4gIHJldHVybiBudW0gPiA5ID8gbnVtIDogJzAnICsgbnVtO1xufTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG5tb2R1bGUuZXhwb3J0cyA9IChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkdG9JU09TdHJpbmcuY2FsbChuZXcgRGF0ZSgtNWUxMyAtIDEpKSAhPSAnMDM4NS0wNy0yNVQwNzowNjozOS45OTlaJztcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICR0b0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKE5hTikpO1xufSkpID8gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7XG4gIGlmICghaXNGaW5pdGUoZ2V0VGltZS5jYWxsKHRoaXMpKSkgdGhyb3cgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gIHZhciBkID0gdGhpcztcbiAgdmFyIHkgPSBkLmdldFVUQ0Z1bGxZZWFyKCk7XG4gIHZhciBtID0gZC5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgdmFyIHMgPSB5IDwgMCA/ICctJyA6IHkgPiA5OTk5ID8gJysnIDogJyc7XG4gIHJldHVybiBzICsgKCcwMDAwMCcgKyBNYXRoLmFicyh5KSkuc2xpY2UocyA/IC02IDogLTQpICtcbiAgICAnLScgKyBseihkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIGx6KGQuZ2V0VVRDRGF0ZSgpKSArXG4gICAgJ1QnICsgbHooZC5nZXRVVENIb3VycygpKSArICc6JyArIGx6KGQuZ2V0VVRDTWludXRlcygpKSArXG4gICAgJzonICsgbHooZC5nZXRVVENTZWNvbmRzKCkpICsgJy4nICsgKG0gPiA5OSA/IG0gOiAnMCcgKyBseihtKSkgKyAnWic7XG59IDogJHRvSVNPU3RyaW5nO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIERhdGVQcm90byA9IERhdGUucHJvdG90eXBlO1xudmFyIElOVkFMSURfREFURSA9ICdJbnZhbGlkIERhdGUnO1xudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgJHRvU3RyaW5nID0gRGF0ZVByb3RvW1RPX1NUUklOR107XG52YXIgZ2V0VGltZSA9IERhdGVQcm90by5nZXRUaW1lO1xuaWYgKG5ldyBEYXRlKE5hTikgKyAnJyAhPSBJTlZBTElEX0RBVEUpIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShEYXRlUHJvdG8sIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgdmFyIHZhbHVlID0gZ2V0VGltZS5jYWxsKHRoaXMpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gJHRvU3RyaW5nLmNhbGwodGhpcykgOiBJTlZBTElEX0RBVEU7XG4gIH0pO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDE1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgVE9fUFJJTUlUSVZFID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvUHJpbWl0aXZlJyk7XG52YXIgcHJvdG8gPSBEYXRlLnByb3RvdHlwZTtcblxuaWYgKCEoVE9fUFJJTUlUSVZFIGluIHByb3RvKSkgcmVxdWlyZSgnLi9faGlkZScpKHByb3RvLCBUT19QUklNSVRJVkUsIHJlcXVpcmUoJy4vX2RhdGUtdG8tcHJpbWl0aXZlJykpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanNcbi8vIG1vZHVsZSBpZCA9IDE1OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIE5VTUJFUiA9ICdudW1iZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoaW50KSB7XG4gIGlmIChoaW50ICE9PSAnc3RyaW5nJyAmJiBoaW50ICE9PSBOVU1CRVIgJiYgaGludCAhPT0gJ2RlZmF1bHQnKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7XG4gIHJldHVybiB0b1ByaW1pdGl2ZShhbk9iamVjdCh0aGlzKSwgaGludCAhPSBOVU1CRVIpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2RhdGUtdG8tcHJpbWl0aXZlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjIuMS4yLjIgLyAxNS40LjMuMiBBcnJheS5pc0FycmF5KGFyZylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnQXJyYXknLCB7IGlzQXJyYXk6IHJlcXVpcmUoJy4vX2lzLWFycmF5JykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMTYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChtYXBwaW5nKSBtYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQygpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IgKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5mcm9tLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanNcbi8vIG1vZHVsZSBpZCA9IDE2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgaWYgKGluZGV4IGluIG9iamVjdCkgJGRlZmluZVByb3BlcnR5LmYob2JqZWN0LCBpbmRleCwgY3JlYXRlRGVzYygwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtpbmRleF0gPSB2YWx1ZTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDE2NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG4vLyBXZWJLaXQgQXJyYXkub2YgaXNuJ3QgZ2VuZXJpY1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShBcnJheS5vZi5jYWxsKEYpIGluc3RhbmNlb2YgRik7XG59KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMyBBcnJheS5vZiggLi4uaXRlbXMpXG4gIG9mOiBmdW5jdGlvbiBvZigvKiAuLi5hcmdzICovKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyAodHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheSkoYUxlbik7XG4gICAgd2hpbGUgKGFMZW4gPiBpbmRleCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gYUxlbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm9mLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5qb2luKHNlcGFyYXRvcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5Sm9pbiA9IFtdLmpvaW47XG5cbi8vIGZhbGxiYWNrIGZvciBub3QgYXJyYXktbGlrZSBzdHJpbmdzXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChyZXF1aXJlKCcuL19pb2JqZWN0JykgIT0gT2JqZWN0IHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoYXJyYXlKb2luKSksICdBcnJheScsIHtcbiAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodG9JT2JqZWN0KHRoaXMpLCBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IHNlcGFyYXRvcik7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuam9pbi5qc1xuLy8gbW9kdWxlIGlkID0gMTY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7XG4gIHJldHVybiAhIW1ldGhvZCAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY2FsbFxuICAgIGFyZyA/IG1ldGhvZC5jYWxsKG51bGwsIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgMSkgOiBtZXRob2QuY2FsbChudWxsKTtcbiAgfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaWN0LW1ldGhvZC5qc1xuLy8gbW9kdWxlIGlkID0gMTY5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xuXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2UgRVMzIHN0cmluZ3MgYW5kIERPTSBvYmplY3RzXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICBpZiAoaHRtbCkgYXJyYXlTbGljZS5jYWxsKGh0bWwpO1xufSksICdBcnJheScsIHtcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKGJlZ2luLCBlbmQpIHtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodGhpcy5sZW5ndGgpO1xuICAgIHZhciBrbGFzcyA9IGNvZih0aGlzKTtcbiAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZDtcbiAgICBpZiAoa2xhc3MgPT0gJ0FycmF5JykgcmV0dXJuIGFycmF5U2xpY2UuY2FsbCh0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB2YXIgc3RhcnQgPSB0b0Fic29sdXRlSW5kZXgoYmVnaW4sIGxlbik7XG4gICAgdmFyIHVwVG8gPSB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW4pO1xuICAgIHZhciBzaXplID0gdG9MZW5ndGgodXBUbyAtIHN0YXJ0KTtcbiAgICB2YXIgY2xvbmVkID0gbmV3IEFycmF5KHNpemUpO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykgY2xvbmVkW2ldID0ga2xhc3MgPT0gJ1N0cmluZydcbiAgICAgID8gdGhpcy5jaGFyQXQoc3RhcnQgKyBpKVxuICAgICAgOiB0aGlzW3N0YXJ0ICsgaV07XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zbGljZS5qc1xuLy8gbW9kdWxlIGlkID0gMTcwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyICRzb3J0ID0gW10uc29ydDtcbnZhciB0ZXN0ID0gWzEsIDIsIDNdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIElFOC1cbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCBidWdcbiAgdGVzdC5zb3J0KG51bGwpO1xuICAvLyBPbGQgV2ViS2l0XG59KSB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRzb3J0KSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjI1IEFycmF5LnByb3RvdHlwZS5zb3J0KGNvbXBhcmVmbilcbiAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWRcbiAgICAgID8gJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSlcbiAgICAgIDogJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSwgYUZ1bmN0aW9uKGNvbXBhcmVmbikpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvcnQuanNcbi8vIG1vZHVsZSBpZCA9IDE3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmb3JFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIFNUUklDVCA9IHJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5mb3JFYWNoLCB0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhU1RSSUNULCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xMCAvIDE1LjQuNC4xOCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZm9yLWVhY2guanNcbi8vIG1vZHVsZSBpZCA9IDE3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXNjID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsICRjcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWwsIHJlcztcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHJlc3VsdFtpbmRleF0gPSByZXM7ICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlcykgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdC5wdXNoKHZhbCk7ICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanNcbi8vIG1vZHVsZSBpZCA9IDE3M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDE3NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsKSkge1xuICAgIEMgPSBvcmlnaW5hbC5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDE3NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRtYXAgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5tYXAsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xNSAvIDE1LjQuNC4xOSBBcnJheS5wcm90b3R5cGUubWFwKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIG1hcDogZnVuY3Rpb24gbWFwKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRtYXAodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDE3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMik7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5maWx0ZXIsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy43IC8gMTUuNC40LjIwIEFycmF5LnByb3RvdHlwZS5maWx0ZXIoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGZpbHRlcih0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbHRlci5qc1xuLy8gbW9kdWxlIGlkID0gMTc3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHNvbWUgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5zb21lLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMjMgLyAxNS40LjQuMTcgQXJyYXkucHJvdG90eXBlLnNvbWUoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkc29tZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvbWUuanNcbi8vIG1vZHVsZSBpZCA9IDE3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRldmVyeSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg0KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmV2ZXJ5LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNSAvIDE1LjQuNC4xNiBBcnJheS5wcm90b3R5cGUuZXZlcnkoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmV2ZXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxNzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5yZWR1Y2UsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xOCAvIDE1LjQuNC4yMSBBcnJheS5wcm90b3R5cGUucmVkdWNlKGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgZmFsc2UpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS5qc1xuLy8gbW9kdWxlIGlkID0gMTgwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIGNhbGxiYWNrZm4sIGFMZW4sIG1lbW8sIGlzUmlnaHQpIHtcbiAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpO1xuICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBpbmRleCA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMDtcbiAgdmFyIGkgPSBpc1JpZ2h0ID8gLTEgOiAxO1xuICBpZiAoYUxlbiA8IDIpIGZvciAoOzspIHtcbiAgICBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xuICAgICAgaW5kZXggKz0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpbmRleCArPSBpO1xuICAgIGlmIChpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICB9XG4gIH1cbiAgZm9yICg7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSkgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICB9XG4gIHJldHVybiBtZW1vO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXJlZHVjZS5qc1xuLy8gbW9kdWxlIGlkID0gMTgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ucmVkdWNlUmlnaHQsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xOSAvIDE1LjQuNC4yMiBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQoY2FsbGJhY2tmbiBbLCBpbml0aWFsVmFsdWVdKVxuICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgdHJ1ZSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0LmpzXG4vLyBtb2R1bGUgaWQgPSAxODJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkaW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyICRuYXRpdmUgPSBbXS5pbmRleE9mO1xudmFyIE5FR0FUSVZFX1pFUk8gPSAhISRuYXRpdmUgJiYgMSAvIFsxXS5pbmRleE9mKDEsIC0wKSA8IDA7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjExIC8gMTUuNC40LjE0IEFycmF5LnByb3RvdHlwZS5pbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcbiAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiBORUdBVElWRV9aRVJPXG4gICAgICAvLyBjb252ZXJ0IC0wIHRvICswXG4gICAgICA/ICRuYXRpdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCAwXG4gICAgICA6ICRpbmRleE9mKHRoaXMsIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDE4M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciAkbmF0aXZlID0gW10ubGFzdEluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmxhc3RJbmRleE9mKDEsIC0wKSA8IDA7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE0IC8gMTUuNC40LjE1IEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IFssIGZyb21JbmRleF0pXG4gIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gQFsqLTFdICovKSB7XG4gICAgLy8gY29udmVydCAtMCB0byArMFxuICAgIGlmIChORUdBVElWRV9aRVJPKSByZXR1cm4gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDA7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgaW5kZXggPSBNYXRoLm1pbihpbmRleCwgdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSkpO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gbGVuZ3RoICsgaW5kZXg7XG4gICAgZm9yICg7aW5kZXggPj0gMDsgaW5kZXgtLSkgaWYgKGluZGV4IGluIE8pIGlmIChPW2luZGV4XSA9PT0gc2VhcmNoRWxlbWVudCkgcmV0dXJuIGluZGV4IHx8IDA7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDE4NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7IGNvcHlXaXRoaW46IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdjb3B5V2l0aGluJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbi5qc1xuLy8gbW9kdWxlIGlkID0gMTg1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFtdLmNvcHlXaXRoaW4gfHwgZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQgLyogPSAwICovLCBzdGFydCAvKiA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIHRvID0gdG9BYnNvbHV0ZUluZGV4KHRhcmdldCwgbGVuKTtcbiAgdmFyIGZyb20gPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGNvdW50ID0gTWF0aC5taW4oKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKSkgLSBmcm9tLCBsZW4gLSB0byk7XG4gIHZhciBpbmMgPSAxO1xuICBpZiAoZnJvbSA8IHRvICYmIHRvIDwgZnJvbSArIGNvdW50KSB7XG4gICAgaW5jID0gLTE7XG4gICAgZnJvbSArPSBjb3VudCAtIDE7XG4gICAgdG8gKz0gY291bnQgLSAxO1xuICB9XG4gIHdoaWxlIChjb3VudC0tID4gMCkge1xuICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICB0byArPSBpbmM7XG4gICAgZnJvbSArPSBpbmM7XG4gIH0gcmV0dXJuIE87XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktY29weS13aXRoaW4uanNcbi8vIG1vZHVsZSBpZCA9IDE4NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5JywgeyBmaWxsOiByZXF1aXJlKCcuL19hcnJheS1maWxsJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmaWxsJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWxsLmpzXG4vLyBtb2R1bGUgaWQgPSAxODhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKTtcbiAgd2hpbGUgKGVuZFBvcyA+IGluZGV4KSBPW2luZGV4KytdID0gdmFsdWU7XG4gIHJldHVybiBPO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWZpbGwuanNcbi8vIG1vZHVsZSBpZCA9IDE4OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDUpO1xudmFyIEtFWSA9ICdmaW5kJztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qc1xuLy8gbW9kdWxlIGlkID0gMTkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy45IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgocHJlZGljYXRlLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg2KTtcbnZhciBLRVkgPSAnZmluZEluZGV4JztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoS0VZKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDE5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKCdBcnJheScpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcy5qc1xuLy8gbW9kdWxlIGlkID0gMTkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanNcbi8vIG1vZHVsZSBpZCA9IDE5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciAkZmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyICRSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIEJhc2UgPSAkUmVnRXhwO1xudmFyIHByb3RvID0gJFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgcmUxID0gL2EvZztcbnZhciByZTIgPSAvYS9nO1xuLy8gXCJuZXdcIiBjcmVhdGVzIGEgbmV3IG9iamVjdCwgb2xkIHdlYmtpdCBidWdneSBoZXJlXG52YXIgQ09SUkVDVF9ORVcgPSBuZXcgJFJlZ0V4cChyZTEpICE9PSByZTE7XG5cbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICghQ09SUkVDVF9ORVcgfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJlMltyZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKV0gPSBmYWxzZTtcbiAgLy8gUmVnRXhwIGNvbnN0cnVjdG9yIGNhbiBhbHRlciBmbGFncyBhbmQgSXNSZWdFeHAgd29ya3MgY29ycmVjdCB3aXRoIEBAbWF0Y2hcbiAgcmV0dXJuICRSZWdFeHAocmUxKSAhPSByZTEgfHwgJFJlZ0V4cChyZTIpID09IHJlMiB8fCAkUmVnRXhwKHJlMSwgJ2knKSAhPSAnL2EvaSc7XG59KSkpIHtcbiAgJFJlZ0V4cCA9IGZ1bmN0aW9uIFJlZ0V4cChwLCBmKSB7XG4gICAgdmFyIHRpUkUgPSB0aGlzIGluc3RhbmNlb2YgJFJlZ0V4cDtcbiAgICB2YXIgcGlSRSA9IGlzUmVnRXhwKHApO1xuICAgIHZhciBmaVUgPSBmID09PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuICF0aVJFICYmIHBpUkUgJiYgcC5jb25zdHJ1Y3RvciA9PT0gJFJlZ0V4cCAmJiBmaVUgPyBwXG4gICAgICA6IGluaGVyaXRJZlJlcXVpcmVkKENPUlJFQ1RfTkVXXG4gICAgICAgID8gbmV3IEJhc2UocGlSRSAmJiAhZmlVID8gcC5zb3VyY2UgOiBwLCBmKVxuICAgICAgICA6IEJhc2UoKHBpUkUgPSBwIGluc3RhbmNlb2YgJFJlZ0V4cCkgPyBwLnNvdXJjZSA6IHAsIHBpUkUgJiYgZmlVID8gJGZsYWdzLmNhbGwocCkgOiBmKVxuICAgICAgLCB0aVJFID8gdGhpcyA6IHByb3RvLCAkUmVnRXhwKTtcbiAgfTtcbiAgdmFyIHByb3h5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIGtleSBpbiAkUmVnRXhwIHx8IGRQKCRSZWdFeHAsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBCYXNlW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBCYXNlW2tleV0gPSBpdDsgfVxuICAgIH0pO1xuICB9O1xuICBmb3IgKHZhciBrZXlzID0gZ09QTihCYXNlKSwgaSA9IDA7IGtleXMubGVuZ3RoID4gaTspIHByb3h5KGtleXNbaSsrXSk7XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJFJlZ0V4cDtcbiAgJFJlZ0V4cC5wcm90b3R5cGUgPSBwcm90bztcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsICdSZWdFeHAnLCAkUmVnRXhwKTtcbn1cblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnUmVnRXhwJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDE5NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFnc1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBpZiAodGhhdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmICh0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG4gIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JztcbiAgaWYgKHRoYXQuc3RpY2t5KSByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2ZsYWdzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmZsYWdzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciAkZmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IC8uL1tUT19TVFJJTkddO1xuXG52YXIgZGVmaW5lID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoUmVnRXhwLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmbiwgdHJ1ZSk7XG59O1xuXG4vLyAyMS4yLjUuMTQgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZygpXG5pZiAocmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7IHJldHVybiAkdG9TdHJpbmcuY2FsbCh7IHNvdXJjZTogJ2EnLCBmbGFnczogJ2InIH0pICE9ICcvYS9iJzsgfSkpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgcmV0dXJuICcvJy5jb25jYXQoUi5zb3VyY2UsICcvJyxcbiAgICAgICdmbGFncycgaW4gUiA/IFIuZmxhZ3MgOiAhREVTQ1JJUFRPUlMgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCA/ICRmbGFncy5jYWxsKFIpIDogdW5kZWZpbmVkKTtcbiAgfSk7XG4vLyBGRjQ0LSBSZWdFeHAjdG9TdHJpbmcgaGFzIGEgd3JvbmcgbmFtZVxufSBlbHNlIGlmICgkdG9TdHJpbmcubmFtZSAhPSBUT19TVFJJTkcpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbiAgfSk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAudG8tc3RyaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAxOThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3MoKVxuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgLy4vZy5mbGFncyAhPSAnZycpIHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogcmVxdWlyZSgnLi9fZmxhZ3MnKVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MuanNcbi8vIG1vZHVsZSBpZCA9IDE5OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBAQG1hdGNoIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ21hdGNoJywgMSwgZnVuY3Rpb24gKGRlZmluZWQsIE1BVENILCAkbWF0Y2gpIHtcbiAgLy8gMjEuMS4zLjExIFN0cmluZy5wcm90b3R5cGUubWF0Y2gocmVnZXhwKVxuICByZXR1cm4gW2Z1bmN0aW9uIG1hdGNoKHJlZ2V4cCkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgdmFyIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbTUFUQ0hdKFN0cmluZyhPKSk7XG4gIH0sICRtYXRjaF07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qc1xuLy8gbW9kdWxlIGlkID0gMjAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBsZW5ndGgsIGV4ZWMpIHtcbiAgdmFyIFNZTUJPTCA9IHdrcyhLRVkpO1xuICB2YXIgZm5zID0gZXhlYyhkZWZpbmVkLCBTWU1CT0wsICcnW0tFWV0pO1xuICB2YXIgc3RyZm4gPSBmbnNbMF07XG4gIHZhciByeGZuID0gZm5zWzFdO1xuICBpZiAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPSA3O1xuICB9KSkge1xuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgc3RyZm4pO1xuICAgIGhpZGUoUmVnRXhwLnByb3RvdHlwZSwgU1lNQk9MLCBsZW5ndGggPT0gMlxuICAgICAgLy8gMjEuMi41LjggUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdKHN0cmluZywgcmVwbGFjZVZhbHVlKVxuICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdClcbiAgICAgID8gZnVuY3Rpb24gKHN0cmluZywgYXJnKSB7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcyk7IH1cbiAgICApO1xuICB9XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qc1xuLy8gbW9kdWxlIGlkID0gMjAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIEBAcmVwbGFjZSBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFJFUExBQ0UsICRyZXBsYWNlKSB7XG4gIC8vIDIxLjEuMy4xNCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSlcbiAgcmV0dXJuIFtmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgIHZhciBmbiA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZuLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgIDogJHJlcGxhY2UuY2FsbChTdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICB9LCAkcmVwbGFjZV07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gQEBzZWFyY2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc2VhcmNoJywgMSwgZnVuY3Rpb24gKGRlZmluZWQsIFNFQVJDSCwgJHNlYXJjaCkge1xuICAvLyAyMS4xLjMuMTUgU3RyaW5nLnByb3RvdHlwZS5zZWFyY2gocmVnZXhwKVxuICByZXR1cm4gW2Z1bmN0aW9uIHNlYXJjaChyZWdleHApIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgIHZhciBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbU0VBUkNIXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gIH0sICRzZWFyY2hdO1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gQEBzcGxpdCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdzcGxpdCcsIDIsIGZ1bmN0aW9uIChkZWZpbmVkLCBTUExJVCwgJHNwbGl0KSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG4gIHZhciBfc3BsaXQgPSAkc3BsaXQ7XG4gIHZhciAkcHVzaCA9IFtdLnB1c2g7XG4gIHZhciAkU1BMSVQgPSAnc3BsaXQnO1xuICB2YXIgTEVOR1RIID0gJ2xlbmd0aCc7XG4gIHZhciBMQVNUX0lOREVYID0gJ2xhc3RJbmRleCc7XG4gIGlmIChcbiAgICAnYWJiYydbJFNQTElUXSgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0J1skU1BMSVRdKC8oPzopLywgLTEpW0xFTkdUSF0gIT0gNCB8fFxuICAgICdhYidbJFNQTElUXSgvKD86YWIpKi8pW0xFTkdUSF0gIT0gMiB8fFxuICAgICcuJ1skU1BMSVRdKC8oLj8pKC4/KS8pW0xFTkdUSF0gIT0gNCB8fFxuICAgICcuJ1skU1BMSVRdKC8oKSgpLylbTEVOR1RIXSA+IDEgfHxcbiAgICAnJ1skU1BMSVRdKC8uPy8pW0xFTkdUSF1cbiAgKSB7XG4gICAgdmFyIE5QQ0cgPSAvKCk/Py8uZXhlYygnJylbMV0gPT09IHVuZGVmaW5lZDsgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBcbiAgICAvLyBiYXNlZCBvbiBlczUtc2hpbSBpbXBsZW1lbnRhdGlvbiwgbmVlZCB0byByZXdvcmsgaXRcbiAgICAkc3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkgcmV0dXJuIF9zcGxpdC5jYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHNwbGl0TGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gNDI5NDk2NzI5NSA6IGxpbWl0ID4+PiAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgc2VwYXJhdG9yMiwgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aCwgaTtcbiAgICAgIC8vIERvZXNuJ3QgbmVlZCBmbGFncyBneSwgYnV0IHRoZXkgZG9uJ3QgaHVydFxuICAgICAgaWYgKCFOUENHKSBzZXBhcmF0b3IyID0gbmV3IFJlZ0V4cCgnXicgKyBzZXBhcmF0b3JDb3B5LnNvdXJjZSArICckKD8hXFxcXHMpJywgZmxhZ3MpO1xuICAgICAgd2hpbGUgKG1hdGNoID0gc2VwYXJhdG9yQ29weS5leGVjKHN0cmluZykpIHtcbiAgICAgICAgLy8gYHNlcGFyYXRvckNvcHkubGFzdEluZGV4YCBpcyBub3QgcmVsaWFibGUgY3Jvc3MtYnJvd3NlclxuICAgICAgICBsYXN0SW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAgZm9yIE5QQ0dcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICAgICAgaWYgKCFOUENHICYmIG1hdGNoW0xFTkdUSF0gPiAxKSBtYXRjaFswXS5yZXBsYWNlKHNlcGFyYXRvcjIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHNbTEVOR1RIXSAtIDI7IGkrKykgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAobWF0Y2hbTEVOR1RIXSA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHJpbmdbTEVOR1RIXSkgJHB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0W0xFTkdUSF0gPj0gc3BsaXRMaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0gPT09IG1hdGNoLmluZGV4KSBzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdKys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmdbTEVOR1RIXSkge1xuICAgICAgICBpZiAobGFzdExlbmd0aCB8fCAhc2VwYXJhdG9yQ29weS50ZXN0KCcnKSkgb3V0cHV0LnB1c2goJycpO1xuICAgICAgfSBlbHNlIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4KSk7XG4gICAgICByZXR1cm4gb3V0cHV0W0xFTkdUSF0gPiBzcGxpdExpbWl0ID8gb3V0cHV0LnNsaWNlKDAsIHNwbGl0TGltaXQpIDogb3V0cHV0O1xuICAgIH07XG4gIC8vIENoYWtyYSwgVjhcbiAgfSBlbHNlIGlmICgnMCdbJFNQTElUXSh1bmRlZmluZWQsIDApW0xFTkdUSF0pIHtcbiAgICAkc3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiBfc3BsaXQuY2FsbCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xuICB9XG4gIC8vIDIxLjEuMy4xNyBTdHJpbmcucHJvdG90eXBlLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpXG4gIHJldHVybiBbZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICB2YXIgZm4gPSBzZXBhcmF0b3IgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VwYXJhdG9yW1NQTElUXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdCkgOiAkc3BsaXQuY2FsbChTdHJpbmcoTyksIHNlcGFyYXRvciwgbGltaXQpO1xuICB9LCAkc3BsaXRdO1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQuanNcbi8vIG1vZHVsZSBpZCA9IDIwNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuL19wZXJmb3JtJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyICRQcm9taXNlID0gZ2xvYmFsW1BST01JU0VdO1xudmFyIGlzTm9kZSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIGVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIEludGVybmFsLCBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIE93blByb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSA9ICRQcm9taXNlLnJlc29sdmUoMSk7XG4gICAgdmFyIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbiAoZXhlYykge1xuICAgICAgZXhlYyhlbXB0eSwgZW1wdHkpO1xuICAgIH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJykgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHByb21pc2UsIGlzUmVqZWN0KSB7XG4gIGlmIChwcm9taXNlLl9uKSByZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIG9rID0gcHJvbWlzZS5fcyA9PSAxO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24gKHJlYWN0aW9uKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpKSBydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpIG9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgdW5oYW5kbGVkID0gaXNVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgdmFyIHJlc3VsdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZiAodW5oYW5kbGVkKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pIHtcbiAgICAgICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgoY29uc29sZSA9IGdsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmICh1bmhhbmRsZWQgJiYgcmVzdWx0LmUpIHRocm93IHJlc3VsdC52O1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICByZXR1cm4gcHJvbWlzZS5faCAhPT0gMSAmJiAocHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jKS5sZW5ndGggPT09IDA7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpIHtcbiAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3YgfSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYgKCFwcm9taXNlLl9hKSBwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgdmFyIHRoZW47XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmICh0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgJHJlamVjdC5jYWxsKHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9hKSB0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX3MpIG5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gJFByb21pc2UgfHwgQyA9PT0gV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFByb21pc2U6ICRQcm9taXNlIH0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB2YXIgJCRyZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoTElCUkFSWSAmJiB0aGlzID09PSBXcmFwcGVyID8gJFByb21pc2UgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uIChpdGVyKSB7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyICRpbmRleCA9IGluZGV4Kys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IDIwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBCUkVBSyA9IHt9O1xudmFyIFJFVFVSTiA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKSB7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKTtcbiAgdmFyIGYgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYgKGlzQXJyYXlJdGVyKGl0ZXJGbikpIGZvciAobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2Zvci1vZi5qc1xuLy8gbW9kdWxlIGlkID0gMjA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDIwOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190YXNrLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChpc05vZGUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgU2FmYXJpIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE9ic2VydmVyICYmICEoZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpKSB7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5cbmZ1bmN0aW9uIFByb21pc2VDYXBhYmlsaXR5KEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qc1xuLy8gbW9kdWxlIGlkID0gMjExXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19wZXJmb3JtLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qc1xuLy8gbW9kdWxlIGlkID0gMjEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qc1xuLy8gbW9kdWxlIGlkID0gMjE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIE1BUCA9ICdNYXAnO1xuXG4vLyAyMy4xIE1hcCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShNQVAsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjEuMy42IE1hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gc3Ryb25nLmdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnY7XG4gIH0sXG4gIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih2YWxpZGF0ZSh0aGlzLCBNQVApLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZywgdHJ1ZSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDIxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgJGl0ZXJEZWZpbmUgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5O1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNJWkUgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgdmFyIGVudHJ5O1xuICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yIChlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICBpZiAoZW50cnkuayA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBmb3IgKHZhciB0aGF0ID0gdmFsaWRhdGUodGhpcywgTkFNRSksIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucCkgZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm47XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmICh0aGF0Ll9mID09IGVudHJ5KSB0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZiAodGhhdC5fbCA9PSBlbnRyeSkgdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZikge1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCBOQU1FKVtTSVpFXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgdmFyIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGF0Ll9mKSB0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZiAocHJldikgcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSB0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQywgTkFNRSwgSVNfTUFQKSB7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgdGhpcy5fdCA9IHZhbGlkYXRlKGl0ZXJhdGVkLCBOQU1FKTsgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBraW5kID0gdGhhdC5faztcbiAgICAgIHZhciBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qc1xuLy8gbW9kdWxlIGlkID0gMjE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRZUEUpIHtcbiAgaWYgKCFpc09iamVjdChpdCkgfHwgaXQuX3QgIT09IFRZUEUpIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQhJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL192YWxpZGF0ZS1jb2xsZWN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJGl0ZXJEZXRlY3QgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgZm4gPSBwcm90b1tLRVldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBLRVksXG4gICAgICBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyB1bmRlZmluZWQgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpIHsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpOyByZXR1cm4gdGhpczsgfVxuICAgICAgICA6IGZ1bmN0aW9uIHNldChhLCBiKSB7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhLCBiKTsgcmV0dXJuIHRoaXM7IH1cbiAgICApO1xuICB9O1xuICBpZiAodHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgICBtZXRhLk5FRUQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiAgQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9ICRpdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7IG5ldyBDKGl0ZXIpOyB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UoKSwgdGFyZ2V0LCBDKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQy5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQztcbiAgICB9XG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuICAgIGlmIChCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKSBmaXhNZXRob2QoQURERVIpO1xuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgcHJvdG8uY2xlYXIpIGRlbGV0ZSBwcm90by5jbGVhcjtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChDICE9IEJhc2UpLCBPKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgU0VUID0gJ1NldCc7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFNFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodmFsaWRhdGUodGhpcywgU0VUKSwgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAyMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGVhY2ggPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMCk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpO1xudmFyIHdlYWsgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXdlYWsnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBXRUFLX01BUCA9ICdXZWFrTWFwJztcbnZhciBnZXRXZWFrID0gbWV0YS5nZXRXZWFrO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IHdlYWsudWZzdG9yZTtcbnZhciB0bXAgPSB7fTtcbnZhciBJbnRlcm5hbE1hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICB9O1xufTtcblxudmFyIG1ldGhvZHMgPSB7XG4gIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBXRUFLX01BUCkpLmdldChrZXkpO1xuICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhW3RoaXMuX2ldIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSxcbiAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd2Vhay5kZWYodmFsaWRhdGUodGhpcywgV0VBS19NQVApLCBrZXksIHZhbHVlKTtcbiAgfVxufTtcblxuLy8gMjMuMyBXZWFrTWFwIE9iamVjdHNcbnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfTUFQLCB3cmFwcGVyLCBtZXRob2RzLCB3ZWFrLCB0cnVlLCB0cnVlKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuaWYgKGZhaWxzKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyAkV2Vha01hcCgpLnNldCgoT2JqZWN0LmZyZWV6ZSB8fCBPYmplY3QpKHRtcCksIDcpLmdldCh0bXApICE9IDc7IH0pKSB7XG4gIEludGVybmFsTWFwID0gd2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBXRUFLX01BUCk7XG4gIGFzc2lnbihJbnRlcm5hbE1hcC5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICBtZXRhLk5FRUQgPSB0cnVlO1xuICBlYWNoKFsnZGVsZXRlJywgJ2hhcycsICdnZXQnLCAnc2V0J10sIGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcHJvdG8gPSAkV2Vha01hcC5wcm90b3R5cGU7XG4gICAgdmFyIG1ldGhvZCA9IHByb3RvW2tleV07XG4gICAgcmVkZWZpbmUocHJvdG8sIGtleSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIC8vIHN0b3JlIGZyb3plbiBvYmplY3RzIG9uIGludGVybmFsIHdlYWttYXAgc2hpbVxuICAgICAgaWYgKGlzT2JqZWN0KGEpICYmICFpc0V4dGVuc2libGUoYSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mKSB0aGlzLl9mID0gbmV3IEludGVybmFsTWFwKCk7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9mW2tleV0oYSwgYik7XG4gICAgICAgIHJldHVybiBrZXkgPT0gJ3NldCcgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgLy8gc3RvcmUgYWxsIHRoZSByZXN0IG9uIG5hdGl2ZSB3ZWFrbWFwXG4gICAgICB9IHJldHVybiBtZXRob2QuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLW1hcC5qc1xuLy8gbW9kdWxlIGlkID0gMjIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGdldFdlYWsgPSByZXF1aXJlKCcuL19tZXRhJykuZ2V0V2VhaztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKTtcbnZhciAkaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgYXJyYXlGaW5kID0gY3JlYXRlQXJyYXlNZXRob2QoNSk7XG52YXIgYXJyYXlGaW5kSW5kZXggPSBjcmVhdGVBcnJheU1ldGhvZCg2KTtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAodGhhdCkge1xuICByZXR1cm4gdGhhdC5fbCB8fCAodGhhdC5fbCA9IG5ldyBVbmNhdWdodEZyb3plblN0b3JlKCkpO1xufTtcbnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmEgPSBbXTtcbn07XG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGFycmF5RmluZChzdG9yZS5hLCBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgfSk7XG59O1xuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuYS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gYXJyYXlGaW5kSW5kZXgodGhpcy5hLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICAgIH0pO1xuICAgIGlmICh+aW5kZXgpIHRoaXMuYS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiAhIX5pbmRleDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBpZCsrOyAgICAgIC8vIGNvbGxlY3Rpb24gaWRcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7IC8vIGxlYWsgc3RvcmUgZm9yIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RzXG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgfSk7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjMuMy4yIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy40LjMuMyBXZWFrU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSkgJiYgZGVsZXRlIGRhdGFbdGhpcy5faV07XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjQuMy40IFdlYWtTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSkuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZGF0YSA9IGdldFdlYWsoYW5PYmplY3Qoa2V5KSwgdHJ1ZSk7XG4gICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUodGhhdCkuc2V0KGtleSwgdmFsdWUpO1xuICAgIGVsc2UgZGF0YVt0aGF0Ll9pXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGF0O1xuICB9LFxuICB1ZnN0b3JlOiB1bmNhdWdodEZyb3plblN0b3JlXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi13ZWFrLmpzXG4vLyBtb2R1bGUgaWQgPSAyMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlYWsgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXdlYWsnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBXRUFLX1NFVCA9ICdXZWFrU2V0JztcblxuLy8gMjMuNCBXZWFrU2V0IE9iamVjdHNcbnJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShXRUFLX1NFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjQuMy4xIFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICByZXR1cm4gd2Vhay5kZWYodmFsaWRhdGUodGhpcywgV0VBS19TRVQpLCB2YWx1ZSwgdHJ1ZSk7XG4gIH1cbn0sIHdlYWssIGZhbHNlLCB0cnVlKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAyMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5BcnJheUJ1ZmZlcjtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgJEFycmF5QnVmZmVyID0gYnVmZmVyLkFycmF5QnVmZmVyO1xudmFyICREYXRhVmlldyA9IGJ1ZmZlci5EYXRhVmlldztcbnZhciAkaXNWaWV3ID0gJHR5cGVkLkFCViAmJiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG52YXIgJHNsaWNlID0gJEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZTtcbnZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoQXJyYXlCdWZmZXIgIT09ICRBcnJheUJ1ZmZlciksIHsgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlciB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhJHR5cGVkLkNPTlNUUiwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuMy4xIEFycmF5QnVmZmVyLmlzVmlldyhhcmcpXG4gIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gICAgcmV0dXJuICRpc1ZpZXcgJiYgJGlzVmlldyhpdCkgfHwgaXNPYmplY3QoaXQpICYmIFZJRVcgaW4gaXQ7XG4gIH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuVSArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIW5ldyAkQXJyYXlCdWZmZXIoMikuc2xpY2UoMSwgdW5kZWZpbmVkKS5ieXRlTGVuZ3RoO1xufSksIEFSUkFZX0JVRkZFUiwge1xuICAvLyAyNC4xLjQuMyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoJHNsaWNlICE9PSB1bmRlZmluZWQgJiYgZW5kID09PSB1bmRlZmluZWQpIHJldHVybiAkc2xpY2UuY2FsbChhbk9iamVjdCh0aGlzKSwgc3RhcnQpOyAvLyBGRiBmaXhcbiAgICB2YXIgbGVuID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gICAgdmFyIGZpbmFsID0gdG9BYnNvbHV0ZUluZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogZW5kLCBsZW4pO1xuICAgIHZhciByZXN1bHQgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkQXJyYXlCdWZmZXIpKSh0b0xlbmd0aChmaW5hbCAtIGZpcnN0KSk7XG4gICAgdmFyIHZpZXdTID0gbmV3ICREYXRhVmlldyh0aGlzKTtcbiAgICB2YXIgdmlld1QgPSBuZXcgJERhdGFWaWV3KHJlc3VsdCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoZmlyc3QgPCBmaW5hbCkge1xuICAgICAgdmlld1Quc2V0VWludDgoaW5kZXgrKywgdmlld1MuZ2V0VWludDgoZmlyc3QrKykpO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoQVJSQVlfQlVGRkVSKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qc1xuLy8gbW9kdWxlIGlkID0gMjIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFRZUEVEID0gdWlkKCd0eXBlZF9hcnJheScpO1xudmFyIFZJRVcgPSB1aWQoJ3ZpZXcnKTtcbnZhciBBQlYgPSAhIShnbG9iYWwuQXJyYXlCdWZmZXIgJiYgZ2xvYmFsLkRhdGFWaWV3KTtcbnZhciBDT05TVFIgPSBBQlY7XG52YXIgaSA9IDA7XG52YXIgbCA9IDk7XG52YXIgVHlwZWQ7XG5cbnZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzID0gKFxuICAnSW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXknXG4pLnNwbGl0KCcsJyk7XG5cbndoaWxlIChpIDwgbCkge1xuICBpZiAoVHlwZWQgPSBnbG9iYWxbVHlwZWRBcnJheUNvbnN0cnVjdG9yc1tpKytdXSkge1xuICAgIGhpZGUoVHlwZWQucHJvdG90eXBlLCBUWVBFRCwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICB9IGVsc2UgQ09OU1RSID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBQlY6IEFCVixcbiAgQ09OU1RSOiBDT05TVFIsXG4gIFRZUEVEOiBUWVBFRCxcbiAgVklFVzogVklFV1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAyMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICR0eXBlZCA9IHJlcXVpcmUoJy4vX3R5cGVkJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0luZGV4ID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBhcnJheUZpbGwgPSByZXF1aXJlKCcuL19hcnJheS1maWxsJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgREFUQV9WSUVXID0gJ0RhdGFWaWV3JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoISc7XG52YXIgV1JPTkdfSU5ERVggPSAnV3JvbmcgaW5kZXghJztcbnZhciAkQXJyYXlCdWZmZXIgPSBnbG9iYWxbQVJSQVlfQlVGRkVSXTtcbnZhciAkRGF0YVZpZXcgPSBnbG9iYWxbREFUQV9WSUVXXTtcbnZhciBNYXRoID0gZ2xvYmFsLk1hdGg7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdy1yZXN0cmljdGVkLW5hbWVzXG52YXIgSW5maW5pdHkgPSBnbG9iYWwuSW5maW5pdHk7XG52YXIgQmFzZUJ1ZmZlciA9ICRBcnJheUJ1ZmZlcjtcbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBwb3cgPSBNYXRoLnBvdztcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgTE4yID0gTWF0aC5MTjI7XG52YXIgQlVGRkVSID0gJ2J1ZmZlcic7XG52YXIgQllURV9MRU5HVEggPSAnYnl0ZUxlbmd0aCc7XG52YXIgQllURV9PRkZTRVQgPSAnYnl0ZU9mZnNldCc7XG52YXIgJEJVRkZFUiA9IERFU0NSSVBUT1JTID8gJ19iJyA6IEJVRkZFUjtcbnZhciAkTEVOR1RIID0gREVTQ1JJUFRPUlMgPyAnX2wnIDogQllURV9MRU5HVEg7XG52YXIgJE9GRlNFVCA9IERFU0NSSVBUT1JTID8gJ19vJyA6IEJZVEVfT0ZGU0VUO1xuXG4vLyBJRUVFNzU0IGNvbnZlcnNpb25zIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaWVlZTc1NFxuZnVuY3Rpb24gcGFja0lFRUU3NTQodmFsdWUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KG5CeXRlcyk7XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgcnQgPSBtTGVuID09PSAyMyA/IHBvdygyLCAtMjQpIC0gcG93KDIsIC03NykgOiAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciBzID0gdmFsdWUgPCAwIHx8IHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDAgPyAxIDogMDtcbiAgdmFyIGUsIG0sIGM7XG4gIHZhbHVlID0gYWJzKHZhbHVlKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICBpZiAodmFsdWUgIT0gdmFsdWUgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIG0gPSB2YWx1ZSAhPSB2YWx1ZSA/IDEgOiAwO1xuICAgIGUgPSBlTWF4O1xuICB9IGVsc2Uge1xuICAgIGUgPSBmbG9vcihsb2codmFsdWUpIC8gTE4yKTtcbiAgICBpZiAodmFsdWUgKiAoYyA9IHBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tO1xuICAgICAgYyAqPSAyO1xuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBwb3coMiwgMSAtIGVCaWFzKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDA7XG4gICAgICBlID0gZU1heDtcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogcG93KDIsIG1MZW4pO1xuICAgICAgZSA9IGUgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogcG93KDIsIGVCaWFzIC0gMSkgKiBwb3coMiwgbUxlbik7XG4gICAgICBlID0gMDtcbiAgICB9XG4gIH1cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW2krK10gPSBtICYgMjU1LCBtIC89IDI1NiwgbUxlbiAtPSA4KTtcbiAgZSA9IGUgPDwgbUxlbiB8IG07XG4gIGVMZW4gKz0gbUxlbjtcbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbaSsrXSA9IGUgJiAyNTUsIGUgLz0gMjU2LCBlTGVuIC09IDgpO1xuICBidWZmZXJbLS1pXSB8PSBzICogMTI4O1xuICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gdW5wYWNrSUVFRTc1NChidWZmZXIsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIG5CaXRzID0gZUxlbiAtIDc7XG4gIHZhciBpID0gbkJ5dGVzIC0gMTtcbiAgdmFyIHMgPSBidWZmZXJbaS0tXTtcbiAgdmFyIGUgPSBzICYgMTI3O1xuICB2YXIgbTtcbiAgcyA+Pj0gNztcbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbaV0sIGktLSwgbkJpdHMgLT0gOCk7XG4gIG0gPSBlICYgKDEgPDwgLW5CaXRzKSAtIDE7XG4gIGUgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbUxlbjtcbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbaV0sIGktLSwgbkJpdHMgLT0gOCk7XG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhcztcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiBzID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBwb3coMiwgbUxlbik7XG4gICAgZSA9IGUgLSBlQmlhcztcbiAgfSByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIHBvdygyLCBlIC0gbUxlbik7XG59XG5cbmZ1bmN0aW9uIHVucGFja0kzMihieXRlcykge1xuICByZXR1cm4gYnl0ZXNbM10gPDwgMjQgfCBieXRlc1syXSA8PCAxNiB8IGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXTtcbn1cbmZ1bmN0aW9uIHBhY2tJOChpdCkge1xuICByZXR1cm4gW2l0ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrSTE2KGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmLCBpdCA+PiA4ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrSTMyKGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmLCBpdCA+PiA4ICYgMHhmZiwgaXQgPj4gMTYgJiAweGZmLCBpdCA+PiAyNCAmIDB4ZmZdO1xufVxuZnVuY3Rpb24gcGFja0Y2NChpdCkge1xuICByZXR1cm4gcGFja0lFRUU3NTQoaXQsIDUyLCA4KTtcbn1cbmZ1bmN0aW9uIHBhY2tGMzIoaXQpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KGl0LCAyMywgNCk7XG59XG5cbmZ1bmN0aW9uIGFkZEdldHRlcihDLCBrZXksIGludGVybmFsKSB7XG4gIGRQKENbUFJPVE9UWVBFXSwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpc1tpbnRlcm5hbF07IH0gfSk7XG59XG5cbmZ1bmN0aW9uIGdldCh2aWV3LCBieXRlcywgaW5kZXgsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBudW1JbmRleCA9ICtpbmRleDtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChudW1JbmRleCk7XG4gIGlmIChpbnRJbmRleCArIGJ5dGVzID4gdmlld1skTEVOR1RIXSkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBzdG9yZSA9IHZpZXdbJEJVRkZFUl0uX2I7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgdmlld1skT0ZGU0VUXTtcbiAgdmFyIHBhY2sgPSBzdG9yZS5zbGljZShzdGFydCwgc3RhcnQgKyBieXRlcyk7XG4gIHJldHVybiBpc0xpdHRsZUVuZGlhbiA/IHBhY2sgOiBwYWNrLnJldmVyc2UoKTtcbn1cbmZ1bmN0aW9uIHNldCh2aWV3LCBieXRlcywgaW5kZXgsIGNvbnZlcnNpb24sIHZhbHVlLCBpc0xpdHRsZUVuZGlhbikge1xuICB2YXIgbnVtSW5kZXggPSAraW5kZXg7XG4gIHZhciBpbnRJbmRleCA9IHRvSW5kZXgobnVtSW5kZXgpO1xuICBpZiAoaW50SW5kZXggKyBieXRlcyA+IHZpZXdbJExFTkdUSF0pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgc3RvcmUgPSB2aWV3WyRCVUZGRVJdLl9iO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHZpZXdbJE9GRlNFVF07XG4gIHZhciBwYWNrID0gY29udmVyc2lvbigrdmFsdWUpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHN0b3JlW3N0YXJ0ICsgaV0gPSBwYWNrW2lzTGl0dGxlRW5kaWFuID8gaSA6IGJ5dGVzIC0gaSAtIDFdO1xufVxuXG5pZiAoISR0eXBlZC5BQlYpIHtcbiAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0b0luZGV4KGxlbmd0aCk7XG4gICAgdGhpcy5fYiA9IGFycmF5RmlsbC5jYWxsKG5ldyBBcnJheShieXRlTGVuZ3RoKSwgMCk7XG4gICAgdGhpc1skTEVOR1RIXSA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgJERhdGFWaWV3ID0gZnVuY3Rpb24gRGF0YVZpZXcoYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkRGF0YVZpZXcsIERBVEFfVklFVyk7XG4gICAgYW5JbnN0YW5jZShidWZmZXIsICRBcnJheUJ1ZmZlciwgREFUQV9WSUVXKTtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gYnVmZmVyWyRMRU5HVEhdO1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoYnl0ZU9mZnNldCk7XG4gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQhJyk7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ1ZmZlckxlbmd0aCAtIG9mZnNldCA6IHRvTGVuZ3RoKGJ5dGVMZW5ndGgpO1xuICAgIGlmIChvZmZzZXQgKyBieXRlTGVuZ3RoID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgdGhpc1skQlVGRkVSXSA9IGJ1ZmZlcjtcbiAgICB0aGlzWyRPRkZTRVRdID0gb2Zmc2V0O1xuICAgIHRoaXNbJExFTkdUSF0gPSBieXRlTGVuZ3RoO1xuICB9O1xuXG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIGFkZEdldHRlcigkQXJyYXlCdWZmZXIsIEJZVEVfTEVOR1RILCAnX2wnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCVUZGRVIsICdfYicpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJZVEVfTEVOR1RILCAnX2wnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCWVRFX09GRlNFVCwgJ19vJyk7XG4gIH1cblxuICByZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSwge1xuICAgIGdldEludDg6IGZ1bmN0aW9uIGdldEludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDtcbiAgICB9LFxuICAgIGdldFVpbnQ4OiBmdW5jdGlvbiBnZXRVaW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MTY6IGZ1bmN0aW9uIGdldEludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pO1xuICAgICAgcmV0dXJuIChieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF0pIDw8IDE2ID4+IDE2O1xuICAgIH0sXG4gICAgZ2V0VWludDE2OiBmdW5jdGlvbiBnZXRVaW50MTYoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSk7XG4gICAgICByZXR1cm4gYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MzI6IGZ1bmN0aW9uIGdldEludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJMzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSkpO1xuICAgIH0sXG4gICAgZ2V0VWludDMyOiBmdW5jdGlvbiBnZXRVaW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0kzMihnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSkgPj4+IDA7XG4gICAgfSxcbiAgICBnZXRGbG9hdDMyOiBmdW5jdGlvbiBnZXRGbG9hdDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pLCAyMywgNCk7XG4gICAgfSxcbiAgICBnZXRGbG9hdDY0OiBmdW5jdGlvbiBnZXRGbG9hdDY0KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pLCA1MiwgOCk7XG4gICAgfSxcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0k4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSTgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldEludDE2OiBmdW5jdGlvbiBzZXRJbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJMTYsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0VWludDE2OiBmdW5jdGlvbiBzZXRVaW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBwYWNrSTE2LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEludDMyOiBmdW5jdGlvbiBzZXRJbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0VWludDMyOiBmdW5jdGlvbiBzZXRVaW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSTMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEZsb2F0MzI6IGZ1bmN0aW9uIHNldEZsb2F0MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrRjMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEZsb2F0NjQ6IGZ1bmN0aW9uIHNldEZsb2F0NjQoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBwYWNrRjY0LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgaWYgKCFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgJEFycmF5QnVmZmVyKDEpO1xuICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoLTEpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICB9KSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoMS41KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBuZXcgJEFycmF5QnVmZmVyKE5hTik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgcmV0dXJuICRBcnJheUJ1ZmZlci5uYW1lICE9IEFSUkFZX0JVRkZFUjtcbiAgfSkpIHtcbiAgICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhpcywgJEFycmF5QnVmZmVyKTtcbiAgICAgIHJldHVybiBuZXcgQmFzZUJ1ZmZlcih0b0luZGV4KGxlbmd0aCkpO1xuICAgIH07XG4gICAgdmFyIEFycmF5QnVmZmVyUHJvdG8gPSAkQXJyYXlCdWZmZXJbUFJPVE9UWVBFXSA9IEJhc2VCdWZmZXJbUFJPVE9UWVBFXTtcbiAgICBmb3IgKHZhciBrZXlzID0gZ09QTihCYXNlQnVmZmVyKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOykge1xuICAgICAgaWYgKCEoKGtleSA9IGtleXNbaisrXSkgaW4gJEFycmF5QnVmZmVyKSkgaGlkZSgkQXJyYXlCdWZmZXIsIGtleSwgQmFzZUJ1ZmZlcltrZXldKTtcbiAgICB9XG4gICAgaWYgKCFMSUJSQVJZKSBBcnJheUJ1ZmZlclByb3RvLmNvbnN0cnVjdG9yID0gJEFycmF5QnVmZmVyO1xuICB9XG4gIC8vIGlPUyBTYWZhcmkgNy54IGJ1Z1xuICB2YXIgdmlldyA9IG5ldyAkRGF0YVZpZXcobmV3ICRBcnJheUJ1ZmZlcigyKSk7XG4gIHZhciAkc2V0SW50OCA9ICREYXRhVmlld1tQUk9UT1RZUEVdLnNldEludDg7XG4gIHZpZXcuc2V0SW50OCgwLCAyMTQ3NDgzNjQ4KTtcbiAgdmlldy5zZXRJbnQ4KDEsIDIxNDc0ODM2NDkpO1xuICBpZiAodmlldy5nZXRJbnQ4KDApIHx8ICF2aWV3LmdldEludDgoMSkpIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7XG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgICRzZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG59XG5zZXRUb1N0cmluZ1RhZygkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG5zZXRUb1N0cmluZ1RhZygkRGF0YVZpZXcsIERBVEFfVklFVyk7XG5oaWRlKCREYXRhVmlld1tQUk9UT1RZUEVdLCAkdHlwZWQuVklFVywgdHJ1ZSk7XG5leHBvcnRzW0FSUkFZX0JVRkZFUl0gPSAkQXJyYXlCdWZmZXI7XG5leHBvcnRzW0RBVEFfVklFV10gPSAkRGF0YVZpZXc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190eXBlZC1idWZmZXIuanNcbi8vIG1vZHVsZSBpZCA9IDIyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2luZGV4XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXIoaXQpO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTtcbiAgaWYgKG51bWJlciAhPT0gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBsZW5ndGghJyk7XG4gIHJldHVybiBsZW5ndGg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDIyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fdHlwZWQnKS5BQlYsIHtcbiAgRGF0YVZpZXc6IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpLkRhdGFWaWV3XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qc1xuLy8gbW9kdWxlIGlkID0gMjI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDIyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5pZiAocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSkge1xuICB2YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbiAgdmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xuICB2YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xuICB2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuICB2YXIgJHR5cGVkID0gcmVxdWlyZSgnLi9fdHlwZWQnKTtcbiAgdmFyICRidWZmZXIgPSByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKTtcbiAgdmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xuICB2YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG4gIHZhciBwcm9wZXJ0eURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG4gIHZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xuICB2YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbiAgdmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbiAgdmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG4gIHZhciB0b0luZGV4ID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbiAgdmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG4gIHZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuICB2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG4gIHZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xuICB2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbiAgdmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG4gIHZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbiAgdmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbiAgdmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xuICB2YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbiAgdmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG4gIHZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbiAgdmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xuICB2YXIgY3JlYXRlQXJyYXlNZXRob2QgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJyk7XG4gIHZhciBjcmVhdGVBcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKTtcbiAgdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbiAgdmFyIEFycmF5SXRlcmF0b3JzID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbiAgdmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xuICB2YXIgJGl0ZXJEZXRlY3QgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpO1xuICB2YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJyk7XG4gIHZhciBhcnJheUZpbGwgPSByZXF1aXJlKCcuL19hcnJheS1maWxsJyk7XG4gIHZhciBhcnJheUNvcHlXaXRoaW4gPSByZXF1aXJlKCcuL19hcnJheS1jb3B5LXdpdGhpbicpO1xuICB2YXIgJERQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG4gIHZhciAkR09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG4gIHZhciBkUCA9ICREUC5mO1xuICB2YXIgZ09QRCA9ICRHT1BELmY7XG4gIHZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG4gIHZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuICB2YXIgVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5O1xuICB2YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcbiAgdmFyIFNIQVJFRF9CVUZGRVIgPSAnU2hhcmVkJyArIEFSUkFZX0JVRkZFUjtcbiAgdmFyIEJZVEVTX1BFUl9FTEVNRU5UID0gJ0JZVEVTX1BFUl9FTEVNRU5UJztcbiAgdmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuICB2YXIgQXJyYXlQcm90byA9IEFycmF5W1BST1RPVFlQRV07XG4gIHZhciAkQXJyYXlCdWZmZXIgPSAkYnVmZmVyLkFycmF5QnVmZmVyO1xuICB2YXIgJERhdGFWaWV3ID0gJGJ1ZmZlci5EYXRhVmlldztcbiAgdmFyIGFycmF5Rm9yRWFjaCA9IGNyZWF0ZUFycmF5TWV0aG9kKDApO1xuICB2YXIgYXJyYXlGaWx0ZXIgPSBjcmVhdGVBcnJheU1ldGhvZCgyKTtcbiAgdmFyIGFycmF5U29tZSA9IGNyZWF0ZUFycmF5TWV0aG9kKDMpO1xuICB2YXIgYXJyYXlFdmVyeSA9IGNyZWF0ZUFycmF5TWV0aG9kKDQpO1xuICB2YXIgYXJyYXlGaW5kID0gY3JlYXRlQXJyYXlNZXRob2QoNSk7XG4gIHZhciBhcnJheUZpbmRJbmRleCA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpO1xuICB2YXIgYXJyYXlJbmNsdWRlcyA9IGNyZWF0ZUFycmF5SW5jbHVkZXModHJ1ZSk7XG4gIHZhciBhcnJheUluZGV4T2YgPSBjcmVhdGVBcnJheUluY2x1ZGVzKGZhbHNlKTtcbiAgdmFyIGFycmF5VmFsdWVzID0gQXJyYXlJdGVyYXRvcnMudmFsdWVzO1xuICB2YXIgYXJyYXlLZXlzID0gQXJyYXlJdGVyYXRvcnMua2V5cztcbiAgdmFyIGFycmF5RW50cmllcyA9IEFycmF5SXRlcmF0b3JzLmVudHJpZXM7XG4gIHZhciBhcnJheUxhc3RJbmRleE9mID0gQXJyYXlQcm90by5sYXN0SW5kZXhPZjtcbiAgdmFyIGFycmF5UmVkdWNlID0gQXJyYXlQcm90by5yZWR1Y2U7XG4gIHZhciBhcnJheVJlZHVjZVJpZ2h0ID0gQXJyYXlQcm90by5yZWR1Y2VSaWdodDtcbiAgdmFyIGFycmF5Sm9pbiA9IEFycmF5UHJvdG8uam9pbjtcbiAgdmFyIGFycmF5U29ydCA9IEFycmF5UHJvdG8uc29ydDtcbiAgdmFyIGFycmF5U2xpY2UgPSBBcnJheVByb3RvLnNsaWNlO1xuICB2YXIgYXJyYXlUb1N0cmluZyA9IEFycmF5UHJvdG8udG9TdHJpbmc7XG4gIHZhciBhcnJheVRvTG9jYWxlU3RyaW5nID0gQXJyYXlQcm90by50b0xvY2FsZVN0cmluZztcbiAgdmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xuICB2YXIgVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpO1xuICB2YXIgVFlQRURfQ09OU1RSVUNUT1IgPSB1aWQoJ3R5cGVkX2NvbnN0cnVjdG9yJyk7XG4gIHZhciBERUZfQ09OU1RSVUNUT1IgPSB1aWQoJ2RlZl9jb25zdHJ1Y3RvcicpO1xuICB2YXIgQUxMX0NPTlNUUlVDVE9SUyA9ICR0eXBlZC5DT05TVFI7XG4gIHZhciBUWVBFRF9BUlJBWSA9ICR0eXBlZC5UWVBFRDtcbiAgdmFyIFZJRVcgPSAkdHlwZWQuVklFVztcbiAgdmFyIFdST05HX0xFTkdUSCA9ICdXcm9uZyBsZW5ndGghJztcblxuICB2YXIgJG1hcCA9IGNyZWF0ZUFycmF5TWV0aG9kKDEsIGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYWxsb2NhdGUoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSksIGxlbmd0aCk7XG4gIH0pO1xuXG4gIHZhciBMSVRUTEVfRU5ESUFOID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgVWludDE2QXJyYXkoWzFdKS5idWZmZXIpWzBdID09PSAxO1xuICB9KTtcblxuICB2YXIgRk9SQ0VEX1NFVCA9ICEhVWludDhBcnJheSAmJiAhIVVpbnQ4QXJyYXlbUFJPVE9UWVBFXS5zZXQgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBVaW50OEFycmF5KDEpLnNldCh7fSk7XG4gIH0pO1xuXG4gIHZhciB0b09mZnNldCA9IGZ1bmN0aW9uIChpdCwgQllURVMpIHtcbiAgICB2YXIgb2Zmc2V0ID0gdG9JbnRlZ2VyKGl0KTtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgJSBCWVRFUykgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0IScpO1xuICAgIHJldHVybiBvZmZzZXQ7XG4gIH07XG5cbiAgdmFyIHZhbGlkYXRlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgaWYgKGlzT2JqZWN0KGl0KSAmJiBUWVBFRF9BUlJBWSBpbiBpdCkgcmV0dXJuIGl0O1xuICAgIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgdHlwZWQgYXJyYXkhJyk7XG4gIH07XG5cbiAgdmFyIGFsbG9jYXRlID0gZnVuY3Rpb24gKEMsIGxlbmd0aCkge1xuICAgIGlmICghKGlzT2JqZWN0KEMpICYmIFRZUEVEX0NPTlNUUlVDVE9SIGluIEMpKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0l0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIScpO1xuICAgIH0gcmV0dXJuIG5ldyBDKGxlbmd0aCk7XG4gIH07XG5cbiAgdmFyIHNwZWNpZXNGcm9tTGlzdCA9IGZ1bmN0aW9uIChPLCBsaXN0KSB7XG4gICAgcmV0dXJuIGZyb21MaXN0KHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pLCBsaXN0KTtcbiAgfTtcblxuICB2YXIgZnJvbUxpc3QgPSBmdW5jdGlvbiAoQywgbGlzdCkge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBhbGxvY2F0ZShDLCBsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgYWRkR2V0dGVyID0gZnVuY3Rpb24gKGl0LCBrZXksIGludGVybmFsKSB7XG4gICAgZFAoaXQsIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RbaW50ZXJuYWxdOyB9IH0pO1xuICB9O1xuXG4gIHZhciAkZnJvbSA9IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwZm4sIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHNvdXJjZSk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBtYXBmbiA9IGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXRlckZuID0gZ2V0SXRlckZuKE8pO1xuICAgIHZhciBpLCBsZW5ndGgsIHZhbHVlcywgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZiAoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhaXNBcnJheUl0ZXIoaXRlckZuKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCB2YWx1ZXMgPSBbXSwgaSA9IDA7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaSsrKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHN0ZXAudmFsdWUpO1xuICAgICAgfSBPID0gdmFsdWVzO1xuICAgIH1cbiAgICBpZiAobWFwcGluZyAmJiBhTGVuID4gMikgbWFwZm4gPSBjdHgobWFwZm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgZm9yIChpID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpLCByZXN1bHQgPSBhbGxvY2F0ZSh0aGlzLCBsZW5ndGgpOyBsZW5ndGggPiBpOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IG1hcHBpbmcgPyBtYXBmbihPW2ldLCBpKSA6IE9baV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyICRvZiA9IGZ1bmN0aW9uIG9mKC8qIC4uLml0ZW1zICovKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gYWxsb2NhdGUodGhpcywgbGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBpT1MgU2FmYXJpIDYueCBmYWlscyBoZXJlXG4gIHZhciBUT19MT0NBTEVfQlVHID0gISFVaW50OEFycmF5ICYmIGZhaWxzKGZ1bmN0aW9uICgpIHsgYXJyYXlUb0xvY2FsZVN0cmluZy5jYWxsKG5ldyBVaW50OEFycmF5KDEpKTsgfSk7XG5cbiAgdmFyICR0b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKCkge1xuICAgIHJldHVybiBhcnJheVRvTG9jYWxlU3RyaW5nLmFwcGx5KFRPX0xPQ0FMRV9CVUcgPyBhcnJheVNsaWNlLmNhbGwodmFsaWRhdGUodGhpcykpIDogdmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgdmFyIHByb3RvID0ge1xuICAgIGNvcHlXaXRoaW46IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCAvKiAsIGVuZCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5Q29weVdpdGhpbi5jYWxsKHZhbGlkYXRlKHRoaXMpLCB0YXJnZXQsIHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUV2ZXJ5KHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmaWxsOiBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQsIGVuZCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlGaWxsLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlGaWx0ZXIodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKSk7XG4gICAgfSxcbiAgICBmaW5kOiBmdW5jdGlvbiBmaW5kKHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUZpbmQodmFsaWRhdGUodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RmluZEluZGV4KHZhbGlkYXRlKHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIGFycmF5Rm9yRWFjaCh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlJbmRleE9mKHZhbGlkYXRlKHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5SW5jbHVkZXModmFsaWRhdGUodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUpvaW4uYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlMYXN0SW5kZXhPZi5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG1hcDogZnVuY3Rpb24gbWFwKG1hcGZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuICRtYXAodmFsaWRhdGUodGhpcyksIG1hcGZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZS5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZVJpZ2h0LmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBsZW5ndGggPSB2YWxpZGF0ZSh0aGF0KS5sZW5ndGg7XG4gICAgICB2YXIgbWlkZGxlID0gTWF0aC5mbG9vcihsZW5ndGggLyAyKTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICB3aGlsZSAoaW5kZXggPCBtaWRkbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0aGF0W2luZGV4XTtcbiAgICAgICAgdGhhdFtpbmRleCsrXSA9IHRoYXRbLS1sZW5ndGhdO1xuICAgICAgICB0aGF0W2xlbmd0aF0gPSB2YWx1ZTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfSxcbiAgICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlTb21lKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgICAgcmV0dXJuIGFycmF5U29ydC5jYWxsKHZhbGlkYXRlKHRoaXMpLCBjb21wYXJlZm4pO1xuICAgIH0sXG4gICAgc3ViYXJyYXk6IGZ1bmN0aW9uIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICAgIHZhciBPID0gdmFsaWRhdGUodGhpcyk7XG4gICAgICB2YXIgbGVuZ3RoID0gTy5sZW5ndGg7XG4gICAgICB2YXIgJGJlZ2luID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW5ndGgpO1xuICAgICAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSkpKFxuICAgICAgICBPLmJ1ZmZlcixcbiAgICAgICAgTy5ieXRlT2Zmc2V0ICsgJGJlZ2luICogTy5CWVRFU19QRVJfRUxFTUVOVCxcbiAgICAgICAgdG9MZW5ndGgoKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKSkgLSAkYmVnaW4pXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICB2YXIgJHNsaWNlID0gZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlTbGljZS5jYWxsKHZhbGlkYXRlKHRoaXMpLCBzdGFydCwgZW5kKSk7XG4gIH07XG5cbiAgdmFyICRzZXQgPSBmdW5jdGlvbiBzZXQoYXJyYXlMaWtlIC8qICwgb2Zmc2V0ICovKSB7XG4gICAgdmFsaWRhdGUodGhpcyk7XG4gICAgdmFyIG9mZnNldCA9IHRvT2Zmc2V0KGFyZ3VtZW50c1sxXSwgMSk7XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIHZhciBzcmMgPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aChzcmMubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB3aGlsZSAoaW5kZXggPCBsZW4pIHRoaXNbb2Zmc2V0ICsgaW5kZXhdID0gc3JjW2luZGV4KytdO1xuICB9O1xuXG4gIHZhciAkaXRlcmF0b3JzID0ge1xuICAgIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlFbnRyaWVzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH0sXG4gICAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgIHJldHVybiBhcnJheUtleXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfSxcbiAgICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgICAgIHJldHVybiBhcnJheVZhbHVlcy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGlzVEFJbmRleCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIHJldHVybiBpc09iamVjdCh0YXJnZXQpXG4gICAgICAmJiB0YXJnZXRbVFlQRURfQVJSQVldXG4gICAgICAmJiB0eXBlb2Yga2V5ICE9ICdzeW1ib2wnXG4gICAgICAmJiBrZXkgaW4gdGFyZ2V0XG4gICAgICAmJiBTdHJpbmcoK2tleSkgPT0gU3RyaW5nKGtleSk7XG4gIH07XG4gIHZhciAkZ2V0RGVzYyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkge1xuICAgIHJldHVybiBpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgPyBwcm9wZXJ0eURlc2MoMiwgdGFyZ2V0W2tleV0pXG4gICAgICA6IGdPUEQodGFyZ2V0LCBrZXkpO1xuICB9O1xuICB2YXIgJHNldERlc2MgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzYykge1xuICAgIGlmIChpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgJiYgaXNPYmplY3QoZGVzYylcbiAgICAgICYmIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgICAgJiYgIWhhcyhkZXNjLCAnZ2V0JylcbiAgICAgICYmICFoYXMoZGVzYywgJ3NldCcpXG4gICAgICAvLyBUT0RPOiBhZGQgdmFsaWRhdGlvbiBkZXNjcmlwdG9yIHcvbyBjYWxsaW5nIGFjY2Vzc29yc1xuICAgICAgJiYgIWRlc2MuY29uZmlndXJhYmxlXG4gICAgICAmJiAoIWhhcyhkZXNjLCAnd3JpdGFibGUnKSB8fCBkZXNjLndyaXRhYmxlKVxuICAgICAgJiYgKCFoYXMoZGVzYywgJ2VudW1lcmFibGUnKSB8fCBkZXNjLmVudW1lcmFibGUpXG4gICAgKSB7XG4gICAgICB0YXJnZXRba2V5XSA9IGRlc2MudmFsdWU7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gcmV0dXJuIGRQKHRhcmdldCwga2V5LCBkZXNjKTtcbiAgfTtcblxuICBpZiAoIUFMTF9DT05TVFJVQ1RPUlMpIHtcbiAgICAkR09QRC5mID0gJGdldERlc2M7XG4gICAgJERQLmYgPSAkc2V0RGVzYztcbiAgfVxuXG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIUFMTF9DT05TVFJVQ1RPUlMsICdPYmplY3QnLCB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0RGVzYyxcbiAgICBkZWZpbmVQcm9wZXJ0eTogJHNldERlc2NcbiAgfSk7XG5cbiAgaWYgKGZhaWxzKGZ1bmN0aW9uICgpIHsgYXJyYXlUb1N0cmluZy5jYWxsKHt9KTsgfSkpIHtcbiAgICBhcnJheVRvU3RyaW5nID0gYXJyYXlUb0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRoaXMpO1xuICAgIH07XG4gIH1cblxuICB2YXIgJFR5cGVkQXJyYXlQcm90b3R5cGUkID0gcmVkZWZpbmVBbGwoe30sIHByb3RvKTtcbiAgcmVkZWZpbmVBbGwoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAkaXRlcmF0b3JzKTtcbiAgaGlkZSgkVHlwZWRBcnJheVByb3RvdHlwZSQsIElURVJBVE9SLCAkaXRlcmF0b3JzLnZhbHVlcyk7XG4gIHJlZGVmaW5lQWxsKCRUeXBlZEFycmF5UHJvdG90eXBlJCwge1xuICAgIHNsaWNlOiAkc2xpY2UsXG4gICAgc2V0OiAkc2V0LFxuICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7IC8qIG5vb3AgKi8gfSxcbiAgICB0b1N0cmluZzogYXJyYXlUb1N0cmluZyxcbiAgICB0b0xvY2FsZVN0cmluZzogJHRvTG9jYWxlU3RyaW5nXG4gIH0pO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnVmZmVyJywgJ2InKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J5dGVPZmZzZXQnLCAnbycpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnl0ZUxlbmd0aCcsICdsJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdsZW5ndGgnLCAnZScpO1xuICBkUCgkVHlwZWRBcnJheVByb3RvdHlwZSQsIFRBRywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpc1tUWVBFRF9BUlJBWV07IH1cbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgQllURVMsIHdyYXBwZXIsIENMQU1QRUQpIHtcbiAgICBDTEFNUEVEID0gISFDTEFNUEVEO1xuICAgIHZhciBOQU1FID0gS0VZICsgKENMQU1QRUQgPyAnQ2xhbXBlZCcgOiAnJykgKyAnQXJyYXknO1xuICAgIHZhciBHRVRURVIgPSAnZ2V0JyArIEtFWTtcbiAgICB2YXIgU0VUVEVSID0gJ3NldCcgKyBLRVk7XG4gICAgdmFyIFR5cGVkQXJyYXkgPSBnbG9iYWxbTkFNRV07XG4gICAgdmFyIEJhc2UgPSBUeXBlZEFycmF5IHx8IHt9O1xuICAgIHZhciBUQUMgPSBUeXBlZEFycmF5ICYmIGdldFByb3RvdHlwZU9mKFR5cGVkQXJyYXkpO1xuICAgIHZhciBGT1JDRUQgPSAhVHlwZWRBcnJheSB8fCAhJHR5cGVkLkFCVjtcbiAgICB2YXIgTyA9IHt9O1xuICAgIHZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheSAmJiBUeXBlZEFycmF5W1BST1RPVFlQRV07XG4gICAgdmFyIGdldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkge1xuICAgICAgdmFyIGRhdGEgPSB0aGF0Ll9kO1xuICAgICAgcmV0dXJuIGRhdGEudltHRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIExJVFRMRV9FTkRJQU4pO1xuICAgIH07XG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhhdC5fZDtcbiAgICAgIGlmIChDTEFNUEVEKSB2YWx1ZSA9ICh2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUpKSA8IDAgPyAwIDogdmFsdWUgPiAweGZmID8gMHhmZiA6IHZhbHVlICYgMHhmZjtcbiAgICAgIGRhdGEudltTRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIHZhbHVlLCBMSVRUTEVfRU5ESUFOKTtcbiAgICB9O1xuICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICBkUCh0aGF0LCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKEZPUkNFRCkge1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FLCAnX2QnKTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciBidWZmZXIsIGJ5dGVMZW5ndGgsIGxlbmd0aCwga2xhc3M7XG4gICAgICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICBsZW5ndGggPSB0b0luZGV4KGRhdGEpO1xuICAgICAgICAgIGJ5dGVMZW5ndGggPSBsZW5ndGggKiBCWVRFUztcbiAgICAgICAgICBidWZmZXIgPSBuZXcgJEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiAkQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihkYXRhKSkgPT0gQVJSQVlfQlVGRkVSIHx8IGtsYXNzID09IFNIQVJFRF9CVUZGRVIpIHtcbiAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgIG9mZnNldCA9IHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKTtcbiAgICAgICAgICB2YXIgJGxlbiA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICBpZiAoJGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gJGxlbiAtIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoIDwgMCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gdG9MZW5ndGgoJGxlbmd0aCkgKiBCWVRFUztcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoICsgb2Zmc2V0ID4gJGxlbikgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW5ndGggPSBieXRlTGVuZ3RoIC8gQllURVM7XG4gICAgICAgIH0gZWxzZSBpZiAoVFlQRURfQVJSQVkgaW4gZGF0YSkge1xuICAgICAgICAgIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBoaWRlKHRoYXQsICdfZCcsIHtcbiAgICAgICAgICBiOiBidWZmZXIsXG4gICAgICAgICAgbzogb2Zmc2V0LFxuICAgICAgICAgIGw6IGJ5dGVMZW5ndGgsXG4gICAgICAgICAgZTogbGVuZ3RoLFxuICAgICAgICAgIHY6IG5ldyAkRGF0YVZpZXcoYnVmZmVyKVxuICAgICAgICB9KTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSBhZGRFbGVtZW50KHRoYXQsIGluZGV4KyspO1xuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gY3JlYXRlKCRUeXBlZEFycmF5UHJvdG90eXBlJCk7XG4gICAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIFR5cGVkQXJyYXkpO1xuICAgIH0gZWxzZSBpZiAoIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIFR5cGVkQXJyYXkoMSk7XG4gICAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9KSB8fCAhJGl0ZXJEZXRlY3QoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheShudWxsKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KDEuNSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheShpdGVyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9LCB0cnVlKSkge1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FKTtcbiAgICAgICAgdmFyIGtsYXNzO1xuICAgICAgICAvLyBgd3NgIG1vZHVsZSBidWcsIHRlbXBvcmFyaWx5IHJlbW92ZSB2YWxpZGF0aW9uIGxlbmd0aCBmb3IgVWludDhBcnJheVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9wdWxsLzY0NVxuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSByZXR1cm4gbmV3IEJhc2UodG9JbmRleChkYXRhKSk7XG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgJEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoZGF0YSkpID09IEFSUkFZX0JVRkZFUiB8fCBrbGFzcyA9PSBTSEFSRURfQlVGRkVSKSB7XG4gICAgICAgICAgcmV0dXJuICRsZW5ndGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBuZXcgQmFzZShkYXRhLCB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUyksICRsZW5ndGgpXG4gICAgICAgICAgICA6ICRvZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG5ldyBCYXNlKGRhdGEsIHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKSlcbiAgICAgICAgICAgICAgOiBuZXcgQmFzZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVFlQRURfQVJSQVkgaW4gZGF0YSkgcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgIH0pO1xuICAgICAgYXJyYXlGb3JFYWNoKFRBQyAhPT0gRnVuY3Rpb24ucHJvdG90eXBlID8gZ09QTihCYXNlKS5jb25jYXQoZ09QTihUQUMpKSA6IGdPUE4oQmFzZSksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIFR5cGVkQXJyYXkpKSBoaWRlKFR5cGVkQXJyYXksIGtleSwgQmFzZVtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gVHlwZWRBcnJheVByb3RvdHlwZTtcbiAgICAgIGlmICghTElCUkFSWSkgVHlwZWRBcnJheVByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR5cGVkQXJyYXk7XG4gICAgfVxuICAgIHZhciAkbmF0aXZlSXRlcmF0b3IgPSBUeXBlZEFycmF5UHJvdG90eXBlW0lURVJBVE9SXTtcbiAgICB2YXIgQ09SUkVDVF9JVEVSX05BTUUgPSAhISRuYXRpdmVJdGVyYXRvclxuICAgICAgJiYgKCRuYXRpdmVJdGVyYXRvci5uYW1lID09ICd2YWx1ZXMnIHx8ICRuYXRpdmVJdGVyYXRvci5uYW1lID09IHVuZGVmaW5lZCk7XG4gICAgdmFyICRpdGVyYXRvciA9ICRpdGVyYXRvcnMudmFsdWVzO1xuICAgIGhpZGUoVHlwZWRBcnJheSwgVFlQRURfQ09OU1RSVUNUT1IsIHRydWUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVFlQRURfQVJSQVksIE5BTUUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBERUZfQ09OU1RSVUNUT1IsIFR5cGVkQXJyYXkpO1xuXG4gICAgaWYgKENMQU1QRUQgPyBuZXcgVHlwZWRBcnJheSgxKVtUQUddICE9IE5BTUUgOiAhKFRBRyBpbiBUeXBlZEFycmF5UHJvdG90eXBlKSkge1xuICAgICAgZFAoVHlwZWRBcnJheVByb3RvdHlwZSwgVEFHLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTkFNRTsgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgT1tOQU1FXSA9IFR5cGVkQXJyYXk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChUeXBlZEFycmF5ICE9IEJhc2UpLCBPKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5TLCBOQU1FLCB7XG4gICAgICBCWVRFU19QRVJfRUxFTUVOVDogQllURVNcbiAgICB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBCYXNlLm9mLmNhbGwoVHlwZWRBcnJheSwgMSk7IH0pLCBOQU1FLCB7XG4gICAgICBmcm9tOiAkZnJvbSxcbiAgICAgIG9mOiAkb2ZcbiAgICB9KTtcblxuICAgIGlmICghKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlQcm90b3R5cGUpKSBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCwgTkFNRSwgcHJvdG8pO1xuXG4gICAgc2V0U3BlY2llcyhOQU1FKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogRk9SQ0VEX1NFVCwgTkFNRSwgeyBzZXQ6ICRzZXQgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFDT1JSRUNUX0lURVJfTkFNRSwgTkFNRSwgJGl0ZXJhdG9ycyk7XG5cbiAgICBpZiAoIUxJQlJBUlkgJiYgVHlwZWRBcnJheVByb3RvdHlwZS50b1N0cmluZyAhPSBhcnJheVRvU3RyaW5nKSBUeXBlZEFycmF5UHJvdG90eXBlLnRvU3RyaW5nID0gYXJyYXlUb1N0cmluZztcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoMSkuc2xpY2UoKTtcbiAgICB9KSwgTkFNRSwgeyBzbGljZTogJHNsaWNlIH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFsxLCAyXS50b0xvY2FsZVN0cmluZygpICE9IG5ldyBUeXBlZEFycmF5KFsxLCAyXSkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgVHlwZWRBcnJheVByb3RvdHlwZS50b0xvY2FsZVN0cmluZy5jYWxsKFsxLCAyXSk7XG4gICAgfSkpLCBOQU1FLCB7IHRvTG9jYWxlU3RyaW5nOiAkdG9Mb2NhbGVTdHJpbmcgfSk7XG5cbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBDT1JSRUNUX0lURVJfTkFNRSA/ICRuYXRpdmVJdGVyYXRvciA6ICRpdGVyYXRvcjtcbiAgICBpZiAoIUxJQlJBUlkgJiYgIUNPUlJFQ1RfSVRFUl9OQU1FKSBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIElURVJBVE9SLCAkaXRlcmF0b3IpO1xuICB9O1xufSBlbHNlIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDIyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAyMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDhDbGFtcGVkQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0sIHRydWUpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjMxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDE2JywgMiwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDE2QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDIzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50MTYnLCAyLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDE2QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAyMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50MzInLCA0LCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDIzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdGbG9hdDMyJywgNCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEZsb2F0MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAyMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQ2NCcsIDgsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDY0QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDI2LjEuMSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciByQXBwbHkgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuYXBwbHk7XG52YXIgZkFwcGx5ID0gRnVuY3Rpb24uYXBwbHk7XG4vLyBNUyBFZGdlIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByQXBwbHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KSB7XG4gICAgdmFyIFQgPSBhRnVuY3Rpb24odGFyZ2V0KTtcbiAgICB2YXIgTCA9IGFuT2JqZWN0KGFyZ3VtZW50c0xpc3QpO1xuICAgIHJldHVybiByQXBwbHkgPyByQXBwbHkoVCwgdGhpc0FyZ3VtZW50LCBMKSA6IGZBcHBseS5jYWxsKFQsIHRoaXNBcmd1bWVudCwgTCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qc1xuLy8gbW9kdWxlIGlkID0gMjM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDI2LjEuMiBSZWZsZWN0LmNvbnN0cnVjdCh0YXJnZXQsIGFyZ3VtZW50c0xpc3QgWywgbmV3VGFyZ2V0XSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuL19iaW5kJyk7XG52YXIgckNvbnN0cnVjdCA9IChyZXF1aXJlKCcuL19nbG9iYWwnKS5SZWZsZWN0IHx8IHt9KS5jb25zdHJ1Y3Q7XG5cbi8vIE1TIEVkZ2Ugc3VwcG9ydHMgb25seSAyIGFyZ3VtZW50cyBhbmQgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxuLy8gRkYgTmlnaHRseSBzZXRzIHRoaXJkIGFyZ3VtZW50IGFzIGBuZXcudGFyZ2V0YCwgYnV0IGRvZXMgbm90IGNyZWF0ZSBgdGhpc2AgZnJvbSBpdFxudmFyIE5FV19UQVJHRVRfQlVHID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiAhKHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBbXSwgRikgaW5zdGFuY2VvZiBGKTtcbn0pO1xudmFyIEFSR1NfQlVHID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgckNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKE5FV19UQVJHRVRfQlVHIHx8IEFSR1NfQlVHKSwgJ1JlZmxlY3QnLCB7XG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gY29uc3RydWN0KFRhcmdldCwgYXJncyAvKiAsIG5ld1RhcmdldCAqLykge1xuICAgIGFGdW5jdGlvbihUYXJnZXQpO1xuICAgIGFuT2JqZWN0KGFyZ3MpO1xuICAgIHZhciBuZXdUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IFRhcmdldCA6IGFGdW5jdGlvbihhcmd1bWVudHNbMl0pO1xuICAgIGlmIChBUkdTX0JVRyAmJiAhTkVXX1RBUkdFVF9CVUcpIHJldHVybiByQ29uc3RydWN0KFRhcmdldCwgYXJncywgbmV3VGFyZ2V0KTtcbiAgICBpZiAoVGFyZ2V0ID09IG5ld1RhcmdldCkge1xuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHNcbiAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IFRhcmdldCgpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgfVxuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBsb3Qgb2YgYXJndW1lbnRzIGNhc2VcbiAgICAgIHZhciAkYXJncyA9IFtudWxsXTtcbiAgICAgICRhcmdzLnB1c2guYXBwbHkoJGFyZ3MsIGFyZ3MpO1xuICAgICAgcmV0dXJuIG5ldyAoYmluZC5hcHBseShUYXJnZXQsICRhcmdzKSkoKTtcbiAgICB9XG4gICAgLy8gd2l0aCBhbHRlcmVkIG5ld1RhcmdldCwgbm90IHN1cHBvcnQgYnVpbHQtaW4gY29uc3RydWN0b3JzXG4gICAgdmFyIHByb3RvID0gbmV3VGFyZ2V0LnByb3RvdHlwZTtcbiAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGUoaXNPYmplY3QocHJvdG8pID8gcHJvdG8gOiBPYmplY3QucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gRnVuY3Rpb24uYXBwbHkuY2FsbChUYXJnZXQsIGluc3RhbmNlLCBhcmdzKTtcbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IGluc3RhbmNlO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAyMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjYuMS4zIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcylcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG5cbi8vIE1TIEVkZ2UgaGFzIGJyb2tlbiBSZWZsZWN0LmRlZmluZVByb3BlcnR5IC0gdGhyb3dpbmcgaW5zdGVhZCBvZiByZXR1cm5pbmcgZmFsc2VcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KGRQLmYoe30sIDEsIHsgdmFsdWU6IDEgfSksIDEsIHsgdmFsdWU6IDIgfSk7XG59KSwgJ1JlZmxlY3QnLCB7XG4gIGRlZmluZVByb3BlcnR5OiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKHByb3BlcnR5S2V5LCB0cnVlKTtcbiAgICBhbk9iamVjdChhdHRyaWJ1dGVzKTtcbiAgICB0cnkge1xuICAgICAgZFAuZih0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDI0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICB2YXIgZGVzYyA9IGdPUEQoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICAgIHJldHVybiBkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSA/IGZhbHNlIDogZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDI0MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAyNi4xLjUgUmVmbGVjdC5lbnVtZXJhdGUodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIEVudW1lcmF0ZSA9IGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gYW5PYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB2YXIga2V5cyA9IHRoaXMuX2sgPSBbXTsgICAgICAvLyBrZXlzXG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIGl0ZXJhdGVkKSBrZXlzLnB1c2goa2V5KTtcbn07XG5yZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpKEVudW1lcmF0ZSwgJ09iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSB0aGlzO1xuICB2YXIga2V5cyA9IHRoYXQuX2s7XG4gIHZhciBrZXk7XG4gIGRvIHtcbiAgICBpZiAodGhhdC5faSA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9IHdoaWxlICghKChrZXkgPSBrZXlzW3RoYXQuX2krK10pIGluIHRoYXQuX3QpKTtcbiAgcmV0dXJuIHsgdmFsdWU6IGtleSwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGVudW1lcmF0ZTogZnVuY3Rpb24gZW51bWVyYXRlKHRhcmdldCkge1xuICAgIHJldHVybiBuZXcgRW51bWVyYXRlKHRhcmdldCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDI0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTtcbiAgdmFyIGRlc2MsIHByb3RvO1xuICBpZiAoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpIHJldHVybiB0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZiAoZGVzYyA9IGdPUEQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSByZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IGdldDogZ2V0IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanNcbi8vIG1vZHVsZSBpZCA9IDI0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjcgUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgcmV0dXJuIGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDI0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjggUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGdldFByb3RvID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKHRhcmdldCkge1xuICAgIHJldHVybiBnZXRQcm90byhhbk9iamVjdCh0YXJnZXQpKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDI0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjkgUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaGFzOiBmdW5jdGlvbiBoYXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5oYXMuanNcbi8vIG1vZHVsZSBpZCA9IDI0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjEwIFJlZmxlY3QuaXNFeHRlbnNpYmxlKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciAkaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBpc0V4dGVuc2libGU6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZSh0YXJnZXQpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHJldHVybiAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUuanNcbi8vIG1vZHVsZSBpZCA9IDI0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjExIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IG93bktleXM6IHJlcXVpcmUoJy4vX293bi1rZXlzJykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgUmVmbGVjdCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnT1BOLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIHJldHVybiBnZXRTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vd24ta2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMjQ5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDI2LjEuMTIgUmVmbGVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJHByZXZlbnRFeHRlbnNpb25zID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHByZXZlbnRFeHRlbnNpb25zOiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoJHByZXZlbnRFeHRlbnNpb25zKSAkcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanNcbi8vIG1vZHVsZSBpZCA9IDI1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjEzIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcGVydHlLZXksIFYgWywgcmVjZWl2ZXJdKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViAvKiAsIHJlY2VpdmVyICovKSB7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCA0ID8gdGFyZ2V0IDogYXJndW1lbnRzWzNdO1xuICB2YXIgb3duRGVzYyA9IGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIHZhciBleGlzdGluZ0Rlc2NyaXB0b3IsIHByb3RvO1xuICBpZiAoIW93bkRlc2MpIHtcbiAgICBpZiAoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkge1xuICAgICAgcmV0dXJuIHNldChwcm90bywgcHJvcGVydHlLZXksIFYsIHJlY2VpdmVyKTtcbiAgICB9XG4gICAgb3duRGVzYyA9IGNyZWF0ZURlc2MoMCk7XG4gIH1cbiAgaWYgKGhhcyhvd25EZXNjLCAndmFsdWUnKSkge1xuICAgIGlmIChvd25EZXNjLndyaXRhYmxlID09PSBmYWxzZSB8fCAhaXNPYmplY3QocmVjZWl2ZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgZXhpc3RpbmdEZXNjcmlwdG9yID0gZ09QRC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSkgfHwgY3JlYXRlRGVzYygwKTtcbiAgICBleGlzdGluZ0Rlc2NyaXB0b3IudmFsdWUgPSBWO1xuICAgIGRQLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBleGlzdGluZ0Rlc2NyaXB0b3IpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvd25EZXNjLnNldCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAob3duRGVzYy5zZXQuY2FsbChyZWNlaXZlciwgViksIHRydWUpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IHNldDogc2V0IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanNcbi8vIG1vZHVsZSBpZCA9IDI1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjE0IFJlZmxlY3Quc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2V0UHJvdG8gPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKTtcblxuaWYgKHNldFByb3RvKSAkZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHNldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKSB7XG4gICAgc2V0UHJvdG8uY2hlY2sodGFyZ2V0LCBwcm90byk7XG4gICAgdHJ5IHtcbiAgICAgIHNldFByb3RvLnNldCh0YXJnZXQsIHByb3RvKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzXG4vLyBtb2R1bGUgaWQgPSAyNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gJGluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnaW5jbHVkZXMnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtQXJyYXkucHJvdG90eXBlLmZsYXRNYXBcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmxhdHRlbkludG9BcnJheSA9IHJlcXVpcmUoJy4vX2ZsYXR0ZW4taW50by1hcnJheScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiwgQTtcbiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gICAgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIDEsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmxhdE1hcCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuZmxhdC1tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDI1NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLWZsYXRNYXAvI3NlYy1GbGF0dGVuSW50b0FycmF5XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFID0gcmVxdWlyZSgnLi9fd2tzJykoJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xuXG5mdW5jdGlvbiBmbGF0dGVuSW50b0FycmF5KHRhcmdldCwgb3JpZ2luYWwsIHNvdXJjZSwgc291cmNlTGVuLCBzdGFydCwgZGVwdGgsIG1hcHBlciwgdGhpc0FyZykge1xuICB2YXIgdGFyZ2V0SW5kZXggPSBzdGFydDtcbiAgdmFyIHNvdXJjZUluZGV4ID0gMDtcbiAgdmFyIG1hcEZuID0gbWFwcGVyID8gY3R4KG1hcHBlciwgdGhpc0FyZywgMykgOiBmYWxzZTtcbiAgdmFyIGVsZW1lbnQsIHNwcmVhZGFibGU7XG5cbiAgd2hpbGUgKHNvdXJjZUluZGV4IDwgc291cmNlTGVuKSB7XG4gICAgaWYgKHNvdXJjZUluZGV4IGluIHNvdXJjZSkge1xuICAgICAgZWxlbWVudCA9IG1hcEZuID8gbWFwRm4oc291cmNlW3NvdXJjZUluZGV4XSwgc291cmNlSW5kZXgsIG9yaWdpbmFsKSA6IHNvdXJjZVtzb3VyY2VJbmRleF07XG5cbiAgICAgIHNwcmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIGlmIChpc09iamVjdChlbGVtZW50KSkge1xuICAgICAgICBzcHJlYWRhYmxlID0gZWxlbWVudFtJU19DT05DQVRfU1BSRUFEQUJMRV07XG4gICAgICAgIHNwcmVhZGFibGUgPSBzcHJlYWRhYmxlICE9PSB1bmRlZmluZWQgPyAhIXNwcmVhZGFibGUgOiBpc0FycmF5KGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3ByZWFkYWJsZSAmJiBkZXB0aCA+IDApIHtcbiAgICAgICAgdGFyZ2V0SW5kZXggPSBmbGF0dGVuSW50b0FycmF5KHRhcmdldCwgb3JpZ2luYWwsIGVsZW1lbnQsIHRvTGVuZ3RoKGVsZW1lbnQubGVuZ3RoKSwgdGFyZ2V0SW5kZXgsIGRlcHRoIC0gMSkgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IDB4MWZmZmZmZmZmZmZmZmYpIHRocm93IFR5cGVFcnJvcigpO1xuICAgICAgICB0YXJnZXRbdGFyZ2V0SW5kZXhdID0gZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0SW5kZXgrKztcbiAgICB9XG4gICAgc291cmNlSW5kZXgrKztcbiAgfVxuICByZXR1cm4gdGFyZ2V0SW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbkludG9BcnJheTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2ZsYXR0ZW4taW50by1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUFycmF5LnByb3RvdHlwZS5mbGF0dGVuXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSByZXF1aXJlKCcuL19mbGF0dGVuLWludG8tYXJyYXknKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIGZsYXR0ZW46IGZ1bmN0aW9uIGZsYXR0ZW4oLyogZGVwdGhBcmcgPSAxICovKSB7XG4gICAgdmFyIGRlcHRoQXJnID0gYXJndW1lbnRzWzBdO1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICBmbGF0dGVuSW50b0FycmF5KEEsIE8sIE8sIHNvdXJjZUxlbiwgMCwgZGVwdGhBcmcgPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGhBcmcpKTtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmbGF0dGVuJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5mbGF0dGVuLmpzXG4vLyBtb2R1bGUgaWQgPSAyNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIGF0OiBmdW5jdGlvbiBhdChwb3MpIHtcbiAgICByZXR1cm4gJGF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLmF0LmpzXG4vLyBtb2R1bGUgaWQgPSAyNTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhZCA9IHJlcXVpcmUoJy4vX3N0cmluZy1wYWQnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8yODBcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogL1ZlcnNpb25cXC8xMFxcLlxcZCsoXFwuXFxkKyk/IFNhZmFyaVxcLy8udGVzdCh1c2VyQWdlbnQpLCAnU3RyaW5nJywge1xuICBwYWRTdGFydDogZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRydWUpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtc3RhcnQuanNcbi8vIG1vZHVsZSBpZCA9IDI1OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIG1heExlbmd0aCwgZmlsbFN0cmluZywgbGVmdCkge1xuICB2YXIgUyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgdmFyIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoO1xuICB2YXIgZmlsbFN0ciA9IGZpbGxTdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcgJyA6IFN0cmluZyhmaWxsU3RyaW5nKTtcbiAgdmFyIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7XG4gIGlmIChpbnRNYXhMZW5ndGggPD0gc3RyaW5nTGVuZ3RoIHx8IGZpbGxTdHIgPT0gJycpIHJldHVybiBTO1xuICB2YXIgZmlsbExlbiA9IGludE1heExlbmd0aCAtIHN0cmluZ0xlbmd0aDtcbiAgdmFyIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIE1hdGguY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTtcbiAgaWYgKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKSBzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7XG4gIHJldHVybiBsZWZ0ID8gc3RyaW5nRmlsbGVyICsgUyA6IFMgKyBzdHJpbmdGaWxsZXI7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXBhZC5qc1xuLy8gbW9kdWxlIGlkID0gMjU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdXNlci1hZ2VudC5qc1xuLy8gbW9kdWxlIGlkID0gMjYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYWQgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMjgwXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIC9WZXJzaW9uXFwvMTBcXC5cXGQrKFxcLlxcZCspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KSwgJ1N0cmluZycsIHtcbiAgcGFkRW5kOiBmdW5jdGlvbiBwYWRFbmQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLWVuZC5qc1xuLy8gbW9kdWxlIGlkID0gMjYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWJtYXJrYmFnZS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW1MZWZ0JywgZnVuY3Rpb24gKCR0cmltKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltTGVmdCgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMSk7XG4gIH07XG59LCAndHJpbVN0YXJ0Jyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1sZWZ0LmpzXG4vLyBtb2R1bGUgaWQgPSAyNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlYm1hcmtiYWdlL2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxucmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKSgndHJpbVJpZ2h0JywgZnVuY3Rpb24gKCR0cmltKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltUmlnaHQoKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDIpO1xuICB9O1xufSwgJ3RyaW1FbmQnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0LmpzXG4vLyBtb2R1bGUgaWQgPSAyNjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9TdHJpbmcucHJvdG90eXBlLm1hdGNoQWxsL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBnZXRGbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG52YXIgUmVnRXhwUHJvdG8gPSBSZWdFeHAucHJvdG90eXBlO1xuXG52YXIgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yID0gZnVuY3Rpb24gKHJlZ2V4cCwgc3RyaW5nKSB7XG4gIHRoaXMuX3IgPSByZWdleHA7XG4gIHRoaXMuX3MgPSBzdHJpbmc7XG59O1xuXG5yZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpKCRSZWdFeHBTdHJpbmdJdGVyYXRvciwgJ1JlZ0V4cCBTdHJpbmcnLCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgbWF0Y2ggPSB0aGlzLl9yLmV4ZWModGhpcy5fcyk7XG4gIHJldHVybiB7IHZhbHVlOiBtYXRjaCwgZG9uZTogbWF0Y2ggPT09IG51bGwgfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgbWF0Y2hBbGw6IGZ1bmN0aW9uIG1hdGNoQWxsKHJlZ2V4cCkge1xuICAgIGRlZmluZWQodGhpcyk7XG4gICAgaWYgKCFpc1JlZ0V4cChyZWdleHApKSB0aHJvdyBUeXBlRXJyb3IocmVnZXhwICsgJyBpcyBub3QgYSByZWdleHAhJyk7XG4gICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgdmFyIGZsYWdzID0gJ2ZsYWdzJyBpbiBSZWdFeHBQcm90byA/IFN0cmluZyhyZWdleHAuZmxhZ3MpIDogZ2V0RmxhZ3MuY2FsbChyZWdleHApO1xuICAgIHZhciByeCA9IG5ldyBSZWdFeHAocmVnZXhwLnNvdXJjZSwgfmZsYWdzLmluZGV4T2YoJ2cnKSA/IGZsYWdzIDogJ2cnICsgZmxhZ3MpO1xuICAgIHJ4Lmxhc3RJbmRleCA9IHRvTGVuZ3RoKHJlZ2V4cC5sYXN0SW5kZXgpO1xuICAgIHJldHVybiBuZXcgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKHJ4LCBTKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDI2NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4vX293bi1rZXlzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gICAgdmFyIGdldERlc2MgPSBnT1BELmY7XG4gICAgdmFyIGtleXMgPSBvd25LZXlzKE8pO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleSwgZGVzYztcbiAgICB3aGlsZSAoa2V5cy5sZW5ndGggPiBpKSB7XG4gICAgICBkZXNjID0gZ2V0RGVzYyhPLCBrZXkgPSBrZXlzW2krK10pO1xuICAgICAgaWYgKGRlc2MgIT09IHVuZGVmaW5lZCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBrZXksIGRlc2MpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LXZhbHVlcy1lbnRyaWVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICR2YWx1ZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKShmYWxzZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcyhpdCkge1xuICAgIHJldHVybiAkdmFsdWVzKGl0KTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBpc0VudW0gPSByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlzRW50cmllcykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gZ2V0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoTywga2V5ID0ga2V5c1tpKytdKSkge1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC10by1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjY5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IHJlcXVpcmUoJy4vX29iamVjdC10by1hcnJheScpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhpdCkge1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDI3MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuXG4vLyBCLjIuMi4yIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19kZWZpbmVHZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpIHtcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwgeyBnZXQ6IGFGdW5jdGlvbihnZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1nZXR0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDI3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBGb3JjZWQgcmVwbGFjZW1lbnQgcHJvdG90eXBlIGFjY2Vzc29ycyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKSB8fCAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBLID0gTWF0aC5yYW5kb20oKTtcbiAgLy8gSW4gRkYgdGhyb3dzIG9ubHkgZGVmaW5lIG1ldGhvZHNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmLCBuby11c2VsZXNzLWNhbGxcbiAgX19kZWZpbmVTZXR0ZXJfXy5jYWxsKG51bGwsIEssIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG4gIGRlbGV0ZSByZXF1aXJlKCcuL19nbG9iYWwnKVtLXTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWZvcmNlZC1wYW0uanNcbi8vIG1vZHVsZSBpZCA9IDI3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuXG4vLyBCLjIuMi4zIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXyhQLCBzZXR0ZXIpXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19kZWZpbmVTZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVTZXR0ZXJfXyhQLCBzZXR0ZXIpIHtcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwgeyBzZXQ6IGFGdW5jdGlvbihzZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1zZXR0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDI3M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XG5cbi8vIEIuMi4yLjQgT2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cEdldHRlcl9fKFApXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19sb29rdXBHZXR0ZXJfXzogZnVuY3Rpb24gX19sb29rdXBHZXR0ZXJfXyhQKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgSyA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICAgIHZhciBEO1xuICAgIGRvIHtcbiAgICAgIGlmIChEID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIEspKSByZXR1cm4gRC5nZXQ7XG4gICAgfSB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLWdldHRlci5qc1xuLy8gbW9kdWxlIGlkID0gMjc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxuLy8gQi4yLjIuNSBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwU2V0dGVyX18oUClcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2xvb2t1cFNldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cFNldHRlcl9fKFApIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gICAgdmFyIEQ7XG4gICAgZG8ge1xuICAgICAgaWYgKEQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgSykpIHJldHVybiBELnNldDtcbiAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdNYXAnLCB7IHRvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ01hcCcpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWFwLnRvLWpzb24uanNcbi8vIG1vZHVsZSBpZCA9IDI3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIGlmIChjbGFzc29mKHRoaXMpICE9IE5BTUUpIHRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgcmV0dXJuIGZyb20odGhpcyk7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi10by1qc29uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXIsIElURVJBVE9SKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yT2YoaXRlciwgZmFsc2UsIHJlc3VsdC5wdXNoLCByZXN1bHQsIElURVJBVE9SKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdTZXQnLCB7IHRvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ1NldCcpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc2V0LnRvLWpzb24uanNcbi8vIG1vZHVsZSBpZCA9IDI3OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ01hcCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWFwLm9mLmpzXG4vLyBtb2R1bGUgaWQgPSAyODBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09MTEVDVElPTikge1xuICAkZXhwb3J0KCRleHBvcnQuUywgQ09MTEVDVElPTiwgeyBvZjogZnVuY3Rpb24gb2YoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIEEgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIEFbbGVuZ3RoXSA9IGFyZ3VtZW50c1tsZW5ndGhdO1xuICAgIHJldHVybiBuZXcgdGhpcyhBKTtcbiAgfSB9KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1vZi5qc1xuLy8gbW9kdWxlIGlkID0gMjgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5vZlxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tb2YnKSgnU2V0Jyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQub2YuanNcbi8vIG1vZHVsZSBpZCA9IDI4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdXZWFrTWFwJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZi5qc1xuLy8gbW9kdWxlIGlkID0gMjgzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWtzZXQub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ1dlYWtTZXQnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstc2V0Lm9mLmpzXG4vLyBtb2R1bGUgaWQgPSAyODRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnTWFwJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAuZnJvbS5qc1xuLy8gbW9kdWxlIGlkID0gMjg1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgZnJvbTogZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50c1sxXTtcbiAgICB2YXIgbWFwcGluZywgQSwgbiwgY2I7XG4gICAgYUZ1bmN0aW9uKHRoaXMpO1xuICAgIG1hcHBpbmcgPSBtYXBGbiAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChtYXBwaW5nKSBhRnVuY3Rpb24obWFwRm4pO1xuICAgIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IHRoaXMoKTtcbiAgICBBID0gW107XG4gICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgIG4gPSAwO1xuICAgICAgY2IgPSBjdHgobWFwRm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbiAobmV4dEl0ZW0pIHtcbiAgICAgICAgQS5wdXNoKGNiKG5leHRJdGVtLCBuKyspKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBBLnB1c2gsIEEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tZnJvbS5qc1xuLy8gbW9kdWxlIGlkID0gMjg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ1NldCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc2V0LmZyb20uanNcbi8vIG1vZHVsZSBpZCA9IDI4N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnV2Vha01hcCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1tYXAuZnJvbS5qc1xuLy8gbW9kdWxlIGlkID0gMjg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWtzZXQuZnJvbVxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tZnJvbScpKCdXZWFrU2V0Jyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLXNldC5mcm9tLmpzXG4vLyBtb2R1bGUgaWQgPSAyODlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuRywgeyBnbG9iYWw6IHJlcXVpcmUoJy4vX2dsb2JhbCcpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSAyOTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N5c3RlbScsIHsgZ2xvYmFsOiByZXF1aXJlKCcuL19nbG9iYWwnKSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDI5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL3Byb3Bvc2FsLWlzLWVycm9yXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ0Vycm9yJywge1xuICBpc0Vycm9yOiBmdW5jdGlvbiBpc0Vycm9yKGl0KSB7XG4gICAgcmV0dXJuIGNvZihpdCkgPT09ICdFcnJvcic7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3IuanNcbi8vIG1vZHVsZSBpZCA9IDI5MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNsYW1wOiBmdW5jdGlvbiBjbGFtcCh4LCBsb3dlciwgdXBwZXIpIHtcbiAgICByZXR1cm4gTWF0aC5taW4odXBwZXIsIE1hdGgubWF4KGxvd2VyLCB4KSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5jbGFtcC5qc1xuLy8gbW9kdWxlIGlkID0gMjkzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgREVHX1BFUl9SQUQ6IE1hdGguUEkgLyAxODAgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmRlZy1wZXItcmFkLmpzXG4vLyBtb2R1bGUgaWQgPSAyOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBSQURfUEVSX0RFRyA9IDE4MCAvIE1hdGguUEk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZGVncmVlczogZnVuY3Rpb24gZGVncmVlcyhyYWRpYW5zKSB7XG4gICAgcmV0dXJuIHJhZGlhbnMgKiBSQURfUEVSX0RFRztcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmRlZ3JlZXMuanNcbi8vIG1vZHVsZSBpZCA9IDI5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNjYWxlID0gcmVxdWlyZSgnLi9fbWF0aC1zY2FsZScpO1xudmFyIGZyb3VuZCA9IHJlcXVpcmUoJy4vX21hdGgtZnJvdW5kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZnNjYWxlOiBmdW5jdGlvbiBmc2NhbGUoeCwgaW5Mb3csIGluSGlnaCwgb3V0TG93LCBvdXRIaWdoKSB7XG4gICAgcmV0dXJuIGZyb3VuZChzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmZzY2FsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjk2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zY2FsZSB8fCBmdW5jdGlvbiBzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpIHtcbiAgaWYgKFxuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IHggIT0geFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgaW5Mb3cgIT0gaW5Mb3dcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IGluSGlnaCAhPSBpbkhpZ2hcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IG91dExvdyAhPSBvdXRMb3dcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IG91dEhpZ2ggIT0gb3V0SGlnaFxuICApIHJldHVybiBOYU47XG4gIGlmICh4ID09PSBJbmZpbml0eSB8fCB4ID09PSAtSW5maW5pdHkpIHJldHVybiB4O1xuICByZXR1cm4gKHggLSBpbkxvdykgKiAob3V0SGlnaCAtIG91dExvdykgLyAoaW5IaWdoIC0gaW5Mb3cpICsgb3V0TG93O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2NhbGUuanNcbi8vIG1vZHVsZSBpZCA9IDI5N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpYWRkaDogZnVuY3Rpb24gaWFkZGgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxICsgKHkxID4+PiAwKSArICgoJHgwICYgJHkwIHwgKCR4MCB8ICR5MCkgJiB+KCR4MCArICR5MCA+Pj4gMCkpID4+PiAzMSkgfCAwO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaWFkZGguanNcbi8vIG1vZHVsZSBpZCA9IDI5OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpc3ViaDogZnVuY3Rpb24gaXN1YmgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxIC0gKHkxID4+PiAwKSAtICgofiR4MCAmICR5MCB8IH4oJHgwIF4gJHkwKSAmICR4MCAtICR5MCA+Pj4gMCkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pc3ViaC5qc1xuLy8gbW9kdWxlIGlkID0gMjk5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGltdWxoOiBmdW5jdGlvbiBpbXVsaCh1LCB2KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZjtcbiAgICB2YXIgJHUgPSArdTtcbiAgICB2YXIgJHYgPSArdjtcbiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjtcbiAgICB2YXIgdjAgPSAkdiAmIFVJTlQxNjtcbiAgICB2YXIgdTEgPSAkdSA+PiAxNjtcbiAgICB2YXIgdjEgPSAkdiA+PiAxNjtcbiAgICB2YXIgdCA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+IDE2KTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmltdWxoLmpzXG4vLyBtb2R1bGUgaWQgPSAzMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBSQURfUEVSX0RFRzogMTgwIC8gTWF0aC5QSSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgucmFkLXBlci1kZWcuanNcbi8vIG1vZHVsZSBpZCA9IDMwMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIERFR19QRVJfUkFEID0gTWF0aC5QSSAvIDE4MDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICByYWRpYW5zOiBmdW5jdGlvbiByYWRpYW5zKGRlZ3JlZXMpIHtcbiAgICByZXR1cm4gZGVncmVlcyAqIERFR19QRVJfUkFEO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgucmFkaWFucy5qc1xuLy8gbW9kdWxlIGlkID0gMzAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgc2NhbGU6IHJlcXVpcmUoJy4vX21hdGgtc2NhbGUnKSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguc2NhbGUuanNcbi8vIG1vZHVsZSBpZCA9IDMwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB1bXVsaDogZnVuY3Rpb24gdW11bGgodSwgdikge1xuICAgIHZhciBVSU5UMTYgPSAweGZmZmY7XG4gICAgdmFyICR1ID0gK3U7XG4gICAgdmFyICR2ID0gK3Y7XG4gICAgdmFyIHUwID0gJHUgJiBVSU5UMTY7XG4gICAgdmFyIHYwID0gJHYgJiBVSU5UMTY7XG4gICAgdmFyIHUxID0gJHUgPj4+IDE2O1xuICAgIHZhciB2MSA9ICR2ID4+PiAxNjtcbiAgICB2YXIgdCA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+Pj4gMTYpICsgKCh1MCAqIHYxID4+PiAwKSArICh0ICYgVUlOVDE2KSA+Pj4gMTYpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgudW11bGguanNcbi8vIG1vZHVsZSBpZCA9IDMwNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwOi8vamZiYXN0aWVuLmdpdGh1Yi5pby9wYXBlcnMvTWF0aC5zaWduYml0Lmh0bWxcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgc2lnbmJpdDogZnVuY3Rpb24gc2lnbmJpdCh4KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuICh4ID0gK3gpICE9IHggPyB4IDogeCA9PSAwID8gMSAvIHggPT0gSW5maW5pdHkgOiB4ID4gMDtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNpZ25iaXQuanNcbi8vIG1vZHVsZSBpZCA9IDMwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWZpbmFsbHlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdQcm9taXNlJywgeyAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgY29yZS5Qcm9taXNlIHx8IGdsb2JhbC5Qcm9taXNlKTtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gIHJldHVybiB0aGlzLnRoZW4oXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgfSA6IG9uRmluYWxseSxcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHlcbiAgKTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHkuanNcbi8vIG1vZHVsZSBpZCA9IDMwNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXRyeVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1Byb21pc2UnLCB7ICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTtcbiAgKHJlc3VsdC5lID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnYpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeS5qc1xuLy8gbW9kdWxlIGlkID0gMzA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IG1ldGFkYXRhLnNldDtcblxubWV0YWRhdGEuZXhwKHsgZGVmaW5lTWV0YWRhdGE6IGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHRhcmdldEtleSkge1xuICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCBhbk9iamVjdCh0YXJnZXQpLCB0b01ldGFLZXkodGFyZ2V0S2V5KSk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5kZWZpbmUtbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMwOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgTWFwID0gcmVxdWlyZSgnLi9lczYubWFwJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdtZXRhZGF0YScpO1xudmFyIHN0b3JlID0gc2hhcmVkLnN0b3JlIHx8IChzaGFyZWQuc3RvcmUgPSBuZXcgKHJlcXVpcmUoJy4vZXM2LndlYWstbWFwJykpKCkpO1xuXG52YXIgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IGZ1bmN0aW9uICh0YXJnZXQsIHRhcmdldEtleSwgY3JlYXRlKSB7XG4gIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICBpZiAoIXRhcmdldE1ldGFkYXRhKSB7XG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgc3RvcmUuc2V0KHRhcmdldCwgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9XG4gIHZhciBrZXlNZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhLmdldCh0YXJnZXRLZXkpO1xuICBpZiAoIWtleU1ldGFkYXRhKSB7XG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdGFyZ2V0TWV0YWRhdGEuc2V0KHRhcmdldEtleSwga2V5TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9IHJldHVybiBrZXlNZXRhZGF0YTtcbn07XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTtcbiAgcmV0dXJuIG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IG1ldGFkYXRhTWFwLmhhcyhNZXRhZGF0YUtleSk7XG59O1xudmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbn07XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIHRydWUpLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG59O1xudmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAodGFyZ2V0LCB0YXJnZXRLZXksIGZhbHNlKTtcbiAgdmFyIGtleXMgPSBbXTtcbiAgaWYgKG1ldGFkYXRhTWFwKSBtZXRhZGF0YU1hcC5mb3JFYWNoKGZ1bmN0aW9uIChfLCBrZXkpIHsga2V5cy5wdXNoKGtleSk7IH0pO1xuICByZXR1cm4ga2V5cztcbn07XG52YXIgdG9NZXRhS2V5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG52YXIgZXhwID0gZnVuY3Rpb24gKE8pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgTyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc3RvcmU6IHN0b3JlLFxuICBtYXA6IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAsXG4gIGhhczogb3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgZ2V0OiBvcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICBzZXQ6IG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gIGtleXM6IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICBrZXk6IHRvTWV0YUtleSxcbiAgZXhwOiBleHBcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19tZXRhZGF0YS5qc1xuLy8gbW9kdWxlIGlkID0gMzA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG52YXIgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IG1ldGFkYXRhLm1hcDtcbnZhciBzdG9yZSA9IG1ldGFkYXRhLnN0b3JlO1xuXG5tZXRhZGF0YS5leHAoeyBkZWxldGVNZXRhZGF0YTogZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKTtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXksIGZhbHNlKTtcbiAgaWYgKG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgfHwgIW1ldGFkYXRhTWFwWydkZWxldGUnXShtZXRhZGF0YUtleSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKG1ldGFkYXRhTWFwLnNpemUpIHJldHVybiB0cnVlO1xuICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBzdG9yZS5nZXQodGFyZ2V0KTtcbiAgdGFyZ2V0TWV0YWRhdGFbJ2RlbGV0ZSddKHRhcmdldEtleSk7XG4gIHJldHVybiAhIXRhcmdldE1ldGFkYXRhLnNpemUgfHwgc3RvcmVbJ2RlbGV0ZSddKHRhcmdldCk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhcztcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0O1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5R2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZiAoaGFzT3duKSByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIHZhciBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTtcbiAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCA/IG9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCkgOiB1bmRlZmluZWQ7XG59O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRNZXRhZGF0YTogZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9lczYuc2V0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbnZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlNZXRhZGF0YUtleXMgPSBmdW5jdGlvbiAoTywgUCkge1xuICB2YXIgb0tleXMgPSBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICBpZiAocGFyZW50ID09PSBudWxsKSByZXR1cm4gb0tleXM7XG4gIHZhciBwS2V5cyA9IG9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gIHJldHVybiBwS2V5cy5sZW5ndGggPyBvS2V5cy5sZW5ndGggPyBmcm9tKG5ldyBTZXQob0tleXMuY29uY2F0KHBLZXlzKSkpIDogcEtleXMgOiBvS2V5cztcbn07XG5cbm1ldGFkYXRhLmV4cCh7IGdldE1ldGFkYXRhS2V5czogZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlNZXRhZGF0YUtleXMoYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzFdKSk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMzEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0O1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0T3duTWV0YWRhdGE6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qc1xuLy8gbW9kdWxlIGlkID0gMzEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1sxXSkpO1xufSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSAzMTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5oYXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlIYXNNZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgaGFzT3duID0gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIGlmIChoYXNPd24pIHJldHVybiB0cnVlO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogZmFsc2U7XG59O1xuXG5tZXRhZGF0YS5leHAoeyBoYXNNZXRhZGF0YTogZnVuY3Rpb24gaGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhcztcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbm1ldGFkYXRhLmV4cCh7IGhhc093bk1ldGFkYXRhOiBmdW5jdGlvbiBoYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHJldHVybiBvcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpXG4gICAgLCBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pKTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMxNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciB0b01ldGFLZXkgPSAkbWV0YWRhdGEua2V5O1xudmFyIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEgPSAkbWV0YWRhdGEuc2V0O1xuXG4kbWV0YWRhdGEuZXhwKHsgbWV0YWRhdGE6IGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKFxuICAgICAgbWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsXG4gICAgICAodGFyZ2V0S2V5ICE9PSB1bmRlZmluZWQgPyBhbk9iamVjdCA6IGFGdW5jdGlvbikodGFyZ2V0KSxcbiAgICAgIHRvTWV0YUtleSh0YXJnZXRLZXkpXG4gICAgKTtcbiAgfTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lm1ldGFkYXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAzMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3J3YWxkcm9uL3RjMzktbm90ZXMvYmxvYi9tYXN0ZXIvZXM2LzIwMTQtMDkvc2VwdC0yNS5tZCM1MTAtZ2xvYmFsYXNhcC1mb3ItZW5xdWV1aW5nLWEtbWljcm90YXNrXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgcHJvY2VzcyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnByb2Nlc3M7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG4kZXhwb3J0KCRleHBvcnQuRywge1xuICBhc2FwOiBmdW5jdGlvbiBhc2FwKGZuKSB7XG4gICAgdmFyIGRvbWFpbiA9IGlzTm9kZSAmJiBwcm9jZXNzLmRvbWFpbjtcbiAgICBtaWNyb3Rhc2soZG9tYWluID8gZG9tYWluLmJpbmQoZm4pIDogZm4pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFzYXAuanNcbi8vIG1vZHVsZSBpZCA9IDMxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemVucGFyc2luZy9lcy1vYnNlcnZhYmxlXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBPQlNFUlZBQkxFID0gcmVxdWlyZSgnLi9fd2tzJykoJ29ic2VydmFibGUnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBSRVRVUk4gPSBmb3JPZi5SRVRVUk47XG5cbnZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZuID09IG51bGwgPyB1bmRlZmluZWQgOiBhRnVuY3Rpb24oZm4pO1xufTtcblxudmFyIGNsZWFudXBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHZhciBjbGVhbnVwID0gc3Vic2NyaXB0aW9uLl9jO1xuICBpZiAoY2xlYW51cCkge1xuICAgIHN1YnNjcmlwdGlvbi5fYyA9IHVuZGVmaW5lZDtcbiAgICBjbGVhbnVwKCk7XG4gIH1cbn07XG5cbnZhciBzdWJzY3JpcHRpb25DbG9zZWQgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHJldHVybiBzdWJzY3JpcHRpb24uX28gPT09IHVuZGVmaW5lZDtcbn07XG5cbnZhciBjbG9zZVN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkge1xuICAgIHN1YnNjcmlwdGlvbi5fbyA9IHVuZGVmaW5lZDtcbiAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gIH1cbn07XG5cbnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAob2JzZXJ2ZXIsIHN1YnNjcmliZXIpIHtcbiAgYW5PYmplY3Qob2JzZXJ2ZXIpO1xuICB0aGlzLl9jID0gdW5kZWZpbmVkO1xuICB0aGlzLl9vID0gb2JzZXJ2ZXI7XG4gIG9ic2VydmVyID0gbmV3IFN1YnNjcmlwdGlvbk9ic2VydmVyKHRoaXMpO1xuICB0cnkge1xuICAgIHZhciBjbGVhbnVwID0gc3Vic2NyaWJlcihvYnNlcnZlcik7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IGNsZWFudXA7XG4gICAgaWYgKGNsZWFudXAgIT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwLnVuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSBjbGVhbnVwID0gZnVuY3Rpb24gKCkgeyBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgfTtcbiAgICAgIGVsc2UgYUZ1bmN0aW9uKGNsZWFudXApO1xuICAgICAgdGhpcy5fYyA9IGNsZWFudXA7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuO1xuICB9IGlmIChzdWJzY3JpcHRpb25DbG9zZWQodGhpcykpIGNsZWFudXBTdWJzY3JpcHRpb24odGhpcyk7XG59O1xuXG5TdWJzY3JpcHRpb24ucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoe30sIHtcbiAgdW5zdWJzY3JpYmU6IGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkgeyBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTsgfVxufSk7XG5cbnZhciBTdWJzY3JpcHRpb25PYnNlcnZlciA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgdGhpcy5fcyA9IHN1YnNjcmlwdGlvbjtcbn07XG5cblN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7XG4gIG5leHQ6IGZ1bmN0aW9uIG5leHQodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcbiAgICBpZiAoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKSB7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX287XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbSA9IGdldE1ldGhvZChvYnNlcnZlci5uZXh0KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGVycm9yOiBmdW5jdGlvbiBlcnJvcih2YWx1ZSkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zO1xuICAgIGlmIChzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkgdGhyb3cgdmFsdWU7XG4gICAgdmFyIG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vO1xuICAgIHN1YnNjcmlwdGlvbi5fbyA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgdmFyIG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIuZXJyb3IpO1xuICAgICAgaWYgKCFtKSB0aHJvdyB2YWx1ZTtcbiAgICAgIHZhbHVlID0gbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG4gIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh2YWx1ZSkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zO1xuICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHtcbiAgICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fbztcbiAgICAgIHN1YnNjcmlwdGlvbi5fbyA9IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLmNvbXBsZXRlKTtcbiAgICAgICAgdmFsdWUgPSBtID8gbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxufSk7XG5cbnZhciAkT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIE9ic2VydmFibGUoc3Vic2NyaWJlcikge1xuICBhbkluc3RhbmNlKHRoaXMsICRPYnNlcnZhYmxlLCAnT2JzZXJ2YWJsZScsICdfZicpLl9mID0gYUZ1bmN0aW9uKHN1YnNjcmliZXIpO1xufTtcblxucmVkZWZpbmVBbGwoJE9ic2VydmFibGUucHJvdG90eXBlLCB7XG4gIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24ob2JzZXJ2ZXIsIHRoaXMuX2YpO1xuICB9LFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgKGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgYUZ1bmN0aW9uKGZuKTtcbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGF0LnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59KTtcblxucmVkZWZpbmVBbGwoJE9ic2VydmFibGUsIHtcbiAgZnJvbTogZnVuY3Rpb24gZnJvbSh4KSB7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiAkT2JzZXJ2YWJsZTtcbiAgICB2YXIgbWV0aG9kID0gZ2V0TWV0aG9kKGFuT2JqZWN0KHgpW09CU0VSVkFCTEVdKTtcbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICB2YXIgb2JzZXJ2YWJsZSA9IGFuT2JqZWN0KG1ldGhvZC5jYWxsKHgpKTtcbiAgICAgIHJldHVybiBvYnNlcnZhYmxlLmNvbnN0cnVjdG9yID09PSBDID8gb2JzZXJ2YWJsZSA6IG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZS5zdWJzY3JpYmUob2JzZXJ2ZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGZvck9mKHgsIGZhbHNlLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdCk7XG4gICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm4gUkVUVVJOO1xuICAgICAgICAgICAgfSkgPT09IFJFVFVSTikgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChkb25lKSB0aHJvdyBlO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IGRvbmUgPSB0cnVlOyB9O1xuICAgIH0pO1xuICB9LFxuICBvZjogZnVuY3Rpb24gb2YoKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoLCBpdGVtcyA9IG5ldyBBcnJheShsKTsgaSA8IGw7KSBpdGVtc1tpXSA9IGFyZ3VtZW50c1tpKytdO1xuICAgIHJldHVybiBuZXcgKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6ICRPYnNlcnZhYmxlKShmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW1zW2pdKTtcbiAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgfSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IGRvbmUgPSB0cnVlOyB9O1xuICAgIH0pO1xuICB9XG59KTtcblxuaGlkZSgkT2JzZXJ2YWJsZS5wcm90b3R5cGUsIE9CU0VSVkFCTEUsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG4kZXhwb3J0KCRleHBvcnQuRywgeyBPYnNlcnZhYmxlOiAkT2JzZXJ2YWJsZSB9KTtcblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnT2JzZXJ2YWJsZScpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JzZXJ2YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gMzE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGllOS0gc2V0VGltZW91dCAmIHNldEludGVydmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xudmFyIHNsaWNlID0gW10uc2xpY2U7XG52YXIgTVNJRSA9IC9NU0lFIC5cXC4vLnRlc3QodXNlckFnZW50KTsgLy8gPC0gZGlydHkgaWU5LSBjaGVja1xudmFyIHdyYXAgPSBmdW5jdGlvbiAoc2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZm4sIHRpbWUgLyogLCAuLi5hcmdzICovKSB7XG4gICAgdmFyIGJvdW5kQXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIHZhciBhcmdzID0gYm91bmRBcmdzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpIDogZmFsc2U7XG4gICAgcmV0dXJuIHNldChib3VuZEFyZ3MgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pKS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IDogZm4sIHRpbWUpO1xuICB9O1xufTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CICsgJGV4cG9ydC5GICogTVNJRSwge1xuICBzZXRUaW1lb3V0OiB3cmFwKGdsb2JhbC5zZXRUaW1lb3V0KSxcbiAgc2V0SW50ZXJ2YWw6IHdyYXAoZ2xvYmFsLnNldEludGVydmFsKVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanNcbi8vIG1vZHVsZSBpZCA9IDMyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICR0YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpO1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkIsIHtcbiAgc2V0SW1tZWRpYXRlOiAkdGFzay5zZXQsXG4gIGNsZWFySW1tZWRpYXRlOiAkdGFzay5jbGVhclxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDMyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5BcnJheTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiBmYWxzZSxcbiAgQ1NTVmFsdWVMaXN0OiBmYWxzZSxcbiAgQ2xpZW50UmVjdExpc3Q6IGZhbHNlLFxuICBET01SZWN0TGlzdDogZmFsc2UsXG4gIERPTVN0cmluZ0xpc3Q6IGZhbHNlLFxuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiBmYWxzZSxcbiAgRmlsZUxpc3Q6IGZhbHNlLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTEZvcm1FbGVtZW50OiBmYWxzZSxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IGZhbHNlLFxuICBNZWRpYUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBNaW1lVHlwZUFycmF5OiBmYWxzZSxcbiAgTmFtZWROb2RlTWFwOiBmYWxzZSxcbiAgTm9kZUxpc3Q6IHRydWUsXG4gIFBhaW50UmVxdWVzdExpc3Q6IGZhbHNlLFxuICBQbHVnaW46IGZhbHNlLFxuICBQbHVnaW5BcnJheTogZmFsc2UsXG4gIFNWR0xlbmd0aExpc3Q6IGZhbHNlLFxuICBTVkdOdW1iZXJMaXN0OiBmYWxzZSxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IGZhbHNlLFxuICBTVkdQb2ludExpc3Q6IGZhbHNlLFxuICBTVkdTdHJpbmdMaXN0OiBmYWxzZSxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogZmFsc2UsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IGZhbHNlLFxuICBTdHlsZVNoZWV0TGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIFRleHRUcmFja0N1ZUxpc3Q6IGZhbHNlLFxuICBUZXh0VHJhY2tMaXN0OiBmYWxzZSxcbiAgVG91Y2hMaXN0OiBmYWxzZVxufTtcblxuZm9yICh2YXIgY29sbGVjdGlvbnMgPSBnZXRLZXlzKERPTUl0ZXJhYmxlcyksIGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBjb2xsZWN0aW9uc1tpXTtcbiAgdmFyIGV4cGxpY2l0ID0gRE9NSXRlcmFibGVzW05BTUVdO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGtleTtcbiAgaWYgKHByb3RvKSB7XG4gICAgaWYgKCFwcm90b1tJVEVSQVRPUl0pIGhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYgKCFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgaWYgKGV4cGxpY2l0KSBmb3IgKGtleSBpbiAkaXRlcmF0b3JzKSBpZiAoIXByb3RvW2tleV0pIHJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gMzIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvbWFzdGVyL0xJQ0VOU0UgZmlsZS4gQW5cbiAqIGFkZGl0aW9uYWwgZ3JhbnQgb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpblxuICogdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZ2xvYmFsLnByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgZ2xvYmFsLnByb2Nlc3MuZG9tYWluKSB7XG4gICAgICBpbnZva2UgPSBnbG9iYWwucHJvY2Vzcy5kb21haW4uYmluZChpbnZva2UpO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gQW1vbmcgdGhlIHZhcmlvdXMgdHJpY2tzIGZvciBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbFxuICAvLyBvYmplY3QsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIG1vc3QgcmVsaWFibGUgdGVjaG5pcXVlIHRoYXQgZG9lcyBub3RcbiAgLy8gdXNlIGluZGlyZWN0IGV2YWwgKHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5KS5cbiAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gIHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgPyB3aW5kb3cgOlxuICB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0aGlzXG4pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qc1xuLy8gbW9kdWxlIGlkID0gMzIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5SZWdFeHAuZXNjYXBlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvZm4vcmVnZXhwL2VzY2FwZS5qc1xuLy8gbW9kdWxlIGlkID0gMzI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZW5qYW1pbmdyL1JleEV4cC5lc2NhcGVcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHJlID0gcmVxdWlyZSgnLi9fcmVwbGFjZXInKSgvW1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWdFeHAnLCB7IGVzY2FwZTogZnVuY3Rpb24gZXNjYXBlKGl0KSB7IHJldHVybiAkcmUoaXQpOyB9IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9jb3JlLnJlZ2V4cC5lc2NhcGUuanNcbi8vIG1vZHVsZSBpZCA9IDMyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyZWdFeHAsIHJlcGxhY2UpIHtcbiAgdmFyIHJlcGxhY2VyID0gcmVwbGFjZSA9PT0gT2JqZWN0KHJlcGxhY2UpID8gZnVuY3Rpb24gKHBhcnQpIHtcbiAgICByZXR1cm4gcmVwbGFjZVtwYXJ0XTtcbiAgfSA6IHJlcGxhY2U7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gU3RyaW5nKGl0KS5yZXBsYWNlKHJlZ0V4cCwgcmVwbGFjZXIpO1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3JlcGxhY2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAzMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuZXhwb3J0IGNvbnN0IExvZyA9IHJlcXVpcmUoJy4vc3JjL0xvZycpO1xyXG5leHBvcnQgY29uc3QgT2lkY0NsaWVudCA9IHJlcXVpcmUoJy4vc3JjL09pZGNDbGllbnQnKTtcclxuZXhwb3J0IGNvbnN0IE9pZGNDbGllbnRTZXR0aW5ncyA9IHJlcXVpcmUoJy4vc3JjL09pZGNDbGllbnRTZXR0aW5ncycpO1xyXG5leHBvcnQgY29uc3QgV2ViU3RvcmFnZVN0YXRlU3RvcmUgPSByZXF1aXJlKCcuL3NyYy9XZWJTdG9yYWdlU3RhdGVTdG9yZScpO1xyXG5leHBvcnQgY29uc3QgSW5NZW1vcnlXZWJTdG9yYWdlID0gcmVxdWlyZSgnLi9zcmMvSW5NZW1vcnlXZWJTdG9yYWdlJyk7XHJcbmV4cG9ydCBjb25zdCBVc2VyTWFuYWdlciA9IHJlcXVpcmUoJy4vc3JjL1VzZXJNYW5hZ2VyJyk7XHJcbmV4cG9ydCBjb25zdCBBY2Nlc3NUb2tlbkV2ZW50cyA9IHJlcXVpcmUoJy4vc3JjL0FjY2Vzc1Rva2VuRXZlbnRzJyk7XHJcbmV4cG9ydCBjb25zdCBNZXRhZGF0YVNlcnZpY2UgPSByZXF1aXJlKCcuL3NyYy9NZXRhZGF0YVNlcnZpY2UnKTtcclxuZXhwb3J0IGNvbnN0IENvcmRvdmFQb3B1cE5hdmlnYXRvciA9IHJlcXVpcmUoJy4vc3JjL0NvcmRvdmFQb3B1cE5hdmlnYXRvcicpO1xyXG5leHBvcnQgY29uc3QgQ29yZG92YUlGcmFtZU5hdmlnYXRvciA9IHJlcXVpcmUoJy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3InKTtcclxuZXhwb3J0IGNvbnN0IENoZWNrU2Vzc2lvbklGcmFtZSA9IHJlcXVpcmUoJy4vc3JjL0NoZWNrU2Vzc2lvbklGcmFtZScpO1xyXG5leHBvcnQgY29uc3QgVG9rZW5SZXZvY2F0aW9uQ2xpZW50ID0gcmVxdWlyZSgnLi9zcmMvVG9rZW5SZXZvY2F0aW9uQ2xpZW50Jyk7XHJcbmV4cG9ydCBjb25zdCBTZXNzaW9uTW9uaXRvciA9IHJlcXVpcmUoJy4vc3JjL1Nlc3Npb25Nb25pdG9yJyk7XHJcbmV4cG9ydCBjb25zdCBHbG9iYWwgPSByZXF1aXJlKCcuL3NyYy9HbG9iYWwnKTtcclxuZXhwb3J0IGNvbnN0IFVzZXIgPSByZXF1aXJlKCcuL3NyYy9Vc2VyJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBMb2csXHJcbiAgICBPaWRjQ2xpZW50LFxyXG4gICAgT2lkY0NsaWVudFNldHRpbmdzLFxyXG4gICAgV2ViU3RvcmFnZVN0YXRlU3RvcmUsXHJcbiAgICBJbk1lbW9yeVdlYlN0b3JhZ2UsXHJcbiAgICBVc2VyTWFuYWdlcixcclxuICAgIEFjY2Vzc1Rva2VuRXZlbnRzLFxyXG4gICAgTWV0YWRhdGFTZXJ2aWNlLFxyXG4gICAgQ29yZG92YVBvcHVwTmF2aWdhdG9yLFxyXG4gICAgQ29yZG92YUlGcmFtZU5hdmlnYXRvcixcclxuICAgIENoZWNrU2Vzc2lvbklGcmFtZSxcclxuICAgIFRva2VuUmV2b2NhdGlvbkNsaWVudCxcclxuICAgIFNlc3Npb25Nb25pdG9yLFxyXG4gICAgR2xvYmFsLFxyXG4gICAgVXNlclxyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9pbmRleC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmxldCBub3BMb2dnZXIgPSB7XHJcbiAgICBkZWJ1Zygpe30sXHJcbiAgICBpbmZvKCl7fSxcclxuICAgIHdhcm4oKXt9LFxyXG4gICAgZXJyb3IoKXt9XHJcbn07XHJcblxyXG5jb25zdCBOT05FID0gMDtcclxuY29uc3QgRVJST1IgPSAxO1xyXG5jb25zdCBXQVJOID0gMjtcclxuY29uc3QgSU5GTyA9IDM7XHJcbmNvbnN0IERFQlVHID0gNDtcclxuXHJcbmxldCBsb2dnZXI7XHJcbmxldCBsZXZlbDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZyB7XHJcbiAgICBzdGF0aWMgZ2V0IE5PTkUoKSB7cmV0dXJuIE5PTkV9O1xyXG4gICAgc3RhdGljIGdldCBFUlJPUigpIHtyZXR1cm4gRVJST1J9O1xyXG4gICAgc3RhdGljIGdldCBXQVJOKCkge3JldHVybiBXQVJOfTtcclxuICAgIHN0YXRpYyBnZXQgSU5GTygpIHtyZXR1cm4gSU5GT307XHJcbiAgICBzdGF0aWMgZ2V0IERFQlVHKCkge3JldHVybiBERUJVR307XHJcbiAgICBcclxuICAgIHN0YXRpYyByZXNldCgpe1xyXG4gICAgICAgIGxldmVsID0gSU5GTztcclxuICAgICAgICBsb2dnZXIgPSBub3BMb2dnZXI7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBnZXQgbGV2ZWwoKXtcclxuICAgICAgICByZXR1cm4gbGV2ZWw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgc2V0IGxldmVsKHZhbHVlKXtcclxuICAgICAgICBpZiAoTk9ORSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBERUJVRyl7XHJcbiAgICAgICAgICAgIGxldmVsID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBnZXQgbG9nZ2VyKCl7XHJcbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBzZXQgbG9nZ2VyKHZhbHVlKXtcclxuICAgICAgICBpZiAoIXZhbHVlLmRlYnVnICYmIHZhbHVlLmluZm8pIHtcclxuICAgICAgICAgICAgLy8ganVzdCB0byBzdGF5IGJhY2t3YXJkcyBjb21wYXQuIGNhbiByZW1vdmUgaW4gMi4wXHJcbiAgICAgICAgICAgIHZhbHVlLmRlYnVnID0gdmFsdWUuaW5mbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5kZWJ1ZyAmJiB2YWx1ZS5pbmZvICYmIHZhbHVlLndhcm4gJiYgdmFsdWUuZXJyb3Ipe1xyXG4gICAgICAgICAgICBsb2dnZXIgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nZ2VyXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIGRlYnVnKC4uLmFyZ3Mpe1xyXG4gICAgICAgIGlmIChsZXZlbCA+PSBERUJVRyl7XHJcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zy5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBpbmZvKC4uLmFyZ3Mpe1xyXG4gICAgICAgIGlmIChsZXZlbCA+PSBJTkZPKXtcclxuICAgICAgICAgICAgbG9nZ2VyLmluZm8uYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgd2FybiguLi5hcmdzKXtcclxuICAgICAgICBpZiAobGV2ZWwgPj0gV0FSTil7XHJcbiAgICAgICAgICAgIGxvZ2dlci53YXJuLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGVycm9yKC4uLmFyZ3Mpe1xyXG4gICAgICAgIGlmIChsZXZlbCA+PSBFUlJPUil7XHJcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvci5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuTG9nLnJlc2V0KCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0xvZy5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgT2lkY0NsaWVudFNldHRpbmdzIGZyb20gJy4vT2lkY0NsaWVudFNldHRpbmdzJztcclxuaW1wb3J0IEVycm9yUmVzcG9uc2UgZnJvbSAnLi9FcnJvclJlc3BvbnNlJztcclxuaW1wb3J0IFNpZ25pblJlcXVlc3QgZnJvbSAnLi9TaWduaW5SZXF1ZXN0JztcclxuaW1wb3J0IFNpZ25pblJlc3BvbnNlIGZyb20gJy4vU2lnbmluUmVzcG9uc2UnO1xyXG5pbXBvcnQgU2lnbm91dFJlcXVlc3QgZnJvbSAnLi9TaWdub3V0UmVxdWVzdCc7XHJcbmltcG9ydCBTaWdub3V0UmVzcG9uc2UgZnJvbSAnLi9TaWdub3V0UmVzcG9uc2UnO1xyXG5pbXBvcnQgU2lnbmluU3RhdGUgZnJvbSAnLi9TaWduaW5TdGF0ZSc7XHJcbmltcG9ydCBTdGF0ZSBmcm9tICcuL1N0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9pZGNDbGllbnQge1xyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MgPSB7fSkge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncyBpbnN0YW5jZW9mIE9pZGNDbGllbnRTZXR0aW5ncykge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBuZXcgT2lkY0NsaWVudFNldHRpbmdzKHNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF9zdGF0ZVN0b3JlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnN0YXRlU3RvcmU7XHJcbiAgICB9XHJcbiAgICBnZXQgX3ZhbGlkYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy52YWxpZGF0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgX21ldGFkYXRhU2VydmljZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tZXRhZGF0YVNlcnZpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcclxuICAgIH1cclxuICAgIGdldCBtZXRhZGF0YVNlcnZpY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTaWduaW5SZXF1ZXN0KHtcclxuICAgICAgICByZXNwb25zZV90eXBlLCBzY29wZSwgcmVkaXJlY3RfdXJpLCBcclxuICAgICAgICAvLyBkYXRhIHdhcyBtZWFudCB0byBiZSB0aGUgcGxhY2UgYSBjYWxsZXIgY291bGQgaW5kaWNhdGUgdGhlIGRhdGEgdG9cclxuICAgICAgICAvLyBoYXZlIHJvdW5kIHRyaXBwZWQsIGJ1dCBwZW9wbGUgd2VyZSBnZXR0aW5nIGNvbmZ1c2VkLCBzbyBpIGFkZGVkIHN0YXRlIChzaW5jZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWMpIFxyXG4gICAgICAgIC8vIGFuZCBzbyBub3cgaWYgZGF0YSBpcyBub3QgcGFzc2VkLCBidXQgc3RhdGUgaXMgdGhlbiBzdGF0ZSB3aWxsIGJlIHVzZWRcclxuICAgICAgICBkYXRhLCBzdGF0ZSwgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50LCBhY3JfdmFsdWVzLFxyXG4gICAgICAgIHJlc291cmNlLCByZXF1ZXN0LCByZXF1ZXN0X3VyaSwgZXh0cmFRdWVyeVBhcmFtcyB9ID0ge30sXHJcbiAgICAgICAgc3RhdGVTdG9yZVxyXG4gICAgKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jcmVhdGVTaWduaW5SZXF1ZXN0XCIpO1xyXG5cclxuICAgICAgICBsZXQgY2xpZW50X2lkID0gdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkO1xyXG4gICAgICAgIHJlc3BvbnNlX3R5cGUgPSByZXNwb25zZV90eXBlIHx8IHRoaXMuX3NldHRpbmdzLnJlc3BvbnNlX3R5cGU7XHJcbiAgICAgICAgc2NvcGUgPSBzY29wZSB8fCB0aGlzLl9zZXR0aW5ncy5zY29wZTtcclxuICAgICAgICByZWRpcmVjdF91cmkgPSByZWRpcmVjdF91cmkgfHwgdGhpcy5fc2V0dGluZ3MucmVkaXJlY3RfdXJpO1xyXG5cclxuICAgICAgICAvLyBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50IGFyZW4ndCBhbGxvd2VkIG9uIF9zZXR0aW5nc1xyXG4gICAgICAgIHByb21wdCA9IHByb21wdCB8fCB0aGlzLl9zZXR0aW5ncy5wcm9tcHQ7XHJcbiAgICAgICAgZGlzcGxheSA9IGRpc3BsYXkgfHwgdGhpcy5fc2V0dGluZ3MuZGlzcGxheTtcclxuICAgICAgICBtYXhfYWdlID0gbWF4X2FnZSB8fCB0aGlzLl9zZXR0aW5ncy5tYXhfYWdlO1xyXG4gICAgICAgIHVpX2xvY2FsZXMgPSB1aV9sb2NhbGVzIHx8IHRoaXMuX3NldHRpbmdzLnVpX2xvY2FsZXM7XHJcbiAgICAgICAgYWNyX3ZhbHVlcyA9IGFjcl92YWx1ZXMgfHwgdGhpcy5fc2V0dGluZ3MuYWNyX3ZhbHVlcztcclxuICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlIHx8IHRoaXMuX3NldHRpbmdzLnJlc291cmNlO1xyXG4gICAgICAgIGV4dHJhUXVlcnlQYXJhbXMgPSBleHRyYVF1ZXJ5UGFyYW1zIHx8IHRoaXMuX3NldHRpbmdzLmV4dHJhUXVlcnlQYXJhbXM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IGF1dGhvcml0eSA9IHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRBdXRob3JpemF0aW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIGF1dGhvcml6YXRpb24gZW5kcG9pbnRcIiwgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzaWduaW5SZXF1ZXN0ID0gbmV3IFNpZ25pblJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgdXJsLFxyXG4gICAgICAgICAgICAgICAgY2xpZW50X2lkLFxyXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZSxcclxuICAgICAgICAgICAgICAgIHNjb3BlLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSB8fCBzdGF0ZSxcclxuICAgICAgICAgICAgICAgIGF1dGhvcml0eSxcclxuICAgICAgICAgICAgICAgIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlcyxcclxuICAgICAgICAgICAgICAgIHJlc291cmNlLCByZXF1ZXN0LCByZXF1ZXN0X3VyaSwgZXh0cmFRdWVyeVBhcmFtcyxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2lnbmluU3RhdGUgPSBzaWduaW5SZXF1ZXN0LnN0YXRlO1xyXG4gICAgICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUuc2V0KHNpZ25pblN0YXRlLmlkLCBzaWduaW5TdGF0ZS50b1N0b3JhZ2VTdHJpbmcoKSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2lnbmluUmVxdWVzdDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc1NpZ25pblJlc3BvbnNlKHVybCwgc3RhdGVTdG9yZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQucHJvY2Vzc1NpZ25pblJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgU2lnbmluUmVzcG9uc2UodXJsKTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5zdGF0ZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBzdGF0ZSBpbiByZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHN0YXRlIGluIHJlc3BvbnNlXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XHJcblxyXG4gICAgICAgIHJldHVybiBzdGF0ZVN0b3JlLnJlbW92ZShyZXNwb25zZS5zdGF0ZSkudGhlbihzdG9yZWRTdGF0ZVN0cmluZyA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc3RvcmVkU3RhdGVTdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBTaWduaW5TdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhzdG9yZWRTdGF0ZVN0cmluZyk7XHJcblxyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZWNlaXZlZCBzdGF0ZSBmcm9tIHN0b3JhZ2U7IHZhbGlkYXRpbmcgcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGVTaWduaW5SZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNpZ25vdXRSZXF1ZXN0KHtpZF90b2tlbl9oaW50LCBkYXRhLCBzdGF0ZSwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpfSA9IHt9LFxyXG4gICAgICAgIHN0YXRlU3RvcmVcclxuICAgICkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQuY3JlYXRlU2lnbm91dFJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSA9IHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0RW5kU2Vzc2lvbkVuZHBvaW50KCkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gZW5kIHNlc3Npb24gZW5kcG9pbnQgdXJsIHJldHVybmVkXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gZW5kIHNlc3Npb24gZW5kcG9pbnRcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIGVuZCBzZXNzaW9uIGVuZHBvaW50XCIsIHVybCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBTaWdub3V0UmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgICAgICBpZF90b2tlbl9oaW50LFxyXG4gICAgICAgICAgICAgICAgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSB8fCBzdGF0ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBzaWdub3V0U3RhdGUgPSByZXF1ZXN0LnN0YXRlO1xyXG4gICAgICAgICAgICBpZiAoc2lnbm91dFN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTaWdub3V0IHJlcXVlc3QgaGFzIHN0YXRlIHRvIHBlcnNpc3RcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcclxuICAgICAgICAgICAgICAgIHN0YXRlU3RvcmUuc2V0KHNpZ25vdXRTdGF0ZS5pZCwgc2lnbm91dFN0YXRlLnRvU3RvcmFnZVN0cmluZygpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc1NpZ25vdXRSZXNwb25zZSh1cmwsIHN0YXRlU3RvcmUpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWdub3V0UmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBTaWdub3V0UmVzcG9uc2UodXJsKTtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLnN0YXRlKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIk5vIHN0YXRlIGluIHJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cud2FybihcIlJlc3BvbnNlIHdhcyBlcnJvclwiLCByZXNwb25zZS5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgc3RhdGVLZXkgPSByZXNwb25zZS5zdGF0ZTtcclxuXHJcbiAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUucmVtb3ZlKHN0YXRlS2V5KS50aGVuKHN0b3JlZFN0YXRlU3RyaW5nID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzdG9yZWRTdGF0ZVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IFN0YXRlLmZyb21TdG9yYWdlU3RyaW5nKHN0b3JlZFN0YXRlU3RyaW5nKTtcclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIHN0YXRlIGZyb20gc3RvcmFnZTsgdmFsaWRhdGluZyByZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZVNpZ25vdXRSZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyU3RhbGVTdGF0ZShzdGF0ZVN0b3JlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jbGVhclN0YWxlU3RhdGVcIik7XHJcblxyXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XHJcblxyXG4gICAgICAgIHJldHVybiBTdGF0ZS5jbGVhclN0YWxlU3RhdGUoc3RhdGVTdG9yZSwgdGhpcy5zZXR0aW5ncy5zdGFsZVN0YXRlQWdlKTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvT2lkY0NsaWVudC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgV2ViU3RvcmFnZVN0YXRlU3RvcmUgZnJvbSAnLi9XZWJTdG9yYWdlU3RhdGVTdG9yZSc7XHJcbmltcG9ydCBSZXNwb25zZVZhbGlkYXRvciBmcm9tICcuL1Jlc3BvbnNlVmFsaWRhdG9yJztcclxuaW1wb3J0IE1ldGFkYXRhU2VydmljZSBmcm9tICcuL01ldGFkYXRhU2VydmljZSc7XHJcblxyXG5jb25zdCBPaWRjTWV0YWRhdGFVcmxQYXRoID0gJy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uJztcclxuXHJcbmNvbnN0IERlZmF1bHRSZXNwb25zZVR5cGUgPSBcImlkX3Rva2VuXCI7XHJcbmNvbnN0IERlZmF1bHRTY29wZSA9IFwib3BlbmlkXCI7XHJcbmNvbnN0IERlZmF1bHRTdGFsZVN0YXRlQWdlID0gNjAgKiA1OyAvLyBzZWNvbmRzXHJcbmNvbnN0IERlZmF1bHRDbG9ja1NrZXdJblNlY29uZHMgPSA2MCAqIDU7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPaWRjQ2xpZW50U2V0dGluZ3Mge1xyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIC8vIG1ldGFkYXRhIHJlbGF0ZWRcclxuICAgICAgICBhdXRob3JpdHksIG1ldGFkYXRhVXJsLCBtZXRhZGF0YSwgc2lnbmluZ0tleXMsXHJcbiAgICAgICAgLy8gY2xpZW50IHJlbGF0ZWRcclxuICAgICAgICBjbGllbnRfaWQsIGNsaWVudF9zZWNyZXQsIHJlc3BvbnNlX3R5cGUgPSBEZWZhdWx0UmVzcG9uc2VUeXBlLCBzY29wZSA9IERlZmF1bHRTY29wZSxcclxuICAgICAgICByZWRpcmVjdF91cmksIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSxcclxuICAgICAgICAvLyBvcHRpb25hbCBwcm90b2NvbFxyXG4gICAgICAgIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgYWNyX3ZhbHVlcywgcmVzb3VyY2UsXHJcbiAgICAgICAgLy8gYmVoYXZpb3IgZmxhZ3NcclxuICAgICAgICBmaWx0ZXJQcm90b2NvbENsYWltcyA9IHRydWUsIGxvYWRVc2VySW5mbyA9IHRydWUsXHJcbiAgICAgICAgc3RhbGVTdGF0ZUFnZSA9IERlZmF1bHRTdGFsZVN0YXRlQWdlLCBjbG9ja1NrZXcgPSBEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzLFxyXG4gICAgICAgIC8vIG90aGVyIGJlaGF2aW9yXHJcbiAgICAgICAgc3RhdGVTdG9yZSA9IG5ldyBXZWJTdG9yYWdlU3RhdGVTdG9yZSgpLFxyXG4gICAgICAgIFJlc3BvbnNlVmFsaWRhdG9yQ3RvciA9IFJlc3BvbnNlVmFsaWRhdG9yLFxyXG4gICAgICAgIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UsXHJcbiAgICAgICAgLy8gZXh0cmEgcXVlcnkgcGFyYW1zXHJcbiAgICAgICAgZXh0cmFRdWVyeVBhcmFtcyA9IHt9XHJcbiAgICB9ID0ge30pIHtcclxuXHJcbiAgICAgICAgdGhpcy5fYXV0aG9yaXR5ID0gYXV0aG9yaXR5O1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gbWV0YWRhdGFVcmw7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YTtcclxuICAgICAgICB0aGlzLl9zaWduaW5nS2V5cyA9IHNpZ25pbmdLZXlzO1xyXG5cclxuICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSBjbGllbnRfaWQ7XHJcbiAgICAgICAgdGhpcy5fY2xpZW50X3NlY3JldCA9IGNsaWVudF9zZWNyZXQ7XHJcbiAgICAgICAgdGhpcy5fcmVzcG9uc2VfdHlwZSA9IHJlc3BvbnNlX3R5cGU7XHJcbiAgICAgICAgdGhpcy5fc2NvcGUgPSBzY29wZTtcclxuICAgICAgICB0aGlzLl9yZWRpcmVjdF91cmkgPSByZWRpcmVjdF91cmk7XHJcbiAgICAgICAgdGhpcy5fcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcm9tcHQgPSBwcm9tcHQ7XHJcbiAgICAgICAgdGhpcy5fZGlzcGxheSA9IGRpc3BsYXk7XHJcbiAgICAgICAgdGhpcy5fbWF4X2FnZSA9IG1heF9hZ2U7XHJcbiAgICAgICAgdGhpcy5fdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXM7XHJcbiAgICAgICAgdGhpcy5fYWNyX3ZhbHVlcyA9IGFjcl92YWx1ZXM7XHJcbiAgICAgICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMgPSAhIWZpbHRlclByb3RvY29sQ2xhaW1zO1xyXG4gICAgICAgIHRoaXMuX2xvYWRVc2VySW5mbyA9ICEhbG9hZFVzZXJJbmZvO1xyXG4gICAgICAgIHRoaXMuX3N0YWxlU3RhdGVBZ2UgPSBzdGFsZVN0YXRlQWdlO1xyXG4gICAgICAgIHRoaXMuX2Nsb2NrU2tldyA9IGNsb2NrU2tldztcclxuXHJcbiAgICAgICAgdGhpcy5fc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmU7XHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdG9yID0gbmV3IFJlc3BvbnNlVmFsaWRhdG9yQ3Rvcih0aGlzKTtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZXh0cmFRdWVyeVBhcmFtcyA9IHR5cGVvZiBleHRyYVF1ZXJ5UGFyYW1zID09PSAnb2JqZWN0JyA/IGV4dHJhUXVlcnlQYXJhbXMgOiB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjbGllbnQgY29uZmlnXHJcbiAgICBnZXQgY2xpZW50X2lkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRfaWQ7XHJcbiAgICB9XHJcbiAgICBzZXQgY2xpZW50X2lkKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgLy8gb25lLXRpbWUgc2V0IG9ubHlcclxuICAgICAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJjbGllbnRfaWQgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2xpZW50X2lkIGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IGNsaWVudF9zZWNyZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudF9zZWNyZXQ7XHJcbiAgICB9XHJcbiAgICBnZXQgcmVzcG9uc2VfdHlwZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VfdHlwZTtcclxuICAgIH1cclxuICAgIGdldCBzY29wZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2NvcGU7XHJcbiAgICB9XHJcbiAgICBnZXQgcmVkaXJlY3RfdXJpKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdF91cmk7XHJcbiAgICB9XHJcbiAgICBnZXQgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIG9wdGlvbmFsIHByb3RvY29sIHBhcmFtc1xyXG4gICAgZ2V0IHByb21wdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbXB0O1xyXG4gICAgfVxyXG4gICAgZ2V0IGRpc3BsYXkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXk7XHJcbiAgICB9XHJcbiAgICBnZXQgbWF4X2FnZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4X2FnZTtcclxuICAgIH1cclxuICAgIGdldCB1aV9sb2NhbGVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91aV9sb2NhbGVzO1xyXG4gICAgfVxyXG4gICAgZ2V0IGFjcl92YWx1ZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fjcl92YWx1ZXM7XHJcbiAgICB9XHJcbiAgICBnZXQgcmVzb3VyY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBtZXRhZGF0YVxyXG4gICAgZ2V0IGF1dGhvcml0eSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yaXR5O1xyXG4gICAgfVxyXG4gICAgc2V0IGF1dGhvcml0eSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldCBvbmx5XHJcbiAgICAgICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiYXV0aG9yaXR5IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF1dGhvcml0eSBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBtZXRhZGF0YVVybCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX21ldGFkYXRhVXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gdGhpcy5hdXRob3JpdHk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmwgJiYgdGhpcy5fbWV0YWRhdGFVcmwuaW5kZXhPZihPaWRjTWV0YWRhdGFVcmxQYXRoKSA8IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybFt0aGlzLl9tZXRhZGF0YVVybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gJy8nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gT2lkY01ldGFkYXRhVXJsUGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhVXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNldHRhYmxlL2NhY2hhYmxlIG1ldGFkYXRhIHZhbHVlc1xyXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YTtcclxuICAgIH1cclxuICAgIHNldCBtZXRhZGF0YSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpZ25pbmdLZXlzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5nS2V5cztcclxuICAgIH1cclxuICAgIHNldCBzaWduaW5nS2V5cyh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYmVoYXZpb3IgZmxhZ3NcclxuICAgIGdldCBmaWx0ZXJQcm90b2NvbENsYWltcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXM7XHJcbiAgICB9XHJcbiAgICBnZXQgbG9hZFVzZXJJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkVXNlckluZm87XHJcbiAgICB9XHJcbiAgICBnZXQgc3RhbGVTdGF0ZUFnZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhbGVTdGF0ZUFnZTtcclxuICAgIH1cclxuICAgIGdldCBjbG9ja1NrZXcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb2NrU2tldztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3RhdGVTdG9yZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVTdG9yZTtcclxuICAgIH1cclxuICAgIGdldCB2YWxpZGF0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBtZXRhZGF0YVNlcnZpY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBleHRyYSBxdWVyeSBwYXJhbXNcclxuICAgIGdldCBleHRyYVF1ZXJ5UGFyYW1zKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9leHRyYVF1ZXJ5UGFyYW1zO1xyXG4gICAgfVxyXG4gICAgc2V0IGV4dHJhUXVlcnlQYXJhbXModmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhUXVlcnlQYXJhbXMgPSB2YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9leHRyYVF1ZXJ5UGFyYW1zID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9PaWRjQ2xpZW50U2V0dGluZ3MuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJTdG9yYWdlU3RhdGVTdG9yZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7cHJlZml4ID0gXCJvaWRjLlwiLCBzdG9yZSA9IEdsb2JhbC5sb2NhbFN0b3JhZ2V9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xyXG4gICAgICAgIHRoaXMuX3ByZWZpeCA9IHByZWZpeDtcclxuICAgIH1cclxuXHJcbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLnNldFwiLCBrZXkpO1xyXG5cclxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b3JlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldChrZXkpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJXZWJTdG9yYWdlU3RhdGVTdG9yZS5nZXRcIiwga2V5KTtcclxuXHJcbiAgICAgICAga2V5ID0gdGhpcy5fcHJlZml4ICsga2V5O1xyXG5cclxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX3N0b3JlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZShrZXkpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJXZWJTdG9yYWdlU3RhdGVTdG9yZS5yZW1vdmVcIiwga2V5KTtcclxuXHJcbiAgICAgICAga2V5ID0gdGhpcy5fcHJlZml4ICsga2V5O1xyXG5cclxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX3N0b3JlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICB0aGlzLl9zdG9yZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxLZXlzKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLmdldEFsbEtleXNcIik7XHJcblxyXG4gICAgICAgIHZhciBrZXlzID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9zdG9yZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuX3N0b3JlLmtleShpbmRleCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5fcHJlZml4KSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleS5zdWJzdHIodGhpcy5fcHJlZml4Lmxlbmd0aCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoa2V5cyk7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuY29uc3QgdGltZXIgPSB7XHJcbiAgICBzZXRJbnRlcnZhbDogZnVuY3Rpb24gKGNiLCBkdXJhdGlvbikge1xyXG4gICAgICAgIHJldHVybiBzZXRJbnRlcnZhbChjYiwgZHVyYXRpb24pO1xyXG4gICAgfSxcclxuICAgIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uIChoYW5kbGUpIHtcclxuICAgICAgICByZXR1cm4gY2xlYXJJbnRlcnZhbChoYW5kbGUpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubGV0IHRlc3RpbmcgPSBmYWxzZTtcclxubGV0IHJlcXVlc3QgPSBudWxsO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2xvYmFsIHtcclxuXHJcbiAgICBzdGF0aWMgX3Rlc3RpbmcoKSB7XHJcbiAgICAgICAgdGVzdGluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBsb2NhdGlvbigpIHtcclxuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGxvY2FsU3RvcmFnZSgpIHtcclxuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBzZXNzaW9uU3RvcmFnZSgpIHtcclxuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2V0WE1MSHR0cFJlcXVlc3QobmV3UmVxdWVzdCkge1xyXG4gICAgICAgIHJlcXVlc3QgPSBuZXdSZXF1ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgWE1MSHR0cFJlcXVlc3QoKSB7XHJcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0IHx8IFhNTEh0dHBSZXF1ZXN0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IHRpbWVyKCkge1xyXG4gICAgICAgIGlmICghdGVzdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGltZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvR2xvYmFsLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xyXG5pbXBvcnQgVXNlckluZm9TZXJ2aWNlIGZyb20gJy4vVXNlckluZm9TZXJ2aWNlJztcclxuaW1wb3J0IEVycm9yUmVzcG9uc2UgZnJvbSAnLi9FcnJvclJlc3BvbnNlJztcclxuaW1wb3J0IEpvc2VVdGlsIGZyb20gJy4vSm9zZVV0aWwnO1xyXG5cclxuY29uc3QgUHJvdG9jb2xDbGFpbXMgPSBbXCJub25jZVwiLCBcImF0X2hhc2hcIiwgXCJpYXRcIiwgXCJuYmZcIiwgXCJleHBcIiwgXCJhdWRcIiwgXCJpc3NcIiwgXCJjX2hhc2hcIl07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNwb25zZVZhbGlkYXRvciB7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UsIFVzZXJJbmZvU2VydmljZUN0b3IgPSBVc2VySW5mb1NlcnZpY2UsIGpvc2VVdGlsID0gSm9zZVV0aWwpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBSZXNwb25zZVZhbGlkYXRvclwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0dGluZ3NcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcclxuICAgICAgICB0aGlzLl91c2VySW5mb1NlcnZpY2UgPSBuZXcgVXNlckluZm9TZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5fam9zZVV0aWwgPSBqb3NlVXRpbDtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVNpZ25pblJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLnZhbGlkYXRlU2lnbmluUmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzU2lnbmluUGFyYW1zKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInN0YXRlIHByb2Nlc3NlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlVG9rZW5zKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ0b2tlbnMgdmFsaWRhdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NDbGFpbXMocmVzcG9uc2UpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImNsYWltcyBwcm9jZXNzZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXRlU2lnbm91dFJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLnZhbGlkYXRlU2lnbm91dFJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICBpZiAoc3RhdGUuaWQgIT09IHJlc3BvbnNlLnN0YXRlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlN0YXRlIGRvZXMgbm90IG1hdGNoXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgc3RhdGUgbWF0Y2hlcywgdGFrZSB0aGUgc3RvcmVkIGRhdGFcclxuICAgICAgICAvLyBhbmQgc2V0IGl0IGludG8gdGhlIHJlc3BvbnNlIHNvIGNhbGxlcnMgY2FuIGdldCB0aGVpciBzdGF0ZVxyXG4gICAgICAgIC8vIHRoaXMgaXMgaW1wb3J0YW50IGZvciBib3RoIHN1Y2Nlc3MgJiBlcnJvciBvdXRjb21lc1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcInN0YXRlIHZhbGlkYXRlZFwiKTtcclxuICAgICAgICByZXNwb25zZS5zdGF0ZSA9IHN0YXRlLmRhdGE7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xyXG4gICAgICAgICAgICBMb2cud2FybihcIlJlc3BvbnNlIHdhcyBlcnJvclwiLCByZXNwb25zZS5lcnJvcik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Byb2Nlc3NTaWduaW5QYXJhbXMoc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3Byb2Nlc3NTaWduaW5QYXJhbXNcIik7XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5pZCAhPT0gcmVzcG9uc2Uuc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghc3RhdGUuY2xpZW50X2lkKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGNsaWVudF9pZCBvbiBzdGF0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGNsaWVudF9pZCBvbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghc3RhdGUuYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGF1dGhvcml0eSBvbiBzdGF0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF1dGhvcml0eSBvbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBhdXRob3JpdHkgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSA9IHN0YXRlLmF1dGhvcml0eTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZW5zdXJlIHdlJ3JlIHVzaW5nIHRoZSBjb3JyZWN0IGF1dGhvcml0eSBpZiB0aGUgYXV0aG9yaXR5IGlzIG5vdCBsb2FkZWQgZnJvbSBzaWduaW4gc3RhdGVcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkgJiYgdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5ICE9PSBzdGF0ZS5hdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiYXV0aG9yaXR5IG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJhdXRob3JpdHkgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBjbGllbnRfaWQgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCA9IHN0YXRlLmNsaWVudF9pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZW5zdXJlIHdlJ3JlIHVzaW5nIHRoZSBjb3JyZWN0IGNsaWVudF9pZCBpZiB0aGUgY2xpZW50X2lkIGlzIG5vdCBsb2FkZWQgZnJvbSBzaWduaW4gc3RhdGVcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQgJiYgdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkICE9PSBzdGF0ZS5jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiY2xpZW50X2lkIG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJjbGllbnRfaWQgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIHN0YXRlIG1hdGNoZXMsIHRha2UgdGhlIHN0b3JlZCBkYXRhXHJcbiAgICAgICAgLy8gYW5kIHNldCBpdCBpbnRvIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBnZXQgdGhlaXIgc3RhdGVcclxuICAgICAgICAvLyB0aGlzIGlzIGltcG9ydGFudCBmb3IgYm90aCBzdWNjZXNzICYgZXJyb3Igb3V0Y29tZXNcclxuICAgICAgICBMb2cuZGVidWcoXCJzdGF0ZSB2YWxpZGF0ZWRcIik7XHJcbiAgICAgICAgcmVzcG9uc2Uuc3RhdGUgPSBzdGF0ZS5kYXRhO1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcclxuICAgICAgICAgICAgTG9nLndhcm4oXCJSZXNwb25zZSB3YXMgZXJyb3JcIiwgcmVzcG9uc2UuZXJyb3IpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5ub25jZSAmJiAhcmVzcG9uc2UuaWRfdG9rZW4pIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiRXhwZWN0aW5nIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gaWRfdG9rZW4gaW4gcmVzcG9uc2VcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzdGF0ZS5ub25jZSAmJiByZXNwb25zZS5pZF90b2tlbikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJOb3QgZXhwZWN0aW5nIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5leHBlY3RlZCBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBfcHJvY2Vzc0NsYWltcyhyZXNwb25zZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ2xhaW1zXCIpO1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UuaXNPcGVuSWRDb25uZWN0KSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlc3BvbnNlIGlzIE9JREMsIHByb2Nlc3NpbmcgY2xhaW1zXCIpO1xyXG5cclxuICAgICAgICAgICAgcmVzcG9uc2UucHJvZmlsZSA9IHRoaXMuX2ZpbHRlclByb3RvY29sQ2xhaW1zKHJlc3BvbnNlLnByb2ZpbGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmxvYWRVc2VySW5mbyAmJiByZXNwb25zZS5hY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImxvYWRpbmcgdXNlciBpbmZvXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VySW5mb1NlcnZpY2UuZ2V0Q2xhaW1zKHJlc3BvbnNlLmFjY2Vzc190b2tlbikudGhlbihjbGFpbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInVzZXIgaW5mbyBjbGFpbXMgcmVjZWl2ZWQgZnJvbSB1c2VyIGluZm8gZW5kcG9pbnRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjbGFpbXMuc3ViICE9PSByZXNwb25zZS5wcm9maWxlLnN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJzdWIgZnJvbSB1c2VyIGluZm8gZW5kcG9pbnQgZG9lcyBub3QgbWF0Y2ggc3ViIGluIGFjY2Vzc190b2tlblwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInN1YiBmcm9tIHVzZXIgaW5mbyBlbmRwb2ludCBkb2VzIG5vdCBtYXRjaCBzdWIgaW4gYWNjZXNzX3Rva2VuXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnByb2ZpbGUgPSB0aGlzLl9tZXJnZUNsYWltcyhyZXNwb25zZS5wcm9maWxlLCBjbGFpbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInVzZXIgaW5mbyBjbGFpbXMgcmVjZWl2ZWQsIHVwZGF0ZWQgcHJvZmlsZTpcIiwgcmVzcG9uc2UucHJvZmlsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwibm90IGxvYWRpbmcgdXNlciBpbmZvXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJyZXNwb25zZSBpcyBub3QgT0lEQywgbm90IHByb2Nlc3NpbmcgY2xhaW1zXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX21lcmdlQ2xhaW1zKGNsYWltczEsIGNsYWltczIpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgY2xhaW1zMSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gY2xhaW1zMikge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gY2xhaW1zMltuYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W25hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtuYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0W25hbWVdLmluZGV4T2YodmFsdWUpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0ucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0W25hbWVdICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IFtyZXN1bHRbbmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBfZmlsdGVyUHJvdG9jb2xDbGFpbXMoY2xhaW1zKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX2ZpbHRlclByb3RvY29sQ2xhaW1zLCBpbmNvbWluZyBjbGFpbXM6XCIsIGNsYWltcyk7XHJcblxyXG4gICAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBjbGFpbXMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MuX2ZpbHRlclByb3RvY29sQ2xhaW1zKSB7XHJcbiAgICAgICAgICAgIFByb3RvY29sQ2xhaW1zLmZvckVhY2godHlwZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVzdWx0W3R5cGVdO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInByb3RvY29sIGNsYWltcyBmaWx0ZXJlZFwiLCByZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwicHJvdG9jb2wgY2xhaW1zIG5vdCBmaWx0ZXJlZFwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBfdmFsaWRhdGVUb2tlbnMoc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlVG9rZW5zXCIpO1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UuaWRfdG9rZW4pIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5hY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlZhbGlkYXRpbmcgaWRfdG9rZW4gYW5kIGFjY2Vzc190b2tlblwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUlkVG9rZW5BbmRBY2Nlc3NUb2tlbihzdGF0ZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJWYWxpZGF0aW5nIGlkX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBMb2cuZGVidWcoXCJObyBpZF90b2tlbiB0byB2YWxpZGF0ZVwiKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBfdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW4oc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW5cIik7XHJcblxyXG4gICAgICAgIGlmICghc3RhdGUubm9uY2UpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbm9uY2Ugb24gc3RhdGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBub25jZSBvbiBzdGF0ZVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXNwb25zZS5pZF90b2tlbik7XHJcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIgfHwgIWp3dC5wYXlsb2FkKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5ub25jZSAhPT0gand0LnBheWxvYWQubm9uY2UpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiSW52YWxpZCBub25jZSBpbiBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGtpZCA9IGp3dC5oZWFkZXIua2lkO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldElzc3VlcigpLnRoZW4oaXNzdWVyID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgaXNzdWVyXCIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRTaWduaW5nS2V5cygpLnRoZW4oa2V5cyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc2lnbmluZyBrZXlzIGZyb20gbWV0YWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIHNpZ25pbmcga2V5c1wiKTtcclxuICAgICAgICAgICAgICAgIGxldCBrZXk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleXMgPSB0aGlzLl9maWx0ZXJCeUFsZyhrZXlzLCBqd3QuaGVhZGVyLmFsZyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8ga2lkIGZvdW5kIGluIGlkX3Rva2VuIGFuZCBtb3JlIHRoYW4gb25lIGtleSBmb3VuZCBpbiBtZXRhZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGtpZCBmb3VuZCBpbiBpZF90b2tlbiBhbmQgbW9yZSB0aGFuIG9uZSBrZXkgZm91bmQgaW4gbWV0YWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpZCBpcyBtYW5kYXRvcnkgb25seSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBrZXlzIGluIHRoZSByZWZlcmVuY2VkIEpXSyBTZXQgZG9jdW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1jb25uZWN0LWNvcmUtMV8wLmh0bWwjU2lnbmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXMuZmlsdGVyKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkua2lkID09PSBraWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBrZXkgbWF0Y2hpbmcga2lkIG9yIGFsZyBmb3VuZCBpbiBzaWduaW5nIGtleXNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGtleSBtYXRjaGluZyBraWQgb3IgYWxnIGZvdW5kIGluIHNpZ25pbmcga2V5c1wiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGF1ZGllbmNlID0gc3RhdGUuY2xpZW50X2lkO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgY2xvY2tTa2V3SW5TZWNvbmRzID0gdGhpcy5fc2V0dGluZ3MuY2xvY2tTa2V3O1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVmFsaWRhaW5nIEpXVDsgdXNpbmcgY2xvY2sgc2tldyAoaW4gc2Vjb25kcykgb2Y6IFwiLCBjbG9ja1NrZXdJblNlY29uZHMpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9qb3NlVXRpbC52YWxpZGF0ZUp3dChyZXNwb25zZS5pZF90b2tlbiwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXdJblNlY29uZHMpLnRoZW4oKCk9PntcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJKV1QgdmFsaWRhdGlvbiBzdWNjZXNzZnVsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghand0LnBheWxvYWQuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHN1YiBwcmVzZW50IGluIGlkX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc3ViIHByZXNlbnQgaW4gaWRfdG9rZW5cIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucHJvZmlsZSA9IGp3dC5wYXlsb2FkO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfZmlsdGVyQnlBbGcoa2V5cywgYWxnKXtcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fZmlsdGVyQnlBbGdcIiwgYWxnKTtcclxuXHJcbiAgICAgICAgdmFyIGt0eSA9IG51bGw7XHJcbiAgICAgICAgaWYgKGFsZy5zdGFydHNXaXRoKFwiUlNcIikpIHtcclxuICAgICAgICAgICAga3R5ID0gXCJSU0FcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJQU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIlBTXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGFsZy5zdGFydHNXaXRoKFwiRVNcIikpIHtcclxuICAgICAgICAgICAga3R5ID0gXCJFQ1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiYWxnIG5vdCBzdXBwb3J0ZWQ6IFwiLCBhbGcpO1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkxvb2tpbmcgZm9yIGtleXMgdGhhdCBtYXRjaCBrdHk6IFwiLCBrdHkpO1xyXG5cclxuICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoa2V5ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGtleS5rdHkgPT09IGt0eTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTnVtYmVyIG9mIGtleXMgdGhhdCBtYXRjaCBrdHk6IFwiLCBrdHksIGtleXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9XHJcblxyXG4gICAgX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVBY2Nlc3NUb2tlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5wcm9maWxlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHByb2ZpbGUgbG9hZGVkIGZyb20gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwcm9maWxlIGxvYWRlZCBmcm9tIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGF0X2hhc2ggaW4gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBhdF9oYXNoIGluIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2UuaWRfdG9rZW4pIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBpZF90b2tlblwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgand0ID0gdGhpcy5fam9zZVV0aWwucGFyc2VKd3QocmVzcG9uc2UuaWRfdG9rZW4pO1xyXG4gICAgICAgIGlmICghand0IHx8ICFqd3QuaGVhZGVyKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBoYXNoQWxnID0gand0LmhlYWRlci5hbGc7XHJcbiAgICAgICAgaWYgKCFoYXNoQWxnIHx8IGhhc2hBbGcubGVuZ3RoICE9PSA1KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGFsZzpcIiwgaGFzaEFsZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGhhc2hCaXRzID0gaGFzaEFsZy5zdWJzdHIoMiwgMyk7XHJcbiAgICAgICAgaWYgKCFoYXNoQml0cykge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6XCIsIGhhc2hBbGcsIGhhc2hCaXRzKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFsZzogXCIgKyBoYXNoQWxnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBoYXNoQml0cyA9IHBhcnNlSW50KGhhc2hCaXRzKTtcclxuICAgICAgICBpZiAoaGFzaEJpdHMgIT09IDI1NiAmJiBoYXNoQml0cyAhPT0gMzg0ICYmIGhhc2hCaXRzICE9PSA1MTIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOlwiLCBoYXNoQWxnLCBoYXNoQml0cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNoYSA9IFwic2hhXCIgKyBoYXNoQml0cztcclxuICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2pvc2VVdGlsLmhhc2hTdHJpbmcocmVzcG9uc2UuYWNjZXNzX3Rva2VuLCBzaGEpO1xyXG4gICAgICAgIGlmICghaGFzaCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJhY2Nlc3NfdG9rZW4gaGFzaCBmYWlsZWQ6XCIsIHNoYSk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbGVmdCA9IGhhc2guc3Vic3RyKDAsIGhhc2gubGVuZ3RoIC8gMik7XHJcbiAgICAgICAgdmFyIGxlZnRfYjY0dSA9IHRoaXMuX2pvc2VVdGlsLmhleFRvQmFzZTY0VXJsKGxlZnQpO1xyXG4gICAgICAgIGlmIChsZWZ0X2I2NHUgIT09IHJlc3BvbnNlLnByb2ZpbGUuYXRfaGFzaCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiLCBsZWZ0X2I2NHUsIHJlc3BvbnNlLnByb2ZpbGUuYXRfaGFzaCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9SZXNwb25zZVZhbGlkYXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgSnNvblNlcnZpY2UgZnJvbSAnLi9Kc29uU2VydmljZSc7XHJcblxyXG5jb25zdCBPaWRjTWV0YWRhdGFVcmxQYXRoID0gJy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGFkYXRhU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBNZXRhZGF0YVNlcnZpY2VcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9qc29uU2VydmljZSA9IG5ldyBKc29uU2VydmljZUN0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWV0YWRhdGFVcmwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9tZXRhZGF0YVVybCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubWV0YWRhdGFVcmwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gdGhpcy5fc2V0dGluZ3MubWV0YWRhdGFVcmw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCA9IHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmwgJiYgdGhpcy5fbWV0YWRhdGFVcmwuaW5kZXhPZihPaWRjTWV0YWRhdGFVcmxQYXRoKSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmxbdGhpcy5fbWV0YWRhdGFVcmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSAnLyc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsICs9IE9pZGNNZXRhZGF0YVVybFBhdGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVVybDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNZXRhZGF0YSgpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0TWV0YWRhdGFcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YSkge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXR1cm5pbmcgbWV0YWRhdGEgZnJvbSBzZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFVcmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXV0aG9yaXR5IG9yIG1ldGFkYXRhVXJsIGNvbmZpZ3VyZWQgb24gc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBhdXRob3JpdHkgb3IgbWV0YWRhdGFVcmwgY29uZmlndXJlZCBvbiBzZXR0aW5nc1wiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBMb2cuZGVidWcoXCJnZXR0aW5nIG1ldGFkYXRhIGZyb21cIiwgdGhpcy5tZXRhZGF0YVVybCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKHRoaXMubWV0YWRhdGFVcmwpXHJcbiAgICAgICAgICAgIC50aGVuKG1ldGFkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImpzb24gcmVjZWl2ZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0SXNzdWVyKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRJc3N1ZXJcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJpc3N1ZXJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXV0aG9yaXphdGlvbkVuZHBvaW50KCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRBdXRob3JpemF0aW9uRW5kcG9pbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJhdXRob3JpemF0aW9uX2VuZHBvaW50XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJJbmZvRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFVzZXJJbmZvRW5kcG9pbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJ1c2VyaW5mb19lbmRwb2ludFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb2tlbkVuZHBvaW50KCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRUb2tlbkVuZHBvaW50XCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwidG9rZW5fZW5kcG9pbnRcIiwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldENoZWNrU2Vzc2lvbklmcmFtZSgpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiY2hlY2tfc2Vzc2lvbl9pZnJhbWVcIiwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RW5kU2Vzc2lvbkVuZHBvaW50KCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRFbmRTZXNzaW9uRW5kcG9pbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJlbmRfc2Vzc2lvbl9lbmRwb2ludFwiLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZXZvY2F0aW9uRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFJldm9jYXRpb25FbmRwb2ludFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcInJldm9jYXRpb25fZW5kcG9pbnRcIiwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldE1ldGFkYXRhUHJvcGVydHkobmFtZSwgb3B0aW9uYWw9ZmFsc2UpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuX2dldE1ldGFkYXRhUHJvcGVydHlcIiwgbmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGFkYXRhKCkudGhlbihtZXRhZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm1ldGFkYXRhIHJlY2lldmVkXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhW25hbWVdID09PSB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cud2FybihcIk1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gb3B0aW9uYWwgcHJvcGVydHkgXCIgKyBuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTWV0YWRhdGEgZG9lcyBub3QgY29udGFpbiBwcm9wZXJ0eSBcIiArIG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVydHkgXCIgKyBuYW1lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhW25hbWVdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNpZ25pbmdLZXlzKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRTaWduaW5nS2V5c1wiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJldHVybmluZyBzaWduaW5nS2V5cyBmcm9tIHNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiandrc191cmlcIikudGhlbihqd2tzX3VyaSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImp3a3NfdXJpIHJlY2VpdmVkXCIsIGp3a3NfdXJpKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKGp3a3NfdXJpKS50aGVuKGtleVNldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJrZXkgc2V0IHJlY2VpdmVkXCIsIGtleVNldCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFrZXlTZXQua2V5cykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk1pc3Npbmcga2V5cyBvbiBrZXlzZXRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBrZXlzIG9uIGtleXNldFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cyA9IGtleVNldC5rZXlzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvTWV0YWRhdGFTZXJ2aWNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi9HbG9iYWwnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSnNvblNlcnZpY2Uge1xyXG4gICAgY29uc3RydWN0b3IoWE1MSHR0cFJlcXVlc3RDdG9yID0gR2xvYmFsLlhNTEh0dHBSZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5fWE1MSHR0cFJlcXVlc3QgPSBYTUxIdHRwUmVxdWVzdEN0b3I7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldEpzb24odXJsLCB0b2tlbikge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkpzb25TZXJ2aWNlLmdldEpzb25cIiwgdXJsKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXVybCl7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciByZXEgPSBuZXcgdGhpcy5fWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHVybCk7XHJcblxyXG4gICAgICAgICAgICByZXEub25sb2FkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJIVFRQIHJlc3BvbnNlIHJlY2VpdmVkLCBzdGF0dXNcIiwgcmVxLnN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChyZXEuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UocmVxLnJlc3BvbnNlVGV4dCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBwYXJzaW5nIEpTT04gcmVzcG9uc2VcIiwgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihyZXEuc3RhdHVzVGV4dCArIFwiIChcIiArIHJlcS5zdGF0dXMgKyBcIilcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIm5ldHdvcmsgZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoXCJOZXR3b3JrIEVycm9yXCIpKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidG9rZW4gcGFzc2VkLCBzZXR0aW5nIEF1dGhvcml6YXRpb24gaGVhZGVyXCIpO1xyXG4gICAgICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgdG9rZW4pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXEuc2VuZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0pzb25TZXJ2aWNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IEpzb25TZXJ2aWNlIGZyb20gJy4vSnNvblNlcnZpY2UnO1xyXG5pbXBvcnQgTWV0YWRhdGFTZXJ2aWNlIGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlJztcclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VySW5mb1NlcnZpY2Uge1xyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIEpzb25TZXJ2aWNlQ3RvciA9IEpzb25TZXJ2aWNlLCBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlKSB7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBzZXR0aW5ncyBwYXNzZWQgdG8gVXNlckluZm9TZXJ2aWNlXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXR0aW5nc1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5fanNvblNlcnZpY2UgPSBuZXcgSnNvblNlcnZpY2VDdG9yKCk7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENsYWltcyh0b2tlbikge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJJbmZvU2VydmljZS5nZXRDbGFpbXNcIik7XHJcblxyXG4gICAgICAgIGlmICghdG9rZW4pIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdG9rZW4gcGFzc2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQSB0b2tlbiBpcyByZXF1aXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldFVzZXJJbmZvRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlY2VpdmVkIHVzZXJpbmZvIHVybFwiLCB1cmwpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pzb25TZXJ2aWNlLmdldEpzb24odXJsLCB0b2tlbikudGhlbihjbGFpbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiY2xhaW1zIHJlY2VpdmVkXCIsIGNsYWltcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXNlckluZm9TZXJ2aWNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFcnJvclJlc3BvbnNlIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3Ioe2Vycm9yLCBlcnJvcl9kZXNjcmlwdGlvbiwgZXJyb3JfdXJpLCBzdGF0ZX09e31cclxuICAgICkge1xyXG4gICAgICAgICBpZiAoIWVycm9yKXtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gZXJyb3IgcGFzc2VkIHRvIEVycm9yUmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImVycm9yXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBzdXBlcihlcnJvcl9kZXNjcmlwdGlvbiB8fCBlcnJvcik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJFcnJvclJlc3BvbnNlXCI7IFxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcclxuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gZXJyb3JfZGVzY3JpcHRpb247XHJcbiAgICAgICAgdGhpcy5lcnJvcl91cmkgPSBlcnJvcl91cmk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9FcnJvclJlc3BvbnNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IHsgandzLCBLRVlVVElMIGFzIEtleVV0aWwsIFg1MDksIGNyeXB0bywgaGV4dG9iNjR1IH0gZnJvbSAnanNyc2FzaWduJztcclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5jb25zdCBBbGxvd2VkU2lnbmluZ0FsZ3MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJywgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJywgJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ107XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKb3NlVXRpbCB7XHJcblxyXG4gICAgc3RhdGljIHBhcnNlSnd0KGp3dCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLnBhcnNlSnd0XCIpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB0b2tlbiA9IGp3cy5KV1MucGFyc2Uoand0KTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogdG9rZW4uaGVhZGVyT2JqLFxyXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogdG9rZW4ucGF5bG9hZE9ialxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLnZhbGlkYXRlSnd0XCIpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoa2V5Lmt0eSA9PT0gXCJSU0FcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleS5lICYmIGtleS5uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gS2V5VXRpbC5nZXRLZXkoa2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleS54NWMgJiYga2V5Lng1Yy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPSBLZXlVdGlsLmdldEtleShYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0UEVNKGtleS54NWNbMF0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlJTQSBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIiwga2V5KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiUlNBIGtleSBtaXNzaW5nIGtleSBtYXRlcmlhbFwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5Lmt0eSA9PT0gXCJFQ1wiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmNydiAmJiBrZXkueCAmJiBrZXkueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFQyBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIiwga2V5KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRUMga2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGtleSB0eXBlXCIsIGtleSAmJiBrZXkua3R5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBrZXkgdHlwZTogXCIgKyBrZXkgJiYga2V5Lmt0eSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gSm9zZVV0aWwuX3ZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihlICYmIGUubWVzc2FnZSB8fCBlKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiSldUIHZhbGlkYXRpb24gZmFpbGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgX3ZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dFwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFjbG9ja1NrZXcpIHtcclxuICAgICAgICAgICAgY2xvY2tTa2V3ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghbm93KSB7XHJcbiAgICAgICAgICAgIG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBwYXlsb2FkID0gSm9zZVV0aWwucGFyc2VKd3Qoand0KS5wYXlsb2FkO1xyXG5cclxuICAgICAgICBpZiAoIXBheWxvYWQuaXNzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcImlzc3VlciB3YXMgbm90IHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiaXNzdWVyIHdhcyBub3QgcHJvdmlkZWRcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGF5bG9hZC5pc3MgIT09IGlzc3Vlcikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIGlzc3VlciBpbiB0b2tlblwiLCBwYXlsb2FkLmlzcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGlzc3VlciBpbiB0b2tlbjogXCIgKyBwYXlsb2FkLmlzcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwYXlsb2FkLmF1ZCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJhdWQgd2FzIG5vdCBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImF1ZCB3YXMgbm90IHByb3ZpZGVkXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHZhbGlkQXVkaWVuY2UgPSBwYXlsb2FkLmF1ZCA9PT0gYXVkaWVuY2UgfHwgKEFycmF5LmlzQXJyYXkocGF5bG9hZC5hdWQpICYmIHBheWxvYWQuYXVkLmluZGV4T2YoYXVkaWVuY2UpID49IDApOyBcclxuICAgICAgICBpZiAoIXZhbGlkQXVkaWVuY2UpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiSW52YWxpZCBhdWRpZW5jZSBpbiB0b2tlblwiLCBwYXlsb2FkLmF1ZCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGF1ZGllbmNlIGluIHRva2VuOiBcIiArIHBheWxvYWQuYXVkKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbG93ZXJOb3cgPSBub3cgKyBjbG9ja1NrZXc7XHJcbiAgICAgICAgdmFyIHVwcGVyTm93ID0gbm93IC0gY2xvY2tTa2V3O1xyXG5cclxuICAgICAgICBpZiAoIXBheWxvYWQuaWF0KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcImlhdCB3YXMgbm90IHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiaWF0IHdhcyBub3QgcHJvdmlkZWRcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobG93ZXJOb3cgPCBwYXlsb2FkLmlhdCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJpYXQgaXMgaW4gdGhlIGZ1dHVyZVwiLCBwYXlsb2FkLmlhdCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJpYXQgaXMgaW4gdGhlIGZ1dHVyZTogXCIgKyBwYXlsb2FkLmlhdCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBheWxvYWQubmJmICYmIGxvd2VyTm93IDwgcGF5bG9hZC5uYmYpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwibmJmIGlzIGluIHRoZSBmdXR1cmVcIiwgcGF5bG9hZC5uYmYpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwibmJmIGlzIGluIHRoZSBmdXR1cmU6IFwiICsgcGF5bG9hZC5uYmYpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcGF5bG9hZC5leHApIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiZXhwIHdhcyBub3QgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJleHAgd2FzIG5vdCBwcm92aWRlZFwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXlsb2FkLmV4cCA8IHVwcGVyTm93KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcImV4cCBpcyBpbiB0aGUgcGFzdFwiLCBwYXlsb2FkLmV4cCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJleHAgaXMgaW4gdGhlIHBhc3Q6XCIgKyBwYXlsb2FkLmV4cCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCFqd3MuSldTLnZlcmlmeShqd3QsIGtleSwgQWxsb3dlZFNpZ25pbmdBbGdzKSkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwic2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInNpZ25hdHVyZSB2YWxpZGF0aW9uIGZhaWxlZFwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKGUgJiYgZS5tZXNzYWdlIHx8IGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwic2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaGFzaFN0cmluZyh2YWx1ZSwgYWxnKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSm9zZVV0aWwuaGFzaFN0cmluZ1wiLCB2YWx1ZSwgYWxnKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gY3J5cHRvLlV0aWwuaGFzaFN0cmluZyh2YWx1ZSwgYWxnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaGV4VG9CYXNlNjRVcmwodmFsdWUpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJKb3NlVXRpbC5oZXhUb0Jhc2U2NFVybFwiLCB2YWx1ZSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGhleHRvYjY0dSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0pvc2VVdGlsLmpzIiwiXG52YXIgbmF2aWdhdG9yID0ge307XG5uYXZpZ2F0b3IudXNlckFnZW50ID0gZmFsc2U7XG5cbnZhciB3aW5kb3cgPSB7fTtcbi8qXG4gKiBqc3JzYXNpZ24gNS4xLjAgKDIwMTYtMDktMDgpIChjKSAyMDEwLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuXG4vKlxueWFob28tbWluLmpzXG5Db3B5cmlnaHQgKGMpIDIwMTEsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db2RlIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZTpcbmh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3l1aS9saWNlbnNlLmh0bWxcbnZlcnNpb246IDIuOS4wXG4qL1xuaWYodHlwZW9mIFlBSE9PPT1cInVuZGVmaW5lZFwifHwhWUFIT08pe3ZhciBZQUhPTz17fTt9WUFIT08ubmFtZXNwYWNlPWZ1bmN0aW9uKCl7dmFyIGI9YXJndW1lbnRzLGc9bnVsbCxlLGMsZjtmb3IoZT0wO2U8Yi5sZW5ndGg7ZT1lKzEpe2Y9KFwiXCIrYltlXSkuc3BsaXQoXCIuXCIpO2c9WUFIT087Zm9yKGM9KGZbMF09PVwiWUFIT09cIik/MTowO2M8Zi5sZW5ndGg7Yz1jKzEpe2dbZltjXV09Z1tmW2NdXXx8e307Zz1nW2ZbY11dO319cmV0dXJuIGc7fTtZQUhPTy5sb2c9ZnVuY3Rpb24oZCxhLGMpe3ZhciBiPVlBSE9PLndpZGdldC5Mb2dnZXI7aWYoYiYmYi5sb2cpe3JldHVybiBiLmxvZyhkLGEsYyk7fWVsc2V7cmV0dXJuIGZhbHNlO319O1lBSE9PLnJlZ2lzdGVyPWZ1bmN0aW9uKGEsZixlKXt2YXIgaz1ZQUhPTy5lbnYubW9kdWxlcyxjLGosaCxnLGQ7aWYoIWtbYV0pe2tbYV09e3ZlcnNpb25zOltdLGJ1aWxkczpbXX07fWM9a1thXTtqPWUudmVyc2lvbjtoPWUuYnVpbGQ7Zz1ZQUhPTy5lbnYubGlzdGVuZXJzO2MubmFtZT1hO2MudmVyc2lvbj1qO2MuYnVpbGQ9aDtjLnZlcnNpb25zLnB1c2goaik7Yy5idWlsZHMucHVzaChoKTtjLm1haW5DbGFzcz1mO2ZvcihkPTA7ZDxnLmxlbmd0aDtkPWQrMSl7Z1tkXShjKTt9aWYoZil7Zi5WRVJTSU9OPWo7Zi5CVUlMRD1oO31lbHNle1lBSE9PLmxvZyhcIm1haW5DbGFzcyBpcyB1bmRlZmluZWQgZm9yIG1vZHVsZSBcIithLFwid2FyblwiKTt9fTtZQUhPTy5lbnY9WUFIT08uZW52fHx7bW9kdWxlczpbXSxsaXN0ZW5lcnM6W119O1lBSE9PLmVudi5nZXRWZXJzaW9uPWZ1bmN0aW9uKGEpe3JldHVybiBZQUhPTy5lbnYubW9kdWxlc1thXXx8bnVsbDt9O1lBSE9PLmVudi5wYXJzZVVBPWZ1bmN0aW9uKGQpe3ZhciBlPWZ1bmN0aW9uKGkpe3ZhciBqPTA7cmV0dXJuIHBhcnNlRmxvYXQoaS5yZXBsYWNlKC9cXC4vZyxmdW5jdGlvbigpe3JldHVybihqKys9PTEpP1wiXCI6XCIuXCI7fSkpO30saD1uYXZpZ2F0b3IsZz17aWU6MCxvcGVyYTowLGdlY2tvOjAsd2Via2l0OjAsY2hyb21lOjAsbW9iaWxlOm51bGwsYWlyOjAsaXBhZDowLGlwaG9uZTowLGlwb2Q6MCxpb3M6bnVsbCxhbmRyb2lkOjAsd2Vib3M6MCxjYWphOmgmJmguY2FqYVZlcnNpb24sc2VjdXJlOmZhbHNlLG9zOm51bGx9LGM9ZHx8KG5hdmlnYXRvciYmbmF2aWdhdG9yLnVzZXJBZ2VudCksZj13aW5kb3cmJndpbmRvdy5sb2NhdGlvbixiPWYmJmYuaHJlZixhO2cuc2VjdXJlPWImJihiLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImh0dHBzXCIpPT09MCk7aWYoYyl7aWYoKC93aW5kb3dzfHdpbjMyL2kpLnRlc3QoYykpe2cub3M9XCJ3aW5kb3dzXCI7fWVsc2V7aWYoKC9tYWNpbnRvc2gvaSkudGVzdChjKSl7Zy5vcz1cIm1hY2ludG9zaFwiO31lbHNle2lmKCgvcmhpbm8vaSkudGVzdChjKSl7Zy5vcz1cInJoaW5vXCI7fX19aWYoKC9LSFRNTC8pLnRlc3QoYykpe2cud2Via2l0PTE7fWE9Yy5tYXRjaCgvQXBwbGVXZWJLaXRcXC8oW15cXHNdKikvKTtpZihhJiZhWzFdKXtnLndlYmtpdD1lKGFbMV0pO2lmKC8gTW9iaWxlXFwvLy50ZXN0KGMpKXtnLm1vYmlsZT1cIkFwcGxlXCI7YT1jLm1hdGNoKC9PUyAoW15cXHNdKikvKTtpZihhJiZhWzFdKXthPWUoYVsxXS5yZXBsYWNlKFwiX1wiLFwiLlwiKSk7fWcuaW9zPWE7Zy5pcGFkPWcuaXBvZD1nLmlwaG9uZT0wO2E9Yy5tYXRjaCgvaVBhZHxpUG9kfGlQaG9uZS8pO2lmKGEmJmFbMF0pe2dbYVswXS50b0xvd2VyQ2FzZSgpXT1nLmlvczt9fWVsc2V7YT1jLm1hdGNoKC9Ob2tpYU5bXlxcL10qfEFuZHJvaWQgXFxkXFwuXFxkfHdlYk9TXFwvXFxkXFwuXFxkLyk7aWYoYSl7Zy5tb2JpbGU9YVswXTt9aWYoL3dlYk9TLy50ZXN0KGMpKXtnLm1vYmlsZT1cIldlYk9TXCI7YT1jLm1hdGNoKC93ZWJPU1xcLyhbXlxcc10qKTsvKTtpZihhJiZhWzFdKXtnLndlYm9zPWUoYVsxXSk7fX1pZigvIEFuZHJvaWQvLnRlc3QoYykpe2cubW9iaWxlPVwiQW5kcm9pZFwiO2E9Yy5tYXRjaCgvQW5kcm9pZCAoW15cXHNdKik7Lyk7aWYoYSYmYVsxXSl7Zy5hbmRyb2lkPWUoYVsxXSk7fX19YT1jLm1hdGNoKC9DaHJvbWVcXC8oW15cXHNdKikvKTtpZihhJiZhWzFdKXtnLmNocm9tZT1lKGFbMV0pO31lbHNle2E9Yy5tYXRjaCgvQWRvYmVBSVJcXC8oW15cXHNdKikvKTtpZihhKXtnLmFpcj1hWzBdO319fWlmKCFnLndlYmtpdCl7YT1jLm1hdGNoKC9PcGVyYVtcXHNcXC9dKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy5vcGVyYT1lKGFbMV0pO2E9Yy5tYXRjaCgvVmVyc2lvblxcLyhbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2cub3BlcmE9ZShhWzFdKTt9YT1jLm1hdGNoKC9PcGVyYSBNaW5pW147XSovKTtpZihhKXtnLm1vYmlsZT1hWzBdO319ZWxzZXthPWMubWF0Y2goL01TSUVcXHMoW147XSopLyk7aWYoYSYmYVsxXSl7Zy5pZT1lKGFbMV0pO31lbHNle2E9Yy5tYXRjaCgvR2Vja29cXC8oW15cXHNdKikvKTtpZihhKXtnLmdlY2tvPTE7YT1jLm1hdGNoKC9ydjooW15cXHNcXCldKikvKTtpZihhJiZhWzFdKXtnLmdlY2tvPWUoYVsxXSk7fX19fX19cmV0dXJuIGc7fTtZQUhPTy5lbnYudWE9WUFIT08uZW52LnBhcnNlVUEoKTsoZnVuY3Rpb24oKXtZQUhPTy5uYW1lc3BhY2UoXCJ1dGlsXCIsXCJ3aWRnZXRcIixcImV4YW1wbGVcIik7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBZQUhPT19jb25maWcpe3ZhciBiPVlBSE9PX2NvbmZpZy5saXN0ZW5lcixhPVlBSE9PLmVudi5saXN0ZW5lcnMsZD10cnVlLGM7aWYoYil7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyl7aWYoYVtjXT09Yil7ZD1mYWxzZTticmVhazt9fWlmKGQpe2EucHVzaChiKTt9fX19KSgpO1lBSE9PLmxhbmc9WUFIT08ubGFuZ3x8e307KGZ1bmN0aW9uKCl7dmFyIGY9WUFIT08ubGFuZyxhPU9iamVjdC5wcm90b3R5cGUsYz1cIltvYmplY3QgQXJyYXldXCIsaD1cIltvYmplY3QgRnVuY3Rpb25dXCIsaT1cIltvYmplY3QgT2JqZWN0XVwiLGI9W10sZz17XCImXCI6XCImYW1wO1wiLFwiPFwiOlwiJmx0O1wiLFwiPlwiOlwiJmd0O1wiLCdcIic6XCImcXVvdDtcIixcIidcIjpcIiYjeDI3O1wiLFwiL1wiOlwiJiN4MkY7XCIsXCJgXCI6XCImI3g2MDtcIn0sZD1bXCJ0b1N0cmluZ1wiLFwidmFsdWVPZlwiXSxlPXtpc0FycmF5OmZ1bmN0aW9uKGope3JldHVybiBhLnRvU3RyaW5nLmFwcGx5KGopPT09Yzt9LGlzQm9vbGVhbjpmdW5jdGlvbihqKXtyZXR1cm4gdHlwZW9mIGo9PT1cImJvb2xlYW5cIjt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oail7cmV0dXJuKHR5cGVvZiBqPT09XCJmdW5jdGlvblwiKXx8YS50b1N0cmluZy5hcHBseShqKT09PWg7fSxpc051bGw6ZnVuY3Rpb24oail7cmV0dXJuIGo9PT1udWxsO30saXNOdW1iZXI6ZnVuY3Rpb24oail7cmV0dXJuIHR5cGVvZiBqPT09XCJudW1iZXJcIiYmaXNGaW5pdGUoaik7fSxpc09iamVjdDpmdW5jdGlvbihqKXtyZXR1cm4oaiYmKHR5cGVvZiBqPT09XCJvYmplY3RcInx8Zi5pc0Z1bmN0aW9uKGopKSl8fGZhbHNlO30saXNTdHJpbmc6ZnVuY3Rpb24oail7cmV0dXJuIHR5cGVvZiBqPT09XCJzdHJpbmdcIjt9LGlzVW5kZWZpbmVkOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwidW5kZWZpbmVkXCI7fSxfSUVFbnVtRml4OihZQUhPTy5lbnYudWEuaWUpP2Z1bmN0aW9uKGwsayl7dmFyIGosbixtO2ZvcihqPTA7ajxkLmxlbmd0aDtqPWorMSl7bj1kW2pdO209a1tuXTtpZihmLmlzRnVuY3Rpb24obSkmJm0hPWFbbl0pe2xbbl09bTt9fX06ZnVuY3Rpb24oKXt9LGVzY2FwZUhUTUw6ZnVuY3Rpb24oail7cmV0dXJuIGoucmVwbGFjZSgvWyY8PlwiJ1xcL2BdL2csZnVuY3Rpb24oayl7cmV0dXJuIGdba107fSk7fSxleHRlbmQ6ZnVuY3Rpb24obSxuLGwpe2lmKCFufHwhbSl7dGhyb3cgbmV3IEVycm9yKFwiZXh0ZW5kIGZhaWxlZCwgcGxlYXNlIGNoZWNrIHRoYXQgXCIrXCJhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbmNsdWRlZC5cIik7fXZhciBrPWZ1bmN0aW9uKCl7fSxqO2sucHJvdG90eXBlPW4ucHJvdG90eXBlO20ucHJvdG90eXBlPW5ldyBrKCk7bS5wcm90b3R5cGUuY29uc3RydWN0b3I9bTttLnN1cGVyY2xhc3M9bi5wcm90b3R5cGU7aWYobi5wcm90b3R5cGUuY29uc3RydWN0b3I9PWEuY29uc3RydWN0b3Ipe24ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW47fWlmKGwpe2ZvcihqIGluIGwpe2lmKGYuaGFzT3duUHJvcGVydHkobCxqKSl7bS5wcm90b3R5cGVbal09bFtqXTt9fWYuX0lFRW51bUZpeChtLnByb3RvdHlwZSxsKTt9fSxhdWdtZW50T2JqZWN0OmZ1bmN0aW9uKG4sbSl7aWYoIW18fCFuKXt0aHJvdyBuZXcgRXJyb3IoXCJBYnNvcmIgZmFpbGVkLCB2ZXJpZnkgZGVwZW5kZW5jaWVzLlwiKTt9dmFyIGo9YXJndW1lbnRzLGwsbyxrPWpbMl07aWYoayYmayE9PXRydWUpe2ZvcihsPTI7bDxqLmxlbmd0aDtsPWwrMSl7bltqW2xdXT1tW2pbbF1dO319ZWxzZXtmb3IobyBpbiBtKXtpZihrfHwhKG8gaW4gbikpe25bb109bVtvXTt9fWYuX0lFRW51bUZpeChuLG0pO31yZXR1cm4gbjt9LGF1Z21lbnRQcm90bzpmdW5jdGlvbihtLGwpe2lmKCFsfHwhbSl7dGhyb3cgbmV3IEVycm9yKFwiQXVnbWVudCBmYWlsZWQsIHZlcmlmeSBkZXBlbmRlbmNpZXMuXCIpO312YXIgaj1bbS5wcm90b3R5cGUsbC5wcm90b3R5cGVdLGs7Zm9yKGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7az1rKzEpe2oucHVzaChhcmd1bWVudHNba10pO31mLmF1Z21lbnRPYmplY3QuYXBwbHkodGhpcyxqKTtyZXR1cm4gbTt9LGR1bXA6ZnVuY3Rpb24oaixwKXt2YXIgbCxuLHI9W10sdD1cInsuLi59XCIsaz1cImYoKXsuLi59XCIscT1cIiwgXCIsbT1cIiA9PiBcIjtpZighZi5pc09iamVjdChqKSl7cmV0dXJuIGorXCJcIjt9ZWxzZXtpZihqIGluc3RhbmNlb2YgRGF0ZXx8KFwibm9kZVR5cGVcIiBpbiBqJiZcInRhZ05hbWVcIiBpbiBqKSl7cmV0dXJuIGo7fWVsc2V7aWYoZi5pc0Z1bmN0aW9uKGopKXtyZXR1cm4gazt9fX1wPShmLmlzTnVtYmVyKHApKT9wOjM7aWYoZi5pc0FycmF5KGopKXtyLnB1c2goXCJbXCIpO2ZvcihsPTAsbj1qLmxlbmd0aDtsPG47bD1sKzEpe2lmKGYuaXNPYmplY3QoaltsXSkpe3IucHVzaCgocD4wKT9mLmR1bXAoaltsXSxwLTEpOnQpO31lbHNle3IucHVzaChqW2xdKTt9ci5wdXNoKHEpO31pZihyLmxlbmd0aD4xKXtyLnBvcCgpO31yLnB1c2goXCJdXCIpO31lbHNle3IucHVzaChcIntcIik7Zm9yKGwgaW4gail7aWYoZi5oYXNPd25Qcm9wZXJ0eShqLGwpKXtyLnB1c2gobCttKTtpZihmLmlzT2JqZWN0KGpbbF0pKXtyLnB1c2goKHA+MCk/Zi5kdW1wKGpbbF0scC0xKTp0KTt9ZWxzZXtyLnB1c2goaltsXSk7fXIucHVzaChxKTt9fWlmKHIubGVuZ3RoPjEpe3IucG9wKCk7fXIucHVzaChcIn1cIik7fXJldHVybiByLmpvaW4oXCJcIik7fSxzdWJzdGl0dXRlOmZ1bmN0aW9uKHgseSxFLGwpe3ZhciBELEMsQixHLHQsdSxGPVtdLHAsej14Lmxlbmd0aCxBPVwiZHVtcFwiLHI9XCIgXCIscT1cIntcIixtPVwifVwiLG4sdztmb3IoOzspe0Q9eC5sYXN0SW5kZXhPZihxLHopO2lmKEQ8MCl7YnJlYWs7fUM9eC5pbmRleE9mKG0sRCk7aWYoRCsxPkMpe2JyZWFrO31wPXguc3Vic3RyaW5nKEQrMSxDKTtHPXA7dT1udWxsO0I9Ry5pbmRleE9mKHIpO2lmKEI+LTEpe3U9Ry5zdWJzdHJpbmcoQisxKTtHPUcuc3Vic3RyaW5nKDAsQik7fXQ9eVtHXTtpZihFKXt0PUUoRyx0LHUpO31pZihmLmlzT2JqZWN0KHQpKXtpZihmLmlzQXJyYXkodCkpe3Q9Zi5kdW1wKHQscGFyc2VJbnQodSwxMCkpO31lbHNle3U9dXx8XCJcIjtuPXUuaW5kZXhPZihBKTtpZihuPi0xKXt1PXUuc3Vic3RyaW5nKDQpO313PXQudG9TdHJpbmcoKTtpZih3PT09aXx8bj4tMSl7dD1mLmR1bXAodCxwYXJzZUludCh1LDEwKSk7fWVsc2V7dD13O319fWVsc2V7aWYoIWYuaXNTdHJpbmcodCkmJiFmLmlzTnVtYmVyKHQpKXt0PVwifi1cIitGLmxlbmd0aCtcIi1+XCI7RltGLmxlbmd0aF09cDt9fXg9eC5zdWJzdHJpbmcoMCxEKSt0K3guc3Vic3RyaW5nKEMrMSk7aWYobD09PWZhbHNlKXt6PUQtMTt9fWZvcihEPUYubGVuZ3RoLTE7RD49MDtEPUQtMSl7eD14LnJlcGxhY2UobmV3IFJlZ0V4cChcIn4tXCIrRCtcIi1+XCIpLFwie1wiK0ZbRF0rXCJ9XCIsXCJnXCIpO31yZXR1cm4geDt9LHRyaW06ZnVuY3Rpb24oail7dHJ5e3JldHVybiBqLnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIik7fWNhdGNoKGspe3JldHVybiBqO1xufX0sbWVyZ2U6ZnVuY3Rpb24oKXt2YXIgbj17fSxrPWFyZ3VtZW50cyxqPWsubGVuZ3RoLG07Zm9yKG09MDttPGo7bT1tKzEpe2YuYXVnbWVudE9iamVjdChuLGtbbV0sdHJ1ZSk7fXJldHVybiBuO30sbGF0ZXI6ZnVuY3Rpb24odCxrLHUsbixwKXt0PXR8fDA7az1rfHx7fTt2YXIgbD11LHM9bixxLGo7aWYoZi5pc1N0cmluZyh1KSl7bD1rW3VdO31pZighbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIm1ldGhvZCB1bmRlZmluZWRcIik7fWlmKCFmLmlzVW5kZWZpbmVkKG4pJiYhZi5pc0FycmF5KHMpKXtzPVtuXTt9cT1mdW5jdGlvbigpe2wuYXBwbHkoayxzfHxiKTt9O2o9KHApP3NldEludGVydmFsKHEsdCk6c2V0VGltZW91dChxLHQpO3JldHVybntpbnRlcnZhbDpwLGNhbmNlbDpmdW5jdGlvbigpe2lmKHRoaXMuaW50ZXJ2YWwpe2NsZWFySW50ZXJ2YWwoaik7fWVsc2V7Y2xlYXJUaW1lb3V0KGopO319fTt9LGlzVmFsdWU6ZnVuY3Rpb24oail7cmV0dXJuKGYuaXNPYmplY3Qoail8fGYuaXNTdHJpbmcoail8fGYuaXNOdW1iZXIoail8fGYuaXNCb29sZWFuKGopKTt9fTtmLmhhc093blByb3BlcnR5PShhLmhhc093blByb3BlcnR5KT9mdW5jdGlvbihqLGspe3JldHVybiBqJiZqLmhhc093blByb3BlcnR5JiZqLmhhc093blByb3BlcnR5KGspO306ZnVuY3Rpb24oaixrKXtyZXR1cm4gIWYuaXNVbmRlZmluZWQoaltrXSkmJmouY29uc3RydWN0b3IucHJvdG90eXBlW2tdIT09altrXTt9O2UuYXVnbWVudE9iamVjdChmLGUsdHJ1ZSk7WUFIT08udXRpbC5MYW5nPWY7Zi5hdWdtZW50PWYuYXVnbWVudFByb3RvO1lBSE9PLmF1Z21lbnQ9Zi5hdWdtZW50UHJvdG87WUFIT08uZXh0ZW5kPWYuZXh0ZW5kO30pKCk7WUFIT08ucmVnaXN0ZXIoXCJ5YWhvb1wiLFlBSE9PLHt2ZXJzaW9uOlwiMi45LjBcIixidWlsZDpcIjI4MDBcIn0pO1xuXG4vKiEgQ3J5cHRvSlMgdjMuMS4yIGNvcmUtZml4LmpzXG4gKiBjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbiAqIChjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuICogVEhJUyBJUyBGSVggb2YgJ2NvcmUuanMnIHRvIGZpeCBIbWFjIGlzc3VlLlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvaXNzdWVzL2RldGFpbD9pZD04NFxuICogaHR0cHM6Ly9jcnlwdG8tanMuZ29vZ2xlY29kZS5jb20vc3ZuLWhpc3RvcnkvcjY2Ny9icmFuY2hlcy8zLngvc3JjL2NvcmUuanNcbiAqL1xudmFyIENyeXB0b0pTPUNyeXB0b0pTfHwoZnVuY3Rpb24oZSxnKXt2YXIgYT17fTt2YXIgYj1hLmxpYj17fTt2YXIgaj1iLkJhc2U9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe31yZXR1cm57ZXh0ZW5kOmZ1bmN0aW9uKHApe24ucHJvdG90eXBlPXRoaXM7dmFyIG89bmV3IG4oKTtpZihwKXtvLm1peEluKHApfWlmKCFvLmhhc093blByb3BlcnR5KFwiaW5pdFwiKSl7by5pbml0PWZ1bmN0aW9uKCl7by4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fW8uaW5pdC5wcm90b3R5cGU9bztvLiRzdXBlcj10aGlzO3JldHVybiBvfSxjcmVhdGU6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLmV4dGVuZCgpO28uaW5pdC5hcHBseShvLGFyZ3VtZW50cyk7cmV0dXJuIG99LGluaXQ6ZnVuY3Rpb24oKXt9LG1peEluOmZ1bmN0aW9uKHApe2Zvcih2YXIgbyBpbiBwKXtpZihwLmhhc093blByb3BlcnR5KG8pKXt0aGlzW29dPXBbb119fWlmKHAuaGFzT3duUHJvcGVydHkoXCJ0b1N0cmluZ1wiKSl7dGhpcy50b1N0cmluZz1wLnRvU3RyaW5nfX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0LnByb3RvdHlwZS5leHRlbmQodGhpcyl9fX0oKSk7dmFyIGw9Yi5Xb3JkQXJyYXk9ai5leHRlbmQoe2luaXQ6ZnVuY3Rpb24obyxuKXtvPXRoaXMud29yZHM9b3x8W107aWYobiE9Zyl7dGhpcy5zaWdCeXRlcz1ufWVsc2V7dGhpcy5zaWdCeXRlcz1vLmxlbmd0aCo0fX0sdG9TdHJpbmc6ZnVuY3Rpb24obil7cmV0dXJuKG58fGgpLnN0cmluZ2lmeSh0aGlzKX0sY29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBxPXRoaXMud29yZHM7dmFyIHA9dC53b3Jkczt2YXIgbj10aGlzLnNpZ0J5dGVzO3ZhciBzPXQuc2lnQnl0ZXM7dGhpcy5jbGFtcCgpO2lmKG4lNCl7Zm9yKHZhciByPTA7cjxzO3IrKyl7dmFyIG89KHBbcj4+PjJdPj4+KDI0LShyJTQpKjgpKSYyNTU7cVsobityKT4+PjJdfD1vPDwoMjQtKChuK3IpJTQpKjgpfX1lbHNle2Zvcih2YXIgcj0wO3I8cztyKz00KXtxWyhuK3IpPj4+Ml09cFtyPj4+Ml19fXRoaXMuc2lnQnl0ZXMrPXM7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKCl7dmFyIG89dGhpcy53b3Jkczt2YXIgbj10aGlzLnNpZ0J5dGVzO29bbj4+PjJdJj00Mjk0OTY3Mjk1PDwoMzItKG4lNCkqOCk7by5sZW5ndGg9ZS5jZWlsKG4vNCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIG49ai5jbG9uZS5jYWxsKHRoaXMpO24ud29yZHM9dGhpcy53b3Jkcy5zbGljZSgwKTtyZXR1cm4gbn0scmFuZG9tOmZ1bmN0aW9uKHApe3ZhciBvPVtdO2Zvcih2YXIgbj0wO248cDtuKz00KXtvLnB1c2goKGUucmFuZG9tKCkqNDI5NDk2NzI5Nil8MCl9cmV0dXJuIG5ldyBsLmluaXQobyxwKX19KTt2YXIgbT1hLmVuYz17fTt2YXIgaD1tLkhleD17c3RyaW5naWZ5OmZ1bmN0aW9uKHApe3ZhciByPXAud29yZHM7dmFyIG89cC5zaWdCeXRlczt2YXIgcT1bXTtmb3IodmFyIG49MDtuPG87bisrKXt2YXIgcz0ocltuPj4+Ml0+Pj4oMjQtKG4lNCkqOCkpJjI1NTtxLnB1c2goKHM+Pj40KS50b1N0cmluZygxNikpO3EucHVzaCgocyYxNSkudG9TdHJpbmcoMTYpKX1yZXR1cm4gcS5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihwKXt2YXIgbj1wLmxlbmd0aDt2YXIgcT1bXTtmb3IodmFyIG89MDtvPG47bys9Mil7cVtvPj4+M118PXBhcnNlSW50KHAuc3Vic3RyKG8sMiksMTYpPDwoMjQtKG8lOCkqNCl9cmV0dXJuIG5ldyBsLmluaXQocSxuLzIpfX07dmFyIGQ9bS5MYXRpbjE9e3N0cmluZ2lmeTpmdW5jdGlvbihxKXt2YXIgcj1xLndvcmRzO3ZhciBwPXEuc2lnQnl0ZXM7dmFyIG49W107Zm9yKHZhciBvPTA7bzxwO28rKyl7dmFyIHM9KHJbbz4+PjJdPj4+KDI0LShvJTQpKjgpKSYyNTU7bi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocykpfXJldHVybiBuLmpvaW4oXCJcIil9LHBhcnNlOmZ1bmN0aW9uKHApe3ZhciBuPXAubGVuZ3RoO3ZhciBxPVtdO2Zvcih2YXIgbz0wO288bjtvKyspe3Fbbz4+PjJdfD0ocC5jaGFyQ29kZUF0KG8pJjI1NSk8PCgyNC0obyU0KSo4KX1yZXR1cm4gbmV3IGwuaW5pdChxLG4pfX07dmFyIGM9bS5VdGY4PXtzdHJpbmdpZnk6ZnVuY3Rpb24obil7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGQuc3RyaW5naWZ5KG4pKSl9Y2F0Y2gobyl7dGhyb3cgbmV3IEVycm9yKFwiTWFsZm9ybWVkIFVURi04IGRhdGFcIil9fSxwYXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gZC5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQobikpKX19O3ZhciBpPWIuQnVmZmVyZWRCbG9ja0FsZ29yaXRobT1qLmV4dGVuZCh7cmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9kYXRhPW5ldyBsLmluaXQoKTt0aGlzLl9uRGF0YUJ5dGVzPTB9LF9hcHBlbmQ6ZnVuY3Rpb24obil7aWYodHlwZW9mIG49PVwic3RyaW5nXCIpe249Yy5wYXJzZShuKX10aGlzLl9kYXRhLmNvbmNhdChuKTt0aGlzLl9uRGF0YUJ5dGVzKz1uLnNpZ0J5dGVzfSxfcHJvY2VzczpmdW5jdGlvbih3KXt2YXIgcT10aGlzLl9kYXRhO3ZhciB4PXEud29yZHM7dmFyIG49cS5zaWdCeXRlczt2YXIgdD10aGlzLmJsb2NrU2l6ZTt2YXIgdj10KjQ7dmFyIHU9bi92O2lmKHcpe3U9ZS5jZWlsKHUpfWVsc2V7dT1lLm1heCgodXwwKS10aGlzLl9taW5CdWZmZXJTaXplLDApfXZhciBzPXUqdDt2YXIgcj1lLm1pbihzKjQsbik7aWYocyl7Zm9yKHZhciBwPTA7cDxzO3ArPXQpe3RoaXMuX2RvUHJvY2Vzc0Jsb2NrKHgscCl9dmFyIG89eC5zcGxpY2UoMCxzKTtxLnNpZ0J5dGVzLT1yfXJldHVybiBuZXcgbC5pbml0KG8scil9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIG49ai5jbG9uZS5jYWxsKHRoaXMpO24uX2RhdGE9dGhpcy5fZGF0YS5jbG9uZSgpO3JldHVybiBufSxfbWluQnVmZmVyU2l6ZTowfSk7dmFyIGY9Yi5IYXNoZXI9aS5leHRlbmQoe2NmZzpqLmV4dGVuZCgpLGluaXQ6ZnVuY3Rpb24obil7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKG4pO3RoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXtpLnJlc2V0LmNhbGwodGhpcyk7dGhpcy5fZG9SZXNldCgpfSx1cGRhdGU6ZnVuY3Rpb24obil7dGhpcy5fYXBwZW5kKG4pO3RoaXMuX3Byb2Nlc3MoKTtyZXR1cm4gdGhpc30sZmluYWxpemU6ZnVuY3Rpb24obil7aWYobil7dGhpcy5fYXBwZW5kKG4pfXZhciBvPXRoaXMuX2RvRmluYWxpemUoKTtyZXR1cm4gb30sYmxvY2tTaXplOjUxMi8zMixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbihwLG8pe3JldHVybiBuZXcgbi5pbml0KG8pLmZpbmFsaXplKHApfX0sX2NyZWF0ZUhtYWNIZWxwZXI6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHAsbyl7cmV0dXJuIG5ldyBrLkhNQUMuaW5pdChuLG8pLmZpbmFsaXplKHApfX19KTt2YXIgaz1hLmFsZ289e307cmV0dXJuIGF9KE1hdGgpKTtcbi8qXG5DcnlwdG9KUyB2My4xLjIgeDY0LWNvcmUtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbihnKXt2YXIgYT1DcnlwdG9KUyxmPWEubGliLGU9Zi5CYXNlLGg9Zi5Xb3JkQXJyYXksYT1hLng2ND17fTthLldvcmQ9ZS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYixjKXt0aGlzLmhpZ2g9Yjt0aGlzLmxvdz1jfX0pO2EuV29yZEFycmF5PWUuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGIsYyl7Yj10aGlzLndvcmRzPWJ8fFtdO3RoaXMuc2lnQnl0ZXM9YyE9Zz9jOjgqYi5sZW5ndGh9LHRvWDMyOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMud29yZHMsYz1iLmxlbmd0aCxhPVtdLGQ9MDtkPGM7ZCsrKXt2YXIgZT1iW2RdO2EucHVzaChlLmhpZ2gpO2EucHVzaChlLmxvdyl9cmV0dXJuIGguY3JlYXRlKGEsdGhpcy5zaWdCeXRlcyl9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWUuY2xvbmUuY2FsbCh0aGlzKSxjPWIud29yZHM9dGhpcy53b3Jkcy5zbGljZSgwKSxhPWMubGVuZ3RoLGQ9MDtkPGE7ZCsrKWNbZF09Y1tkXS5jbG9uZSgpO3JldHVybiBifX0pfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBjaXBoZXItY29yZS5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG5DcnlwdG9KUy5saWIuQ2lwaGVyfHxmdW5jdGlvbih1KXt2YXIgZz1DcnlwdG9KUyxmPWcubGliLGs9Zi5CYXNlLGw9Zi5Xb3JkQXJyYXkscT1mLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0scj1nLmVuYy5CYXNlNjQsdj1nLmFsZ28uRXZwS0RGLG49Zi5DaXBoZXI9cS5leHRlbmQoe2NmZzprLmV4dGVuZCgpLGNyZWF0ZUVuY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9FTkNfWEZPUk1fTU9ERSxhLGIpfSxjcmVhdGVEZWNyeXB0b3I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fREVDX1hGT1JNX01PREUsYSxiKX0saW5pdDpmdW5jdGlvbihhLGIsYyl7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKGMpO3RoaXMuX3hmb3JtTW9kZT1hO3RoaXMuX2tleT1iO3RoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXtxLnJlc2V0LmNhbGwodGhpcyk7dGhpcy5fZG9SZXNldCgpfSxwcm9jZXNzOmZ1bmN0aW9uKGEpe3RoaXMuX2FwcGVuZChhKTtcbnJldHVybiB0aGlzLl9wcm9jZXNzKCl9LGZpbmFsaXplOmZ1bmN0aW9uKGEpe2EmJnRoaXMuX2FwcGVuZChhKTtyZXR1cm4gdGhpcy5fZG9GaW5hbGl6ZSgpfSxrZXlTaXplOjQsaXZTaXplOjQsX0VOQ19YRk9STV9NT0RFOjEsX0RFQ19YRk9STV9NT0RFOjIsX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihhKXtyZXR1cm57ZW5jcnlwdDpmdW5jdGlvbihiLGMsZCl7cmV0dXJuKFwic3RyaW5nXCI9PXR5cGVvZiBjP3M6aikuZW5jcnlwdChhLGIsYyxkKX0sZGVjcnlwdDpmdW5jdGlvbihiLGMsZCl7cmV0dXJuKFwic3RyaW5nXCI9PXR5cGVvZiBjP3M6aikuZGVjcnlwdChhLGIsYyxkKX19fX0pO2YuU3RyZWFtQ2lwaGVyPW4uZXh0ZW5kKHtfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9jZXNzKCEwKX0sYmxvY2tTaXplOjF9KTt2YXIgbT1nLm1vZGU9e30sdD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5faXY7ZD90aGlzLl9pdj11OmQ9dGhpcy5fcHJldkJsb2NrO2Zvcih2YXIgZT1cbjA7ZTxjO2UrKylhW2IrZV1ePWRbZV19LGg9KGYuQmxvY2tDaXBoZXJNb2RlPWsuZXh0ZW5kKHtjcmVhdGVFbmNyeXB0b3I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5FbmNyeXB0b3IuY3JlYXRlKGEsYil9LGNyZWF0ZURlY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkRlY3J5cHRvci5jcmVhdGUoYSxiKX0saW5pdDpmdW5jdGlvbihhLGIpe3RoaXMuX2NpcGhlcj1hO3RoaXMuX2l2PWJ9fSkpLmV4dGVuZCgpO2guRW5jcnlwdG9yPWguZXh0ZW5kKHtwcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9jaXBoZXIsZD1jLmJsb2NrU2l6ZTt0LmNhbGwodGhpcyxhLGIsZCk7Yy5lbmNyeXB0QmxvY2soYSxiKTt0aGlzLl9wcmV2QmxvY2s9YS5zbGljZShiLGIrZCl9fSk7aC5EZWNyeXB0b3I9aC5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2NpcGhlcixkPWMuYmxvY2tTaXplLGU9YS5zbGljZShiLGIrZCk7Yy5kZWNyeXB0QmxvY2soYSxcbmIpO3QuY2FsbCh0aGlzLGEsYixkKTt0aGlzLl9wcmV2QmxvY2s9ZX19KTttPW0uQ0JDPWg7aD0oZy5wYWQ9e30pLlBrY3M3PXtwYWQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9NCpiLGM9Yy1hLnNpZ0J5dGVzJWMsZD1jPDwyNHxjPDwxNnxjPDw4fGMsZT1bXSxmPTA7ZjxjO2YrPTQpZS5wdXNoKGQpO2M9bC5jcmVhdGUoZSxjKTthLmNvbmNhdChjKX0sdW5wYWQ6ZnVuY3Rpb24oYSl7YS5zaWdCeXRlcy09YS53b3Jkc1thLnNpZ0J5dGVzLTE+Pj4yXSYyNTV9fTtmLkJsb2NrQ2lwaGVyPW4uZXh0ZW5kKHtjZmc6bi5jZmcuZXh0ZW5kKHttb2RlOm0scGFkZGluZzpofSkscmVzZXQ6ZnVuY3Rpb24oKXtuLnJlc2V0LmNhbGwodGhpcyk7dmFyIGE9dGhpcy5jZmcsYj1hLml2LGE9YS5tb2RlO2lmKHRoaXMuX3hmb3JtTW9kZT09dGhpcy5fRU5DX1hGT1JNX01PREUpdmFyIGM9YS5jcmVhdGVFbmNyeXB0b3I7ZWxzZSBjPWEuY3JlYXRlRGVjcnlwdG9yLHRoaXMuX21pbkJ1ZmZlclNpemU9MTtcbnRoaXMuX21vZGU9Yy5jYWxsKGEsdGhpcyxiJiZiLndvcmRzKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEsYil7dGhpcy5fbW9kZS5wcm9jZXNzQmxvY2soYSxiKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNmZy5wYWRkaW5nO2lmKHRoaXMuX3hmb3JtTW9kZT09dGhpcy5fRU5DX1hGT1JNX01PREUpe2EucGFkKHRoaXMuX2RhdGEsdGhpcy5ibG9ja1NpemUpO3ZhciBiPXRoaXMuX3Byb2Nlc3MoITApfWVsc2UgYj10aGlzLl9wcm9jZXNzKCEwKSxhLnVucGFkKGIpO3JldHVybiBifSxibG9ja1NpemU6NH0pO3ZhciBwPWYuQ2lwaGVyUGFyYW1zPWsuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEpe3RoaXMubWl4SW4oYSl9LHRvU3RyaW5nOmZ1bmN0aW9uKGEpe3JldHVybihhfHx0aGlzLmZvcm1hdHRlcikuc3RyaW5naWZ5KHRoaXMpfX0pLG09KGcuZm9ybWF0PXt9KS5PcGVuU1NMPXtzdHJpbmdpZnk6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jaXBoZXJ0ZXh0O2E9YS5zYWx0O1xucmV0dXJuKGE/bC5jcmVhdGUoWzEzOTg4OTM2ODQsMTcwMTA3NjgzMV0pLmNvbmNhdChhKS5jb25jYXQoYik6YikudG9TdHJpbmcocil9LHBhcnNlOmZ1bmN0aW9uKGEpe2E9ci5wYXJzZShhKTt2YXIgYj1hLndvcmRzO2lmKDEzOTg4OTM2ODQ9PWJbMF0mJjE3MDEwNzY4MzE9PWJbMV0pe3ZhciBjPWwuY3JlYXRlKGIuc2xpY2UoMiw0KSk7Yi5zcGxpY2UoMCw0KTthLnNpZ0J5dGVzLT0xNn1yZXR1cm4gcC5jcmVhdGUoe2NpcGhlcnRleHQ6YSxzYWx0OmN9KX19LGo9Zi5TZXJpYWxpemFibGVDaXBoZXI9ay5leHRlbmQoe2NmZzprLmV4dGVuZCh7Zm9ybWF0Om19KSxlbmNyeXB0OmZ1bmN0aW9uKGEsYixjLGQpe2Q9dGhpcy5jZmcuZXh0ZW5kKGQpO3ZhciBlPWEuY3JlYXRlRW5jcnlwdG9yKGMsZCk7Yj1lLmZpbmFsaXplKGIpO2U9ZS5jZmc7cmV0dXJuIHAuY3JlYXRlKHtjaXBoZXJ0ZXh0OmIsa2V5OmMsaXY6ZS5pdixhbGdvcml0aG06YSxtb2RlOmUubW9kZSxwYWRkaW5nOmUucGFkZGluZyxcbmJsb2NrU2l6ZTphLmJsb2NrU2l6ZSxmb3JtYXR0ZXI6ZC5mb3JtYXR9KX0sZGVjcnlwdDpmdW5jdGlvbihhLGIsYyxkKXtkPXRoaXMuY2ZnLmV4dGVuZChkKTtiPXRoaXMuX3BhcnNlKGIsZC5mb3JtYXQpO3JldHVybiBhLmNyZWF0ZURlY3J5cHRvcihjLGQpLmZpbmFsaXplKGIuY2lwaGVydGV4dCl9LF9wYXJzZTpmdW5jdGlvbihhLGIpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBhP2IucGFyc2UoYSx0aGlzKTphfX0pLGc9KGcua2RmPXt9KS5PcGVuU1NMPXtleGVjdXRlOmZ1bmN0aW9uKGEsYixjLGQpe2R8fChkPWwucmFuZG9tKDgpKTthPXYuY3JlYXRlKHtrZXlTaXplOmIrY30pLmNvbXB1dGUoYSxkKTtjPWwuY3JlYXRlKGEud29yZHMuc2xpY2UoYiksNCpjKTthLnNpZ0J5dGVzPTQqYjtyZXR1cm4gcC5jcmVhdGUoe2tleTphLGl2OmMsc2FsdDpkfSl9fSxzPWYuUGFzc3dvcmRCYXNlZENpcGhlcj1qLmV4dGVuZCh7Y2ZnOmouY2ZnLmV4dGVuZCh7a2RmOmd9KSxlbmNyeXB0OmZ1bmN0aW9uKGEsXG5iLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7Yz1kLmtkZi5leGVjdXRlKGMsYS5rZXlTaXplLGEuaXZTaXplKTtkLml2PWMuaXY7YT1qLmVuY3J5cHQuY2FsbCh0aGlzLGEsYixjLmtleSxkKTthLm1peEluKGMpO3JldHVybiBhfSxkZWNyeXB0OmZ1bmN0aW9uKGEsYixjLGQpe2Q9dGhpcy5jZmcuZXh0ZW5kKGQpO2I9dGhpcy5fcGFyc2UoYixkLmZvcm1hdCk7Yz1kLmtkZi5leGVjdXRlKGMsYS5rZXlTaXplLGEuaXZTaXplLGIuc2FsdCk7ZC5pdj1jLml2O3JldHVybiBqLmRlY3J5cHQuY2FsbCh0aGlzLGEsYixjLmtleSxkKX19KX0oKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBhZXMuanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7Zm9yKHZhciBxPUNyeXB0b0pTLHg9cS5saWIuQmxvY2tDaXBoZXIscj1xLmFsZ28saj1bXSx5PVtdLHo9W10sQT1bXSxCPVtdLEM9W10scz1bXSx1PVtdLHY9W10sdz1bXSxnPVtdLGs9MDsyNTY+aztrKyspZ1trXT0xMjg+az9rPDwxOms8PDFeMjgzO2Zvcih2YXIgbj0wLGw9MCxrPTA7MjU2Pms7aysrKXt2YXIgZj1sXmw8PDFebDw8Ml5sPDwzXmw8PDQsZj1mPj4+OF5mJjI1NV45OTtqW25dPWY7eVtmXT1uO3ZhciB0PWdbbl0sRD1nW3RdLEU9Z1tEXSxiPTI1NypnW2ZdXjE2ODQzMDA4KmY7eltuXT1iPDwyNHxiPj4+ODtBW25dPWI8PDE2fGI+Pj4xNjtCW25dPWI8PDh8Yj4+PjI0O0Nbbl09YjtiPTE2ODQzMDA5KkVeNjU1MzcqRF4yNTcqdF4xNjg0MzAwOCpuO3NbZl09Yjw8MjR8Yj4+Pjg7dVtmXT1iPDwxNnxiPj4+MTY7dltmXT1iPDw4fGI+Pj4yNDt3W2ZdPWI7bj8obj10XmdbZ1tnW0VedF1dXSxsXj1nW2dbbF1dKTpuPWw9MX12YXIgRj1bMCwxLDIsNCw4LFxuMTYsMzIsNjQsMTI4LDI3LDU0XSxyPXIuQUVTPXguZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgYz10aGlzLl9rZXksZT1jLndvcmRzLGE9Yy5zaWdCeXRlcy80LGM9NCooKHRoaXMuX25Sb3VuZHM9YSs2KSsxKSxiPXRoaXMuX2tleVNjaGVkdWxlPVtdLGg9MDtoPGM7aCsrKWlmKGg8YSliW2hdPWVbaF07ZWxzZXt2YXIgZD1iW2gtMV07aCVhPzY8YSYmND09aCVhJiYoZD1qW2Q+Pj4yNF08PDI0fGpbZD4+PjE2JjI1NV08PDE2fGpbZD4+PjgmMjU1XTw8OHxqW2QmMjU1XSk6KGQ9ZDw8OHxkPj4+MjQsZD1qW2Q+Pj4yNF08PDI0fGpbZD4+PjE2JjI1NV08PDE2fGpbZD4+PjgmMjU1XTw8OHxqW2QmMjU1XSxkXj1GW2gvYXwwXTw8MjQpO2JbaF09YltoLWFdXmR9ZT10aGlzLl9pbnZLZXlTY2hlZHVsZT1bXTtmb3IoYT0wO2E8YzthKyspaD1jLWEsZD1hJTQ/YltoXTpiW2gtNF0sZVthXT00PmF8fDQ+PWg/ZDpzW2pbZD4+PjI0XV1edVtqW2Q+Pj4xNiYyNTVdXV52W2pbZD4+PlxuOCYyNTVdXV53W2pbZCYyNTVdXX0sZW5jcnlwdEJsb2NrOmZ1bmN0aW9uKGMsZSl7dGhpcy5fZG9DcnlwdEJsb2NrKGMsZSx0aGlzLl9rZXlTY2hlZHVsZSx6LEEsQixDLGopfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24oYyxlKXt2YXIgYT1jW2UrMV07Y1tlKzFdPWNbZSszXTtjW2UrM109YTt0aGlzLl9kb0NyeXB0QmxvY2soYyxlLHRoaXMuX2ludktleVNjaGVkdWxlLHMsdSx2LHcseSk7YT1jW2UrMV07Y1tlKzFdPWNbZSszXTtjW2UrM109YX0sX2RvQ3J5cHRCbG9jazpmdW5jdGlvbihjLGUsYSxiLGgsZCxqLG0pe2Zvcih2YXIgbj10aGlzLl9uUm91bmRzLGY9Y1tlXV5hWzBdLGc9Y1tlKzFdXmFbMV0saz1jW2UrMl1eYVsyXSxwPWNbZSszXV5hWzNdLGw9NCx0PTE7dDxuO3QrKyl2YXIgcT1iW2Y+Pj4yNF1eaFtnPj4+MTYmMjU1XV5kW2s+Pj44JjI1NV1ealtwJjI1NV1eYVtsKytdLHI9YltnPj4+MjRdXmhbaz4+PjE2JjI1NV1eZFtwPj4+OCYyNTVdXmpbZiYyNTVdXmFbbCsrXSxzPVxuYltrPj4+MjRdXmhbcD4+PjE2JjI1NV1eZFtmPj4+OCYyNTVdXmpbZyYyNTVdXmFbbCsrXSxwPWJbcD4+PjI0XV5oW2Y+Pj4xNiYyNTVdXmRbZz4+PjgmMjU1XV5qW2smMjU1XV5hW2wrK10sZj1xLGc9cixrPXM7cT0obVtmPj4+MjRdPDwyNHxtW2c+Pj4xNiYyNTVdPDwxNnxtW2s+Pj44JjI1NV08PDh8bVtwJjI1NV0pXmFbbCsrXTtyPShtW2c+Pj4yNF08PDI0fG1baz4+PjE2JjI1NV08PDE2fG1bcD4+PjgmMjU1XTw8OHxtW2YmMjU1XSleYVtsKytdO3M9KG1baz4+PjI0XTw8MjR8bVtwPj4+MTYmMjU1XTw8MTZ8bVtmPj4+OCYyNTVdPDw4fG1bZyYyNTVdKV5hW2wrK107cD0obVtwPj4+MjRdPDwyNHxtW2Y+Pj4xNiYyNTVdPDwxNnxtW2c+Pj44JjI1NV08PDh8bVtrJjI1NV0pXmFbbCsrXTtjW2VdPXE7Y1tlKzFdPXI7Y1tlKzJdPXM7Y1tlKzNdPXB9LGtleVNpemU6OH0pO3EuQUVTPXguX2NyZWF0ZUhlbHBlcihyKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgdHJpcGxlZGVzLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBqKGIsYyl7dmFyIGE9KHRoaXMuX2xCbG9jaz4+PmJedGhpcy5fckJsb2NrKSZjO3RoaXMuX3JCbG9ja149YTt0aGlzLl9sQmxvY2tePWE8PGJ9ZnVuY3Rpb24gbChiLGMpe3ZhciBhPSh0aGlzLl9yQmxvY2s+Pj5iXnRoaXMuX2xCbG9jaykmYzt0aGlzLl9sQmxvY2tePWE7dGhpcy5fckJsb2NrXj1hPDxifXZhciBoPUNyeXB0b0pTLGU9aC5saWIsbj1lLldvcmRBcnJheSxlPWUuQmxvY2tDaXBoZXIsZz1oLmFsZ28scT1bNTcsNDksNDEsMzMsMjUsMTcsOSwxLDU4LDUwLDQyLDM0LDI2LDE4LDEwLDIsNTksNTEsNDMsMzUsMjcsMTksMTEsMyw2MCw1Miw0NCwzNiw2Myw1NSw0NywzOSwzMSwyMywxNSw3LDYyLDU0LDQ2LDM4LDMwLDIyLDE0LDYsNjEsNTMsNDUsMzcsMjksMjEsMTMsNSwyOCwyMCwxMiw0XSxwPVsxNCwxNywxMSwyNCwxLDUsMywyOCwxNSw2LDIxLDEwLDIzLDE5LDEyLDQsMjYsOCwxNiw3LDI3LDIwLDEzLDIsNDEsNTIsMzEsMzcsNDcsXG41NSwzMCw0MCw1MSw0NSwzMyw0OCw0NCw0OSwzOSw1NiwzNCw1Myw0Niw0Miw1MCwzNiwyOSwzMl0scj1bMSwyLDQsNiw4LDEwLDEyLDE0LDE1LDE3LDE5LDIxLDIzLDI1LDI3LDI4XSxzPVt7XCIwXCI6ODQyMTg4OCwyNjg0MzU0NTY6MzI3NjgsNTM2ODcwOTEyOjg0MjEzNzgsODA1MzA2MzY4OjIsMTA3Mzc0MTgyNDo1MTIsMTM0MjE3NzI4MDo4NDIxODkwLDE2MTA2MTI3MzY6ODM4OTEyMiwxODc5MDQ4MTkyOjgzODg2MDgsMjE0NzQ4MzY0ODo1MTQsMjQxNTkxOTEwNDo4Mzg5MTIwLDI2ODQzNTQ1NjA6MzMyODAsMjk1Mjc5MDAxNjo4NDIxMzc2LDMyMjEyMjU0NzI6MzI3NzAsMzQ4OTY2MDkyODo4Mzg4NjEwLDM3NTgwOTYzODQ6MCw0MDI2NTMxODQwOjMzMjgyLDEzNDIxNzcyODowLDQwMjY1MzE4NDo4NDIxODkwLDY3MTA4ODY0MDozMzI4Miw5Mzk1MjQwOTY6MzI3NjgsMTIwNzk1OTU1Mjo4NDIxODg4LDE0NzYzOTUwMDg6NTEyLDE3NDQ4MzA0NjQ6ODQyMTM3OCwyMDEzMjY1OTIwOjIsXG4yMjgxNzAxMzc2OjgzODkxMjAsMjU1MDEzNjgzMjozMzI4MCwyODE4NTcyMjg4Ojg0MjEzNzYsMzA4NzAwNzc0NDo4Mzg5MTIyLDMzNTU0NDMyMDA6ODM4ODYxMCwzNjIzODc4NjU2OjMyNzcwLDM4OTIzMTQxMTI6NTE0LDQxNjA3NDk1Njg6ODM4ODYwOCwxOjMyNzY4LDI2ODQzNTQ1NzoyLDUzNjg3MDkxMzo4NDIxODg4LDgwNTMwNjM2OTo4Mzg4NjA4LDEwNzM3NDE4MjU6ODQyMTM3OCwxMzQyMTc3MjgxOjMzMjgwLDE2MTA2MTI3Mzc6NTEyLDE4NzkwNDgxOTM6ODM4OTEyMiwyMTQ3NDgzNjQ5Ojg0MjE4OTAsMjQxNTkxOTEwNTo4NDIxMzc2LDI2ODQzNTQ1NjE6ODM4ODYxMCwyOTUyNzkwMDE3OjMzMjgyLDMyMjEyMjU0NzM6NTE0LDM0ODk2NjA5Mjk6ODM4OTEyMCwzNzU4MDk2Mzg1OjMyNzcwLDQwMjY1MzE4NDE6MCwxMzQyMTc3Mjk6ODQyMTg5MCw0MDI2NTMxODU6ODQyMTM3Niw2NzEwODg2NDE6ODM4ODYwOCw5Mzk1MjQwOTc6NTEyLDEyMDc5NTk1NTM6MzI3NjgsMTQ3NjM5NTAwOTo4Mzg4NjEwLFxuMTc0NDgzMDQ2NToyLDIwMTMyNjU5MjE6MzMyODIsMjI4MTcwMTM3NzozMjc3MCwyNTUwMTM2ODMzOjgzODkxMjIsMjgxODU3MjI4OTo1MTQsMzA4NzAwNzc0NTo4NDIxODg4LDMzNTU0NDMyMDE6ODM4OTEyMCwzNjIzODc4NjU3OjAsMzg5MjMxNDExMzozMzI4MCw0MTYwNzQ5NTY5Ojg0MjEzNzh9LHtcIjBcIjoxMDc0MjgyNTEyLDE2Nzc3MjE2OjE2Mzg0LDMzNTU0NDMyOjUyNDI4OCw1MDMzMTY0ODoxMDc0MjY2MTI4LDY3MTA4ODY0OjEwNzM3NDE4NDAsODM4ODYwODA6MTA3NDI4MjQ5NiwxMDA2NjMyOTY6MTA3Mzc1ODIwOCwxMTc0NDA1MTI6MTYsMTM0MjE3NzI4OjU0MDY3MiwxNTA5OTQ5NDQ6MTA3Mzc1ODIyNCwxNjc3NzIxNjA6MTA3Mzc0MTgyNCwxODQ1NDkzNzY6NTQwNjg4LDIwMTMyNjU5Mjo1MjQzMDQsMjE4MTAzODA4OjAsMjM0ODgxMDI0OjE2NDAwLDI1MTY1ODI0MDoxMDc0MjY2MTEyLDgzODg2MDg6MTA3Mzc1ODIwOCwyNTE2NTgyNDo1NDA2ODgsNDE5NDMwNDA6MTYsNTg3MjAyNTY6MTA3Mzc1ODIyNCxcbjc1NDk3NDcyOjEwNzQyODI1MTIsOTIyNzQ2ODg6MTA3Mzc0MTgyNCwxMDkwNTE5MDQ6NTI0Mjg4LDEyNTgyOTEyMDoxMDc0MjY2MTI4LDE0MjYwNjMzNjo1MjQzMDQsMTU5MzgzNTUyOjAsMTc2MTYwNzY4OjE2Mzg0LDE5MjkzNzk4NDoxMDc0MjY2MTEyLDIwOTcxNTIwMDoxMDczNzQxODQwLDIyNjQ5MjQxNjo1NDA2NzIsMjQzMjY5NjMyOjEwNzQyODI0OTYsMjYwMDQ2ODQ4OjE2NDAwLDI2ODQzNTQ1NjowLDI4NTIxMjY3MjoxMDc0MjY2MTI4LDMwMTk4OTg4ODoxMDczNzU4MjI0LDMxODc2NzEwNDoxMDc0MjgyNDk2LDMzNTU0NDMyMDoxMDc0MjY2MTEyLDM1MjMyMTUzNjoxNiwzNjkwOTg3NTI6NTQwNjg4LDM4NTg3NTk2ODoxNjM4NCw0MDI2NTMxODQ6MTY0MDAsNDE5NDMwNDAwOjUyNDI4OCw0MzYyMDc2MTY6NTI0MzA0LDQ1Mjk4NDgzMjoxMDczNzQxODQwLDQ2OTc2MjA0ODo1NDA2NzIsNDg2NTM5MjY0OjEwNzM3NTgyMDgsNTAzMzE2NDgwOjEwNzM3NDE4MjQsNTIwMDkzNjk2OjEwNzQyODI1MTIsXG4yNzY4MjQwNjQ6NTQwNjg4LDI5MzYwMTI4MDo1MjQyODgsMzEwMzc4NDk2OjEwNzQyNjYxMTIsMzI3MTU1NzEyOjE2Mzg0LDM0MzkzMjkyODoxMDczNzU4MjA4LDM2MDcxMDE0NDoxMDc0MjgyNTEyLDM3NzQ4NzM2MDoxNiwzOTQyNjQ1NzY6MTA3Mzc0MTgyNCw0MTEwNDE3OTI6MTA3NDI4MjQ5Niw0Mjc4MTkwMDg6MTA3Mzc0MTg0MCw0NDQ1OTYyMjQ6MTA3Mzc1ODIyNCw0NjEzNzM0NDA6NTI0MzA0LDQ3ODE1MDY1NjowLDQ5NDkyNzg3MjoxNjQwMCw1MTE3MDUwODg6MTA3NDI2NjEyOCw1Mjg0ODIzMDQ6NTQwNjcyfSx7XCIwXCI6MjYwLDEwNDg1NzY6MCwyMDk3MTUyOjY3MTA5MTIwLDMxNDU3Mjg6NjU3OTYsNDE5NDMwNDo2NTU0MCw1MjQyODgwOjY3MTA4ODY4LDYyOTE0NTY6NjcxNzQ2NjAsNzM0MDAzMjo2NzE3NDQwMCw4Mzg4NjA4OjY3MTA4ODY0LDk0MzcxODQ6NjcxNzQ2NTYsMTA0ODU3NjA6NjU3OTIsMTE1MzQzMzY6NjcxNzQ0MDQsMTI1ODI5MTI6NjcxMDkxMjQsMTM2MzE0ODg6NjU1MzYsXG4xNDY4MDA2NDo0LDE1NzI4NjQwOjI1Niw1MjQyODg6NjcxNzQ2NTYsMTU3Mjg2NDo2NzE3NDQwNCwyNjIxNDQwOjAsMzY3MDAxNjo2NzEwOTEyMCw0NzE4NTkyOjY3MTA4ODY4LDU3NjcxNjg6NjU1MzYsNjgxNTc0NDo2NTU0MCw3ODY0MzIwOjI2MCw4OTEyODk2OjQsOTk2MTQ3MjoyNTYsMTEwMTAwNDg6NjcxNzQ0MDAsMTIwNTg2MjQ6NjU3OTYsMTMxMDcyMDA6NjU3OTIsMTQxNTU3NzY6NjcxMDkxMjQsMTUyMDQzNTI6NjcxNzQ2NjAsMTYyNTI5Mjg6NjcxMDg4NjQsMTY3NzcyMTY6NjcxNzQ2NTYsMTc4MjU3OTI6NjU1NDAsMTg4NzQzNjg6NjU1MzYsMTk5MjI5NDQ6NjcxMDkxMjAsMjA5NzE1MjA6MjU2LDIyMDIwMDk2OjY3MTc0NjYwLDIzMDY4NjcyOjY3MTA4ODY4LDI0MTE3MjQ4OjAsMjUxNjU4MjQ6NjcxMDkxMjQsMjYyMTQ0MDA6NjcxMDg4NjQsMjcyNjI5NzY6NCwyODMxMTU1Mjo2NTc5MiwyOTM2MDEyODo2NzE3NDQwMCwzMDQwODcwNDoyNjAsMzE0NTcyODA6NjU3OTYsMzI1MDU4NTY6NjcxNzQ0MDQsXG4xNzMwMTUwNDo2NzEwODg2NCwxODM1MDA4MDoyNjAsMTkzOTg2NTY6NjcxNzQ2NTYsMjA0NDcyMzI6MCwyMTQ5NTgwODo2NTU0MCwyMjU0NDM4NDo2NzEwOTEyMCwyMzU5Mjk2MDoyNTYsMjQ2NDE1MzY6NjcxNzQ0MDQsMjU2OTAxMTI6NjU1MzYsMjY3Mzg2ODg6NjcxNzQ2NjAsMjc3ODcyNjQ6NjU3OTYsMjg4MzU4NDA6NjcxMDg4NjgsMjk4ODQ0MTY6NjcxMDkxMjQsMzA5MzI5OTI6NjcxNzQ0MDAsMzE5ODE1Njg6NCwzMzAzMDE0NDo2NTc5Mn0se1wiMFwiOjIxNTE2ODIwNDgsNjU1MzY6MjE0NzQ4NzgwOCwxMzEwNzI6NDE5ODQ2NCwxOTY2MDg6MjE1MTY3Nzk1MiwyNjIxNDQ6MCwzMjc2ODA6NDE5ODQwMCwzOTMyMTY6MjE0NzQ4MzcxMiw0NTg3NTI6NDE5NDM2OCw1MjQyODg6MjE0NzQ4MzY0OCw1ODk4MjQ6NDE5NDMwNCw2NTUzNjA6NjQsNzIwODk2OjIxNDc0ODc3NDQsNzg2NDMyOjIxNTE2NzgwMTYsODUxOTY4OjQxNjAsOTE3NTA0OjQwOTYsOTgzMDQwOjIxNTE2ODIxMTIsMzI3Njg6MjE0NzQ4NzgwOCxcbjk4MzA0OjY0LDE2Mzg0MDoyMTUxNjc4MDE2LDIyOTM3NjoyMTQ3NDg3NzQ0LDI5NDkxMjo0MTk4NDAwLDM2MDQ0ODoyMTUxNjgyMTEyLDQyNTk4NDowLDQ5MTUyMDoyMTUxNjc3OTUyLDU1NzA1Njo0MDk2LDYyMjU5MjoyMTUxNjgyMDQ4LDY4ODEyODo0MTk0MzA0LDc1MzY2NDo0MTYwLDgxOTIwMDoyMTQ3NDgzNjQ4LDg4NDczNjo0MTk0MzY4LDk1MDI3Mjo0MTk4NDY0LDEwMTU4MDg6MjE0NzQ4MzcxMiwxMDQ4NTc2OjQxOTQzNjgsMTExNDExMjo0MTk4NDAwLDExNzk2NDg6MjE0NzQ4MzcxMiwxMjQ1MTg0OjAsMTMxMDcyMDo0MTYwLDEzNzYyNTY6MjE1MTY3ODAxNiwxNDQxNzkyOjIxNTE2ODIwNDgsMTUwNzMyODoyMTQ3NDg3ODA4LDE1NzI4NjQ6MjE1MTY4MjExMiwxNjM4NDAwOjIxNDc0ODM2NDgsMTcwMzkzNjoyMTUxNjc3OTUyLDE3Njk0NzI6NDE5ODQ2NCwxODM1MDA4OjIxNDc0ODc3NDQsMTkwMDU0NDo0MTk0MzA0LDE5NjYwODA6NjQsMjAzMTYxNjo0MDk2LDEwODEzNDQ6MjE1MTY3Nzk1MixcbjExNDY4ODA6MjE1MTY4MjExMiwxMjEyNDE2OjAsMTI3Nzk1Mjo0MTk4NDAwLDEzNDM0ODg6NDE5NDM2OCwxNDA5MDI0OjIxNDc0ODM2NDgsMTQ3NDU2MDoyMTQ3NDg3ODA4LDE1NDAwOTY6NjQsMTYwNTYzMjoyMTQ3NDgzNzEyLDE2NzExNjg6NDA5NiwxNzM2NzA0OjIxNDc0ODc3NDQsMTgwMjI0MDoyMTUxNjc4MDE2LDE4Njc3NzY6NDE2MCwxOTMzMzEyOjIxNTE2ODIwNDgsMTk5ODg0ODo0MTk0MzA0LDIwNjQzODQ6NDE5ODQ2NH0se1wiMFwiOjEyOCw0MDk2OjE3MDM5MzYwLDgxOTI6MjYyMTQ0LDEyMjg4OjUzNjg3MDkxMiwxNjM4NDo1MzcxMzMxODQsMjA0ODA6MTY3NzczNDQsMjQ1NzY6NTUzNjQ4MjU2LDI4NjcyOjI2MjI3MiwzMjc2ODoxNjc3NzIxNiwzNjg2NDo1MzcxMzMwNTYsNDA5NjA6NTM2ODcxMDQwLDQ1MDU2OjU1MzkxMDQwMCw0OTE1Mjo1NTM5MTAyNzIsNTMyNDg6MCw1NzM0NDoxNzAzOTQ4OCw2MTQ0MDo1NTM2NDgxMjgsMjA0ODoxNzAzOTQ4OCw2MTQ0OjU1MzY0ODI1NixcbjEwMjQwOjEyOCwxNDMzNjoxNzAzOTM2MCwxODQzMjoyNjIxNDQsMjI1Mjg6NTM3MTMzMTg0LDI2NjI0OjU1MzkxMDI3MiwzMDcyMDo1MzY4NzA5MTIsMzQ4MTY6NTM3MTMzMDU2LDM4OTEyOjAsNDMwMDg6NTUzOTEwNDAwLDQ3MTA0OjE2Nzc3MzQ0LDUxMjAwOjUzNjg3MTA0MCw1NTI5Njo1NTM2NDgxMjgsNTkzOTI6MTY3NzcyMTYsNjM0ODg6MjYyMjcyLDY1NTM2OjI2MjE0NCw2OTYzMjoxMjgsNzM3Mjg6NTM2ODcwOTEyLDc3ODI0OjU1MzY0ODI1Niw4MTkyMDoxNjc3NzM0NCw4NjAxNjo1NTM5MTAyNzIsOTAxMTI6NTM3MTMzMTg0LDk0MjA4OjE2Nzc3MjE2LDk4MzA0OjU1MzkxMDQwMCwxMDI0MDA6NTUzNjQ4MTI4LDEwNjQ5NjoxNzAzOTM2MCwxMTA1OTI6NTM3MTMzMDU2LDExNDY4ODoyNjIyNzIsMTE4Nzg0OjUzNjg3MTA0MCwxMjI4ODA6MCwxMjY5NzY6MTcwMzk0ODgsNjc1ODQ6NTUzNjQ4MjU2LDcxNjgwOjE2Nzc3MjE2LDc1Nzc2OjE3MDM5MzYwLDc5ODcyOjUzNzEzMzE4NCxcbjgzOTY4OjUzNjg3MDkxMiw4ODA2NDoxNzAzOTQ4OCw5MjE2MDoxMjgsOTYyNTY6NTUzOTEwMjcyLDEwMDM1MjoyNjIyNzIsMTA0NDQ4OjU1MzkxMDQwMCwxMDg1NDQ6MCwxMTI2NDA6NTUzNjQ4MTI4LDExNjczNjoxNjc3NzM0NCwxMjA4MzI6MjYyMTQ0LDEyNDkyODo1MzcxMzMwNTYsMTI5MDI0OjUzNjg3MTA0MH0se1wiMFwiOjI2ODQzNTQ2NCwyNTY6ODE5Miw1MTI6MjcwNTMyNjA4LDc2ODoyNzA1NDA4MDgsMTAyNDoyNjg0NDM2NDgsMTI4MDoyMDk3MTUyLDE1MzY6MjA5NzE2MCwxNzkyOjI2ODQzNTQ1NiwyMDQ4OjAsMjMwNDoyNjg0NDM2NTYsMjU2MDoyMTA1MzQ0LDI4MTY6OCwzMDcyOjI3MDUzMjYxNiwzMzI4OjIxMDUzNTIsMzU4NDo4MjAwLDM4NDA6MjcwNTQwODAwLDEyODoyNzA1MzI2MDgsMzg0OjI3MDU0MDgwOCw2NDA6OCw4OTY6MjA5NzE1MiwxMTUyOjIxMDUzNTIsMTQwODoyNjg0MzU0NjQsMTY2NDoyNjg0NDM2NDgsMTkyMDo4MjAwLDIxNzY6MjA5NzE2MCwyNDMyOjgxOTIsXG4yNjg4OjI2ODQ0MzY1NiwyOTQ0OjI3MDUzMjYxNiwzMjAwOjAsMzQ1NjoyNzA1NDA4MDAsMzcxMjoyMTA1MzQ0LDM5Njg6MjY4NDM1NDU2LDQwOTY6MjY4NDQzNjQ4LDQzNTI6MjcwNTMyNjE2LDQ2MDg6MjcwNTQwODA4LDQ4NjQ6ODIwMCw1MTIwOjIwOTcxNTIsNTM3NjoyNjg0MzU0NTYsNTYzMjoyNjg0MzU0NjQsNTg4ODoyMTA1MzQ0LDYxNDQ6MjEwNTM1Miw2NDAwOjAsNjY1Njo4LDY5MTI6MjcwNTMyNjA4LDcxNjg6ODE5Miw3NDI0OjI2ODQ0MzY1Niw3NjgwOjI3MDU0MDgwMCw3OTM2OjIwOTcxNjAsNDIyNDo4LDQ0ODA6MjEwNTM0NCw0NzM2OjIwOTcxNTIsNDk5MjoyNjg0MzU0NjQsNTI0ODoyNjg0NDM2NDgsNTUwNDo4MjAwLDU3NjA6MjcwNTQwODA4LDYwMTY6MjcwNTMyNjA4LDYyNzI6MjcwNTQwODAwLDY1Mjg6MjcwNTMyNjE2LDY3ODQ6ODE5Miw3MDQwOjIxMDUzNTIsNzI5NjoyMDk3MTYwLDc1NTI6MCw3ODA4OjI2ODQzNTQ1Niw4MDY0OjI2ODQ0MzY1Nn0se1wiMFwiOjEwNDg1NzYsXG4xNjozMzU1NTQ1NywzMjoxMDI0LDQ4OjEwNDk2MDEsNjQ6MzQ2MDQwMzMsODA6MCw5NjoxLDExMjozNDYwMzAwOSwxMjg6MzM1NTU0NTYsMTQ0OjEwNDg1NzcsMTYwOjMzNTU0NDMzLDE3NjozNDYwNDAzMiwxOTI6MzQ2MDMwMDgsMjA4OjEwMjUsMjI0OjEwNDk2MDAsMjQwOjMzNTU0NDMyLDg6MzQ2MDMwMDksMjQ6MCw0MDozMzU1NTQ1Nyw1NjozNDYwNDAzMiw3MjoxMDQ4NTc2LDg4OjMzNTU0NDMzLDEwNDozMzU1NDQzMiwxMjA6MTAyNSwxMzY6MTA0OTYwMSwxNTI6MzM1NTU0NTYsMTY4OjM0NjAzMDA4LDE4NDoxMDQ4NTc3LDIwMDoxMDI0LDIxNjozNDYwNDAzMywyMzI6MSwyNDg6MTA0OTYwMCwyNTY6MzM1NTQ0MzIsMjcyOjEwNDg1NzYsMjg4OjMzNTU1NDU3LDMwNDozNDYwMzAwOSwzMjA6MTA0ODU3NywzMzY6MzM1NTU0NTYsMzUyOjM0NjA0MDMyLDM2ODoxMDQ5NjAxLDM4NDoxMDI1LDQwMDozNDYwNDAzMyw0MTY6MTA0OTYwMCw0MzI6MSw0NDg6MCw0NjQ6MzQ2MDMwMDgsNDgwOjMzNTU0NDMzLFxuNDk2OjEwMjQsMjY0OjEwNDk2MDAsMjgwOjMzNTU1NDU3LDI5NjozNDYwMzAwOSwzMTI6MSwzMjg6MzM1NTQ0MzIsMzQ0OjEwNDg1NzYsMzYwOjEwMjUsMzc2OjM0NjA0MDMyLDM5MjozMzU1NDQzMyw0MDg6MzQ2MDMwMDgsNDI0OjAsNDQwOjM0NjA0MDMzLDQ1NjoxMDQ5NjAxLDQ3MjoxMDI0LDQ4ODozMzU1NTQ1Niw1MDQ6MTA0ODU3N30se1wiMFwiOjEzNDIxOTgwOCwxOjEzMTA3MiwyOjEzNDIxNzcyOCwzOjMyLDQ6MTMxMTA0LDU6MTM0MzUwODgwLDY6MTM0MzUwODQ4LDc6MjA0OCw4OjEzNDM0ODgwMCw5OjEzNDIxOTc3NiwxMDoxMzMxMjAsMTE6MTM0MzQ4ODMyLDEyOjIwODAsMTM6MCwxNDoxMzQyMTc3NjAsMTU6MTMzMTUyLDIxNDc0ODM2NDg6MjA0OCwyMTQ3NDgzNjQ5OjEzNDM1MDg4MCwyMTQ3NDgzNjUwOjEzNDIxOTgwOCwyMTQ3NDgzNjUxOjEzNDIxNzcyOCwyMTQ3NDgzNjUyOjEzNDM0ODgwMCwyMTQ3NDgzNjUzOjEzMzEyMCwyMTQ3NDgzNjU0OjEzMzE1MiwyMTQ3NDgzNjU1OjMyLFxuMjE0NzQ4MzY1NjoxMzQyMTc3NjAsMjE0NzQ4MzY1NzoyMDgwLDIxNDc0ODM2NTg6MTMxMTA0LDIxNDc0ODM2NTk6MTM0MzUwODQ4LDIxNDc0ODM2NjA6MCwyMTQ3NDgzNjYxOjEzNDM0ODgzMiwyMTQ3NDgzNjYyOjEzNDIxOTc3NiwyMTQ3NDgzNjYzOjEzMTA3MiwxNjoxMzMxNTIsMTc6MTM0MzUwODQ4LDE4OjMyLDE5OjIwNDgsMjA6MTM0MjE5Nzc2LDIxOjEzNDIxNzc2MCwyMjoxMzQzNDg4MzIsMjM6MTMxMDcyLDI0OjAsMjU6MTMxMTA0LDI2OjEzNDM0ODgwMCwyNzoxMzQyMTk4MDgsMjg6MTM0MzUwODgwLDI5OjEzMzEyMCwzMDoyMDgwLDMxOjEzNDIxNzcyOCwyMTQ3NDgzNjY0OjEzMTA3MiwyMTQ3NDgzNjY1OjIwNDgsMjE0NzQ4MzY2NjoxMzQzNDg4MzIsMjE0NzQ4MzY2NzoxMzMxNTIsMjE0NzQ4MzY2ODozMiwyMTQ3NDgzNjY5OjEzNDM0ODgwMCwyMTQ3NDgzNjcwOjEzNDIxNzcyOCwyMTQ3NDgzNjcxOjEzNDIxOTgwOCwyMTQ3NDgzNjcyOjEzNDM1MDg4MCwyMTQ3NDgzNjczOjEzNDIxNzc2MCxcbjIxNDc0ODM2NzQ6MTM0MjE5Nzc2LDIxNDc0ODM2NzU6MCwyMTQ3NDgzNjc2OjEzMzEyMCwyMTQ3NDgzNjc3OjIwODAsMjE0NzQ4MzY3ODoxMzExMDQsMjE0NzQ4MzY3OToxMzQzNTA4NDh9XSx0PVs0MTYwNzQ5NTY5LDUyODQ4MjMwNCwzMzAzMDE0NCwyMDY0Mzg0LDEyOTAyNCw4MDY0LDUwNCwyMTQ3NDgzNjc5XSxtPWcuREVTPWUuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9rZXkud29yZHMsYz1bXSxhPTA7NTY+YTthKyspe3ZhciBmPXFbYV0tMTtjW2FdPWJbZj4+PjVdPj4+MzEtZiUzMiYxfWI9dGhpcy5fc3ViS2V5cz1bXTtmb3IoZj0wOzE2PmY7ZisrKXtmb3IodmFyIGQ9YltmXT1bXSxlPXJbZl0sYT0wOzI0PmE7YSsrKWRbYS82fDBdfD1jWyhwW2FdLTErZSklMjhdPDwzMS1hJTYsZFs0KyhhLzZ8MCldfD1jWzI4KyhwW2ErMjRdLTErZSklMjhdPDwzMS1hJTY7ZFswXT1kWzBdPDwxfGRbMF0+Pj4zMTtmb3IoYT0xOzc+YTthKyspZFthXT4+Pj1cbjQqKGEtMSkrMztkWzddPWRbN108PDV8ZFs3XT4+PjI3fWM9dGhpcy5faW52U3ViS2V5cz1bXTtmb3IoYT0wOzE2PmE7YSsrKWNbYV09YlsxNS1hXX0sZW5jcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZG9DcnlwdEJsb2NrKGIsYyx0aGlzLl9zdWJLZXlzKX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZG9DcnlwdEJsb2NrKGIsYyx0aGlzLl9pbnZTdWJLZXlzKX0sX2RvQ3J5cHRCbG9jazpmdW5jdGlvbihiLGMsYSl7dGhpcy5fbEJsb2NrPWJbY107dGhpcy5fckJsb2NrPWJbYysxXTtqLmNhbGwodGhpcyw0LDI1MjY0NTEzNSk7ai5jYWxsKHRoaXMsMTYsNjU1MzUpO2wuY2FsbCh0aGlzLDIsODU4OTkzNDU5KTtsLmNhbGwodGhpcyw4LDE2NzExOTM1KTtqLmNhbGwodGhpcywxLDE0MzE2NTU3NjUpO2Zvcih2YXIgZj0wOzE2PmY7ZisrKXtmb3IodmFyIGQ9YVtmXSxlPXRoaXMuX2xCbG9jayxoPXRoaXMuX3JCbG9jayxnPTAsaz0wOzg+aztrKyspZ3w9c1trXVsoKGheXG5kW2tdKSZ0W2tdKT4+PjBdO3RoaXMuX2xCbG9jaz1oO3RoaXMuX3JCbG9jaz1lXmd9YT10aGlzLl9sQmxvY2s7dGhpcy5fbEJsb2NrPXRoaXMuX3JCbG9jazt0aGlzLl9yQmxvY2s9YTtqLmNhbGwodGhpcywxLDE0MzE2NTU3NjUpO2wuY2FsbCh0aGlzLDgsMTY3MTE5MzUpO2wuY2FsbCh0aGlzLDIsODU4OTkzNDU5KTtqLmNhbGwodGhpcywxNiw2NTUzNSk7ai5jYWxsKHRoaXMsNCwyNTI2NDUxMzUpO2JbY109dGhpcy5fbEJsb2NrO2JbYysxXT10aGlzLl9yQmxvY2t9LGtleVNpemU6MixpdlNpemU6MixibG9ja1NpemU6Mn0pO2guREVTPWUuX2NyZWF0ZUhlbHBlcihtKTtnPWcuVHJpcGxlREVTPWUuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2tleS53b3Jkczt0aGlzLl9kZXMxPW0uY3JlYXRlRW5jcnlwdG9yKG4uY3JlYXRlKGIuc2xpY2UoMCwyKSkpO3RoaXMuX2RlczI9bS5jcmVhdGVFbmNyeXB0b3Iobi5jcmVhdGUoYi5zbGljZSgyLDQpKSk7dGhpcy5fZGVzMz1cbm0uY3JlYXRlRW5jcnlwdG9yKG4uY3JlYXRlKGIuc2xpY2UoNCw2KSkpfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kZXMxLmVuY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczIuZGVjcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMy5lbmNyeXB0QmxvY2soYixjKX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZGVzMy5kZWNyeXB0QmxvY2soYixjKTt0aGlzLl9kZXMyLmVuY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczEuZGVjcnlwdEJsb2NrKGIsYyl9LGtleVNpemU6NixpdlNpemU6MixibG9ja1NpemU6Mn0pO2guVHJpcGxlREVTPWUuX2NyZWF0ZUhlbHBlcihnKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgZW5jLWJhc2U2NC5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgaD1DcnlwdG9KUyxqPWgubGliLldvcmRBcnJheTtoLmVuYy5CYXNlNjQ9e3N0cmluZ2lmeTpmdW5jdGlvbihiKXt2YXIgZT1iLndvcmRzLGY9Yi5zaWdCeXRlcyxjPXRoaXMuX21hcDtiLmNsYW1wKCk7Yj1bXTtmb3IodmFyIGE9MDthPGY7YSs9Mylmb3IodmFyIGQ9KGVbYT4+PjJdPj4+MjQtOCooYSU0KSYyNTUpPDwxNnwoZVthKzE+Pj4yXT4+PjI0LTgqKChhKzEpJTQpJjI1NSk8PDh8ZVthKzI+Pj4yXT4+PjI0LTgqKChhKzIpJTQpJjI1NSxnPTA7ND5nJiZhKzAuNzUqZzxmO2crKyliLnB1c2goYy5jaGFyQXQoZD4+PjYqKDMtZykmNjMpKTtpZihlPWMuY2hhckF0KDY0KSlmb3IoO2IubGVuZ3RoJTQ7KWIucHVzaChlKTtyZXR1cm4gYi5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihiKXt2YXIgZT1iLmxlbmd0aCxmPXRoaXMuX21hcCxjPWYuY2hhckF0KDY0KTtjJiYoYz1iLmluZGV4T2YoYyksLTEhPWMmJihlPWMpKTtmb3IodmFyIGM9W10sYT0wLGQ9MDtkPFxuZTtkKyspaWYoZCU0KXt2YXIgZz1mLmluZGV4T2YoYi5jaGFyQXQoZC0xKSk8PDIqKGQlNCksaD1mLmluZGV4T2YoYi5jaGFyQXQoZCkpPj4+Ni0yKihkJTQpO2NbYT4+PjJdfD0oZ3xoKTw8MjQtOCooYSU0KTthKyt9cmV0dXJuIGouY3JlYXRlKGMsYSl9LF9tYXA6XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwifX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgbWQ1LmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbihFKXtmdW5jdGlvbiBoKGEsZixnLGoscCxoLGspe2E9YSsoZiZnfH5mJmopK3AraztyZXR1cm4oYTw8aHxhPj4+MzItaCkrZn1mdW5jdGlvbiBrKGEsZixnLGoscCxoLGspe2E9YSsoZiZqfGcmfmopK3AraztyZXR1cm4oYTw8aHxhPj4+MzItaCkrZn1mdW5jdGlvbiBsKGEsZixnLGosaCxrLGwpe2E9YSsoZl5nXmopK2grbDtyZXR1cm4oYTw8a3xhPj4+MzItaykrZn1mdW5jdGlvbiBuKGEsZixnLGosaCxrLGwpe2E9YSsoZ14oZnx+aikpK2grbDtyZXR1cm4oYTw8a3xhPj4+MzItaykrZn1mb3IodmFyIHI9Q3J5cHRvSlMscT1yLmxpYixGPXEuV29yZEFycmF5LHM9cS5IYXNoZXIscT1yLmFsZ28sYT1bXSx0PTA7NjQ+dDt0KyspYVt0XT00Mjk0OTY3Mjk2KkUuYWJzKEUuc2luKHQrMSkpfDA7cT1xLk1ENT1zLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyBGLmluaXQoWzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OF0pfSxcbl9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihtLGYpe2Zvcih2YXIgZz0wOzE2Pmc7ZysrKXt2YXIgaj1mK2cscD1tW2pdO21bal09KHA8PDh8cD4+PjI0KSYxNjcxMTkzNXwocDw8MjR8cD4+PjgpJjQyNzgyNTUzNjB9dmFyIGc9dGhpcy5faGFzaC53b3JkcyxqPW1bZiswXSxwPW1bZisxXSxxPW1bZisyXSxyPW1bZiszXSxzPW1bZis0XSx0PW1bZis1XSx1PW1bZis2XSx2PW1bZis3XSx3PW1bZis4XSx4PW1bZis5XSx5PW1bZisxMF0sej1tW2YrMTFdLEE9bVtmKzEyXSxCPW1bZisxM10sQz1tW2YrMTRdLEQ9bVtmKzE1XSxiPWdbMF0sYz1nWzFdLGQ9Z1syXSxlPWdbM10sYj1oKGIsYyxkLGUsaiw3LGFbMF0pLGU9aChlLGIsYyxkLHAsMTIsYVsxXSksZD1oKGQsZSxiLGMscSwxNyxhWzJdKSxjPWgoYyxkLGUsYixyLDIyLGFbM10pLGI9aChiLGMsZCxlLHMsNyxhWzRdKSxlPWgoZSxiLGMsZCx0LDEyLGFbNV0pLGQ9aChkLGUsYixjLHUsMTcsYVs2XSksYz1oKGMsZCxlLGIsdiwyMixhWzddKSxcbmI9aChiLGMsZCxlLHcsNyxhWzhdKSxlPWgoZSxiLGMsZCx4LDEyLGFbOV0pLGQ9aChkLGUsYixjLHksMTcsYVsxMF0pLGM9aChjLGQsZSxiLHosMjIsYVsxMV0pLGI9aChiLGMsZCxlLEEsNyxhWzEyXSksZT1oKGUsYixjLGQsQiwxMixhWzEzXSksZD1oKGQsZSxiLGMsQywxNyxhWzE0XSksYz1oKGMsZCxlLGIsRCwyMixhWzE1XSksYj1rKGIsYyxkLGUscCw1LGFbMTZdKSxlPWsoZSxiLGMsZCx1LDksYVsxN10pLGQ9ayhkLGUsYixjLHosMTQsYVsxOF0pLGM9ayhjLGQsZSxiLGosMjAsYVsxOV0pLGI9ayhiLGMsZCxlLHQsNSxhWzIwXSksZT1rKGUsYixjLGQseSw5LGFbMjFdKSxkPWsoZCxlLGIsYyxELDE0LGFbMjJdKSxjPWsoYyxkLGUsYixzLDIwLGFbMjNdKSxiPWsoYixjLGQsZSx4LDUsYVsyNF0pLGU9ayhlLGIsYyxkLEMsOSxhWzI1XSksZD1rKGQsZSxiLGMsciwxNCxhWzI2XSksYz1rKGMsZCxlLGIsdywyMCxhWzI3XSksYj1rKGIsYyxkLGUsQiw1LGFbMjhdKSxlPWsoZSxiLFxuYyxkLHEsOSxhWzI5XSksZD1rKGQsZSxiLGMsdiwxNCxhWzMwXSksYz1rKGMsZCxlLGIsQSwyMCxhWzMxXSksYj1sKGIsYyxkLGUsdCw0LGFbMzJdKSxlPWwoZSxiLGMsZCx3LDExLGFbMzNdKSxkPWwoZCxlLGIsYyx6LDE2LGFbMzRdKSxjPWwoYyxkLGUsYixDLDIzLGFbMzVdKSxiPWwoYixjLGQsZSxwLDQsYVszNl0pLGU9bChlLGIsYyxkLHMsMTEsYVszN10pLGQ9bChkLGUsYixjLHYsMTYsYVszOF0pLGM9bChjLGQsZSxiLHksMjMsYVszOV0pLGI9bChiLGMsZCxlLEIsNCxhWzQwXSksZT1sKGUsYixjLGQsaiwxMSxhWzQxXSksZD1sKGQsZSxiLGMsciwxNixhWzQyXSksYz1sKGMsZCxlLGIsdSwyMyxhWzQzXSksYj1sKGIsYyxkLGUseCw0LGFbNDRdKSxlPWwoZSxiLGMsZCxBLDExLGFbNDVdKSxkPWwoZCxlLGIsYyxELDE2LGFbNDZdKSxjPWwoYyxkLGUsYixxLDIzLGFbNDddKSxiPW4oYixjLGQsZSxqLDYsYVs0OF0pLGU9bihlLGIsYyxkLHYsMTAsYVs0OV0pLGQ9bihkLGUsYixjLFxuQywxNSxhWzUwXSksYz1uKGMsZCxlLGIsdCwyMSxhWzUxXSksYj1uKGIsYyxkLGUsQSw2LGFbNTJdKSxlPW4oZSxiLGMsZCxyLDEwLGFbNTNdKSxkPW4oZCxlLGIsYyx5LDE1LGFbNTRdKSxjPW4oYyxkLGUsYixwLDIxLGFbNTVdKSxiPW4oYixjLGQsZSx3LDYsYVs1Nl0pLGU9bihlLGIsYyxkLEQsMTAsYVs1N10pLGQ9bihkLGUsYixjLHUsMTUsYVs1OF0pLGM9bihjLGQsZSxiLEIsMjEsYVs1OV0pLGI9bihiLGMsZCxlLHMsNixhWzYwXSksZT1uKGUsYixjLGQseiwxMCxhWzYxXSksZD1uKGQsZSxiLGMscSwxNSxhWzYyXSksYz1uKGMsZCxlLGIseCwyMSxhWzYzXSk7Z1swXT1nWzBdK2J8MDtnWzFdPWdbMV0rY3wwO2dbMl09Z1syXStkfDA7Z1szXT1nWzNdK2V8MH0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9kYXRhLGY9YS53b3JkcyxnPTgqdGhpcy5fbkRhdGFCeXRlcyxqPTgqYS5zaWdCeXRlcztmW2o+Pj41XXw9MTI4PDwyNC1qJTMyO3ZhciBoPUUuZmxvb3IoZy9cbjQyOTQ5NjcyOTYpO2ZbKGorNjQ+Pj45PDw0KSsxNV09KGg8PDh8aD4+PjI0KSYxNjcxMTkzNXwoaDw8MjR8aD4+PjgpJjQyNzgyNTUzNjA7Zlsoais2ND4+Pjk8PDQpKzE0XT0oZzw8OHxnPj4+MjQpJjE2NzExOTM1fChnPDwyNHxnPj4+OCkmNDI3ODI1NTM2MDthLnNpZ0J5dGVzPTQqKGYubGVuZ3RoKzEpO3RoaXMuX3Byb2Nlc3MoKTthPXRoaXMuX2hhc2g7Zj1hLndvcmRzO2ZvcihnPTA7ND5nO2crKylqPWZbZ10sZltnXT0oajw8OHxqPj4+MjQpJjE2NzExOTM1fChqPDwyNHxqPj4+OCkmNDI3ODI1NTM2MDtyZXR1cm4gYX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYT1zLmNsb25lLmNhbGwodGhpcyk7YS5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGF9fSk7ci5NRDU9cy5fY3JlYXRlSGVscGVyKHEpO3IuSG1hY01ENT1zLl9jcmVhdGVIbWFjSGVscGVyKHEpfSkoTWF0aCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhMS1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGs9Q3J5cHRvSlMsYj1rLmxpYixtPWIuV29yZEFycmF5LGw9Yi5IYXNoZXIsZD1bXSxiPWsuYWxnby5TSEExPWwuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IG0uaW5pdChbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKG4scCl7Zm9yKHZhciBhPXRoaXMuX2hhc2gud29yZHMsZT1hWzBdLGY9YVsxXSxoPWFbMl0saj1hWzNdLGI9YVs0XSxjPTA7ODA+YztjKyspe2lmKDE2PmMpZFtjXT1uW3ArY118MDtlbHNle3ZhciBnPWRbYy0zXV5kW2MtOF1eZFtjLTE0XV5kW2MtMTZdO2RbY109Zzw8MXxnPj4+MzF9Zz0oZTw8NXxlPj4+MjcpK2IrZFtjXTtnPTIwPmM/ZysoKGYmaHx+ZiZqKSsxNTE4NTAwMjQ5KTo0MD5jP2crKChmXmheaikrMTg1OTc3NTM5Myk6NjA+Yz9nKygoZiZofGYmanxoJmopLTE4OTQwMDc1ODgpOmcrKChmXmheXG5qKS04OTk0OTc1MTQpO2I9ajtqPWg7aD1mPDwzMHxmPj4+MjtmPWU7ZT1nfWFbMF09YVswXStlfDA7YVsxXT1hWzFdK2Z8MDthWzJdPWFbMl0raHwwO2FbM109YVszXStqfDA7YVs0XT1hWzRdK2J8MH0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9kYXRhLGQ9Yi53b3JkcyxhPTgqdGhpcy5fbkRhdGFCeXRlcyxlPTgqYi5zaWdCeXRlcztkW2U+Pj41XXw9MTI4PDwyNC1lJTMyO2RbKGUrNjQ+Pj45PDw0KSsxNF09TWF0aC5mbG9vcihhLzQyOTQ5NjcyOTYpO2RbKGUrNjQ+Pj45PDw0KSsxNV09YTtiLnNpZ0J5dGVzPTQqZC5sZW5ndGg7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzLl9oYXNofSxjbG9uZTpmdW5jdGlvbigpe3ZhciBiPWwuY2xvbmUuY2FsbCh0aGlzKTtiLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gYn19KTtrLlNIQTE9bC5fY3JlYXRlSGVscGVyKGIpO2suSG1hY1NIQTE9bC5fY3JlYXRlSG1hY0hlbHBlcihiKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhMjU2LW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oayl7Zm9yKHZhciBnPUNyeXB0b0pTLGg9Zy5saWIsdj1oLldvcmRBcnJheSxqPWguSGFzaGVyLGg9Zy5hbGdvLHM9W10sdD1bXSx1PWZ1bmN0aW9uKHEpe3JldHVybiA0Mjk0OTY3Mjk2KihxLShxfDApKXwwfSxsPTIsYj0wOzY0PmI7KXt2YXIgZDthOntkPWw7Zm9yKHZhciB3PWsuc3FydChkKSxyPTI7cjw9dztyKyspaWYoIShkJXIpKXtkPSExO2JyZWFrIGF9ZD0hMH1kJiYoOD5iJiYoc1tiXT11KGsucG93KGwsMC41KSkpLHRbYl09dShrLnBvdyhsLDEvMykpLGIrKyk7bCsrfXZhciBuPVtdLGg9aC5TSEEyNTY9ai5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgdi5pbml0KHMuc2xpY2UoMCkpfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24ocSxoKXtmb3IodmFyIGE9dGhpcy5faGFzaC53b3JkcyxjPWFbMF0sZD1hWzFdLGI9YVsyXSxrPWFbM10sZj1hWzRdLGc9YVs1XSxqPWFbNl0sbD1hWzddLGU9MDs2ND5lO2UrKyl7aWYoMTY+ZSluW2VdPVxucVtoK2VdfDA7ZWxzZXt2YXIgbT1uW2UtMTVdLHA9bltlLTJdO25bZV09KChtPDwyNXxtPj4+NyleKG08PDE0fG0+Pj4xOClebT4+PjMpK25bZS03XSsoKHA8PDE1fHA+Pj4xNyleKHA8PDEzfHA+Pj4xOSlecD4+PjEwKStuW2UtMTZdfW09bCsoKGY8PDI2fGY+Pj42KV4oZjw8MjF8Zj4+PjExKV4oZjw8N3xmPj4+MjUpKSsoZiZnXn5mJmopK3RbZV0rbltlXTtwPSgoYzw8MzB8Yz4+PjIpXihjPDwxOXxjPj4+MTMpXihjPDwxMHxjPj4+MjIpKSsoYyZkXmMmYl5kJmIpO2w9ajtqPWc7Zz1mO2Y9ayttfDA7az1iO2I9ZDtkPWM7Yz1tK3B8MH1hWzBdPWFbMF0rY3wwO2FbMV09YVsxXStkfDA7YVsyXT1hWzJdK2J8MDthWzNdPWFbM10ra3wwO2FbNF09YVs0XStmfDA7YVs1XT1hWzVdK2d8MDthWzZdPWFbNl0ranwwO2FbN109YVs3XStsfDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5fZGF0YSxiPWQud29yZHMsYT04KnRoaXMuX25EYXRhQnl0ZXMsYz04KmQuc2lnQnl0ZXM7XG5iW2M+Pj41XXw9MTI4PDwyNC1jJTMyO2JbKGMrNjQ+Pj45PDw0KSsxNF09ay5mbG9vcihhLzQyOTQ5NjcyOTYpO2JbKGMrNjQ+Pj45PDw0KSsxNV09YTtkLnNpZ0J5dGVzPTQqYi5sZW5ndGg7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzLl9oYXNofSxjbG9uZTpmdW5jdGlvbigpe3ZhciBiPWouY2xvbmUuY2FsbCh0aGlzKTtiLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gYn19KTtnLlNIQTI1Nj1qLl9jcmVhdGVIZWxwZXIoaCk7Zy5IbWFjU0hBMjU2PWouX2NyZWF0ZUhtYWNIZWxwZXIoaCl9KShNYXRoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGEyMjQtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe3ZhciBiPUNyeXB0b0pTLGQ9Yi5saWIuV29yZEFycmF5LGE9Yi5hbGdvLGM9YS5TSEEyNTYsYT1hLlNIQTIyND1jLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyBkLmluaXQoWzMyMzgzNzEwMzIsOTE0MTUwNjYzLDgxMjcwMjk5OSw0MTQ0OTEyNjk3LDQyOTA3NzU4NTcsMTc1MDYwMzAyNSwxNjk0MDc2ODM5LDMyMDQwNzU0MjhdKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT1jLl9kb0ZpbmFsaXplLmNhbGwodGhpcyk7YS5zaWdCeXRlcy09NDtyZXR1cm4gYX19KTtiLlNIQTIyND1jLl9jcmVhdGVIZWxwZXIoYSk7Yi5IbWFjU0hBMjI0PWMuX2NyZWF0ZUhtYWNIZWxwZXIoYSl9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTUxMi1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3JldHVybiBkLmNyZWF0ZS5hcHBseShkLGFyZ3VtZW50cyl9Zm9yKHZhciBuPUNyeXB0b0pTLHI9bi5saWIuSGFzaGVyLGU9bi54NjQsZD1lLldvcmQsVD1lLldvcmRBcnJheSxlPW4uYWxnbyxlYT1bYSgxMTE2MzUyNDA4LDM2MDk3Njc0NTgpLGEoMTg5OTQ0NzQ0MSw2MDI4OTE3MjUpLGEoMzA0OTMyMzQ3MSwzOTY0NDg0Mzk5KSxhKDM5MjEwMDk1NzMsMjE3MzI5NTU0OCksYSg5NjE5ODcxNjMsNDA4MTYyODQ3MiksYSgxNTA4OTcwOTkzLDMwNTM4MzQyNjUpLGEoMjQ1MzYzNTc0OCwyOTM3NjcxNTc5KSxhKDI4NzA3NjMyMjEsMzY2NDYwOTU2MCksYSgzNjI0MzgxMDgwLDI3MzQ4ODMzOTQpLGEoMzEwNTk4NDAxLDExNjQ5OTY1NDIpLGEoNjA3MjI1Mjc4LDEzMjM2MTA3NjQpLGEoMTQyNjg4MTk4NywzNTkwMzA0OTk0KSxhKDE5MjUwNzgzODgsNDA2ODE4MjM4MyksYSgyMTYyMDc4MjA2LDk5MTMzNjExMyksYSgyNjE0ODg4MTAzLDYzMzgwMzMxNyksXG5hKDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCksYSgzODM1MzkwNDAxLDI2NjY2MTM0NTgpLGEoNDAyMjIyNDc3NCw5NDQ3MTExMzkpLGEoMjY0MzQ3MDc4LDIzNDEyNjI3NzMpLGEoNjA0ODA3NjI4LDIwMDc4MDA5MzMpLGEoNzcwMjU1OTgzLDE0OTU5OTA5MDEpLGEoMTI0OTE1MDEyMiwxODU2NDMxMjM1KSxhKDE1NTUwODE2OTIsMzE3NTIxODEzMiksYSgxOTk2MDY0OTg2LDIxOTg5NTA4MzcpLGEoMjU1NDIyMDg4MiwzOTk5NzE5MzM5KSxhKDI4MjE4MzQzNDksNzY2Nzg0MDE2KSxhKDI5NTI5OTY4MDgsMjU2NjU5NDg3OSksYSgzMjEwMzEzNjcxLDMyMDMzMzc5NTYpLGEoMzMzNjU3MTg5MSwxMDM0NDU3MDI2KSxhKDM1ODQ1Mjg3MTEsMjQ2Njk0ODkwMSksYSgxMTM5MjY5OTMsMzc1ODMyNjM4MyksYSgzMzgyNDE4OTUsMTY4NzE3OTM2KSxhKDY2NjMwNzIwNSwxMTg4MTc5OTY0KSxhKDc3MzUyOTkxMiwxNTQ2MDQ1NzM0KSxhKDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSksYSgxMzk2MTgyMjkxLFxuMjY0MzgzMzgyMyksYSgxNjk1MTgzNzAwLDIzNDM1MjczOTApLGEoMTk4NjY2MTA1MSwxMDE0NDc3NDgwKSxhKDIxNzcwMjYzNTAsMTIwNjc1OTE0MiksYSgyNDU2OTU2MDM3LDM0NDA3NzYyNyksYSgyNzMwNDg1OTIxLDEyOTA4NjM0NjApLGEoMjgyMDMwMjQxMSwzMTU4NDU0MjczKSxhKDMyNTk3MzA4MDAsMzUwNTk1MjY1NyksYSgzMzQ1NzY0NzcxLDEwNjIxNzAwOCksYSgzNTE2MDY1ODE3LDM2MDYwMDgzNDQpLGEoMzYwMDM1MjgwNCwxNDMyNzI1Nzc2KSxhKDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCksYSgyNzU0MjMzNDQsODUxMTY5NzIwKSxhKDQzMDIyNzczNCwzMTAwODIzNzUyKSxhKDUwNjk0ODYxNiwxMzYzMjU4MTk1KSxhKDY1OTA2MDU1NiwzNzUwNjg1NTkzKSxhKDg4Mzk5Nzg3NywzNzg1MDUwMjgwKSxhKDk1ODEzOTU3MSwzMzE4MzA3NDI3KSxhKDEzMjI4MjIyMTgsMzgxMjcyMzQwMyksYSgxNTM3MDAyMDYzLDIwMDMwMzQ5OTUpLGEoMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5KSxcbmEoMTk1NTU2MjIyMiwxNTc1OTkwMDEyKSxhKDIwMjQxMDQ4MTUsMTEyNTU5MjkyOCksYSgyMjI3NzMwNDUyLDI3MTY5MDQzMDYpLGEoMjM2MTg1MjQyNCw0NDI3NzYwNDQpLGEoMjQyODQzNjQ3NCw1OTM2OTgzNDQpLGEoMjc1NjczNDE4NywzNzMzMTEwMjQ5KSxhKDMyMDQwMzE0NzksMjk5OTM1MTU3MyksYSgzMzI5MzI1Mjk4LDM4MTU5MjA0MjcpLGEoMzM5MTU2OTYxNCwzOTI4MzgzOTAwKSxhKDM1MTUyNjcyNzEsNTY2MjgwNzExKSxhKDM5NDAxODc2MDYsMzQ1NDA2OTUzNCksYSg0MTE4NjMwMjcxLDQwMDAyMzk5OTIpLGEoMTE2NDE4NDc0LDE5MTQxMzg1NTQpLGEoMTc0MjkyNDIxLDI3MzEwNTUyNzApLGEoMjg5MzgwMzU2LDMyMDM5OTMwMDYpLGEoNDYwMzkzMjY5LDMyMDYyMDMxNSksYSg2ODU0NzE3MzMsNTg3NDk2ODM2KSxhKDg1MjE0Mjk3MSwxMDg2NzkyODUxKSxhKDEwMTcwMzYyOTgsMzY1NTQzMTAwKSxhKDExMjYwMDA1ODAsMjYxODI5NzY3NiksYSgxMjg4MDMzNDcwLFxuMzQwOTg1NTE1OCksYSgxNTAxNTA1OTQ4LDQyMzQ1MDk4NjYpLGEoMTYwNzE2NzkxNSw5ODcxNjc0NjgpLGEoMTgxNjQwMjMxNiwxMjQ2MTg5NTkxKV0sdj1bXSx3PTA7ODA+dzt3Kyspdlt3XT1hKCk7ZT1lLlNIQTUxMj1yLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyBULmluaXQoW25ldyBkLmluaXQoMTc3OTAzMzcwMyw0MDg5MjM1NzIwKSxuZXcgZC5pbml0KDMxNDQxMzQyNzcsMjIyNzg3MzU5NSksbmV3IGQuaW5pdCgxMDEzOTA0MjQyLDQyNzExNzU3MjMpLG5ldyBkLmluaXQoMjc3MzQ4MDc2MiwxNTk1NzUwMTI5KSxuZXcgZC5pbml0KDEzNTk4OTMxMTksMjkxNzU2NTEzNyksbmV3IGQuaW5pdCgyNjAwODIyOTI0LDcyNTUxMTE5OSksbmV3IGQuaW5pdCg1Mjg3MzQ2MzUsNDIxNTM4OTU0NyksbmV3IGQuaW5pdCgxNTQxNDU5MjI1LDMyNzAzMzIwOSldKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEsZCl7Zm9yKHZhciBmPXRoaXMuX2hhc2gud29yZHMsXG5GPWZbMF0sZT1mWzFdLG49ZlsyXSxyPWZbM10sRz1mWzRdLEg9Zls1XSxJPWZbNl0sZj1mWzddLHc9Ri5oaWdoLEo9Ri5sb3csWD1lLmhpZ2gsSz1lLmxvdyxZPW4uaGlnaCxMPW4ubG93LFo9ci5oaWdoLE09ci5sb3csJD1HLmhpZ2gsTj1HLmxvdyxhYT1ILmhpZ2gsTz1ILmxvdyxiYT1JLmhpZ2gsUD1JLmxvdyxjYT1mLmhpZ2gsUT1mLmxvdyxrPXcsZz1KLHo9WCx4PUssQT1ZLHk9TCxVPVosQj1NLGw9JCxoPU4sUj1hYSxDPU8sUz1iYSxEPVAsVj1jYSxFPVEsbT0wOzgwPm07bSsrKXt2YXIgcz12W21dO2lmKDE2Pm0pdmFyIGo9cy5oaWdoPWFbZCsyKm1dfDAsYj1zLmxvdz1hW2QrMiptKzFdfDA7ZWxzZXt2YXIgaj12W20tMTVdLGI9ai5oaWdoLHA9ai5sb3csaj0oYj4+PjF8cDw8MzEpXihiPj4+OHxwPDwyNCleYj4+PjcscD0ocD4+PjF8Yjw8MzEpXihwPj4+OHxiPDwyNCleKHA+Pj43fGI8PDI1KSx1PXZbbS0yXSxiPXUuaGlnaCxjPXUubG93LHU9KGI+Pj4xOXxjPDwxMyleKGI8PFxuM3xjPj4+MjkpXmI+Pj42LGM9KGM+Pj4xOXxiPDwxMyleKGM8PDN8Yj4+PjI5KV4oYz4+PjZ8Yjw8MjYpLGI9dlttLTddLFc9Yi5oaWdoLHQ9dlttLTE2XSxxPXQuaGlnaCx0PXQubG93LGI9cCtiLmxvdyxqPWorVysoYj4+PjA8cD4+PjA/MTowKSxiPWIrYyxqPWordSsoYj4+PjA8Yz4+PjA/MTowKSxiPWIrdCxqPWorcSsoYj4+PjA8dD4+PjA/MTowKTtzLmhpZ2g9ajtzLmxvdz1ifXZhciBXPWwmUl5+bCZTLHQ9aCZDXn5oJkQscz1rJnpeayZBXnomQSxUPWcmeF5nJnleeCZ5LHA9KGs+Pj4yOHxnPDw0KV4oazw8MzB8Zz4+PjIpXihrPDwyNXxnPj4+NyksdT0oZz4+PjI4fGs8PDQpXihnPDwzMHxrPj4+MileKGc8PDI1fGs+Pj43KSxjPWVhW21dLGZhPWMuaGlnaCxkYT1jLmxvdyxjPUUrKChoPj4+MTR8bDw8MTgpXihoPj4+MTh8bDw8MTQpXihoPDwyM3xsPj4+OSkpLHE9VisoKGw+Pj4xNHxoPDwxOCleKGw+Pj4xOHxoPDwxNCleKGw8PDIzfGg+Pj45KSkrKGM+Pj4wPEU+Pj4wPzE6XG4wKSxjPWMrdCxxPXErVysoYz4+PjA8dD4+PjA/MTowKSxjPWMrZGEscT1xK2ZhKyhjPj4+MDxkYT4+PjA/MTowKSxjPWMrYixxPXEraisoYz4+PjA8Yj4+PjA/MTowKSxiPXUrVCxzPXArcysoYj4+PjA8dT4+PjA/MTowKSxWPVMsRT1ELFM9UixEPUMsUj1sLEM9aCxoPUIrY3wwLGw9VStxKyhoPj4+MDxCPj4+MD8xOjApfDAsVT1BLEI9eSxBPXoseT14LHo9ayx4PWcsZz1jK2J8MCxrPXErcysoZz4+PjA8Yz4+PjA/MTowKXwwfUo9Ri5sb3c9SitnO0YuaGlnaD13K2srKEo+Pj4wPGc+Pj4wPzE6MCk7Sz1lLmxvdz1LK3g7ZS5oaWdoPVgreisoSz4+PjA8eD4+PjA/MTowKTtMPW4ubG93PUwreTtuLmhpZ2g9WStBKyhMPj4+MDx5Pj4+MD8xOjApO009ci5sb3c9TStCO3IuaGlnaD1aK1UrKE0+Pj4wPEI+Pj4wPzE6MCk7Tj1HLmxvdz1OK2g7Ry5oaWdoPSQrbCsoTj4+PjA8aD4+PjA/MTowKTtPPUgubG93PU8rQztILmhpZ2g9YWErUisoTz4+PjA8Qz4+PjA/MTowKTtQPUkubG93PVArRDtcbkkuaGlnaD1iYStTKyhQPj4+MDxEPj4+MD8xOjApO1E9Zi5sb3c9UStFO2YuaGlnaD1jYStWKyhRPj4+MDxFPj4+MD8xOjApfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2RhdGEsZD1hLndvcmRzLGY9OCp0aGlzLl9uRGF0YUJ5dGVzLGU9OCphLnNpZ0J5dGVzO2RbZT4+PjVdfD0xMjg8PDI0LWUlMzI7ZFsoZSsxMjg+Pj4xMDw8NSkrMzBdPU1hdGguZmxvb3IoZi80Mjk0OTY3Mjk2KTtkWyhlKzEyOD4+PjEwPDw1KSszMV09ZjthLnNpZ0J5dGVzPTQqZC5sZW5ndGg7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzLl9oYXNoLnRvWDMyKCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGE9ci5jbG9uZS5jYWxsKHRoaXMpO2EuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBhfSxibG9ja1NpemU6MzJ9KTtuLlNIQTUxMj1yLl9jcmVhdGVIZWxwZXIoZSk7bi5IbWFjU0hBNTEyPXIuX2NyZWF0ZUhtYWNIZWxwZXIoZSl9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTM4NC1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGM9Q3J5cHRvSlMsYT1jLng2NCxiPWEuV29yZCxlPWEuV29yZEFycmF5LGE9Yy5hbGdvLGQ9YS5TSEE1MTIsYT1hLlNIQTM4ND1kLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyBlLmluaXQoW25ldyBiLmluaXQoMzQxODA3MDM2NSwzMjM4MzcxMDMyKSxuZXcgYi5pbml0KDE2NTQyNzAyNTAsOTE0MTUwNjYzKSxuZXcgYi5pbml0KDI0Mzg1MjkzNzAsODEyNzAyOTk5KSxuZXcgYi5pbml0KDM1NTQ2MjM2MCw0MTQ0OTEyNjk3KSxuZXcgYi5pbml0KDE3MzE0MDU0MTUsNDI5MDc3NTg1NyksbmV3IGIuaW5pdCgyMzk0MTgwMjMxLDE3NTA2MDMwMjUpLG5ldyBiLmluaXQoMzY3NTAwODUyNSwxNjk0MDc2ODM5KSxuZXcgYi5pbml0KDEyMDMwNjI4MTMsMzIwNDA3NTQyOCldKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT1kLl9kb0ZpbmFsaXplLmNhbGwodGhpcyk7YS5zaWdCeXRlcy09MTY7cmV0dXJuIGF9fSk7Yy5TSEEzODQ9XG5kLl9jcmVhdGVIZWxwZXIoYSk7Yy5IbWFjU0hBMzg0PWQuX2NyZWF0ZUhtYWNIZWxwZXIoYSl9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHJpcGVtZDE2MC1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuLypcblxuKGMpIDIwMTIgYnkgQ2VkcmljIE1lc25pbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG4oZnVuY3Rpb24oKXt2YXIgcT1DcnlwdG9KUyxkPXEubGliLG49ZC5Xb3JkQXJyYXkscD1kLkhhc2hlcixkPXEuYWxnbyx4PW4uY3JlYXRlKFswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDcsNCwxMywxLDEwLDYsMTUsMywxMiwwLDksNSwyLDE0LDExLDgsMywxMCwxNCw0LDksMTUsOCwxLDIsNywwLDYsMTMsMTEsNSwxMiwxLDksMTEsMTAsMCw4LDEyLDQsMTMsMyw3LDE1LDE0LDUsNiwyLDQsMCw1LDksNywxMiwyLDEwLDE0LDEsMyw4LDExLDYsMTUsMTNdKSx5PW4uY3JlYXRlKFs1LDE0LDcsMCw5LDIsMTEsNCwxMyw2LDE1LDgsMSwxMCwzLDEyLDYsMTEsMyw3LDAsMTMsNSwxMCwxNCwxNSw4LDEyLDQsOSwxLDIsMTUsNSwxLDMsNywxNCw2LDksMTEsOCwxMiwyLDEwLDAsNCwxMyw4LDYsNCwxLDMsMTEsMTUsMCw1LDEyLDIsMTMsOSw3LDEwLDE0LDEyLDE1LDEwLDQsMSw1LDgsNyw2LDIsMTMsMTQsMCwzLDksMTFdKSx6PW4uY3JlYXRlKFsxMSwxNCwxNSwxMixcbjUsOCw3LDksMTEsMTMsMTQsMTUsNiw3LDksOCw3LDYsOCwxMywxMSw5LDcsMTUsNywxMiwxNSw5LDExLDcsMTMsMTIsMTEsMTMsNiw3LDE0LDksMTMsMTUsMTQsOCwxMyw2LDUsMTIsNyw1LDExLDEyLDE0LDE1LDE0LDE1LDksOCw5LDE0LDUsNiw4LDYsNSwxMiw5LDE1LDUsMTEsNiw4LDEzLDEyLDUsMTIsMTMsMTQsMTEsOCw1LDZdKSxBPW4uY3JlYXRlKFs4LDksOSwxMSwxMywxNSwxNSw1LDcsNyw4LDExLDE0LDE0LDEyLDYsOSwxMywxNSw3LDEyLDgsOSwxMSw3LDcsMTIsNyw2LDE1LDEzLDExLDksNywxNSwxMSw4LDYsNiwxNCwxMiwxMyw1LDE0LDEzLDEzLDcsNSwxNSw1LDgsMTEsMTQsMTQsNiwxNCw2LDksMTIsOSwxMiw1LDE1LDgsOCw1LDEyLDksMTIsNSwxNCw2LDgsMTMsNiw1LDE1LDEzLDExLDExXSksQj1uLmNyZWF0ZShbMCwxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsMjQwMDk1OTcwOCwyODQwODUzODM4XSksQz1uLmNyZWF0ZShbMTM1MjgyOTkyNiwxNTQ4NjAzNjg0LDE4MzYwNzI2OTEsXG4yMDUzOTk0MjE3LDBdKSxkPWQuUklQRU1EMTYwPXAuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bi5jcmVhdGUoWzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OCwzMjg1Mzc3NTIwXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihlLHYpe2Zvcih2YXIgYj0wOzE2PmI7YisrKXt2YXIgYz12K2IsZj1lW2NdO2VbY109KGY8PDh8Zj4+PjI0KSYxNjcxMTkzNXwoZjw8MjR8Zj4+PjgpJjQyNzgyNTUzNjB9dmFyIGM9dGhpcy5faGFzaC53b3JkcyxmPUIud29yZHMsZD1DLndvcmRzLG49eC53b3JkcyxxPXkud29yZHMscD16LndvcmRzLHc9QS53b3Jkcyx0LGcsaCxqLHIsdSxrLGwsbSxzO3U9dD1jWzBdO2s9Zz1jWzFdO2w9aD1jWzJdO209aj1jWzNdO3M9cj1jWzRdO2Zvcih2YXIgYSxiPTA7ODA+YjtiKz0xKWE9dCtlW3YrbltiXV18MCxhPTE2PmI/YSsoKGdeaF5qKStmWzBdKTozMj5iP2ErKChnJmh8fmcmaikrZlsxXSk6NDg+Yj9cbmErKCgoZ3x+aCleaikrZlsyXSk6NjQ+Yj9hKygoZyZqfGgmfmopK2ZbM10pOmErKChnXihofH5qKSkrZls0XSksYXw9MCxhPWE8PHBbYl18YT4+PjMyLXBbYl0sYT1hK3J8MCx0PXIscj1qLGo9aDw8MTB8aD4+PjIyLGg9ZyxnPWEsYT11K2VbditxW2JdXXwwLGE9MTY+Yj9hKygoa14obHx+bSkpK2RbMF0pOjMyPmI/YSsoKGsmbXxsJn5tKStkWzFdKTo0OD5iP2ErKCgoa3x+bClebSkrZFsyXSk6NjQ+Yj9hKygoayZsfH5rJm0pK2RbM10pOmErKChrXmxebSkrZFs0XSksYXw9MCxhPWE8PHdbYl18YT4+PjMyLXdbYl0sYT1hK3N8MCx1PXMscz1tLG09bDw8MTB8bD4+PjIyLGw9ayxrPWE7YT1jWzFdK2grbXwwO2NbMV09Y1syXStqK3N8MDtjWzJdPWNbM10rcit1fDA7Y1szXT1jWzRdK3Qra3wwO2NbNF09Y1swXStnK2x8MDtjWzBdPWF9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fZGF0YSxkPWUud29yZHMsYj04KnRoaXMuX25EYXRhQnl0ZXMsYz04KmUuc2lnQnl0ZXM7XG5kW2M+Pj41XXw9MTI4PDwyNC1jJTMyO2RbKGMrNjQ+Pj45PDw0KSsxNF09KGI8PDh8Yj4+PjI0KSYxNjcxMTkzNXwoYjw8MjR8Yj4+PjgpJjQyNzgyNTUzNjA7ZS5zaWdCeXRlcz00KihkLmxlbmd0aCsxKTt0aGlzLl9wcm9jZXNzKCk7ZT10aGlzLl9oYXNoO2Q9ZS53b3Jkcztmb3IoYj0wOzU+YjtiKyspYz1kW2JdLGRbYl09KGM8PDh8Yz4+PjI0KSYxNjcxMTkzNXwoYzw8MjR8Yz4+PjgpJjQyNzgyNTUzNjA7cmV0dXJuIGV9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGQ9cC5jbG9uZS5jYWxsKHRoaXMpO2QuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBkfX0pO3EuUklQRU1EMTYwPXAuX2NyZWF0ZUhlbHBlcihkKTtxLkhtYWNSSVBFTUQxNjA9cC5fY3JlYXRlSG1hY0hlbHBlcihkKX0pKE1hdGgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIGhtYWMuanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGM9Q3J5cHRvSlMsaz1jLmVuYy5VdGY4O2MuYWxnby5ITUFDPWMubGliLkJhc2UuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYil7YT10aGlzLl9oYXNoZXI9bmV3IGEuaW5pdDtcInN0cmluZ1wiPT10eXBlb2YgYiYmKGI9ay5wYXJzZShiKSk7dmFyIGM9YS5ibG9ja1NpemUsZT00KmM7Yi5zaWdCeXRlcz5lJiYoYj1hLmZpbmFsaXplKGIpKTtiLmNsYW1wKCk7Zm9yKHZhciBmPXRoaXMuX29LZXk9Yi5jbG9uZSgpLGc9dGhpcy5faUtleT1iLmNsb25lKCksaD1mLndvcmRzLGo9Zy53b3JkcyxkPTA7ZDxjO2QrKyloW2RdXj0xNTQ5NTU2ODI4LGpbZF1ePTkwOTUyMjQ4NjtmLnNpZ0J5dGVzPWcuc2lnQnl0ZXM9ZTt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5faGFzaGVyO2EucmVzZXQoKTthLnVwZGF0ZSh0aGlzLl9pS2V5KX0sdXBkYXRlOmZ1bmN0aW9uKGEpe3RoaXMuX2hhc2hlci51cGRhdGUoYSk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKGEpe3ZhciBiPVxudGhpcy5faGFzaGVyO2E9Yi5maW5hbGl6ZShhKTtiLnJlc2V0KCk7cmV0dXJuIGIuZmluYWxpemUodGhpcy5fb0tleS5jbG9uZSgpLmNvbmNhdChhKSl9fSl9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHBia2RmMi1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGI9Q3J5cHRvSlMsYT1iLmxpYixkPWEuQmFzZSxtPWEuV29yZEFycmF5LGE9Yi5hbGdvLHE9YS5ITUFDLGw9YS5QQktERjI9ZC5leHRlbmQoe2NmZzpkLmV4dGVuZCh7a2V5U2l6ZTo0LGhhc2hlcjphLlNIQTEsaXRlcmF0aW9uczoxfSksaW5pdDpmdW5jdGlvbihhKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQoYSl9LGNvbXB1dGU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9dGhpcy5jZmcsZj1xLmNyZWF0ZShjLmhhc2hlcixhKSxnPW0uY3JlYXRlKCksZD1tLmNyZWF0ZShbMV0pLGw9Zy53b3JkcyxyPWQud29yZHMsbj1jLmtleVNpemUsYz1jLml0ZXJhdGlvbnM7bC5sZW5ndGg8bjspe3ZhciBoPWYudXBkYXRlKGIpLmZpbmFsaXplKGQpO2YucmVzZXQoKTtmb3IodmFyIGo9aC53b3JkcyxzPWoubGVuZ3RoLGs9aCxwPTE7cDxjO3ArKyl7az1mLmZpbmFsaXplKGspO2YucmVzZXQoKTtmb3IodmFyIHQ9ay53b3JkcyxlPTA7ZTxzO2UrKylqW2VdXj10W2VdfWcuY29uY2F0KGgpO1xuclswXSsrfWcuc2lnQnl0ZXM9NCpuO3JldHVybiBnfX0pO2IuUEJLREYyPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbC5jcmVhdGUoYykuY29tcHV0ZShhLGIpfX0pKCk7XG5cbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG52YXIgYjY0bWFwPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO3ZhciBiNjRwYWQ9XCI9XCI7ZnVuY3Rpb24gaGV4MmI2NChkKXt2YXIgYjt2YXIgZTt2YXIgYT1cIlwiO2ZvcihiPTA7YiszPD1kLmxlbmd0aDtiKz0zKXtlPXBhcnNlSW50KGQuc3Vic3RyaW5nKGIsYiszKSwxNik7YSs9YjY0bWFwLmNoYXJBdChlPj42KStiNjRtYXAuY2hhckF0KGUmNjMpfWlmKGIrMT09ZC5sZW5ndGgpe2U9cGFyc2VJbnQoZC5zdWJzdHJpbmcoYixiKzEpLDE2KTthKz1iNjRtYXAuY2hhckF0KGU8PDIpfWVsc2V7aWYoYisyPT1kLmxlbmd0aCl7ZT1wYXJzZUludChkLnN1YnN0cmluZyhiLGIrMiksMTYpO2ErPWI2NG1hcC5jaGFyQXQoZT4+MikrYjY0bWFwLmNoYXJBdCgoZSYzKTw8NCl9fWlmKGI2NHBhZCl7d2hpbGUoKGEubGVuZ3RoJjMpPjApe2ErPWI2NHBhZH19cmV0dXJuIGF9ZnVuY3Rpb24gYjY0dG9oZXgoZil7dmFyIGQ9XCJcIjt2YXIgZTt2YXIgYj0wO3ZhciBjO3ZhciBhO2ZvcihlPTA7ZTxmLmxlbmd0aDsrK2Upe2lmKGYuY2hhckF0KGUpPT1iNjRwYWQpe2JyZWFrfWE9YjY0bWFwLmluZGV4T2YoZi5jaGFyQXQoZSkpO2lmKGE8MCl7Y29udGludWV9aWYoYj09MCl7ZCs9aW50MmNoYXIoYT4+Mik7Yz1hJjM7Yj0xfWVsc2V7aWYoYj09MSl7ZCs9aW50MmNoYXIoKGM8PDIpfChhPj40KSk7Yz1hJjE1O2I9Mn1lbHNle2lmKGI9PTIpe2QrPWludDJjaGFyKGMpO2QrPWludDJjaGFyKGE+PjIpO2M9YSYzO2I9M31lbHNle2QrPWludDJjaGFyKChjPDwyKXwoYT4+NCkpO2QrPWludDJjaGFyKGEmMTUpO2I9MH19fX1pZihiPT0xKXtkKz1pbnQyY2hhcihjPDwyKX1yZXR1cm4gZH1mdW5jdGlvbiBiNjR0b0JBKGUpe3ZhciBkPWI2NHRvaGV4KGUpO3ZhciBjO3ZhciBiPW5ldyBBcnJheSgpO2ZvcihjPTA7MipjPGQubGVuZ3RoOysrYyl7YltjXT1wYXJzZUludChkLnN1YnN0cmluZygyKmMsMipjKzIpLDE2KX1yZXR1cm4gYn07XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xudmFyIGRiaXRzO3ZhciBjYW5hcnk9MjQ0ODM3ODE0MDk0NTkwO3ZhciBqX2xtPSgoY2FuYXJ5JjE2Nzc3MjE1KT09MTU3MTUwNzApO2Z1bmN0aW9uIEJpZ0ludGVnZXIoZSxkLGYpe2lmKGUhPW51bGwpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXt0aGlzLmZyb21OdW1iZXIoZSxkLGYpfWVsc2V7aWYoZD09bnVsbCYmXCJzdHJpbmdcIiE9dHlwZW9mIGUpe3RoaXMuZnJvbVN0cmluZyhlLDI1Nil9ZWxzZXt0aGlzLmZyb21TdHJpbmcoZSxkKX19fX1mdW5jdGlvbiBuYmkoKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCl9ZnVuY3Rpb24gYW0xKGYsYSxiLGUsaCxnKXt3aGlsZSgtLWc+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+PTApe2ouc3FyVG8oZixhKTtpZigoaCYoMTw8YykpPjApe2oubXVsVG8oYSxkLGYpfWVsc2V7dmFyIGI9ZjtmPWE7YT1ifX1yZXR1cm4gai5yZXZlcnQoZil9ZnVuY3Rpb24gYm5Nb2RQb3dJbnQoYixhKXt2YXIgYztpZihiPDI1Nnx8YS5pc0V2ZW4oKSl7Yz1uZXcgQ2xhc3NpYyhhKX1lbHNle2M9bmV3IE1vbnRnb21lcnkoYSl9cmV0dXJuIHRoaXMuZXhwKGIsYyl9QmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvPWJucENvcHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50PWJucEZyb21JbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZz1ibnBGcm9tU3RyaW5nO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wPWJucENsYW1wO0JpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbz1ibnBETFNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvPWJucERSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbz1ibnBMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbz1ibnBSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbz1ibnBTdWJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvPWJucE11bHRpcGx5VG87QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG89Ym5wU3F1YXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG89Ym5wRGl2UmVtVG87QmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQ9Ym5wSW52RGlnaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuPWJucElzRXZlbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHA9Ym5wRXhwO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nPWJuVG9TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlPWJuTmVnYXRlO0JpZ0ludGVnZXIucHJvdG90eXBlLmFicz1ibkFicztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG89Ym5Db21wYXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoPWJuQml0TGVuZ3RoO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZD1ibk1vZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQ9Ym5Nb2RQb3dJbnQ7QmlnSW50ZWdlci5aRVJPPW5idigwKTtCaWdJbnRlZ2VyLk9ORT1uYnYoMSk7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gYm5DbG9uZSgpe3ZhciBhPW5iaSgpO3RoaXMuY29weVRvKGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuSW50VmFsdWUoKXtpZih0aGlzLnM8MCl7aWYodGhpcy50PT0xKXtyZXR1cm4gdGhpc1swXS10aGlzLkRWfWVsc2V7aWYodGhpcy50PT0wKXtyZXR1cm4gLTF9fX1lbHNle2lmKHRoaXMudD09MSl7cmV0dXJuIHRoaXNbMF19ZWxzZXtpZih0aGlzLnQ9PTApe3JldHVybiAwfX19cmV0dXJuKCh0aGlzWzFdJigoMTw8KDMyLXRoaXMuREIpKS0xKSk8PHRoaXMuREIpfHRoaXNbMF19ZnVuY3Rpb24gYm5CeXRlVmFsdWUoKXtyZXR1cm4odGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDI0KT4+MjR9ZnVuY3Rpb24gYm5TaG9ydFZhbHVlKCl7cmV0dXJuKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwxNik+PjE2fWZ1bmN0aW9uIGJucENodW5rU2l6ZShhKXtyZXR1cm4gTWF0aC5mbG9vcihNYXRoLkxOMip0aGlzLkRCL01hdGgubG9nKGEpKX1mdW5jdGlvbiBiblNpZ051bSgpe2lmKHRoaXMuczwwKXtyZXR1cm4gLTF9ZWxzZXtpZih0aGlzLnQ8PTB8fCh0aGlzLnQ9PTEmJnRoaXNbMF08PTApKXtyZXR1cm4gMH1lbHNle3JldHVybiAxfX19ZnVuY3Rpb24gYm5wVG9SYWRpeChjKXtpZihjPT1udWxsKXtjPTEwfWlmKHRoaXMuc2lnbnVtKCk9PTB8fGM8Mnx8Yz4zNil7cmV0dXJuXCIwXCJ9dmFyIGY9dGhpcy5jaHVua1NpemUoYyk7dmFyIGU9TWF0aC5wb3coYyxmKTt2YXIgaT1uYnYoZSksaj1uYmkoKSxoPW5iaSgpLGc9XCJcIjt0aGlzLmRpdlJlbVRvKGksaixoKTt3aGlsZShqLnNpZ251bSgpPjApe2c9KGUraC5pbnRWYWx1ZSgpKS50b1N0cmluZyhjKS5zdWJzdHIoMSkrZztqLmRpdlJlbVRvKGksaixoKX1yZXR1cm4gaC5pbnRWYWx1ZSgpLnRvU3RyaW5nKGMpK2d9ZnVuY3Rpb24gYm5wRnJvbVJhZGl4KG0saCl7dGhpcy5mcm9tSW50KDApO2lmKGg9PW51bGwpe2g9MTB9dmFyIGY9dGhpcy5jaHVua1NpemUoaCk7dmFyIGc9TWF0aC5wb3coaCxmKSxlPWZhbHNlLGE9MCxsPTA7Zm9yKHZhciBjPTA7YzxtLmxlbmd0aDsrK2Mpe3ZhciBrPWludEF0KG0sYyk7aWYoazwwKXtpZihtLmNoYXJBdChjKT09XCItXCImJnRoaXMuc2lnbnVtKCk9PTApe2U9dHJ1ZX1jb250aW51ZX1sPWgqbCtrO2lmKCsrYT49Zil7dGhpcy5kTXVsdGlwbHkoZyk7dGhpcy5kQWRkT2Zmc2V0KGwsMCk7YT0wO2w9MH19aWYoYT4wKXt0aGlzLmRNdWx0aXBseShNYXRoLnBvdyhoLGEpKTt0aGlzLmRBZGRPZmZzZXQobCwwKX1pZihlKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX19ZnVuY3Rpb24gYm5wRnJvbU51bWJlcihmLGUsaCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpe2lmKGY8Mil7dGhpcy5mcm9tSW50KDEpfWVsc2V7dGhpcy5mcm9tTnVtYmVyKGYsaCk7aWYoIXRoaXMudGVzdEJpdChmLTEpKXt0aGlzLmJpdHdpc2VUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoZi0xKSxvcF9vcix0aGlzKX1pZih0aGlzLmlzRXZlbigpKXt0aGlzLmRBZGRPZmZzZXQoMSwwKX13aGlsZSghdGhpcy5pc1Byb2JhYmxlUHJpbWUoZSkpe3RoaXMuZEFkZE9mZnNldCgyLDApO2lmKHRoaXMuYml0TGVuZ3RoKCk+Zil7dGhpcy5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoZi0xKSx0aGlzKX19fX1lbHNle3ZhciBkPW5ldyBBcnJheSgpLGc9ZiY3O2QubGVuZ3RoPShmPj4zKSsxO2UubmV4dEJ5dGVzKGQpO2lmKGc+MCl7ZFswXSY9KCgxPDxnKS0xKX1lbHNle2RbMF09MH10aGlzLmZyb21TdHJpbmcoZCwyNTYpfX1mdW5jdGlvbiBiblRvQnl0ZUFycmF5KCl7dmFyIGI9dGhpcy50LGM9bmV3IEFycmF5KCk7Y1swXT10aGlzLnM7dmFyIGU9dGhpcy5EQi0oYip0aGlzLkRCKSU4LGYsYT0wO2lmKGItLT4wKXtpZihlPHRoaXMuREImJihmPXRoaXNbYl0+PmUpIT0odGhpcy5zJnRoaXMuRE0pPj5lKXtjW2ErK109ZnwodGhpcy5zPDwodGhpcy5EQi1lKSl9d2hpbGUoYj49MCl7aWYoZTw4KXtmPSh0aGlzW2JdJigoMTw8ZSktMSkpPDwoOC1lKTtmfD10aGlzWy0tYl0+PihlKz10aGlzLkRCLTgpfWVsc2V7Zj0odGhpc1tiXT4+KGUtPTgpKSYyNTU7aWYoZTw9MCl7ZSs9dGhpcy5EQjstLWJ9fWlmKChmJjEyOCkhPTApe2Z8PS0yNTZ9aWYoYT09MCYmKHRoaXMucyYxMjgpIT0oZiYxMjgpKXsrK2F9aWYoYT4wfHxmIT10aGlzLnMpe2NbYSsrXT1mfX19cmV0dXJuIGN9ZnVuY3Rpb24gYm5FcXVhbHMoYil7cmV0dXJuKHRoaXMuY29tcGFyZVRvKGIpPT0wKX1mdW5jdGlvbiBibk1pbihiKXtyZXR1cm4odGhpcy5jb21wYXJlVG8oYik8MCk/dGhpczpifWZ1bmN0aW9uIGJuTWF4KGIpe3JldHVybih0aGlzLmNvbXBhcmVUbyhiKT4wKT90aGlzOmJ9ZnVuY3Rpb24gYm5wQml0d2lzZVRvKGMsaCxlKXt2YXIgZCxnLGI9TWF0aC5taW4oYy50LHRoaXMudCk7Zm9yKGQ9MDtkPGI7KytkKXtlW2RdPWgodGhpc1tkXSxjW2RdKX1pZihjLnQ8dGhpcy50KXtnPWMucyZ0aGlzLkRNO2ZvcihkPWI7ZDx0aGlzLnQ7KytkKXtlW2RdPWgodGhpc1tkXSxnKX1lLnQ9dGhpcy50fWVsc2V7Zz10aGlzLnMmdGhpcy5ETTtmb3IoZD1iO2Q8Yy50OysrZCl7ZVtkXT1oKGcsY1tkXSl9ZS50PWMudH1lLnM9aCh0aGlzLnMsYy5zKTtlLmNsYW1wKCl9ZnVuY3Rpb24gb3BfYW5kKGEsYil7cmV0dXJuIGEmYn1mdW5jdGlvbiBibkFuZChiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX2FuZCxjKTtyZXR1cm4gY31mdW5jdGlvbiBvcF9vcihhLGIpe3JldHVybiBhfGJ9ZnVuY3Rpb24gYm5PcihiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX29yLGMpO3JldHVybiBjfWZ1bmN0aW9uIG9wX3hvcihhLGIpe3JldHVybiBhXmJ9ZnVuY3Rpb24gYm5Yb3IoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF94b3IsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gb3BfYW5kbm90KGEsYil7cmV0dXJuIGEmfmJ9ZnVuY3Rpb24gYm5BbmROb3QoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF9hbmRub3QsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5Ob3QoKXt2YXIgYj1uYmkoKTtmb3IodmFyIGE9MDthPHRoaXMudDsrK2Epe2JbYV09dGhpcy5ETSZ+dGhpc1thXX1iLnQ9dGhpcy50O2Iucz1+dGhpcy5zO3JldHVybiBifWZ1bmN0aW9uIGJuU2hpZnRMZWZ0KGIpe3ZhciBhPW5iaSgpO2lmKGI8MCl7dGhpcy5yU2hpZnRUbygtYixhKX1lbHNle3RoaXMubFNoaWZ0VG8oYixhKX1yZXR1cm4gYX1mdW5jdGlvbiBiblNoaWZ0UmlnaHQoYil7dmFyIGE9bmJpKCk7aWYoYjwwKXt0aGlzLmxTaGlmdFRvKC1iLGEpfWVsc2V7dGhpcy5yU2hpZnRUbyhiLGEpfXJldHVybiBhfWZ1bmN0aW9uIGxiaXQoYSl7aWYoYT09MCl7cmV0dXJuIC0xfXZhciBiPTA7aWYoKGEmNjU1MzUpPT0wKXthPj49MTY7Yis9MTZ9aWYoKGEmMjU1KT09MCl7YT4+PTg7Yis9OH1pZigoYSYxNSk9PTApe2E+Pj00O2IrPTR9aWYoKGEmMyk9PTApe2E+Pj0yO2IrPTJ9aWYoKGEmMSk9PTApeysrYn1yZXR1cm4gYn1mdW5jdGlvbiBibkdldExvd2VzdFNldEJpdCgpe2Zvcih2YXIgYT0wO2E8dGhpcy50OysrYSl7aWYodGhpc1thXSE9MCl7cmV0dXJuIGEqdGhpcy5EQitsYml0KHRoaXNbYV0pfX1pZih0aGlzLnM8MCl7cmV0dXJuIHRoaXMudCp0aGlzLkRCfXJldHVybiAtMX1mdW5jdGlvbiBjYml0KGEpe3ZhciBiPTA7d2hpbGUoYSE9MCl7YSY9YS0xOysrYn1yZXR1cm4gYn1mdW5jdGlvbiBibkJpdENvdW50KCl7dmFyIGM9MCxhPXRoaXMucyZ0aGlzLkRNO2Zvcih2YXIgYj0wO2I8dGhpcy50OysrYil7Yys9Y2JpdCh0aGlzW2JdXmEpfXJldHVybiBjfWZ1bmN0aW9uIGJuVGVzdEJpdChiKXt2YXIgYT1NYXRoLmZsb29yKGIvdGhpcy5EQik7aWYoYT49dGhpcy50KXtyZXR1cm4odGhpcy5zIT0wKX1yZXR1cm4oKHRoaXNbYV0mKDE8PChiJXRoaXMuREIpKSkhPTApfWZ1bmN0aW9uIGJucENoYW5nZUJpdChjLGIpe3ZhciBhPUJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChjKTt0aGlzLmJpdHdpc2VUbyhhLGIsYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5TZXRCaXQoYSl7cmV0dXJuIHRoaXMuY2hhbmdlQml0KGEsb3Bfb3IpfWZ1bmN0aW9uIGJuQ2xlYXJCaXQoYSl7cmV0dXJuIHRoaXMuY2hhbmdlQml0KGEsb3BfYW5kbm90KX1mdW5jdGlvbiBibkZsaXBCaXQoYSl7cmV0dXJuIHRoaXMuY2hhbmdlQml0KGEsb3BfeG9yKX1mdW5jdGlvbiBibnBBZGRUbyhkLGYpe3ZhciBlPTAsZz0wLGI9TWF0aC5taW4oZC50LHRoaXMudCk7d2hpbGUoZTxiKXtnKz10aGlzW2VdK2RbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1pZihkLnQ8dGhpcy50KXtnKz1kLnM7d2hpbGUoZTx0aGlzLnQpe2crPXRoaXNbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz10aGlzLnN9ZWxzZXtnKz10aGlzLnM7d2hpbGUoZTxkLnQpe2crPWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz1kLnN9Zi5zPShnPDApPy0xOjA7aWYoZz4wKXtmW2UrK109Z31lbHNle2lmKGc8LTEpe2ZbZSsrXT10aGlzLkRWK2d9fWYudD1lO2YuY2xhbXAoKX1mdW5jdGlvbiBibkFkZChiKXt2YXIgYz1uYmkoKTt0aGlzLmFkZFRvKGIsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5TdWJ0cmFjdChiKXt2YXIgYz1uYmkoKTt0aGlzLnN1YlRvKGIsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5NdWx0aXBseShiKXt2YXIgYz1uYmkoKTt0aGlzLm11bHRpcGx5VG8oYixjKTtyZXR1cm4gY31mdW5jdGlvbiBiblNxdWFyZSgpe3ZhciBhPW5iaSgpO3RoaXMuc3F1YXJlVG8oYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5EaXZpZGUoYil7dmFyIGM9bmJpKCk7dGhpcy5kaXZSZW1UbyhiLGMsbnVsbCk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5SZW1haW5kZXIoYil7dmFyIGM9bmJpKCk7dGhpcy5kaXZSZW1UbyhiLG51bGwsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5EaXZpZGVBbmRSZW1haW5kZXIoYil7dmFyIGQ9bmJpKCksYz1uYmkoKTt0aGlzLmRpdlJlbVRvKGIsZCxjKTtyZXR1cm4gbmV3IEFycmF5KGQsYyl9ZnVuY3Rpb24gYm5wRE11bHRpcGx5KGEpe3RoaXNbdGhpcy50XT10aGlzLmFtKDAsYS0xLHRoaXMsMCwwLHRoaXMudCk7Kyt0aGlzLnQ7dGhpcy5jbGFtcCgpfWZ1bmN0aW9uIGJucERBZGRPZmZzZXQoYixhKXtpZihiPT0wKXtyZXR1cm59d2hpbGUodGhpcy50PD1hKXt0aGlzW3RoaXMudCsrXT0wfXRoaXNbYV0rPWI7d2hpbGUodGhpc1thXT49dGhpcy5EVil7dGhpc1thXS09dGhpcy5EVjtpZigrK2E+PXRoaXMudCl7dGhpc1t0aGlzLnQrK109MH0rK3RoaXNbYV19fWZ1bmN0aW9uIE51bGxFeHAoKXt9ZnVuY3Rpb24gbk5vcChhKXtyZXR1cm4gYX1mdW5jdGlvbiBuTXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpfWZ1bmN0aW9uIG5TcXJUbyhhLGIpe2Euc3F1YXJlVG8oYil9TnVsbEV4cC5wcm90b3R5cGUuY29udmVydD1uTm9wO051bGxFeHAucHJvdG90eXBlLnJldmVydD1uTm9wO051bGxFeHAucHJvdG90eXBlLm11bFRvPW5NdWxUbztOdWxsRXhwLnByb3RvdHlwZS5zcXJUbz1uU3FyVG87ZnVuY3Rpb24gYm5Qb3coYSl7cmV0dXJuIHRoaXMuZXhwKGEsbmV3IE51bGxFeHAoKSl9ZnVuY3Rpb24gYm5wTXVsdGlwbHlMb3dlclRvKGIsZixlKXt2YXIgZD1NYXRoLm1pbih0aGlzLnQrYi50LGYpO2Uucz0wO2UudD1kO3doaWxlKGQ+MCl7ZVstLWRdPTB9dmFyIGM7Zm9yKGM9ZS50LXRoaXMudDtkPGM7KytkKXtlW2QrdGhpcy50XT10aGlzLmFtKDAsYltkXSxlLGQsMCx0aGlzLnQpfWZvcihjPU1hdGgubWluKGIudCxmKTtkPGM7KytkKXt0aGlzLmFtKDAsYltkXSxlLGQsMCxmLWQpfWUuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVVwcGVyVG8oYixlLGQpey0tZTt2YXIgYz1kLnQ9dGhpcy50K2IudC1lO2Qucz0wO3doaWxlKC0tYz49MCl7ZFtjXT0wfWZvcihjPU1hdGgubWF4KGUtdGhpcy50LDApO2M8Yi50OysrYyl7ZFt0aGlzLnQrYy1lXT10aGlzLmFtKGUtYyxiW2NdLGQsMCwwLHRoaXMudCtjLWUpfWQuY2xhbXAoKTtkLmRyU2hpZnRUbygxLGQpfWZ1bmN0aW9uIEJhcnJldHQoYSl7dGhpcy5yMj1uYmkoKTt0aGlzLnEzPW5iaSgpO0JpZ0ludGVnZXIuT05FLmRsU2hpZnRUbygyKmEudCx0aGlzLnIyKTt0aGlzLm11PXRoaXMucjIuZGl2aWRlKGEpO3RoaXMubT1hfWZ1bmN0aW9uIGJhcnJldHRDb252ZXJ0KGEpe2lmKGEuczwwfHxhLnQ+Mip0aGlzLm0udCl7cmV0dXJuIGEubW9kKHRoaXMubSl9ZWxzZXtpZihhLmNvbXBhcmVUbyh0aGlzLm0pPDApe3JldHVybiBhfWVsc2V7dmFyIGI9bmJpKCk7YS5jb3B5VG8oYik7dGhpcy5yZWR1Y2UoYik7cmV0dXJuIGJ9fX1mdW5jdGlvbiBiYXJyZXR0UmV2ZXJ0KGEpe3JldHVybiBhfWZ1bmN0aW9uIGJhcnJldHRSZWR1Y2UoYSl7YS5kclNoaWZ0VG8odGhpcy5tLnQtMSx0aGlzLnIyKTtpZihhLnQ+dGhpcy5tLnQrMSl7YS50PXRoaXMubS50KzE7YS5jbGFtcCgpfXRoaXMubXUubXVsdGlwbHlVcHBlclRvKHRoaXMucjIsdGhpcy5tLnQrMSx0aGlzLnEzKTt0aGlzLm0ubXVsdGlwbHlMb3dlclRvKHRoaXMucTMsdGhpcy5tLnQrMSx0aGlzLnIyKTt3aGlsZShhLmNvbXBhcmVUbyh0aGlzLnIyKTwwKXthLmRBZGRPZmZzZXQoMSx0aGlzLm0udCsxKX1hLnN1YlRvKHRoaXMucjIsYSk7d2hpbGUoYS5jb21wYXJlVG8odGhpcy5tKT49MCl7YS5zdWJUbyh0aGlzLm0sYSl9fWZ1bmN0aW9uIGJhcnJldHRTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9ZnVuY3Rpb24gYmFycmV0dE11bFRvKGEsYyxiKXthLm11bHRpcGx5VG8oYyxiKTt0aGlzLnJlZHVjZShiKX1CYXJyZXR0LnByb3RvdHlwZS5jb252ZXJ0PWJhcnJldHRDb252ZXJ0O0JhcnJldHQucHJvdG90eXBlLnJldmVydD1iYXJyZXR0UmV2ZXJ0O0JhcnJldHQucHJvdG90eXBlLnJlZHVjZT1iYXJyZXR0UmVkdWNlO0JhcnJldHQucHJvdG90eXBlLm11bFRvPWJhcnJldHRNdWxUbztCYXJyZXR0LnByb3RvdHlwZS5zcXJUbz1iYXJyZXR0U3FyVG87ZnVuY3Rpb24gYm5Nb2RQb3cocSxmKXt2YXIgbz1xLmJpdExlbmd0aCgpLGgsYj1uYnYoMSksdjtpZihvPD0wKXtyZXR1cm4gYn1lbHNle2lmKG88MTgpe2g9MX1lbHNle2lmKG88NDgpe2g9M31lbHNle2lmKG88MTQ0KXtoPTR9ZWxzZXtpZihvPDc2OCl7aD01fWVsc2V7aD02fX19fX1pZihvPDgpe3Y9bmV3IENsYXNzaWMoZil9ZWxzZXtpZihmLmlzRXZlbigpKXt2PW5ldyBCYXJyZXR0KGYpfWVsc2V7dj1uZXcgTW9udGdvbWVyeShmKX19dmFyIHA9bmV3IEFycmF5KCksZD0zLHM9aC0xLGE9KDE8PGgpLTE7cFsxXT12LmNvbnZlcnQodGhpcyk7aWYoaD4xKXt2YXIgQT1uYmkoKTt2LnNxclRvKHBbMV0sQSk7d2hpbGUoZDw9YSl7cFtkXT1uYmkoKTt2Lm11bFRvKEEscFtkLTJdLHBbZF0pO2QrPTJ9fXZhciBsPXEudC0xLHgsdT10cnVlLGM9bmJpKCkseTtvPW5iaXRzKHFbbF0pLTE7d2hpbGUobD49MCl7aWYobz49cyl7eD0ocVtsXT4+KG8tcykpJmF9ZWxzZXt4PShxW2xdJigoMTw8KG8rMSkpLTEpKTw8KHMtbyk7aWYobD4wKXt4fD1xW2wtMV0+Pih0aGlzLkRCK28tcyl9fWQ9aDt3aGlsZSgoeCYxKT09MCl7eD4+PTE7LS1kfWlmKChvLT1kKTwwKXtvKz10aGlzLkRCOy0tbH1pZih1KXtwW3hdLmNvcHlUbyhiKTt1PWZhbHNlfWVsc2V7d2hpbGUoZD4xKXt2LnNxclRvKGIsYyk7di5zcXJUbyhjLGIpO2QtPTJ9aWYoZD4wKXt2LnNxclRvKGIsYyl9ZWxzZXt5PWI7Yj1jO2M9eX12Lm11bFRvKGMscFt4XSxiKX13aGlsZShsPj0wJiYocVtsXSYoMTw8bykpPT0wKXt2LnNxclRvKGIsYyk7eT1iO2I9YztjPXk7aWYoLS1vPDApe289dGhpcy5EQi0xOy0tbH19fXJldHVybiB2LnJldmVydChiKX1mdW5jdGlvbiBibkdDRChjKXt2YXIgYj0odGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpcy5jbG9uZSgpO3ZhciBoPShjLnM8MCk/Yy5uZWdhdGUoKTpjLmNsb25lKCk7aWYoYi5jb21wYXJlVG8oaCk8MCl7dmFyIGU9YjtiPWg7aD1lfXZhciBkPWIuZ2V0TG93ZXN0U2V0Qml0KCksZj1oLmdldExvd2VzdFNldEJpdCgpO2lmKGY8MCl7cmV0dXJuIGJ9aWYoZDxmKXtmPWR9aWYoZj4wKXtiLnJTaGlmdFRvKGYsYik7aC5yU2hpZnRUbyhmLGgpfXdoaWxlKGIuc2lnbnVtKCk+MCl7aWYoKGQ9Yi5nZXRMb3dlc3RTZXRCaXQoKSk+MCl7Yi5yU2hpZnRUbyhkLGIpfWlmKChkPWguZ2V0TG93ZXN0U2V0Qml0KCkpPjApe2guclNoaWZ0VG8oZCxoKX1pZihiLmNvbXBhcmVUbyhoKT49MCl7Yi5zdWJUbyhoLGIpO2IuclNoaWZ0VG8oMSxiKX1lbHNle2guc3ViVG8oYixoKTtoLnJTaGlmdFRvKDEsaCl9fWlmKGY+MCl7aC5sU2hpZnRUbyhmLGgpfXJldHVybiBofWZ1bmN0aW9uIGJucE1vZEludChlKXtpZihlPD0wKXtyZXR1cm4gMH12YXIgYz10aGlzLkRWJWUsYj0odGhpcy5zPDApP2UtMTowO2lmKHRoaXMudD4wKXtpZihjPT0wKXtiPXRoaXNbMF0lZX1lbHNle2Zvcih2YXIgYT10aGlzLnQtMTthPj0wOy0tYSl7Yj0oYypiK3RoaXNbYV0pJWV9fX1yZXR1cm4gYn1mdW5jdGlvbiBibk1vZEludmVyc2UoZil7dmFyIGo9Zi5pc0V2ZW4oKTtpZigodGhpcy5pc0V2ZW4oKSYmail8fGYuc2lnbnVtKCk9PTApe3JldHVybiBCaWdJbnRlZ2VyLlpFUk99dmFyIGk9Zi5jbG9uZSgpLGg9dGhpcy5jbG9uZSgpO3ZhciBnPW5idigxKSxlPW5idigwKSxsPW5idigwKSxrPW5idigxKTt3aGlsZShpLnNpZ251bSgpIT0wKXt3aGlsZShpLmlzRXZlbigpKXtpLnJTaGlmdFRvKDEsaSk7aWYoail7aWYoIWcuaXNFdmVuKCl8fCFlLmlzRXZlbigpKXtnLmFkZFRvKHRoaXMsZyk7ZS5zdWJUbyhmLGUpfWcuclNoaWZ0VG8oMSxnKX1lbHNle2lmKCFlLmlzRXZlbigpKXtlLnN1YlRvKGYsZSl9fWUuclNoaWZ0VG8oMSxlKX13aGlsZShoLmlzRXZlbigpKXtoLnJTaGlmdFRvKDEsaCk7aWYoail7aWYoIWwuaXNFdmVuKCl8fCFrLmlzRXZlbigpKXtsLmFkZFRvKHRoaXMsbCk7ay5zdWJUbyhmLGspfWwuclNoaWZ0VG8oMSxsKX1lbHNle2lmKCFrLmlzRXZlbigpKXtrLnN1YlRvKGYsayl9fWsuclNoaWZ0VG8oMSxrKX1pZihpLmNvbXBhcmVUbyhoKT49MCl7aS5zdWJUbyhoLGkpO2lmKGope2cuc3ViVG8obCxnKX1lLnN1YlRvKGssZSl9ZWxzZXtoLnN1YlRvKGksaCk7aWYoail7bC5zdWJUbyhnLGwpfWsuc3ViVG8oZSxrKX19aWYoaC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpIT0wKXtyZXR1cm4gQmlnSW50ZWdlci5aRVJPfWlmKGsuY29tcGFyZVRvKGYpPj0wKXtyZXR1cm4gay5zdWJ0cmFjdChmKX1pZihrLnNpZ251bSgpPDApe2suYWRkVG8oZixrKX1lbHNle3JldHVybiBrfWlmKGsuc2lnbnVtKCk8MCl7cmV0dXJuIGsuYWRkKGYpfWVsc2V7cmV0dXJuIGt9fXZhciBsb3dwcmltZXM9WzIsMyw1LDcsMTEsMTMsMTcsMTksMjMsMjksMzEsMzcsNDEsNDMsNDcsNTMsNTksNjEsNjcsNzEsNzMsNzksODMsODksOTcsMTAxLDEwMywxMDcsMTA5LDExMywxMjcsMTMxLDEzNywxMzksMTQ5LDE1MSwxNTcsMTYzLDE2NywxNzMsMTc5LDE4MSwxOTEsMTkzLDE5NywxOTksMjExLDIyMywyMjcsMjI5LDIzMywyMzksMjQxLDI1MSwyNTcsMjYzLDI2OSwyNzEsMjc3LDI4MSwyODMsMjkzLDMwNywzMTEsMzEzLDMxNywzMzEsMzM3LDM0NywzNDksMzUzLDM1OSwzNjcsMzczLDM3OSwzODMsMzg5LDM5Nyw0MDEsNDA5LDQxOSw0MjEsNDMxLDQzMyw0MzksNDQzLDQ0OSw0NTcsNDYxLDQ2Myw0NjcsNDc5LDQ4Nyw0OTEsNDk5LDUwMyw1MDksNTIxLDUyMyw1NDEsNTQ3LDU1Nyw1NjMsNTY5LDU3MSw1NzcsNTg3LDU5Myw1OTksNjAxLDYwNyw2MTMsNjE3LDYxOSw2MzEsNjQxLDY0Myw2NDcsNjUzLDY1OSw2NjEsNjczLDY3Nyw2ODMsNjkxLDcwMSw3MDksNzE5LDcyNyw3MzMsNzM5LDc0Myw3NTEsNzU3LDc2MSw3NjksNzczLDc4Nyw3OTcsODA5LDgxMSw4MjEsODIzLDgyNyw4MjksODM5LDg1Myw4NTcsODU5LDg2Myw4NzcsODgxLDg4Myw4ODcsOTA3LDkxMSw5MTksOTI5LDkzNyw5NDEsOTQ3LDk1Myw5NjcsOTcxLDk3Nyw5ODMsOTkxLDk5N107dmFyIGxwbGltPSgxPDwyNikvbG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV07ZnVuY3Rpb24gYm5Jc1Byb2JhYmxlUHJpbWUoZSl7dmFyIGQsYj10aGlzLmFicygpO2lmKGIudD09MSYmYlswXTw9bG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV0pe2ZvcihkPTA7ZDxsb3dwcmltZXMubGVuZ3RoOysrZCl7aWYoYlswXT09bG93cHJpbWVzW2RdKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfWlmKGIuaXNFdmVuKCkpe3JldHVybiBmYWxzZX1kPTE7d2hpbGUoZDxsb3dwcmltZXMubGVuZ3RoKXt2YXIgYT1sb3dwcmltZXNbZF0sYz1kKzE7d2hpbGUoYzxsb3dwcmltZXMubGVuZ3RoJiZhPGxwbGltKXthKj1sb3dwcmltZXNbYysrXX1hPWIubW9kSW50KGEpO3doaWxlKGQ8Yyl7aWYoYSVsb3dwcmltZXNbZCsrXT09MCl7cmV0dXJuIGZhbHNlfX19cmV0dXJuIGIubWlsbGVyUmFiaW4oZSl9ZnVuY3Rpb24gYm5wTWlsbGVyUmFiaW4oZil7dmFyIGc9dGhpcy5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7dmFyIGM9Zy5nZXRMb3dlc3RTZXRCaXQoKTtpZihjPD0wKXtyZXR1cm4gZmFsc2V9dmFyIGg9Zy5zaGlmdFJpZ2h0KGMpO2Y9KGYrMSk+PjE7aWYoZj5sb3dwcmltZXMubGVuZ3RoKXtmPWxvd3ByaW1lcy5sZW5ndGh9dmFyIGI9bmJpKCk7Zm9yKHZhciBlPTA7ZTxmOysrZSl7Yi5mcm9tSW50KGxvd3ByaW1lc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbG93cHJpbWVzLmxlbmd0aCldKTt2YXIgbD1iLm1vZFBvdyhoLHRoaXMpO2lmKGwuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSE9MCYmbC5jb21wYXJlVG8oZykhPTApe3ZhciBkPTE7d2hpbGUoZCsrPGMmJmwuY29tcGFyZVRvKGcpIT0wKXtsPWwubW9kUG93SW50KDIsdGhpcyk7aWYobC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wKXtyZXR1cm4gZmFsc2V9fWlmKGwuY29tcGFyZVRvKGcpIT0wKXtyZXR1cm4gZmFsc2V9fX1yZXR1cm4gdHJ1ZX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5jaHVua1NpemU9Ym5wQ2h1bmtTaXplO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXg9Ym5wVG9SYWRpeDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tUmFkaXg9Ym5wRnJvbVJhZGl4O0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21OdW1iZXI9Ym5wRnJvbU51bWJlcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXR3aXNlVG89Ym5wQml0d2lzZVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmNoYW5nZUJpdD1ibnBDaGFuZ2VCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG89Ym5wQWRkVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5PWJucERNdWx0aXBseTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kQWRkT2Zmc2V0PWJucERBZGRPZmZzZXQ7QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlMb3dlclRvPWJucE11bHRpcGx5TG93ZXJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG89Ym5wTXVsdGlwbHlVcHBlclRvO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludD1ibnBNb2RJbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUubWlsbGVyUmFiaW49Ym5wTWlsbGVyUmFiaW47QmlnSW50ZWdlci5wcm90b3R5cGUuY2xvbmU9Ym5DbG9uZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnRWYWx1ZT1ibkludFZhbHVlO0JpZ0ludGVnZXIucHJvdG90eXBlLmJ5dGVWYWx1ZT1ibkJ5dGVWYWx1ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaG9ydFZhbHVlPWJuU2hvcnRWYWx1ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaWdudW09Ym5TaWdOdW07QmlnSW50ZWdlci5wcm90b3R5cGUudG9CeXRlQXJyYXk9Ym5Ub0J5dGVBcnJheTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5lcXVhbHM9Ym5FcXVhbHM7QmlnSW50ZWdlci5wcm90b3R5cGUubWluPWJuTWluO0JpZ0ludGVnZXIucHJvdG90eXBlLm1heD1ibk1heDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmQ9Ym5BbmQ7QmlnSW50ZWdlci5wcm90b3R5cGUub3I9Ym5PcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS54b3I9Ym5Yb3I7QmlnSW50ZWdlci5wcm90b3R5cGUuYW5kTm90PWJuQW5kTm90O0JpZ0ludGVnZXIucHJvdG90eXBlLm5vdD1ibk5vdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQ9Ym5TaGlmdExlZnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRSaWdodD1iblNoaWZ0UmlnaHQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZ2V0TG93ZXN0U2V0Qml0PWJuR2V0TG93ZXN0U2V0Qml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmJpdENvdW50PWJuQml0Q291bnQ7QmlnSW50ZWdlci5wcm90b3R5cGUudGVzdEJpdD1iblRlc3RCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuc2V0Qml0PWJuU2V0Qml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmNsZWFyQml0PWJuQ2xlYXJCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZmxpcEJpdD1ibkZsaXBCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuYWRkPWJuQWRkO0JpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0PWJuU3VidHJhY3Q7QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHk9Ym5NdWx0aXBseTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGU9Ym5EaXZpZGU7QmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyPWJuUmVtYWluZGVyO0JpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZUFuZFJlbWFpbmRlcj1ibkRpdmlkZUFuZFJlbWFpbmRlcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3c9Ym5Nb2RQb3c7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW52ZXJzZT1ibk1vZEludmVyc2U7QmlnSW50ZWdlci5wcm90b3R5cGUucG93PWJuUG93O0JpZ0ludGVnZXIucHJvdG90eXBlLmdjZD1ibkdDRDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc1Byb2JhYmxlUHJpbWU9Ym5Jc1Byb2JhYmxlUHJpbWU7QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlPWJuU3F1YXJlO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIEFyY2ZvdXIoKXt0aGlzLmk9MDt0aGlzLmo9MDt0aGlzLlM9bmV3IEFycmF5KCl9ZnVuY3Rpb24gQVJDNGluaXQoZCl7dmFyIGMsYSxiO2ZvcihjPTA7YzwyNTY7KytjKXt0aGlzLlNbY109Y31hPTA7Zm9yKGM9MDtjPDI1NjsrK2Mpe2E9KGErdGhpcy5TW2NdK2RbYyVkLmxlbmd0aF0pJjI1NTtiPXRoaXMuU1tjXTt0aGlzLlNbY109dGhpcy5TW2FdO3RoaXMuU1thXT1ifXRoaXMuaT0wO3RoaXMuaj0wfWZ1bmN0aW9uIEFSQzRuZXh0KCl7dmFyIGE7dGhpcy5pPSh0aGlzLmkrMSkmMjU1O3RoaXMuaj0odGhpcy5qK3RoaXMuU1t0aGlzLmldKSYyNTU7YT10aGlzLlNbdGhpcy5pXTt0aGlzLlNbdGhpcy5pXT10aGlzLlNbdGhpcy5qXTt0aGlzLlNbdGhpcy5qXT1hO3JldHVybiB0aGlzLlNbKGErdGhpcy5TW3RoaXMuaV0pJjI1NV19QXJjZm91ci5wcm90b3R5cGUuaW5pdD1BUkM0aW5pdDtBcmNmb3VyLnByb3RvdHlwZS5uZXh0PUFSQzRuZXh0O2Z1bmN0aW9uIHBybmdfbmV3c3RhdGUoKXtyZXR1cm4gbmV3IEFyY2ZvdXIoKX12YXIgcm5nX3BzaXplPTI1Njtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG52YXIgcm5nX3N0YXRlO3ZhciBybmdfcG9vbDt2YXIgcm5nX3BwdHI7ZnVuY3Rpb24gcm5nX3NlZWRfaW50KGEpe3JuZ19wb29sW3JuZ19wcHRyKytdXj1hJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjgpJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjE2KSYyNTU7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePShhPj4yNCkmMjU1O2lmKHJuZ19wcHRyPj1ybmdfcHNpemUpe3JuZ19wcHRyLT1ybmdfcHNpemV9fWZ1bmN0aW9uIHJuZ19zZWVkX3RpbWUoKXtybmdfc2VlZF9pbnQobmV3IERhdGUoKS5nZXRUaW1lKCkpfWlmKHJuZ19wb29sPT1udWxsKXtybmdfcG9vbD1uZXcgQXJyYXkoKTtybmdfcHB0cj0wO3ZhciB0O2lmKHdpbmRvdy5jcnlwdG8mJndpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXt2YXIgdWE9bmV3IFVpbnQ4QXJyYXkoMzIpO3dpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHVhKTtmb3IodD0wO3Q8MzI7Kyt0KXtybmdfcG9vbFtybmdfcHB0cisrXT11YVt0XX19aWYobmF2aWdhdG9yLmFwcE5hbWU9PVwiTmV0c2NhcGVcIiYmbmF2aWdhdG9yLmFwcFZlcnNpb248XCI1XCImJndpbmRvdy5jcnlwdG8pe3ZhciB6PXdpbmRvdy5jcnlwdG8ucmFuZG9tKDMyKTtmb3IodD0wO3Q8ei5sZW5ndGg7Kyt0KXtybmdfcG9vbFtybmdfcHB0cisrXT16LmNoYXJDb2RlQXQodCkmMjU1fX13aGlsZShybmdfcHB0cjxybmdfcHNpemUpe3Q9TWF0aC5mbG9vcig2NTUzNipNYXRoLnJhbmRvbSgpKTtybmdfcG9vbFtybmdfcHB0cisrXT10Pj4+ODtybmdfcG9vbFtybmdfcHB0cisrXT10JjI1NX1ybmdfcHB0cj0wO3JuZ19zZWVkX3RpbWUoKX1mdW5jdGlvbiBybmdfZ2V0X2J5dGUoKXtpZihybmdfc3RhdGU9PW51bGwpe3JuZ19zZWVkX3RpbWUoKTtybmdfc3RhdGU9cHJuZ19uZXdzdGF0ZSgpO3JuZ19zdGF0ZS5pbml0KHJuZ19wb29sKTtmb3Iocm5nX3BwdHI9MDtybmdfcHB0cjxybmdfcG9vbC5sZW5ndGg7KytybmdfcHB0cil7cm5nX3Bvb2xbcm5nX3BwdHJdPTB9cm5nX3BwdHI9MH1yZXR1cm4gcm5nX3N0YXRlLm5leHQoKX1mdW5jdGlvbiBybmdfZ2V0X2J5dGVzKGIpe3ZhciBhO2ZvcihhPTA7YTxiLmxlbmd0aDsrK2Epe2JbYV09cm5nX2dldF9ieXRlKCl9fWZ1bmN0aW9uIFNlY3VyZVJhbmRvbSgpe31TZWN1cmVSYW5kb20ucHJvdG90eXBlLm5leHRCeXRlcz1ybmdfZ2V0X2J5dGVzO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQmlnSW50KGIsYSl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGIsYSl9ZnVuY3Rpb24gbGluZWJyayhjLGQpe3ZhciBhPVwiXCI7dmFyIGI9MDt3aGlsZShiK2Q8Yy5sZW5ndGgpe2ErPWMuc3Vic3RyaW5nKGIsYitkKStcIlxcblwiO2IrPWR9cmV0dXJuIGErYy5zdWJzdHJpbmcoYixjLmxlbmd0aCl9ZnVuY3Rpb24gYnl0ZTJIZXgoYSl7aWYoYTwxNil7cmV0dXJuXCIwXCIrYS50b1N0cmluZygxNil9ZWxzZXtyZXR1cm4gYS50b1N0cmluZygxNil9fWZ1bmN0aW9uIHBrY3MxcGFkMihlLGgpe2lmKGg8ZS5sZW5ndGgrMTEpe2FsZXJ0KFwiTWVzc2FnZSB0b28gbG9uZyBmb3IgUlNBXCIpO3JldHVybiBudWxsfXZhciBnPW5ldyBBcnJheSgpO3ZhciBkPWUubGVuZ3RoLTE7d2hpbGUoZD49MCYmaD4wKXt2YXIgZj1lLmNoYXJDb2RlQXQoZC0tKTtpZihmPDEyOCl7Z1stLWhdPWZ9ZWxzZXtpZigoZj4xMjcpJiYoZjwyMDQ4KSl7Z1stLWhdPShmJjYzKXwxMjg7Z1stLWhdPShmPj42KXwxOTJ9ZWxzZXtnWy0taF09KGYmNjMpfDEyODtnWy0taF09KChmPj42KSY2Myl8MTI4O2dbLS1oXT0oZj4+MTIpfDIyNH19fWdbLS1oXT0wO3ZhciBiPW5ldyBTZWN1cmVSYW5kb20oKTt2YXIgYT1uZXcgQXJyYXkoKTt3aGlsZShoPjIpe2FbMF09MDt3aGlsZShhWzBdPT0wKXtiLm5leHRCeXRlcyhhKX1nWy0taF09YVswXX1nWy0taF09MjtnWy0taF09MDtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoZyl9ZnVuY3Rpb24gb2FlcF9tZ2YxX2FycihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9ZShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxjLmNvbmNhdChbKGQmNDI3ODE5MDA4MCk+PjI0LChkJjE2NzExNjgwKT4+MTYsKGQmNjUyODApPj44LGQmMjU1XSkpKTtkKz0xfXJldHVybiBifXZhciBTSEExX1NJWkU9MjA7ZnVuY3Rpb24gb2FlcF9wYWQobCxhLGMpe2lmKGwubGVuZ3RoKzIqU0hBMV9TSVpFKzI+YSl7dGhyb3dcIk1lc3NhZ2UgdG9vIGxvbmcgZm9yIFJTQVwifXZhciBoPVwiXCIsZDtmb3IoZD0wO2Q8YS1sLmxlbmd0aC0yKlNIQTFfU0laRS0yO2QrPTEpe2grPVwiXFx4MDBcIn12YXIgZT1yc3RyX3NoYTEoXCJcIikraCtcIlxceDAxXCIrbDt2YXIgZj1uZXcgQXJyYXkoU0hBMV9TSVpFKTtuZXcgU2VjdXJlUmFuZG9tKCkubmV4dEJ5dGVzKGYpO3ZhciBnPW9hZXBfbWdmMV9hcnIoZixlLmxlbmd0aCxjfHxyc3RyX3NoYTEpO3ZhciBrPVtdO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKz0xKXtrW2RdPWUuY2hhckNvZGVBdChkKV5nLmNoYXJDb2RlQXQoZCl9dmFyIGo9b2FlcF9tZ2YxX2FycihrLGYubGVuZ3RoLHJzdHJfc2hhMSk7dmFyIGI9WzBdO2ZvcihkPTA7ZDxmLmxlbmd0aDtkKz0xKXtiW2QrMV09ZltkXV5qLmNoYXJDb2RlQXQoZCl9cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGIuY29uY2F0KGspKX1mdW5jdGlvbiBSU0FLZXkoKXt0aGlzLm49bnVsbDt0aGlzLmU9MDt0aGlzLmQ9bnVsbDt0aGlzLnA9bnVsbDt0aGlzLnE9bnVsbDt0aGlzLmRtcDE9bnVsbDt0aGlzLmRtcTE9bnVsbDt0aGlzLmNvZWZmPW51bGx9ZnVuY3Rpb24gUlNBU2V0UHVibGljKGIsYSl7dGhpcy5pc1B1YmxpYz10cnVlO2lmKHR5cGVvZiBiIT09XCJzdHJpbmdcIil7dGhpcy5uPWI7dGhpcy5lPWF9ZWxzZXtpZihiIT1udWxsJiZhIT1udWxsJiZiLmxlbmd0aD4wJiZhLmxlbmd0aD4wKXt0aGlzLm49cGFyc2VCaWdJbnQoYiwxNik7dGhpcy5lPXBhcnNlSW50KGEsMTYpfWVsc2V7YWxlcnQoXCJJbnZhbGlkIFJTQSBwdWJsaWMga2V5XCIpfX19ZnVuY3Rpb24gUlNBRG9QdWJsaWMoYSl7cmV0dXJuIGEubW9kUG93SW50KHRoaXMuZSx0aGlzLm4pfWZ1bmN0aW9uIFJTQUVuY3J5cHQoZCl7dmFyIGE9cGtjczFwYWQyKGQsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+Myk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGU9dGhpcy5kb1B1YmxpYyhhKTtpZihlPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYj1lLnRvU3RyaW5nKDE2KTtpZigoYi5sZW5ndGgmMSk9PTApe3JldHVybiBifWVsc2V7cmV0dXJuXCIwXCIrYn19ZnVuY3Rpb24gUlNBRW5jcnlwdE9BRVAoZSxkKXt2YXIgYT1vYWVwX3BhZChlLCh0aGlzLm4uYml0TGVuZ3RoKCkrNyk+PjMsZCk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGY9dGhpcy5kb1B1YmxpYyhhKTtpZihmPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYj1mLnRvU3RyaW5nKDE2KTtpZigoYi5sZW5ndGgmMSk9PTApe3JldHVybiBifWVsc2V7cmV0dXJuXCIwXCIrYn19UlNBS2V5LnByb3RvdHlwZS5kb1B1YmxpYz1SU0FEb1B1YmxpYztSU0FLZXkucHJvdG90eXBlLnNldFB1YmxpYz1SU0FTZXRQdWJsaWM7UlNBS2V5LnByb3RvdHlwZS5lbmNyeXB0PVJTQUVuY3J5cHQ7UlNBS2V5LnByb3RvdHlwZS5lbmNyeXB0T0FFUD1SU0FFbmNyeXB0T0FFUDtSU0FLZXkucHJvdG90eXBlLnR5cGU9XCJSU0FcIjtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBwa2NzMXVucGFkMihnLGope3ZhciBhPWcudG9CeXRlQXJyYXkoKTt2YXIgZj0wO3doaWxlKGY8YS5sZW5ndGgmJmFbZl09PTApeysrZn1pZihhLmxlbmd0aC1mIT1qLTF8fGFbZl0hPTIpe3JldHVybiBudWxsfSsrZjt3aGlsZShhW2ZdIT0wKXtpZigrK2Y+PWEubGVuZ3RoKXtyZXR1cm4gbnVsbH19dmFyIGU9XCJcIjt3aGlsZSgrK2Y8YS5sZW5ndGgpe3ZhciBoPWFbZl0mMjU1O2lmKGg8MTI4KXtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGgpfWVsc2V7aWYoKGg+MTkxKSYmKGg8MjI0KSl7ZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoKGgmMzEpPDw2KXwoYVtmKzFdJjYzKSk7KytmfWVsc2V7ZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoKGgmMTUpPDwxMil8KChhW2YrMV0mNjMpPDw2KXwoYVtmKzJdJjYzKSk7Zis9Mn19fXJldHVybiBlfWZ1bmN0aW9uIG9hZXBfbWdmMV9zdHIoYyxhLGUpe3ZhciBiPVwiXCIsZD0wO3doaWxlKGIubGVuZ3RoPGEpe2IrPWUoYytTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxbKGQmNDI3ODE5MDA4MCk+PjI0LChkJjE2NzExNjgwKT4+MTYsKGQmNjUyODApPj44LGQmMjU1XSkpO2QrPTF9cmV0dXJuIGJ9dmFyIFNIQTFfU0laRT0yMDtmdW5jdGlvbiBvYWVwX3VucGFkKGwsYixlKXtsPWwudG9CeXRlQXJyYXkoKTt2YXIgZjtmb3IoZj0wO2Y8bC5sZW5ndGg7Zis9MSl7bFtmXSY9MjU1fXdoaWxlKGwubGVuZ3RoPGIpe2wudW5zaGlmdCgwKX1sPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGwpO2lmKGwubGVuZ3RoPDIqU0hBMV9TSVpFKzIpe3Rocm93XCJDaXBoZXIgdG9vIHNob3J0XCJ9dmFyIGM9bC5zdWJzdHIoMSxTSEExX1NJWkUpO3ZhciBvPWwuc3Vic3RyKFNIQTFfU0laRSsxKTt2YXIgbT1vYWVwX21nZjFfc3RyKG8sU0hBMV9TSVpFLGV8fHJzdHJfc2hhMSk7dmFyIGg9W10sZjtmb3IoZj0wO2Y8Yy5sZW5ndGg7Zis9MSl7aFtmXT1jLmNoYXJDb2RlQXQoZilebS5jaGFyQ29kZUF0KGYpfXZhciBqPW9hZXBfbWdmMV9zdHIoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaCksbC5sZW5ndGgtU0hBMV9TSVpFLHJzdHJfc2hhMSk7dmFyIGc9W107Zm9yKGY9MDtmPG8ubGVuZ3RoO2YrPTEpe2dbZl09by5jaGFyQ29kZUF0KGYpXmouY2hhckNvZGVBdChmKX1nPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGcpO2lmKGcuc3Vic3RyKDAsU0hBMV9TSVpFKSE9PXJzdHJfc2hhMShcIlwiKSl7dGhyb3dcIkhhc2ggbWlzbWF0Y2hcIn1nPWcuc3Vic3RyKFNIQTFfU0laRSk7dmFyIGE9Zy5pbmRleE9mKFwiXFx4MDFcIik7dmFyIGs9KGEhPS0xKT9nLnN1YnN0cigwLGEpLmxhc3RJbmRleE9mKFwiXFx4MDBcIik6LTE7aWYoaysxIT1hKXt0aHJvd1wiTWFsZm9ybWVkIGRhdGFcIn1yZXR1cm4gZy5zdWJzdHIoYSsxKX1mdW5jdGlvbiBSU0FTZXRQcml2YXRlKGMsYSxiKXt0aGlzLmlzUHJpdmF0ZT10cnVlO2lmKHR5cGVvZiBjIT09XCJzdHJpbmdcIil7dGhpcy5uPWM7dGhpcy5lPWE7dGhpcy5kPWJ9ZWxzZXtpZihjIT1udWxsJiZhIT1udWxsJiZjLmxlbmd0aD4wJiZhLmxlbmd0aD4wKXt0aGlzLm49cGFyc2VCaWdJbnQoYywxNik7dGhpcy5lPXBhcnNlSW50KGEsMTYpO3RoaXMuZD1wYXJzZUJpZ0ludChiLDE2KX1lbHNle2FsZXJ0KFwiSW52YWxpZCBSU0EgcHJpdmF0ZSBrZXlcIil9fX1mdW5jdGlvbiBSU0FTZXRQcml2YXRlRXgoZyxkLGUsYyxiLGEsaCxmKXt0aGlzLmlzUHJpdmF0ZT10cnVlO2lmKGc9PW51bGwpe3Rocm93XCJSU0FTZXRQcml2YXRlRXggTiA9PSBudWxsXCJ9aWYoZD09bnVsbCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBFID09IG51bGxcIn1pZihnLmxlbmd0aD09MCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBOLmxlbmd0aCA9PSAwXCJ9aWYoZC5sZW5ndGg9PTApe3Rocm93XCJSU0FTZXRQcml2YXRlRXggRS5sZW5ndGggPT0gMFwifWlmKGchPW51bGwmJmQhPW51bGwmJmcubGVuZ3RoPjAmJmQubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChnLDE2KTt0aGlzLmU9cGFyc2VJbnQoZCwxNik7dGhpcy5kPXBhcnNlQmlnSW50KGUsMTYpO3RoaXMucD1wYXJzZUJpZ0ludChjLDE2KTt0aGlzLnE9cGFyc2VCaWdJbnQoYiwxNik7dGhpcy5kbXAxPXBhcnNlQmlnSW50KGEsMTYpO3RoaXMuZG1xMT1wYXJzZUJpZ0ludChoLDE2KTt0aGlzLmNvZWZmPXBhcnNlQmlnSW50KGYsMTYpfWVsc2V7YWxlcnQoXCJJbnZhbGlkIFJTQSBwcml2YXRlIGtleSBpbiBSU0FTZXRQcml2YXRlRXhcIil9fWZ1bmN0aW9uIFJTQUdlbmVyYXRlKGIsaSl7dmFyIGE9bmV3IFNlY3VyZVJhbmRvbSgpO3ZhciBmPWI+PjE7dGhpcy5lPXBhcnNlSW50KGksMTYpO3ZhciBjPW5ldyBCaWdJbnRlZ2VyKGksMTYpO2Zvcig7Oyl7Zm9yKDs7KXt0aGlzLnA9bmV3IEJpZ0ludGVnZXIoYi1mLDEsYSk7aWYodGhpcy5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKS5nY2QoYykuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCYmdGhpcy5wLmlzUHJvYmFibGVQcmltZSgxMCkpe2JyZWFrfX1mb3IoOzspe3RoaXMucT1uZXcgQmlnSW50ZWdlcihmLDEsYSk7aWYodGhpcy5xLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKS5nY2QoYykuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCYmdGhpcy5xLmlzUHJvYmFibGVQcmltZSgxMCkpe2JyZWFrfX1pZih0aGlzLnAuY29tcGFyZVRvKHRoaXMucSk8PTApe3ZhciBoPXRoaXMucDt0aGlzLnA9dGhpcy5xO3RoaXMucT1ofXZhciBnPXRoaXMucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7dmFyIGQ9dGhpcy5xLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgZT1nLm11bHRpcGx5KGQpO2lmKGUuZ2NkKGMpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk9PTApe3RoaXMubj10aGlzLnAubXVsdGlwbHkodGhpcy5xKTt0aGlzLmQ9Yy5tb2RJbnZlcnNlKGUpO3RoaXMuZG1wMT10aGlzLmQubW9kKGcpO3RoaXMuZG1xMT10aGlzLmQubW9kKGQpO3RoaXMuY29lZmY9dGhpcy5xLm1vZEludmVyc2UodGhpcy5wKTticmVha319fWZ1bmN0aW9uIFJTQURvUHJpdmF0ZShhKXtpZih0aGlzLnA9PW51bGx8fHRoaXMucT09bnVsbCl7cmV0dXJuIGEubW9kUG93KHRoaXMuZCx0aGlzLm4pfXZhciBjPWEubW9kKHRoaXMucCkubW9kUG93KHRoaXMuZG1wMSx0aGlzLnApO3ZhciBiPWEubW9kKHRoaXMucSkubW9kUG93KHRoaXMuZG1xMSx0aGlzLnEpO3doaWxlKGMuY29tcGFyZVRvKGIpPDApe2M9Yy5hZGQodGhpcy5wKX1yZXR1cm4gYy5zdWJ0cmFjdChiKS5tdWx0aXBseSh0aGlzLmNvZWZmKS5tb2QodGhpcy5wKS5tdWx0aXBseSh0aGlzLnEpLmFkZChiKX1mdW5jdGlvbiBSU0FEZWNyeXB0KGIpe3ZhciBkPXBhcnNlQmlnSW50KGIsMTYpO3ZhciBhPXRoaXMuZG9Qcml2YXRlKGQpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXJldHVybiBwa2NzMXVucGFkMihhLCh0aGlzLm4uYml0TGVuZ3RoKCkrNyk+PjMpfWZ1bmN0aW9uIFJTQURlY3J5cHRPQUVQKGQsYil7dmFyIGU9cGFyc2VCaWdJbnQoZCwxNik7dmFyIGE9dGhpcy5kb1ByaXZhdGUoZSk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9cmV0dXJuIG9hZXBfdW5wYWQoYSwodGhpcy5uLmJpdExlbmd0aCgpKzcpPj4zLGIpfVJTQUtleS5wcm90b3R5cGUuZG9Qcml2YXRlPVJTQURvUHJpdmF0ZTtSU0FLZXkucHJvdG90eXBlLnNldFByaXZhdGU9UlNBU2V0UHJpdmF0ZTtSU0FLZXkucHJvdG90eXBlLnNldFByaXZhdGVFeD1SU0FTZXRQcml2YXRlRXg7UlNBS2V5LnByb3RvdHlwZS5nZW5lcmF0ZT1SU0FHZW5lcmF0ZTtSU0FLZXkucHJvdG90eXBlLmRlY3J5cHQ9UlNBRGVjcnlwdDtSU0FLZXkucHJvdG90eXBlLmRlY3J5cHRPQUVQPVJTQURlY3J5cHRPQUVQO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIEVDRmllbGRFbGVtZW50RnAoYixhKXt0aGlzLng9YTt0aGlzLnE9Yn1mdW5jdGlvbiBmZUZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfXJldHVybih0aGlzLnEuZXF1YWxzKGEucSkmJnRoaXMueC5lcXVhbHMoYS54KSl9ZnVuY3Rpb24gZmVGcFRvQmlnSW50ZWdlcigpe3JldHVybiB0aGlzLnh9ZnVuY3Rpb24gZmVGcE5lZ2F0ZSgpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54Lm5lZ2F0ZSgpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwQWRkKGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LmFkZChhLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcFN1YnRyYWN0KGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LnN1YnRyYWN0KGEudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwTXVsdGlwbHkoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLngubXVsdGlwbHkoYS50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBTcXVhcmUoKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5zcXVhcmUoKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcERpdmlkZShhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5tdWx0aXBseShhLnRvQmlnSW50ZWdlcigpLm1vZEludmVyc2UodGhpcy5xKSkubW9kKHRoaXMucSkpfUVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmVxdWFscz1mZUZwRXF1YWxzO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnRvQmlnSW50ZWdlcj1mZUZwVG9CaWdJbnRlZ2VyO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLm5lZ2F0ZT1mZUZwTmVnYXRlO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmFkZD1mZUZwQWRkO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnN1YnRyYWN0PWZlRnBTdWJ0cmFjdDtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5tdWx0aXBseT1mZUZwTXVsdGlwbHk7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuc3F1YXJlPWZlRnBTcXVhcmU7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZGl2aWRlPWZlRnBEaXZpZGU7ZnVuY3Rpb24gRUNQb2ludEZwKGMsYSxkLGIpe3RoaXMuY3VydmU9Yzt0aGlzLng9YTt0aGlzLnk9ZDtpZihiPT1udWxsKXt0aGlzLno9QmlnSW50ZWdlci5PTkV9ZWxzZXt0aGlzLno9Yn10aGlzLnppbnY9bnVsbH1mdW5jdGlvbiBwb2ludEZwR2V0WCgpe2lmKHRoaXMuemludj09bnVsbCl7dGhpcy56aW52PXRoaXMuei5tb2RJbnZlcnNlKHRoaXMuY3VydmUucSl9cmV0dXJuIHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMuemludikubW9kKHRoaXMuY3VydmUucSkpfWZ1bmN0aW9uIHBvaW50RnBHZXRZKCl7aWYodGhpcy56aW52PT1udWxsKXt0aGlzLnppbnY9dGhpcy56Lm1vZEludmVyc2UodGhpcy5jdXJ2ZS5xKX1yZXR1cm4gdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcih0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56aW52KS5tb2QodGhpcy5jdXJ2ZS5xKSl9ZnVuY3Rpb24gcG9pbnRGcEVxdWFscyhhKXtpZihhPT10aGlzKXtyZXR1cm4gdHJ1ZX1pZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIGEuaXNJbmZpbml0eSgpfWlmKGEuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCl9dmFyIGMsYjtjPWEueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShhLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtpZighYy5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSl7cmV0dXJuIGZhbHNlfWI9YS54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGEueikpLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBiLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pfWZ1bmN0aW9uIHBvaW50RnBJc0luZmluaXR5KCl7aWYoKHRoaXMueD09bnVsbCkmJih0aGlzLnk9PW51bGwpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gdGhpcy56LmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pJiYhdGhpcy55LnRvQmlnSW50ZWdlcigpLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pfWZ1bmN0aW9uIHBvaW50RnBOZWdhdGUoKXtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMueCx0aGlzLnkubmVnYXRlKCksdGhpcy56KX1mdW5jdGlvbiBwb2ludEZwQWRkKGwpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gbH1pZihsLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9dmFyIHA9bC55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGwueikpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBvPWwueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShsLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtpZihCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKG8pKXtpZihCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKHApKXtyZXR1cm4gdGhpcy50d2ljZSgpfXJldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGo9bmV3IEJpZ0ludGVnZXIoXCIzXCIpO3ZhciBlPXRoaXMueC50b0JpZ0ludGVnZXIoKTt2YXIgbj10aGlzLnkudG9CaWdJbnRlZ2VyKCk7dmFyIGM9bC54LnRvQmlnSW50ZWdlcigpO3ZhciBrPWwueS50b0JpZ0ludGVnZXIoKTt2YXIgbT1vLnNxdWFyZSgpO3ZhciBpPW0ubXVsdGlwbHkobyk7dmFyIGQ9ZS5tdWx0aXBseShtKTt2YXIgZz1wLnNxdWFyZSgpLm11bHRpcGx5KHRoaXMueik7dmFyIGE9Zy5zdWJ0cmFjdChkLnNoaWZ0TGVmdCgxKSkubXVsdGlwbHkobC56KS5zdWJ0cmFjdChpKS5tdWx0aXBseShvKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgaD1kLm11bHRpcGx5KGopLm11bHRpcGx5KHApLnN1YnRyYWN0KG4ubXVsdGlwbHkoaSkpLnN1YnRyYWN0KGcubXVsdGlwbHkocCkpLm11bHRpcGx5KGwueikuYWRkKHAubXVsdGlwbHkoaSkpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBmPWkubXVsdGlwbHkodGhpcy56KS5tdWx0aXBseShsLnopLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihhKSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGgpLGYpfWZ1bmN0aW9uIHBvaW50RnBUd2ljZSgpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnkudG9CaWdJbnRlZ2VyKCkuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9bmV3IEJpZ0ludGVnZXIoXCIzXCIpO3ZhciBjPXRoaXMueC50b0JpZ0ludGVnZXIoKTt2YXIgaD10aGlzLnkudG9CaWdJbnRlZ2VyKCk7dmFyIGU9aC5tdWx0aXBseSh0aGlzLnopO3ZhciBqPWUubXVsdGlwbHkoaCkubW9kKHRoaXMuY3VydmUucSk7dmFyIGk9dGhpcy5jdXJ2ZS5hLnRvQmlnSW50ZWdlcigpO3ZhciBrPWMuc3F1YXJlKCkubXVsdGlwbHkoZyk7aWYoIUJpZ0ludGVnZXIuWkVSTy5lcXVhbHMoaSkpe2s9ay5hZGQodGhpcy56LnNxdWFyZSgpLm11bHRpcGx5KGkpKX1rPWsubW9kKHRoaXMuY3VydmUucSk7dmFyIGI9ay5zcXVhcmUoKS5zdWJ0cmFjdChjLnNoaWZ0TGVmdCgzKS5tdWx0aXBseShqKSkuc2hpZnRMZWZ0KDEpLm11bHRpcGx5KGUpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBmPWsubXVsdGlwbHkoZykubXVsdGlwbHkoYykuc3VidHJhY3Qoai5zaGlmdExlZnQoMSkpLnNoaWZ0TGVmdCgyKS5tdWx0aXBseShqKS5zdWJ0cmFjdChrLnNxdWFyZSgpLm11bHRpcGx5KGspKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgZD1lLnNxdWFyZSgpLm11bHRpcGx5KGUpLnNoaWZ0TGVmdCgzKS5tb2QodGhpcy5jdXJ2ZS5xKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoYiksdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihmKSxkKX1mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHkoYil7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKGIuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9Yjt2YXIgZj1nLm11bHRpcGx5KG5ldyBCaWdJbnRlZ2VyKFwiM1wiKSk7dmFyIGw9dGhpcy5uZWdhdGUoKTt2YXIgZD10aGlzO3ZhciBjO2ZvcihjPWYuYml0TGVuZ3RoKCktMjtjPjA7LS1jKXtkPWQudHdpY2UoKTt2YXIgYT1mLnRlc3RCaXQoYyk7dmFyIGo9Zy50ZXN0Qml0KGMpO2lmKGEhPWope2Q9ZC5hZGQoYT90aGlzOmwpfX1yZXR1cm4gZH1mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHlUd28oYyxhLGIpe3ZhciBkO2lmKGMuYml0TGVuZ3RoKCk+Yi5iaXRMZW5ndGgoKSl7ZD1jLmJpdExlbmd0aCgpLTF9ZWxzZXtkPWIuYml0TGVuZ3RoKCktMX12YXIgZj10aGlzLmN1cnZlLmdldEluZmluaXR5KCk7dmFyIGU9dGhpcy5hZGQoYSk7d2hpbGUoZD49MCl7Zj1mLnR3aWNlKCk7aWYoYy50ZXN0Qml0KGQpKXtpZihiLnRlc3RCaXQoZCkpe2Y9Zi5hZGQoZSl9ZWxzZXtmPWYuYWRkKHRoaXMpfX1lbHNle2lmKGIudGVzdEJpdChkKSl7Zj1mLmFkZChhKX19LS1kfXJldHVybiBmfUVDUG9pbnRGcC5wcm90b3R5cGUuZ2V0WD1wb2ludEZwR2V0WDtFQ1BvaW50RnAucHJvdG90eXBlLmdldFk9cG9pbnRGcEdldFk7RUNQb2ludEZwLnByb3RvdHlwZS5lcXVhbHM9cG9pbnRGcEVxdWFscztFQ1BvaW50RnAucHJvdG90eXBlLmlzSW5maW5pdHk9cG9pbnRGcElzSW5maW5pdHk7RUNQb2ludEZwLnByb3RvdHlwZS5uZWdhdGU9cG9pbnRGcE5lZ2F0ZTtFQ1BvaW50RnAucHJvdG90eXBlLmFkZD1wb2ludEZwQWRkO0VDUG9pbnRGcC5wcm90b3R5cGUudHdpY2U9cG9pbnRGcFR3aWNlO0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHk9cG9pbnRGcE11bHRpcGx5O0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHlUd289cG9pbnRGcE11bHRpcGx5VHdvO2Z1bmN0aW9uIEVDQ3VydmVGcChlLGQsYyl7dGhpcy5xPWU7dGhpcy5hPXRoaXMuZnJvbUJpZ0ludGVnZXIoZCk7dGhpcy5iPXRoaXMuZnJvbUJpZ0ludGVnZXIoYyk7dGhpcy5pbmZpbml0eT1uZXcgRUNQb2ludEZwKHRoaXMsbnVsbCxudWxsKX1mdW5jdGlvbiBjdXJ2ZUZwR2V0USgpe3JldHVybiB0aGlzLnF9ZnVuY3Rpb24gY3VydmVGcEdldEEoKXtyZXR1cm4gdGhpcy5hfWZ1bmN0aW9uIGN1cnZlRnBHZXRCKCl7cmV0dXJuIHRoaXMuYn1mdW5jdGlvbiBjdXJ2ZUZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfXJldHVybih0aGlzLnEuZXF1YWxzKGEucSkmJnRoaXMuYS5lcXVhbHMoYS5hKSYmdGhpcy5iLmVxdWFscyhhLmIpKX1mdW5jdGlvbiBjdXJ2ZUZwR2V0SW5maW5pdHkoKXtyZXR1cm4gdGhpcy5pbmZpbml0eX1mdW5jdGlvbiBjdXJ2ZUZwRnJvbUJpZ0ludGVnZXIoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSxhKX1mdW5jdGlvbiBjdXJ2ZUZwRGVjb2RlUG9pbnRIZXgoZCl7c3dpdGNoKHBhcnNlSW50KGQuc3Vic3RyKDAsMiksMTYpKXtjYXNlIDA6cmV0dXJuIHRoaXMuaW5maW5pdHk7Y2FzZSAyOmNhc2UgMzpyZXR1cm4gbnVsbDtjYXNlIDQ6Y2FzZSA2OmNhc2UgNzp2YXIgYT0oZC5sZW5ndGgtMikvMjt2YXIgYz1kLnN1YnN0cigyLGEpO3ZhciBiPWQuc3Vic3RyKGErMixhKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoYywxNikpLHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoYiwxNikpKTtkZWZhdWx0OnJldHVybiBudWxsfX1FQ0N1cnZlRnAucHJvdG90eXBlLmdldFE9Y3VydmVGcEdldFE7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRBPWN1cnZlRnBHZXRBO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0Qj1jdXJ2ZUZwR2V0QjtFQ0N1cnZlRnAucHJvdG90eXBlLmVxdWFscz1jdXJ2ZUZwRXF1YWxzO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0SW5maW5pdHk9Y3VydmVGcEdldEluZmluaXR5O0VDQ3VydmVGcC5wcm90b3R5cGUuZnJvbUJpZ0ludGVnZXI9Y3VydmVGcEZyb21CaWdJbnRlZ2VyO0VDQ3VydmVGcC5wcm90b3R5cGUuZGVjb2RlUG9pbnRIZXg9Y3VydmVGcERlY29kZVBvaW50SGV4O1xuLyohIChjKSBTdGVmYW4gVGhvbWFzIHwgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW5qcy9iaXRjb2luanMtbGliXG4gKi9cbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmdldEJ5dGVMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcigodGhpcy50b0JpZ0ludGVnZXIoKS5iaXRMZW5ndGgoKSs3KS84KX07RUNQb2ludEZwLnByb3RvdHlwZS5nZXRFbmNvZGVkPWZ1bmN0aW9uKGMpe3ZhciBkPWZ1bmN0aW9uKGgsZil7dmFyIGc9aC50b0J5dGVBcnJheVVuc2lnbmVkKCk7aWYoZjxnLmxlbmd0aCl7Zz1nLnNsaWNlKGcubGVuZ3RoLWYpfWVsc2V7d2hpbGUoZj5nLmxlbmd0aCl7Zy51bnNoaWZ0KDApfX1yZXR1cm4gZ307dmFyIGE9dGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGU9dGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGI9ZChhLDMyKTtpZihjKXtpZihlLmlzRXZlbigpKXtiLnVuc2hpZnQoMil9ZWxzZXtiLnVuc2hpZnQoMyl9fWVsc2V7Yi51bnNoaWZ0KDQpO2I9Yi5jb25jYXQoZChlLDMyKSl9cmV0dXJuIGJ9O0VDUG9pbnRGcC5kZWNvZGVGcm9tPWZ1bmN0aW9uKGcsYyl7dmFyIGY9Y1swXTt2YXIgZT1jLmxlbmd0aC0xO3ZhciBkPWMuc2xpY2UoMSwxK2UvMik7dmFyIGI9Yy5zbGljZSgxK2UvMiwxK2UpO2QudW5zaGlmdCgwKTtiLnVuc2hpZnQoMCk7dmFyIGE9bmV3IEJpZ0ludGVnZXIoZCk7dmFyIGg9bmV3IEJpZ0ludGVnZXIoYik7cmV0dXJuIG5ldyBFQ1BvaW50RnAoZyxnLmZyb21CaWdJbnRlZ2VyKGEpLGcuZnJvbUJpZ0ludGVnZXIoaCkpfTtFQ1BvaW50RnAuZGVjb2RlRnJvbUhleD1mdW5jdGlvbihnLGMpe3ZhciBmPWMuc3Vic3RyKDAsMik7dmFyIGU9Yy5sZW5ndGgtMjt2YXIgZD1jLnN1YnN0cigyLGUvMik7dmFyIGI9Yy5zdWJzdHIoMitlLzIsZS8yKTt2YXIgYT1uZXcgQmlnSW50ZWdlcihkLDE2KTt2YXIgaD1uZXcgQmlnSW50ZWdlcihiLDE2KTtyZXR1cm4gbmV3IEVDUG9pbnRGcChnLGcuZnJvbUJpZ0ludGVnZXIoYSksZy5mcm9tQmlnSW50ZWdlcihoKSl9O0VDUG9pbnRGcC5wcm90b3R5cGUuYWRkMkQ9ZnVuY3Rpb24oYyl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiBjfWlmKGMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnguZXF1YWxzKGMueCkpe2lmKHRoaXMueS5lcXVhbHMoYy55KSl7cmV0dXJuIHRoaXMudHdpY2UoKX1yZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPWMueC5zdWJ0cmFjdCh0aGlzLngpO3ZhciBlPWMueS5zdWJ0cmFjdCh0aGlzLnkpO3ZhciBhPWUuZGl2aWRlKGcpO3ZhciBkPWEuc3F1YXJlKCkuc3VidHJhY3QodGhpcy54KS5zdWJ0cmFjdChjLngpO3ZhciBmPWEubXVsdGlwbHkodGhpcy54LnN1YnRyYWN0KGQpKS5zdWJ0cmFjdCh0aGlzLnkpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsZCxmKX07RUNQb2ludEZwLnByb3RvdHlwZS50d2ljZTJEPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKHRoaXMueS50b0JpZ0ludGVnZXIoKS5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgYj10aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZigyKSk7dmFyIGU9dGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoMykpO3ZhciBhPXRoaXMueC5zcXVhcmUoKS5tdWx0aXBseShlKS5hZGQodGhpcy5jdXJ2ZS5hKS5kaXZpZGUodGhpcy55Lm11bHRpcGx5KGIpKTt2YXIgYz1hLnNxdWFyZSgpLnN1YnRyYWN0KHRoaXMueC5tdWx0aXBseShiKSk7dmFyIGQ9YS5tdWx0aXBseSh0aGlzLnguc3VidHJhY3QoYykpLnN1YnRyYWN0KHRoaXMueSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSxjLGQpfTtFQ1BvaW50RnAucHJvdG90eXBlLm11bHRpcGx5MkQ9ZnVuY3Rpb24oYil7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKGIuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9Yjt2YXIgZj1nLm11bHRpcGx5KG5ldyBCaWdJbnRlZ2VyKFwiM1wiKSk7dmFyIGw9dGhpcy5uZWdhdGUoKTt2YXIgZD10aGlzO3ZhciBjO2ZvcihjPWYuYml0TGVuZ3RoKCktMjtjPjA7LS1jKXtkPWQudHdpY2UoKTt2YXIgYT1mLnRlc3RCaXQoYyk7dmFyIGo9Zy50ZXN0Qml0KGMpO2lmKGEhPWope2Q9ZC5hZGQyRChhP3RoaXM6bCl9fXJldHVybiBkfTtFQ1BvaW50RnAucHJvdG90eXBlLmlzT25DdXJ2ZT1mdW5jdGlvbigpe3ZhciBkPXRoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBpPXRoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBmPXRoaXMuY3VydmUuZ2V0QSgpLnRvQmlnSW50ZWdlcigpO3ZhciBjPXRoaXMuY3VydmUuZ2V0QigpLnRvQmlnSW50ZWdlcigpO3ZhciBoPXRoaXMuY3VydmUuZ2V0USgpO3ZhciBlPWkubXVsdGlwbHkoaSkubW9kKGgpO3ZhciBnPWQubXVsdGlwbHkoZCkubXVsdGlwbHkoZCkuYWRkKGYubXVsdGlwbHkoZCkpLmFkZChjKS5tb2QoaCk7cmV0dXJuIGUuZXF1YWxzKGcpfTtFQ1BvaW50RnAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCIoXCIrdGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCkudG9TdHJpbmcoKStcIixcIit0aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKS50b1N0cmluZygpK1wiKVwifTtFQ1BvaW50RnAucHJvdG90eXBlLnZhbGlkYXRlPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5jdXJ2ZS5nZXRRKCk7aWYodGhpcy5pc0luZmluaXR5KCkpe3Rocm93IG5ldyBFcnJvcihcIlBvaW50IGlzIGF0IGluZmluaXR5LlwiKX12YXIgYT10aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgYj10aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKTtpZihhLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8YS5jb21wYXJlVG8oYy5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpPjApe3Rocm93IG5ldyBFcnJvcihcInggY29vcmRpbmF0ZSBvdXQgb2YgYm91bmRzXCIpfWlmKGIuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKTwwfHxiLmNvbXBhcmVUbyhjLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk+MCl7dGhyb3cgbmV3IEVycm9yKFwieSBjb29yZGluYXRlIG91dCBvZiBib3VuZHNcIil9aWYoIXRoaXMuaXNPbkN1cnZlKCkpe3Rocm93IG5ldyBFcnJvcihcIlBvaW50IGlzIG5vdCBvbiB0aGUgY3VydmUuXCIpfWlmKHRoaXMubXVsdGlwbHkoYykuaXNJbmZpbml0eSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBub3QgYSBzY2FsYXIgbXVsdGlwbGUgb2YgRy5cIil9cmV0dXJuIHRydWV9O1xuLyohIE1pa2UgU2FtdWVsIChjKSAyMDA5IHwgY29kZS5nb29nbGUuY29tL3AvanNvbi1zYW5zLWV2YWxcbiAqL1xudmFyIGpzb25QYXJzZT0oZnVuY3Rpb24oKXt2YXIgZT1cIig/Oi0/XFxcXGIoPzowfFsxLTldWzAtOV0qKSg/OlxcXFwuWzAtOV0rKT8oPzpbZUVdWystXT9bMC05XSspP1xcXFxiKVwiO3ZhciBqPScoPzpbXlxcXFwwLVxcXFx4MDhcXFxceDBhLVxcXFx4MWZcIlxcXFxcXFxcXXxcXFxcXFxcXCg/OltcIi9cXFxcXFxcXGJmbnJ0XXx1WzAtOUEtRmEtZl17NH0pKSc7dmFyIGk9Jyg/OlwiJytqKycqXCIpJzt2YXIgZD1uZXcgUmVnRXhwKFwiKD86ZmFsc2V8dHJ1ZXxudWxsfFtcXFxce1xcXFx9XFxcXFtcXFxcXV18XCIrZStcInxcIitpK1wiKVwiLFwiZ1wiKTt2YXIgaz1uZXcgUmVnRXhwKFwiXFxcXFxcXFwoPzooW151XSl8dSguezR9KSlcIixcImdcIik7dmFyIGc9eydcIic6J1wiJyxcIi9cIjpcIi9cIixcIlxcXFxcIjpcIlxcXFxcIixiOlwiXFxiXCIsZjpcIlxcZlwiLG46XCJcXG5cIixyOlwiXFxyXCIsdDpcIlxcdFwifTtmdW5jdGlvbiBoKGwsbSxuKXtyZXR1cm4gbT9nW21dOlN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobiwxNikpfXZhciBjPW5ldyBTdHJpbmcoXCJcIik7dmFyIGE9XCJcXFxcXCI7dmFyIGY9e1wie1wiOk9iamVjdCxcIltcIjpBcnJheX07dmFyIGI9T2JqZWN0Lmhhc093blByb3BlcnR5O3JldHVybiBmdW5jdGlvbih1LHEpe3ZhciBwPXUubWF0Y2goZCk7dmFyIHg7dmFyIHY9cFswXTt2YXIgbD1mYWxzZTtpZihcIntcIj09PXYpe3g9e319ZWxzZXtpZihcIltcIj09PXYpe3g9W119ZWxzZXt4PVtdO2w9dHJ1ZX19dmFyIHQ7dmFyIHI9W3hdO2Zvcih2YXIgbz0xLWwsbT1wLmxlbmd0aDtvPG07KytvKXt2PXBbb107dmFyIHc7c3dpdGNoKHYuY2hhckNvZGVBdCgwKSl7ZGVmYXVsdDp3PXJbMF07d1t0fHx3Lmxlbmd0aF09Kyh2KTt0PXZvaWQgMDticmVhaztjYXNlIDM0OnY9di5zdWJzdHJpbmcoMSx2Lmxlbmd0aC0xKTtpZih2LmluZGV4T2YoYSkhPT0tMSl7dj12LnJlcGxhY2UoayxoKX13PXJbMF07aWYoIXQpe2lmKHcgaW5zdGFuY2VvZiBBcnJheSl7dD13Lmxlbmd0aH1lbHNle3Q9dnx8YzticmVha319d1t0XT12O3Q9dm9pZCAwO2JyZWFrO2Nhc2UgOTE6dz1yWzBdO3IudW5zaGlmdCh3W3R8fHcubGVuZ3RoXT1bXSk7dD12b2lkIDA7YnJlYWs7Y2FzZSA5MzpyLnNoaWZ0KCk7YnJlYWs7Y2FzZSAxMDI6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPWZhbHNlO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMTEwOnc9clswXTt3W3R8fHcubGVuZ3RoXT1udWxsO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMTE2Onc9clswXTt3W3R8fHcubGVuZ3RoXT10cnVlO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMTIzOnc9clswXTtyLnVuc2hpZnQod1t0fHx3Lmxlbmd0aF09e30pO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMTI1OnIuc2hpZnQoKTticmVha319aWYobCl7aWYoci5sZW5ndGghPT0xKXt0aHJvdyBuZXcgRXJyb3IoKX14PXhbMF19ZWxzZXtpZihyLmxlbmd0aCl7dGhyb3cgbmV3IEVycm9yKCl9fWlmKHEpe3ZhciBzPWZ1bmN0aW9uKEMsQil7dmFyIEQ9Q1tCXTtpZihEJiZ0eXBlb2YgRD09PVwib2JqZWN0XCIpe3ZhciBuPW51bGw7Zm9yKHZhciB6IGluIEQpe2lmKGIuY2FsbChELHopJiZEIT09Qyl7dmFyIHk9cyhELHopO2lmKHkhPT12b2lkIDApe0Rbel09eX1lbHNle2lmKCFuKXtuPVtdfW4ucHVzaCh6KX19fWlmKG4pe2Zvcih2YXIgQT1uLmxlbmd0aDstLUE+PTA7KXtkZWxldGUgRFtuW0FdXX19fXJldHVybiBxLmNhbGwoQyxCLEQpfTt4PXMoe1wiXCI6eH0sXCJcIil9cmV0dXJuIHh9fSkoKTtcbi8qISBhc24xLTEuMC4xMC5qcyAoYykgMjAxMy0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319S0pVUi5hc24xLkFTTjFVdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuaW50ZWdlclRvQnl0ZUhleD1mdW5jdGlvbihhKXt2YXIgYj1hLnRvU3RyaW5nKDE2KTtpZigoYi5sZW5ndGglMik9PTEpe2I9XCIwXCIrYn1yZXR1cm4gYn07dGhpcy5iaWdJbnRUb01pblR3b3NDb21wbGVtZW50c0hleD1mdW5jdGlvbihqKXt2YXIgZj1qLnRvU3RyaW5nKDE2KTtpZihmLnN1YnN0cigwLDEpIT1cIi1cIil7aWYoZi5sZW5ndGglMj09MSl7Zj1cIjBcIitmfWVsc2V7aWYoIWYubWF0Y2goL15bMC03XS8pKXtmPVwiMDBcIitmfX19ZWxzZXt2YXIgYT1mLnN1YnN0cigxKTt2YXIgZT1hLmxlbmd0aDtpZihlJTI9PTEpe2UrPTF9ZWxzZXtpZighZi5tYXRjaCgvXlswLTddLykpe2UrPTJ9fXZhciBnPVwiXCI7Zm9yKHZhciBkPTA7ZDxlO2QrKyl7Zys9XCJmXCJ9dmFyIGM9bmV3IEJpZ0ludGVnZXIoZywxNik7dmFyIGI9Yy54b3IoaikuYWRkKEJpZ0ludGVnZXIuT05FKTtmPWIudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14tLyxcIlwiKX1yZXR1cm4gZn07dGhpcy5nZXRQRU1TdHJpbmdGcm9tSGV4PWZ1bmN0aW9uKGEsYil7dmFyIGM9aGV4dG9iNjQoYSk7dmFyIGQ9Yy5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtkPWQucmVwbGFjZSgvXFxyXFxuJC8sXCJcIik7cmV0dXJuXCItLS0tLUJFR0lOIFwiK2IrXCItLS0tLVxcclxcblwiK2QrXCJcXHJcXG4tLS0tLUVORCBcIitiK1wiLS0tLS1cXHJcXG5cIn07dGhpcy5uZXdPYmplY3Q9ZnVuY3Rpb24oYil7dmFyIGc9S0pVUi5hc24xO3ZhciBrPU9iamVjdC5rZXlzKGIpO2lmKGsubGVuZ3RoIT0xKXt0aHJvd1wia2V5IG9mIHBhcmFtIHNoYWxsIGJlIG9ubHkgb25lLlwifXZhciBqPWtbMF07aWYoXCI6Ym9vbDppbnQ6Yml0c3RyOm9jdHN0cjpudWxsOm9pZDplbnVtOnV0ZjhzdHI6bnVtc3RyOnBybnN0cjp0ZWxzdHI6aWE1c3RyOnV0Y3RpbWU6Z2VudGltZTpzZXE6c2V0OnRhZzpcIi5pbmRleE9mKFwiOlwiK2orXCI6XCIpPT0tMSl7dGhyb3dcInVuZGVmaW5lZCBrZXk6IFwiK2p9aWYoaj09XCJib29sXCIpe3JldHVybiBuZXcgZy5ERVJCb29sZWFuKGJbal0pfWlmKGo9PVwiaW50XCIpe3JldHVybiBuZXcgZy5ERVJJbnRlZ2VyKGJbal0pfWlmKGo9PVwiYml0c3RyXCIpe3JldHVybiBuZXcgZy5ERVJCaXRTdHJpbmcoYltqXSl9aWYoaj09XCJvY3RzdHJcIil7cmV0dXJuIG5ldyBnLkRFUk9jdGV0U3RyaW5nKGJbal0pfWlmKGo9PVwibnVsbFwiKXtyZXR1cm4gbmV3IGcuREVSTnVsbChiW2pdKX1pZihqPT1cIm9pZFwiKXtyZXR1cm4gbmV3IGcuREVST2JqZWN0SWRlbnRpZmllcihiW2pdKX1pZihqPT1cImVudW1cIil7cmV0dXJuIG5ldyBnLkRFUkVudW1lcmF0ZWQoYltqXSl9aWYoaj09XCJ1dGY4c3RyXCIpe3JldHVybiBuZXcgZy5ERVJVVEY4U3RyaW5nKGJbal0pfWlmKGo9PVwibnVtc3RyXCIpe3JldHVybiBuZXcgZy5ERVJOdW1lcmljU3RyaW5nKGJbal0pfWlmKGo9PVwicHJuc3RyXCIpe3JldHVybiBuZXcgZy5ERVJQcmludGFibGVTdHJpbmcoYltqXSl9aWYoaj09XCJ0ZWxzdHJcIil7cmV0dXJuIG5ldyBnLkRFUlRlbGV0ZXhTdHJpbmcoYltqXSl9aWYoaj09XCJpYTVzdHJcIil7cmV0dXJuIG5ldyBnLkRFUklBNVN0cmluZyhiW2pdKX1pZihqPT1cInV0Y3RpbWVcIil7cmV0dXJuIG5ldyBnLkRFUlVUQ1RpbWUoYltqXSl9aWYoaj09XCJnZW50aW1lXCIpe3JldHVybiBuZXcgZy5ERVJHZW5lcmFsaXplZFRpbWUoYltqXSl9aWYoaj09XCJzZXFcIil7dmFyIG09YltqXTt2YXIgaD1bXTtmb3IodmFyIGU9MDtlPG0ubGVuZ3RoO2UrKyl7dmFyIGw9Zy5BU04xVXRpbC5uZXdPYmplY3QobVtlXSk7aC5wdXNoKGwpfXJldHVybiBuZXcgZy5ERVJTZXF1ZW5jZSh7YXJyYXk6aH0pfWlmKGo9PVwic2V0XCIpe3ZhciBtPWJbal07dmFyIGg9W107Zm9yKHZhciBlPTA7ZTxtLmxlbmd0aDtlKyspe3ZhciBsPWcuQVNOMVV0aWwubmV3T2JqZWN0KG1bZV0pO2gucHVzaChsKX1yZXR1cm4gbmV3IGcuREVSU2V0KHthcnJheTpofSl9aWYoaj09XCJ0YWdcIil7dmFyIGM9YltqXTtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYyk9PT1cIltvYmplY3QgQXJyYXldXCImJmMubGVuZ3RoPT0zKXt2YXIgZD1nLkFTTjFVdGlsLm5ld09iamVjdChjWzJdKTtyZXR1cm4gbmV3IGcuREVSVGFnZ2VkT2JqZWN0KHt0YWc6Y1swXSxleHBsaWNpdDpjWzFdLG9iajpkfSl9ZWxzZXt2YXIgZj17fTtpZihjLmV4cGxpY2l0IT09dW5kZWZpbmVkKXtmLmV4cGxpY2l0PWMuZXhwbGljaXR9aWYoYy50YWchPT11bmRlZmluZWQpe2YudGFnPWMudGFnfWlmKGMub2JqPT09dW5kZWZpbmVkKXt0aHJvd1wib2JqIHNoYWxsIGJlIHNwZWNpZmllZCBmb3IgJ3RhZycuXCJ9Zi5vYmo9Zy5BU04xVXRpbC5uZXdPYmplY3QoYy5vYmopO3JldHVybiBuZXcgZy5ERVJUYWdnZWRPYmplY3QoZil9fX07dGhpcy5qc29uVG9BU04xSEVYPWZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMubmV3T2JqZWN0KGIpO3JldHVybiBhLmdldEVuY29kZWRIZXgoKX19O0tKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludD1mdW5jdGlvbihhKXt2YXIgaj1cIlwiO3ZhciBrPXBhcnNlSW50KGEuc3Vic3RyKDAsMiksMTYpO3ZhciBkPU1hdGguZmxvb3Ioay80MCk7dmFyIGM9ayU0MDt2YXIgaj1kK1wiLlwiK2M7dmFyIGU9XCJcIjtmb3IodmFyIGY9MjtmPGEubGVuZ3RoO2YrPTIpe3ZhciBnPXBhcnNlSW50KGEuc3Vic3RyKGYsMiksMTYpO3ZhciBoPShcIjAwMDAwMDAwXCIrZy50b1N0cmluZygyKSkuc2xpY2UoLTgpO2U9ZStoLnN1YnN0cigxLDcpO2lmKGguc3Vic3RyKDAsMSk9PVwiMFwiKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihlLDIpO2o9aitcIi5cIitiLnRvU3RyaW5nKDEwKTtlPVwiXCJ9fXJldHVybiBqfTtLSlVSLmFzbjEuQVNOMVV0aWwub2lkSW50VG9IZXg9ZnVuY3Rpb24oZil7dmFyIGU9ZnVuY3Rpb24oYSl7dmFyIGs9YS50b1N0cmluZygxNik7aWYoay5sZW5ndGg9PTEpe2s9XCIwXCIra31yZXR1cm4ga307dmFyIGQ9ZnVuY3Rpb24obyl7dmFyIG49XCJcIjt2YXIgaz1uZXcgQmlnSW50ZWdlcihvLDEwKTt2YXIgYT1rLnRvU3RyaW5nKDIpO3ZhciBsPTctYS5sZW5ndGglNztpZihsPT03KXtsPTB9dmFyIHE9XCJcIjtmb3IodmFyIG09MDttPGw7bSsrKXtxKz1cIjBcIn1hPXErYTtmb3IodmFyIG09MDttPGEubGVuZ3RoLTE7bSs9Nyl7dmFyIHA9YS5zdWJzdHIobSw3KTtpZihtIT1hLmxlbmd0aC03KXtwPVwiMVwiK3B9bis9ZShwYXJzZUludChwLDIpKX1yZXR1cm4gbn07aWYoIWYubWF0Y2goL15bMC05Ll0rJC8pKXt0aHJvd1wibWFsZm9ybWVkIG9pZCBzdHJpbmc6IFwiK2Z9dmFyIGc9XCJcIjt2YXIgYj1mLnNwbGl0KFwiLlwiKTt2YXIgaj1wYXJzZUludChiWzBdKSo0MCtwYXJzZUludChiWzFdKTtnKz1lKGopO2Iuc3BsaWNlKDAsMik7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2crPWQoYltjXSl9cmV0dXJuIGd9O0tKVVIuYXNuMS5BU04xT2JqZWN0PWZ1bmN0aW9uKCl7dmFyIGM9dHJ1ZTt2YXIgYj1udWxsO3ZhciBkPVwiMDBcIjt2YXIgZT1cIjAwXCI7dmFyIGE9XCJcIjt0aGlzLmdldExlbmd0aEhleEZyb21WYWx1ZT1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhWPT1cInVuZGVmaW5lZFwifHx0aGlzLmhWPT1udWxsKXt0aHJvd1widGhpcy5oViBpcyBudWxsIG9yIHVuZGVmaW5lZC5cIn1pZih0aGlzLmhWLmxlbmd0aCUyPT0xKXt0aHJvd1widmFsdWUgaGV4IG11c3QgYmUgZXZlbiBsZW5ndGg6IG49XCIrYS5sZW5ndGgrXCIsdj1cIit0aGlzLmhWfXZhciBpPXRoaXMuaFYubGVuZ3RoLzI7dmFyIGg9aS50b1N0cmluZygxNik7aWYoaC5sZW5ndGglMj09MSl7aD1cIjBcIitofWlmKGk8MTI4KXtyZXR1cm4gaH1lbHNle3ZhciBnPWgubGVuZ3RoLzI7aWYoZz4xNSl7dGhyb3dcIkFTTi4xIGxlbmd0aCB0b28gbG9uZyB0byByZXByZXNlbnQgYnkgOHg6IG4gPSBcIitpLnRvU3RyaW5nKDE2KX12YXIgZj0xMjgrZztyZXR1cm4gZi50b1N0cmluZygxNikraH19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaFRMVj09bnVsbHx8dGhpcy5pc01vZGlmaWVkKXt0aGlzLmhWPXRoaXMuZ2V0RnJlc2hWYWx1ZUhleCgpO3RoaXMuaEw9dGhpcy5nZXRMZW5ndGhIZXhGcm9tVmFsdWUoKTt0aGlzLmhUTFY9dGhpcy5oVCt0aGlzLmhMK3RoaXMuaFY7dGhpcy5pc01vZGlmaWVkPWZhbHNlfXJldHVybiB0aGlzLmhUTFZ9O3RoaXMuZ2V0VmFsdWVIZXg9ZnVuY3Rpb24oKXt0aGlzLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuXCJcIn19O0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLmdldFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN9O3RoaXMuc2V0U3RyaW5nPWZ1bmN0aW9uKGQpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1kO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9O3RoaXMuc2V0U3RyaW5nSGV4PWZ1bmN0aW9uKGQpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1udWxsO3RoaXMuaFY9ZH07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJzdHJpbmdcIil7dGhpcy5zZXRTdHJpbmcoYyl9ZWxzZXtpZih0eXBlb2YgYy5zdHIhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0U3RyaW5nKGMuc3RyKX1lbHNle2lmKHR5cGVvZiBjLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRTdHJpbmdIZXgoYy5oZXgpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLmxvY2FsRGF0ZVRvVVRDPWZ1bmN0aW9uKGYpe3V0Yz1mLmdldFRpbWUoKSsoZi5nZXRUaW1lem9uZU9mZnNldCgpKjYwMDAwKTt2YXIgZT1uZXcgRGF0ZSh1dGMpO3JldHVybiBlfTt0aGlzLmZvcm1hdERhdGU9ZnVuY3Rpb24obSxvLGUpe3ZhciBnPXRoaXMuemVyb1BhZGRpbmc7dmFyIG49dGhpcy5sb2NhbERhdGVUb1VUQyhtKTt2YXIgcD1TdHJpbmcobi5nZXRGdWxsWWVhcigpKTtpZihvPT1cInV0Y1wiKXtwPXAuc3Vic3RyKDIsMil9dmFyIGw9ZyhTdHJpbmcobi5nZXRNb250aCgpKzEpLDIpO3ZhciBxPWcoU3RyaW5nKG4uZ2V0RGF0ZSgpKSwyKTt2YXIgaD1nKFN0cmluZyhuLmdldEhvdXJzKCkpLDIpO3ZhciBpPWcoU3RyaW5nKG4uZ2V0TWludXRlcygpKSwyKTt2YXIgaj1nKFN0cmluZyhuLmdldFNlY29uZHMoKSksMik7dmFyIHI9cCtsK3EraCtpK2o7aWYoZT09PXRydWUpe3ZhciBmPW4uZ2V0TWlsbGlzZWNvbmRzKCk7aWYoZiE9MCl7dmFyIGs9ZyhTdHJpbmcoZiksMyk7az1rLnJlcGxhY2UoL1swXSskLyxcIlwiKTtyPXIrXCIuXCIra319cmV0dXJuIHIrXCJaXCJ9O3RoaXMuemVyb1BhZGRpbmc9ZnVuY3Rpb24oZSxkKXtpZihlLmxlbmd0aD49ZCl7cmV0dXJuIGV9cmV0dXJuIG5ldyBBcnJheShkLWUubGVuZ3RoKzEpLmpvaW4oXCIwXCIpK2V9O3RoaXMuZ2V0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc307dGhpcy5zZXRTdHJpbmc9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPWQ7dGhpcy5oVj1zdG9oZXgoZCl9O3RoaXMuc2V0QnlEYXRlVmFsdWU9ZnVuY3Rpb24oaCxqLGUsZCxmLGcpe3ZhciBpPW5ldyBEYXRlKERhdGUuVVRDKGgsai0xLGUsZCxmLGcsMCkpO3RoaXMuc2V0QnlEYXRlKGkpfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3RoaXMuc2V0QnlBU04xT2JqZWN0QXJyYXk9ZnVuY3Rpb24oYyl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5hc24xQXJyYXk9Y307dGhpcy5hcHBlbmRBU04xT2JqZWN0PWZ1bmN0aW9uKGMpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuYXNuMUFycmF5LnB1c2goYyl9O3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5hcnJheSE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xQXJyYXk9Yi5hcnJheX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSQm9vbGVhbj1mdW5jdGlvbigpe0tKVVIuYXNuMS5ERVJCb29sZWFuLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMDFcIjt0aGlzLmhUTFY9XCIwMTAxZmZcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkJvb2xlYW4sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJJbnRlZ2VyPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJJbnRlZ2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMDJcIjt0aGlzLnNldEJ5QmlnSW50ZWdlcj1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmhWPUtKVVIuYXNuMS5BU04xVXRpbC5iaWdJbnRUb01pblR3b3NDb21wbGVtZW50c0hleChiKX07dGhpcy5zZXRCeUludGVnZXI9ZnVuY3Rpb24oYyl7dmFyIGI9bmV3IEJpZ0ludGVnZXIoU3RyaW5nKGMpLDEwKTt0aGlzLnNldEJ5QmlnSW50ZWdlcihiKX07dGhpcy5zZXRWYWx1ZUhleD1mdW5jdGlvbihiKXt0aGlzLmhWPWJ9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuYmlnaW50IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5QmlnSW50ZWdlcihhLmJpZ2ludCl9ZWxzZXtpZih0eXBlb2YgYVtcImludFwiXSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUludGVnZXIoYVtcImludFwiXSl9ZWxzZXtpZih0eXBlb2YgYT09XCJudW1iZXJcIil7dGhpcy5zZXRCeUludGVnZXIoYSl9ZWxzZXtpZih0eXBlb2YgYS5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVIZXgoYS5oZXgpfX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJJbnRlZ2VyLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSQml0U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJCaXRTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwM1wiO3RoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9Yn07dGhpcy5zZXRVbnVzZWRCaXRzQW5kSGV4VmFsdWU9ZnVuY3Rpb24oYixkKXtpZihiPDB8fDc8Yil7dGhyb3dcInVudXNlZCBiaXRzIHNoYWxsIGJlIGZyb20gMCB0byA3OiB1ID0gXCIrYn12YXIgYz1cIjBcIitiO3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9YytkfTt0aGlzLnNldEJ5QmluYXJ5U3RyaW5nPWZ1bmN0aW9uKGUpe2U9ZS5yZXBsYWNlKC8wKyQvLFwiXCIpO3ZhciBmPTgtZS5sZW5ndGglODtpZihmPT04KXtmPTB9Zm9yKHZhciBnPTA7Zzw9ZjtnKyspe2UrPVwiMFwifXZhciBqPVwiXCI7Zm9yKHZhciBnPTA7ZzxlLmxlbmd0aC0xO2crPTgpe3ZhciBkPWUuc3Vic3RyKGcsOCk7dmFyIGM9cGFyc2VJbnQoZCwyKS50b1N0cmluZygxNik7aWYoYy5sZW5ndGg9PTEpe2M9XCIwXCIrY31qKz1jfXRoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9XCIwXCIrZitqfTt0aGlzLnNldEJ5Qm9vbGVhbkFycmF5PWZ1bmN0aW9uKGQpe3ZhciBjPVwiXCI7Zm9yKHZhciBiPTA7YjxkLmxlbmd0aDtiKyspe2lmKGRbYl09PXRydWUpe2MrPVwiMVwifWVsc2V7Yys9XCIwXCJ9fXRoaXMuc2V0QnlCaW5hcnlTdHJpbmcoYyl9O3RoaXMubmV3RmFsc2VBcnJheT1mdW5jdGlvbihkKXt2YXIgYj1uZXcgQXJyYXkoZCk7Zm9yKHZhciBjPTA7YzxkO2MrKyl7YltjXT1mYWxzZX1yZXR1cm4gYn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYT09XCJzdHJpbmdcIiYmYS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eWzAtOWEtZl0rJC8pKXt0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyhhKX1lbHNle2lmKHR5cGVvZiBhLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHMoYS5oZXgpfWVsc2V7aWYodHlwZW9mIGEuYmluIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5QmluYXJ5U3RyaW5nKGEuYmluKX1lbHNle2lmKHR5cGVvZiBhLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5Qm9vbGVhbkFycmF5KGEuYXJyYXkpfX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJPY3RldFN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjA0XCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJOdWxsPWZ1bmN0aW9uKCl7S0pVUi5hc24xLkRFUk51bGwuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwNVwiO3RoaXMuaFRMVj1cIjA1MDBcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk51bGwsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyPWZ1bmN0aW9uKGMpe3ZhciBiPWZ1bmN0aW9uKGQpe3ZhciBlPWQudG9TdHJpbmcoMTYpO2lmKGUubGVuZ3RoPT0xKXtlPVwiMFwiK2V9cmV0dXJuIGV9O3ZhciBhPWZ1bmN0aW9uKGspe3ZhciBqPVwiXCI7dmFyIGU9bmV3IEJpZ0ludGVnZXIoaywxMCk7dmFyIGQ9ZS50b1N0cmluZygyKTt2YXIgZj03LWQubGVuZ3RoJTc7aWYoZj09Nyl7Zj0wfXZhciBtPVwiXCI7Zm9yKHZhciBnPTA7ZzxmO2crKyl7bSs9XCIwXCJ9ZD1tK2Q7Zm9yKHZhciBnPTA7ZzxkLmxlbmd0aC0xO2crPTcpe3ZhciBsPWQuc3Vic3RyKGcsNyk7aWYoZyE9ZC5sZW5ndGgtNyl7bD1cIjFcIitsfWorPWIocGFyc2VJbnQobCwyKSl9cmV0dXJuIGp9O0tKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMDZcIjt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGQpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1udWxsO3RoaXMuaFY9ZH07dGhpcy5zZXRWYWx1ZU9pZFN0cmluZz1mdW5jdGlvbihmKXtpZighZi5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJtYWxmb3JtZWQgb2lkIHN0cmluZzogXCIrZn12YXIgZz1cIlwiO3ZhciBkPWYuc3BsaXQoXCIuXCIpO3ZhciBqPXBhcnNlSW50KGRbMF0pKjQwK3BhcnNlSW50KGRbMV0pO2crPWIoaik7ZC5zcGxpY2UoMCwyKTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7Zys9YShkW2VdKX10aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9bnVsbDt0aGlzLmhWPWd9O3RoaXMuc2V0VmFsdWVOYW1lPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBLSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0W2VdIT1cInVuZGVmaW5lZFwiKXt2YXIgZD1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0W2VdO3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoZCl9ZWxzZXt0aHJvd1wiREVST2JqZWN0SWRlbnRpZmllciBvaWROYW1lIHVuZGVmaW5lZDogXCIrZX19O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwic3RyaW5nXCImJmMubWF0Y2goL15bMC0yXS5bMC05Ll0rJC8pKXt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKGMpfWVsc2V7aWYoS0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdFtjXSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhLSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0W2NdKX1lbHNle2lmKHR5cGVvZiBjLm9pZCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhjLm9pZCl9ZWxzZXtpZih0eXBlb2YgYy5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVIZXgoYy5oZXgpfWVsc2V7aWYodHlwZW9mIGMubmFtZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZU5hbWUoYy5uYW1lKX19fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJFbnVtZXJhdGVkPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJFbnVtZXJhdGVkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMGFcIjt0aGlzLnNldEJ5QmlnSW50ZWdlcj1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmhWPUtKVVIuYXNuMS5BU04xVXRpbC5iaWdJbnRUb01pblR3b3NDb21wbGVtZW50c0hleChiKX07dGhpcy5zZXRCeUludGVnZXI9ZnVuY3Rpb24oYyl7dmFyIGI9bmV3IEJpZ0ludGVnZXIoU3RyaW5nKGMpLDEwKTt0aGlzLnNldEJ5QmlnSW50ZWdlcihiKX07dGhpcy5zZXRWYWx1ZUhleD1mdW5jdGlvbihiKXt0aGlzLmhWPWJ9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGFbXCJpbnRcIl0hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGFbXCJpbnRcIl0pfWVsc2V7aWYodHlwZW9mIGE9PVwibnVtYmVyXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGEpfWVsc2V7aWYodHlwZW9mIGEuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlSGV4KGEuaGV4KX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJFbnVtZXJhdGVkLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSVVRGOFN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVVRGOFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMGNcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlVURjhTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTJcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk51bWVyaWNTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjEzXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTRcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSSUE1U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJJQTVTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE2XCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSVVRDVGltZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVVRDVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTdcIjt0aGlzLnNldEJ5RGF0ZT1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmRhdGU9Yjt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcInV0Y1wiKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5kYXRlPT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5zPT1cInVuZGVmaW5lZFwiKXt0aGlzLmRhdGU9bmV3IERhdGUoKTt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcInV0Y1wiKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfXJldHVybiB0aGlzLmhWfTtpZihhIT09dW5kZWZpbmVkKXtpZihhLnN0ciE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmcoYS5zdHIpfWVsc2V7aWYodHlwZW9mIGE9PVwic3RyaW5nXCImJmEubWF0Y2goL15bMC05XXsxMn1aJC8pKXt0aGlzLnNldFN0cmluZyhhKX1lbHNle2lmKGEuaGV4IT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZ0hleChhLmhleCl9ZWxzZXtpZihhLmRhdGUhPT11bmRlZmluZWQpe3RoaXMuc2V0QnlEYXRlKGEuZGF0ZSl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlVUQ1RpbWUsS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSk7S0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxOFwiO3RoaXMud2l0aE1pbGxpcz1mYWxzZTt0aGlzLnNldEJ5RGF0ZT1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmRhdGU9Yjt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcImdlblwiLHRoaXMud2l0aE1pbGxpcyk7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kYXRlPT09dW5kZWZpbmVkJiZ0aGlzLnM9PT11bmRlZmluZWQpe3RoaXMuZGF0ZT1uZXcgRGF0ZSgpO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwiZ2VuXCIsdGhpcy53aXRoTWlsbGlzKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfXJldHVybiB0aGlzLmhWfTtpZihhIT09dW5kZWZpbmVkKXtpZihhLnN0ciE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmcoYS5zdHIpfWVsc2V7aWYodHlwZW9mIGE9PVwic3RyaW5nXCImJmEubWF0Y2goL15bMC05XXsxNH1aJC8pKXt0aGlzLnNldFN0cmluZyhhKX1lbHNle2lmKGEuaGV4IT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZ0hleChhLmhleCl9ZWxzZXtpZihhLmRhdGUhPT11bmRlZmluZWQpe3RoaXMuc2V0QnlEYXRlKGEuZGF0ZSl9fX19aWYoYS5taWxsaXM9PT10cnVlKXt0aGlzLndpdGhNaWxsaXM9dHJ1ZX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWUpO0tKVVIuYXNuMS5ERVJTZXF1ZW5jZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSU2VxdWVuY2Uuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjMwXCI7dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGM9XCJcIjtmb3IodmFyIGI9MDtiPHRoaXMuYXNuMUFycmF5Lmxlbmd0aDtiKyspe3ZhciBkPXRoaXMuYXNuMUFycmF5W2JdO2MrPWQuZ2V0RW5jb2RlZEhleCgpfXRoaXMuaFY9YztyZXR1cm4gdGhpcy5oVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkKTtLSlVSLmFzbjEuREVSU2V0PWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJTZXQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjMxXCI7dGhpcy5zb3J0RmxhZz10cnVlO3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBiPW5ldyBBcnJheSgpO2Zvcih2YXIgYz0wO2M8dGhpcy5hc24xQXJyYXkubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5hc24xQXJyYXlbY107Yi5wdXNoKGQuZ2V0RW5jb2RlZEhleCgpKX1pZih0aGlzLnNvcnRGbGFnPT10cnVlKXtiLnNvcnQoKX10aGlzLmhWPWIuam9pbihcIlwiKTtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLnNvcnRmbGFnIT1cInVuZGVmaW5lZFwiJiZhLnNvcnRmbGFnPT1mYWxzZSl7dGhpcy5zb3J0RmxhZz1mYWxzZX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSU2V0LEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpO0tKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Q9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cImEwXCI7dGhpcy5oVj1cIlwiO3RoaXMuaXNFeHBsaWNpdD10cnVlO3RoaXMuYXNuMU9iamVjdD1udWxsO3RoaXMuc2V0QVNOMU9iamVjdD1mdW5jdGlvbihiLGMsZCl7dGhpcy5oVD1jO3RoaXMuaXNFeHBsaWNpdD1iO3RoaXMuYXNuMU9iamVjdD1kO2lmKHRoaXMuaXNFeHBsaWNpdCl7dGhpcy5oVj10aGlzLmFzbjFPYmplY3QuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlfWVsc2V7dGhpcy5oVj1udWxsO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTt0aGlzLmhUTFY9dGhpcy5oVExWLnJlcGxhY2UoL14uLi8sYyk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS50YWchPVwidW5kZWZpbmVkXCIpe3RoaXMuaFQ9YS50YWd9aWYodHlwZW9mIGEuZXhwbGljaXQhPVwidW5kZWZpbmVkXCIpe3RoaXMuaXNFeHBsaWNpdD1hLmV4cGxpY2l0fWlmKHR5cGVvZiBhLm9iaiE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xT2JqZWN0PWEub2JqO3RoaXMuc2V0QVNOMU9iamVjdCh0aGlzLmlzRXhwbGljaXQsdGhpcy5oVCx0aGlzLmFzbjFPYmplY3QpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3QsS0pVUi5hc24xLkFTTjFPYmplY3QpO1xuLyohIGFzbjFoZXgtMS4xLjYuanMgKGMpIDIwMTItMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG52YXIgQVNOMUhFWD1uZXcgZnVuY3Rpb24oKXt0aGlzLmdldEJ5dGVMZW5ndGhPZkxfQXRPYmo9ZnVuY3Rpb24oYixjKXtpZihiLnN1YnN0cmluZyhjKzIsYyszKSE9XCI4XCIpe3JldHVybiAxfXZhciBhPXBhcnNlSW50KGIuc3Vic3RyaW5nKGMrMyxjKzQpKTtpZihhPT0wKXtyZXR1cm4gLTF9aWYoMDxhJiZhPDEwKXtyZXR1cm4gYSsxfXJldHVybiAtMn07dGhpcy5nZXRIZXhPZkxfQXRPYmo9ZnVuY3Rpb24oYixjKXt2YXIgYT10aGlzLmdldEJ5dGVMZW5ndGhPZkxfQXRPYmooYixjKTtpZihhPDEpe3JldHVyblwiXCJ9cmV0dXJuIGIuc3Vic3RyaW5nKGMrMixjKzIrYSoyKX07dGhpcy5nZXRJbnRPZkxfQXRPYmo9ZnVuY3Rpb24oYyxkKXt2YXIgYj10aGlzLmdldEhleE9mTF9BdE9iaihjLGQpO2lmKGI9PVwiXCIpe3JldHVybiAtMX12YXIgYTtpZihwYXJzZUludChiLnN1YnN0cmluZygwLDEpKTw4KXthPW5ldyBCaWdJbnRlZ2VyKGIsMTYpfWVsc2V7YT1uZXcgQmlnSW50ZWdlcihiLnN1YnN0cmluZygyKSwxNil9cmV0dXJuIGEuaW50VmFsdWUoKX07dGhpcy5nZXRTdGFydFBvc09mVl9BdE9iaj1mdW5jdGlvbihiLGMpe3ZhciBhPXRoaXMuZ2V0Qnl0ZUxlbmd0aE9mTF9BdE9iaihiLGMpO2lmKGE8MCl7cmV0dXJuIGF9cmV0dXJuIGMrKGErMSkqMn07dGhpcy5nZXRIZXhPZlZfQXRPYmo9ZnVuY3Rpb24oYyxkKXt2YXIgYj10aGlzLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGMsZCk7dmFyIGE9dGhpcy5nZXRJbnRPZkxfQXRPYmooYyxkKTtyZXR1cm4gYy5zdWJzdHJpbmcoYixiK2EqMil9O3RoaXMuZ2V0SGV4T2ZUTFZfQXRPYmo9ZnVuY3Rpb24oYyxlKXt2YXIgYj1jLnN1YnN0cihlLDIpO3ZhciBkPXRoaXMuZ2V0SGV4T2ZMX0F0T2JqKGMsZSk7dmFyIGE9dGhpcy5nZXRIZXhPZlZfQXRPYmooYyxlKTtyZXR1cm4gYitkK2F9O3RoaXMuZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaj1mdW5jdGlvbihjLGQpe3ZhciBiPXRoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmooYyxkKTt2YXIgYT10aGlzLmdldEludE9mTF9BdE9iaihjLGQpO3JldHVybiBiK2EqMn07dGhpcy5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmo9ZnVuY3Rpb24oZixqKXt2YXIgYz1uZXcgQXJyYXkoKTt2YXIgaT10aGlzLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGYsaik7Yy5wdXNoKGkpO3ZhciBiPXRoaXMuZ2V0SW50T2ZMX0F0T2JqKGYsaik7dmFyIGc9aTt2YXIgZD0wO3doaWxlKDEpe3ZhciBlPXRoaXMuZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihmLGcpO2lmKGU9PW51bGx8fChlLWk+PShiKjIpKSl7YnJlYWt9aWYoZD49MjAwKXticmVha31jLnB1c2goZSk7Zz1lO2QrK31yZXR1cm4gY307dGhpcy5nZXROdGhDaGlsZEluZGV4X0F0T2JqPWZ1bmN0aW9uKGQsYixlKXt2YXIgYz10aGlzLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLGIpO3JldHVybiBjW2VdfTt0aGlzLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0PWZ1bmN0aW9uKGUsZCxjKXtpZihjLmxlbmd0aD09MCl7cmV0dXJuIGR9dmFyIGY9Yy5zaGlmdCgpO3ZhciBiPXRoaXMuZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsZCk7cmV0dXJuIHRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZSxiW2ZdLGMpfTt0aGlzLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdD1mdW5jdGlvbihkLGMsYil7dmFyIGE9dGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChkLGMsYik7cmV0dXJuIHRoaXMuZ2V0SGV4T2ZUTFZfQXRPYmooZCxhKX07dGhpcy5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0PWZ1bmN0aW9uKGQsYyxiKXt2YXIgYT10aGlzLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGQsYyxiKTtyZXR1cm4gdGhpcy5nZXRIZXhPZlZfQXRPYmooZCxhKX19O0FTTjFIRVguZ2V0VmJ5TGlzdD1mdW5jdGlvbihkLGMsYixlKXt2YXIgYT10aGlzLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGQsYyxiKTtpZihhPT09dW5kZWZpbmVkKXt0aHJvd1wiY2FuJ3QgZmluZCBudGhMaXN0IG9iamVjdFwifWlmKGUhPT11bmRlZmluZWQpe2lmKGQuc3Vic3RyKGEsMikhPWUpe3Rocm93XCJjaGVja2luZyB0YWcgZG9lc24ndCBtYXRjaDogXCIrZC5zdWJzdHIoYSwyKStcIiE9XCIrZX19cmV0dXJuIHRoaXMuZ2V0SGV4T2ZWX0F0T2JqKGQsYSl9O0FTTjFIRVguaGV4dG9vaWRzdHI9ZnVuY3Rpb24oZSl7dmFyIGg9ZnVuY3Rpb24oYixhKXtpZihiLmxlbmd0aD49YSl7cmV0dXJuIGJ9cmV0dXJuIG5ldyBBcnJheShhLWIubGVuZ3RoKzEpLmpvaW4oXCIwXCIpK2J9O3ZhciBsPVtdO3ZhciBvPWUuc3Vic3RyKDAsMik7dmFyIGY9cGFyc2VJbnQobywxNik7bFswXT1uZXcgU3RyaW5nKE1hdGguZmxvb3IoZi80MCkpO2xbMV09bmV3IFN0cmluZyhmJTQwKTt2YXIgbT1lLnN1YnN0cigyKTt2YXIgaz1bXTtmb3IodmFyIGc9MDtnPG0ubGVuZ3RoLzI7ZysrKXtrLnB1c2gocGFyc2VJbnQobS5zdWJzdHIoZyoyLDIpLDE2KSl9dmFyIGo9W107dmFyIGQ9XCJcIjtmb3IodmFyIGc9MDtnPGsubGVuZ3RoO2crKyl7aWYoa1tnXSYxMjgpe2Q9ZCtoKChrW2ddJjEyNykudG9TdHJpbmcoMiksNyl9ZWxzZXtkPWQraCgoa1tnXSYxMjcpLnRvU3RyaW5nKDIpLDcpO2oucHVzaChuZXcgU3RyaW5nKHBhcnNlSW50KGQsMikpKTtkPVwiXCJ9fXZhciBuPWwuam9pbihcIi5cIik7aWYoai5sZW5ndGg+MCl7bj1uK1wiLlwiK2ouam9pbihcIi5cIil9cmV0dXJuIG59O0FTTjFIRVguZHVtcD1mdW5jdGlvbihlLGMsayxnKXt2YXIgbz1mdW5jdGlvbih3LGkpe2lmKHcubGVuZ3RoPD1pKjIpe3JldHVybiB3fWVsc2V7dmFyIHY9dy5zdWJzdHIoMCxpKStcIi4uKHRvdGFsIFwiK3cubGVuZ3RoLzIrXCJieXRlcykuLlwiK3cuc3Vic3RyKHcubGVuZ3RoLWksaSk7cmV0dXJuIHZ9fTtpZihjPT09dW5kZWZpbmVkKXtjPXtvbW1pdF9sb25nX29jdGV0OjMyfX1pZihrPT09dW5kZWZpbmVkKXtrPTB9aWYoZz09PXVuZGVmaW5lZCl7Zz1cIlwifXZhciByPWMub21taXRfbG9uZ19vY3RldDtpZihlLnN1YnN0cihrLDIpPT1cIjAxXCIpe3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7aWYoaD09XCIwMFwiKXtyZXR1cm4gZytcIkJPT0xFQU4gRkFMU0VcXG5cIn1lbHNle3JldHVybiBnK1wiQk9PTEVBTiBUUlVFXFxuXCJ9fWlmKGUuc3Vic3RyKGssMik9PVwiMDJcIil7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTtyZXR1cm4gZytcIklOVEVHRVIgXCIrbyhoLHIpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIwM1wiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO3JldHVybiBnK1wiQklUU1RSSU5HIFwiK28oaCxyKStcIlxcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMDRcIil7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTtpZihBU04xSEVYLmlzQVNOMUhFWChoKSl7dmFyIGo9ZytcIk9DVEVUU1RSSU5HLCBlbmNhcHN1bGF0ZXNcXG5cIjtqPWorQVNOMUhFWC5kdW1wKGgsYywwLGcrXCIgIFwiKTtyZXR1cm4gan1lbHNle3JldHVybiBnK1wiT0NURVRTVFJJTkcgXCIrbyhoLHIpK1wiXFxuXCJ9fWlmKGUuc3Vic3RyKGssMik9PVwiMDVcIil7cmV0dXJuIGcrXCJOVUxMXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIwNlwiKXt2YXIgbD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO3ZhciBhPUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludChsKTt2YXIgbj1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYSk7dmFyIGI9YS5yZXBsYWNlKC9cXC4vZyxcIiBcIik7aWYobiE9XCJcIil7cmV0dXJuIGcrXCJPYmplY3RJZGVudGlmaWVyIFwiK24rXCIgKFwiK2IrXCIpXFxuXCJ9ZWxzZXtyZXR1cm4gZytcIk9iamVjdElkZW50aWZpZXIgKFwiK2IrXCIpXFxuXCJ9fWlmKGUuc3Vic3RyKGssMik9PVwiMGNcIil7cmV0dXJuIGcrXCJVVEY4U3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxM1wiKXtyZXR1cm4gZytcIlByaW50YWJsZVN0cmluZyAnXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiJ1xcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMTRcIil7cmV0dXJuIGcrXCJUZWxldGV4U3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxNlwiKXtyZXR1cm4gZytcIklBNVN0cmluZyAnXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiJ1xcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMTdcIil7cmV0dXJuIGcrXCJVVENUaW1lIFwiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIlxcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMThcIil7cmV0dXJuIGcrXCJHZW5lcmFsaXplZFRpbWUgXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIzMFwiKXtpZihlLnN1YnN0cihrLDQpPT1cIjMwMDBcIil7cmV0dXJuIGcrXCJTRVFVRU5DRSB7fVxcblwifXZhciBqPWcrXCJTRVFVRU5DRVxcblwiO3ZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsayk7dmFyIGY9YztpZigoZC5sZW5ndGg9PTJ8fGQubGVuZ3RoPT0zKSYmZS5zdWJzdHIoZFswXSwyKT09XCIwNlwiJiZlLnN1YnN0cihkW2QubGVuZ3RoLTFdLDIpPT1cIjA0XCIpe3ZhciB0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsZFswXSk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KHQpO3ZhciBuPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTt2YXIgcD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGMpKTtwLng1MDlFeHROYW1lPW47Zj1wfWZvcih2YXIgcT0wO3E8ZC5sZW5ndGg7cSsrKXtqPWorQVNOMUhFWC5kdW1wKGUsZixkW3FdLGcrXCIgIFwiKX1yZXR1cm4gan1pZihlLnN1YnN0cihrLDIpPT1cIjMxXCIpe3ZhciBqPWcrXCJTRVRcXG5cIjt2YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLGspO2Zvcih2YXIgcT0wO3E8ZC5sZW5ndGg7cSsrKXtqPWorQVNOMUhFWC5kdW1wKGUsYyxkW3FdLGcrXCIgIFwiKX1yZXR1cm4gan12YXIgdT1wYXJzZUludChlLnN1YnN0cihrLDIpLDE2KTtpZigodSYxMjgpIT0wKXt2YXIgbT11JjMxO2lmKCh1JjMyKSE9MCl7dmFyIGo9ZytcIltcIittK1wiXVxcblwiO3ZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsayk7Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe2o9aitBU04xSEVYLmR1bXAoZSxjLGRbcV0sZytcIiAgXCIpfXJldHVybiBqfWVsc2V7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTtpZihoLnN1YnN0cigwLDgpPT1cIjY4NzQ3NDcwXCIpe2g9aGV4dG91dGY4KGgpfWlmKGMueDUwOUV4dE5hbWU9PT1cInN1YmplY3RBbHROYW1lXCImJm09PTIpe2g9aGV4dG91dGY4KGgpfXZhciBqPWcrXCJbXCIrbStcIl0gXCIraCtcIlxcblwiO3JldHVybiBqfX1yZXR1cm4gZytcIlVOS05PV04oXCIrZS5zdWJzdHIoaywyKStcIikgXCIrQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKStcIlxcblwifTtBU04xSEVYLmlzQVNOMUhFWD1mdW5jdGlvbihkKXtpZihkLmxlbmd0aCUyPT0xKXtyZXR1cm4gZmFsc2V9dmFyIGM9QVNOMUhFWC5nZXRJbnRPZkxfQXRPYmooZCwwKTt2YXIgYj1kLnN1YnN0cigwLDIpO3ZhciBlPUFTTjFIRVguZ2V0SGV4T2ZMX0F0T2JqKGQsMCk7dmFyIGE9ZC5sZW5ndGgtYi5sZW5ndGgtZS5sZW5ndGg7aWYoYT09YyoyKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9O1xuLyohIGFzbjF4NTA5LTEuMC4xNC5qcyAoYykgMjAxMy0yMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS54NTA5PT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xLng1MDkpe0tKVVIuYXNuMS54NTA5PXt9fUtKVVIuYXNuMS54NTA5LkNlcnRpZmljYXRlPWZ1bmN0aW9uKGcpe0tKVVIuYXNuMS54NTA5LkNlcnRpZmljYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBkPW51bGw7dmFyIGY9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dmFyIGU9bnVsbDt0aGlzLnNldFJzYVBydktleUJ5UEVNYW5kUGFzcz1mdW5jdGlvbihpLGspe3ZhciBoPVBLQ1M1UEtFWS5nZXREZWNyeXB0ZWRLZXlIZXgoaSxrKTt2YXIgaj1uZXcgUlNBS2V5KCk7ai5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGgpO3RoaXMucHJ2S2V5PWp9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz10aGlzLmFzbjFUQlNDZXJ0LmFzbjFTaWduYXR1cmVBbGc7c2lnPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpcIlNIQTF3aXRoUlNBXCJ9KTtzaWcuaW5pdCh0aGlzLnBydktleSk7c2lnLnVwZGF0ZUhleCh0aGlzLmFzbjFUQlNDZXJ0LmdldEVuY29kZWRIZXgoKSk7dGhpcy5oZXhTaWc9c2lnLnNpZ24oKTt0aGlzLmFzbjFTaWc9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrdGhpcy5oZXhTaWd9KTt2YXIgaD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xVEJTQ2VydCx0aGlzLmFzbjFTaWduYXR1cmVBbGcsdGhpcy5hc24xU2lnXX0pO3RoaXMuaFRMVj1oLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9O3RoaXMuc2V0U2lnbmF0dXJlSGV4PWZ1bmN0aW9uKGgpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz10aGlzLmFzbjFUQlNDZXJ0LmFzbjFTaWduYXR1cmVBbGc7dGhpcy5oZXhTaWc9aDt0aGlzLmFzbjFTaWc9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrdGhpcy5oZXhTaWd9KTt2YXIgaT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xVEJTQ2VydCx0aGlzLmFzbjFTaWduYXR1cmVBbGcsdGhpcy5hc24xU2lnXX0pO3RoaXMuaFRMVj1pLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaXNNb2RpZmllZD09ZmFsc2UmJnRoaXMuaFRMViE9bnVsbCl7cmV0dXJuIHRoaXMuaFRMVn10aHJvd1wibm90IHNpZ25lZCB5ZXRcIn07dGhpcy5nZXRQRU1TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgaj10aGlzLmdldEVuY29kZWRIZXgoKTt2YXIgaD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGopO3ZhciBpPUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KGgpO3ZhciBrPWkucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7cmV0dXJuXCItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cXHJcXG5cIitrK1wiXFxyXFxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxcclxcblwifTtpZih0eXBlb2YgZyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGcudGJzY2VydG9iaiE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xVEJTQ2VydD1nLnRic2NlcnRvYmp9aWYodHlwZW9mIGcucHJ2a2V5b2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLnBydktleT1nLnBydmtleW9ian1lbHNle2lmKHR5cGVvZiBnLnJzYXBydmtleSE9XCJ1bmRlZmluZWRcIil7dGhpcy5wcnZLZXk9Zy5yc2FwcnZrZXl9ZWxzZXtpZigodHlwZW9mIGcucnNhcHJ2cGVtIT1cInVuZGVmaW5lZFwiKSYmKHR5cGVvZiBnLnJzYXBydnBhcyE9XCJ1bmRlZmluZWRcIikpe3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzKGcucnNhcHJ2cGVtLGcucnNhcHJ2cGFzKX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNlcnRpZmljYXRlLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5UQlNDZXJ0aWZpY2F0ZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5UQlNDZXJ0aWZpY2F0ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5faW5pdGlhbGl6ZT1mdW5jdGlvbigpe3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYXNuMVZlcnNpb249bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe29iajpuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6Mn0pfSk7dGhpcy5hc24xU2VyaWFsTnVtYmVyPW51bGw7dGhpcy5hc24xU2lnbmF0dXJlQWxnPW51bGw7dGhpcy5hc24xSXNzdWVyPW51bGw7dGhpcy5hc24xTm90QmVmb3JlPW51bGw7dGhpcy5hc24xTm90QWZ0ZXI9bnVsbDt0aGlzLmFzbjFTdWJqZWN0PW51bGw7dGhpcy5hc24xU3VialBLZXk9bnVsbDt0aGlzLmV4dGVuc2lvbnNBcnJheT1uZXcgQXJyYXkoKX07dGhpcy5zZXRTZXJpYWxOdW1iZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVNlcmlhbE51bWJlcj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoYil9O3RoaXMuc2V0U2lnbmF0dXJlQWxnQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFTaWduYXR1cmVBbGc9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoYil9O3RoaXMuc2V0SXNzdWVyQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFJc3N1ZXI9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldE5vdEJlZm9yZUJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xTm90QmVmb3JlPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGIpfTt0aGlzLnNldE5vdEFmdGVyQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFOb3RBZnRlcj1uZXcgS0pVUi5hc24xLng1MDkuVGltZShiKX07dGhpcy5zZXRTdWJqZWN0QnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFTdWJqZWN0PW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShiKX07dGhpcy5zZXRTdWJqZWN0UHVibGljS2V5QnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8oYil9O3RoaXMuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5PWZ1bmN0aW9uKGMpe3ZhciBiPUtFWVVUSUwuZ2V0S2V5KGMpO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhiKX07dGhpcy5hcHBlbmRFeHRlbnNpb249ZnVuY3Rpb24oYil7dGhpcy5leHRlbnNpb25zQXJyYXkucHVzaChiKX07dGhpcy5hcHBlbmRFeHRlbnNpb25CeU5hbWU9ZnVuY3Rpb24oZCxiKXtpZihkLnRvTG93ZXJDYXNlKCk9PVwiYmFzaWNjb25zdHJhaW50c1wiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuQmFzaWNDb25zdHJhaW50cyhiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJrZXl1c2FnZVwiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuS2V5VXNhZ2UoYik7dGhpcy5hcHBlbmRFeHRlbnNpb24oYyl9ZWxzZXtpZihkLnRvTG93ZXJDYXNlKCk9PVwiY3JsZGlzdHJpYnV0aW9ucG9pbnRzXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5DUkxEaXN0cmlidXRpb25Qb2ludHMoYik7dGhpcy5hcHBlbmRFeHRlbnNpb24oYyl9ZWxzZXtpZihkLnRvTG93ZXJDYXNlKCk9PVwiZXh0a2V5dXNhZ2VcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImF1dGhvcml0eWtleWlkZW50aWZpZXJcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXIoYik7dGhpcy5hcHBlbmRFeHRlbnNpb24oYyl9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgZXh0ZW5zaW9uIG5hbWU6IFwiK2R9fX19fX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5hc24xTm90QmVmb3JlPT1udWxsfHx0aGlzLmFzbjFOb3RBZnRlcj09bnVsbCl7dGhyb3dcIm5vdEJlZm9yZSBhbmQvb3Igbm90QWZ0ZXIgbm90IHNldFwifXZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFOb3RCZWZvcmUsdGhpcy5hc24xTm90QWZ0ZXJdfSk7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFWZXJzaW9uKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVNlcmlhbE51bWJlcik7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTaWduYXR1cmVBbGcpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xSXNzdWVyKTt0aGlzLmFzbjFBcnJheS5wdXNoKGMpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU3ViamVjdCk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTdWJqUEtleSk7aWYodGhpcy5leHRlbnNpb25zQXJyYXkubGVuZ3RoPjApe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuZXh0ZW5zaW9uc0FycmF5fSk7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OnRydWUsdGFnOlwiYTNcIixvYmo6ZH0pO3RoaXMuYXNuMUFycmF5LnB1c2goYil9dmFyIGU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuX2luaXRpYWxpemUoKX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuVEJTQ2VydGlmaWNhdGUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkV4dGVuc2lvbj1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGY9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKHtvaWQ6dGhpcy5vaWR9KTt2YXIgZT1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKHtoZXg6dGhpcy5nZXRFeHRuVmFsdWVIZXgoKX0pO3ZhciBkPW5ldyBBcnJheSgpO2QucHVzaChmKTtpZih0aGlzLmNyaXRpY2FsKXtkLnB1c2gobmV3IEtKVVIuYXNuMS5ERVJCb29sZWFuKCkpfWQucHVzaChlKTt2YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7cmV0dXJuIGMuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLmNyaXRpY2FsPWZhbHNlO2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5jcml0aWNhbCE9XCJ1bmRlZmluZWRcIil7dGhpcy5jcml0aWNhbD1iLmNyaXRpY2FsfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuS2V5VXNhZ2U9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuS2V5VXNhZ2Uuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5nZXRFeHRuVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5vaWQ9XCIyLjUuMjkuMTVcIjtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuYmluIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFFeHRuVmFsdWU9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoYSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuS2V5VXNhZ2UsS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uKTtLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYyk7dmFyIGE9ZmFsc2U7dmFyIGI9LTE7dGhpcy5nZXRFeHRuVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgQXJyYXkoKTtpZih0aGlzLmNBKXtlLnB1c2gobmV3IEtKVVIuYXNuMS5ERVJCb29sZWFuKCkpfWlmKHRoaXMucGF0aExlbj4tMSl7ZS5wdXNoKG5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjp0aGlzLnBhdGhMZW59KSl9dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZX0pO3RoaXMuYXNuMUV4dG5WYWx1ZT1kO3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLm9pZD1cIjIuNS4yOS4xOVwiO3RoaXMuY0E9ZmFsc2U7dGhpcy5wYXRoTGVuPS0xO2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5jQSE9XCJ1bmRlZmluZWRcIil7dGhpcy5jQT1jLmNBfWlmKHR5cGVvZiBjLnBhdGhMZW4hPVwidW5kZWZpbmVkXCIpe3RoaXMucGF0aExlbj1jLnBhdGhMZW59fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQmFzaWNDb25zdHJhaW50cyxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cz1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5DUkxEaXN0cmlidXRpb25Qb2ludHMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5nZXRFeHRuVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5zZXRCeURQQXJyYXk9ZnVuY3Rpb24oYil7dGhpcy5hc24xRXh0blZhbHVlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmJ9KX07dGhpcy5zZXRCeU9uZVVSST1mdW5jdGlvbihlKXt2YXIgYj1uZXcgS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWVzKFt7dXJpOmV9XSk7dmFyIGQ9bmV3IEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZShiKTt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQoe2Rwb2JqOmR9KTt0aGlzLnNldEJ5RFBBcnJheShbY10pfTt0aGlzLm9pZD1cIjIuNS4yOS4zMVwiO2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5hcnJheSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeURQQXJyYXkoYS5hcnJheSl9ZWxzZXtpZih0eXBlb2YgYS51cmkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlPbmVVUkkoYS51cmkpfX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5DUkxEaXN0cmlidXRpb25Qb2ludHMsS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uKTtLSlVSLmFzbjEueDUwOS5FeHRLZXlVc2FnZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5FeHRLZXlVc2FnZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLnNldFB1cnBvc2VBcnJheT1mdW5jdGlvbihiKXt0aGlzLmFzbjFFeHRuVmFsdWU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSgpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoYltjXSk7dGhpcy5hc24xRXh0blZhbHVlLmFwcGVuZEFTTjFPYmplY3QoZCl9fTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLm9pZD1cIjIuNS4yOS4zN1wiO2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5hcnJheSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRQdXJwb3NlQXJyYXkoYS5hcnJheSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuRXh0S2V5VXNhZ2UsS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uKTtLSlVSLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5hc24xS0lEPW51bGw7dGhpcy5hc24xQ2VydElzc3Vlcj1udWxsO3RoaXMuYXNuMUNlcnRTTj1udWxsO3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGM9bmV3IEFycmF5KCk7aWYodGhpcy5hc24xS0lEKXtjLnB1c2gobmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OmZhbHNlLHRhZzpcIjgwXCIsb2JqOnRoaXMuYXNuMUtJRH0pKX1pZih0aGlzLmFzbjFDZXJ0SXNzdWVyKXtjLnB1c2gobmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OmZhbHNlLHRhZzpcImExXCIsb2JqOnRoaXMuYXNuMUNlcnRJc3N1ZXJ9KSl9aWYodGhpcy5hc24xQ2VydFNOKXtjLnB1c2gobmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OmZhbHNlLHRhZzpcIjgyXCIsb2JqOnRoaXMuYXNuMUNlcnRTTn0pKX12YXIgYj1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpjfSk7dGhpcy5hc24xRXh0blZhbHVlPWI7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMuc2V0S0lEQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFLSUQ9bmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyhiKX07dGhpcy5zZXRDZXJ0SXNzdWVyQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFDZXJ0SXNzdWVyPW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShiKX07dGhpcy5zZXRDZXJ0U05CeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUNlcnRTTj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoYil9O3RoaXMub2lkPVwiMi41LjI5LjM1XCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmtpZCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRLSURCeVBhcmFtKGEua2lkKX1pZih0eXBlb2YgYS5pc3N1ZXIhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0Q2VydElzc3VlckJ5UGFyYW0oYS5pc3N1ZXIpfWlmKHR5cGVvZiBhLnNuIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldENlcnRTTkJ5UGFyYW0oYS5zbil9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllcixLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkNSTD1mdW5jdGlvbihmKXtLSlVSLmFzbjEueDUwOS5DUkwuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dmFyIGM9bnVsbDt2YXIgZT1udWxsO3ZhciBiPW51bGw7dmFyIGQ9bnVsbDt0aGlzLnNldFJzYVBydktleUJ5UEVNYW5kUGFzcz1mdW5jdGlvbihoLGope3ZhciBnPVBLQ1M1UEtFWS5nZXREZWNyeXB0ZWRLZXlIZXgoaCxqKTt2YXIgaT1uZXcgUlNBS2V5KCk7aS5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGcpO3RoaXMucnNhUHJ2S2V5PWl9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz10aGlzLmFzbjFUQlNDZXJ0TGlzdC5hc24xU2lnbmF0dXJlQWxnO3NpZz1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6XCJTSEExd2l0aFJTQVwiLHByb3Y6XCJjcnlwdG9qcy9qc3JzYVwifSk7c2lnLmluaXRTaWduKHRoaXMucnNhUHJ2S2V5KTtzaWcudXBkYXRlSGV4KHRoaXMuYXNuMVRCU0NlcnRMaXN0LmdldEVuY29kZWRIZXgoKSk7dGhpcy5oZXhTaWc9c2lnLnNpZ24oKTt0aGlzLmFzbjFTaWc9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrdGhpcy5oZXhTaWd9KTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xVEJTQ2VydExpc3QsdGhpcy5hc24xU2lnbmF0dXJlQWxnLHRoaXMuYXNuMVNpZ119KTt0aGlzLmhUTFY9Zy5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTW9kaWZpZWQ9PWZhbHNlJiZ0aGlzLmhUTFYhPW51bGwpe3JldHVybiB0aGlzLmhUTFZ9dGhyb3dcIm5vdCBzaWduZWQgeWV0XCJ9O3RoaXMuZ2V0UEVNU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5nZXRFbmNvZGVkSGV4KCk7dmFyIGc9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShpKTt2YXIgaD1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShnKTt2YXIgaj1oLnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO3JldHVyblwiLS0tLS1CRUdJTiBYNTA5IENSTC0tLS0tXFxyXFxuXCIraitcIlxcclxcbi0tLS0tRU5EIFg1MDkgQ1JMLS0tLS1cXHJcXG5cIn07aWYodHlwZW9mIGYhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBmLnRic29iaiE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xVEJTQ2VydExpc3Q9Zi50YnNvYmp9aWYodHlwZW9mIGYucnNhcHJ2a2V5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnJzYVBydktleT1mLnJzYXBydmtleX1pZigodHlwZW9mIGYucnNhcHJ2cGVtIT1cInVuZGVmaW5lZFwiKSYmKHR5cGVvZiBmLnJzYXBydnBhcyE9XCJ1bmRlZmluZWRcIikpe3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzKGYucnNhcHJ2cGVtLGYucnNhcHJ2cGFzKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5DUkwsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlRCU0NlcnRMaXN0PWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LlRCU0NlcnRMaXN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3RoaXMuc2V0U2lnbmF0dXJlQWxnQnlQYXJhbT1mdW5jdGlvbihjKXt0aGlzLmFzbjFTaWduYXR1cmVBbGc9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoYyl9O3RoaXMuc2V0SXNzdWVyQnlQYXJhbT1mdW5jdGlvbihjKXt0aGlzLmFzbjFJc3N1ZXI9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGMpfTt0aGlzLnNldFRoaXNVcGRhdGVCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMVRoaXNVcGRhdGU9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYyl9O3RoaXMuc2V0TmV4dFVwZGF0ZUJ5UGFyYW09ZnVuY3Rpb24oYyl7dGhpcy5hc24xTmV4dFVwZGF0ZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShjKX07dGhpcy5hZGRSZXZva2VkQ2VydD1mdW5jdGlvbihjLGQpe3ZhciBmPXt9O2lmKGMhPXVuZGVmaW5lZCYmYyE9bnVsbCl7Zi5zbj1jfWlmKGQhPXVuZGVmaW5lZCYmZCE9bnVsbCl7Zi50aW1lPWR9dmFyIGU9bmV3IEtKVVIuYXNuMS54NTA5LkNSTEVudHJ5KGYpO3RoaXMuYVJldm9rZWRDZXJ0LnB1c2goZSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO2lmKHRoaXMuYXNuMVZlcnNpb24hPW51bGwpe3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xVmVyc2lvbil9dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTaWduYXR1cmVBbGcpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xSXNzdWVyKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVRoaXNVcGRhdGUpO2lmKHRoaXMuYXNuMU5leHRVcGRhdGUhPW51bGwpe3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xTmV4dFVwZGF0ZSl9aWYodGhpcy5hUmV2b2tlZENlcnQubGVuZ3RoPjApe3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYVJldm9rZWRDZXJ0fSk7dGhpcy5hc24xQXJyYXkucHVzaChjKX12YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2U7cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5faW5pdGlhbGl6ZT1mdW5jdGlvbigpe3RoaXMuYXNuMVZlcnNpb249bnVsbDt0aGlzLmFzbjFTaWduYXR1cmVBbGc9bnVsbDt0aGlzLmFzbjFJc3N1ZXI9bnVsbDt0aGlzLmFzbjFUaGlzVXBkYXRlPW51bGw7dGhpcy5hc24xTmV4dFVwZGF0ZT1udWxsO3RoaXMuYVJldm9rZWRDZXJ0PW5ldyBBcnJheSgpfTt0aGlzLl9pbml0aWFsaXplKCl9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlRCU0NlcnRMaXN0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5DUkxFbnRyeT1mdW5jdGlvbihjKXtLSlVSLmFzbjEueDUwOS5DUkxFbnRyeS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMuc2V0Q2VydFNlcmlhbD1mdW5jdGlvbihkKXt0aGlzLnNuPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihkKX07dGhpcy5zZXRSZXZvY2F0aW9uRGF0ZT1mdW5jdGlvbihkKXt0aGlzLnRpbWU9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoZCl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLnNuLHRoaXMudGltZV19KTt0aGlzLlRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy50aW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFJldm9jYXRpb25EYXRlKGMudGltZSl9aWYodHlwZW9mIGMuc24hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0Q2VydFNlcmlhbChjLnNuKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5DUkxFbnRyeSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuWDUwME5hbWU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuWDUwME5hbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuc2V0QnlTdHJpbmc9ZnVuY3Rpb24oYyl7dmFyIGQ9Yy5zcGxpdChcIi9cIik7ZC5zaGlmdCgpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt0aGlzLmFzbjFBcnJheS5wdXNoKG5ldyBLSlVSLmFzbjEueDUwOS5SRE4oe3N0cjpkW2VdfSkpfX07dGhpcy5zZXRCeU9iamVjdD1mdW5jdGlvbihlKXtmb3IodmFyIGMgaW4gZSl7aWYoZS5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9bmV3IEtKVVIuYXNuMS54NTA5LlJETih7c3RyOmMrXCI9XCIrZVtjXX0pO3RoaXMuYXNuMUFycmF5P3RoaXMuYXNuMUFycmF5LnB1c2goZCk6dGhpcy5hc24xQXJyYXk9W2RdfX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhUTFY9PVwic3RyaW5nXCIpe3JldHVybiB0aGlzLmhUTFZ9dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTt0aGlzLmhUTFY9Yy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeVN0cmluZyhiLnN0cil9ZWxzZXtpZih0eXBlb2YgYj09PVwib2JqZWN0XCIpe3RoaXMuc2V0QnlPYmplY3QoYil9fWlmKHR5cGVvZiBiLmNlcnRpc3N1ZXIhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBYNTA5KCk7YS5oZXg9WDUwOS5wZW1Ub0hleChiLmNlcnRpc3N1ZXIpO3RoaXMuaFRMVj1hLmdldElzc3VlckhleCgpfWlmKHR5cGVvZiBiLmNlcnRzdWJqZWN0IT1cInVuZGVmaW5lZFwiKXt2YXIgYT1uZXcgWDUwOSgpO2EuaGV4PVg1MDkucGVtVG9IZXgoYi5jZXJ0c3ViamVjdCk7dGhpcy5oVExWPWEuZ2V0U3ViamVjdEhleCgpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5SRE49ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuUkROLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFkZEJ5U3RyaW5nPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUFycmF5LnB1c2gobmV3IEtKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSh7c3RyOmJ9KSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBiPW5ldyBLSlVSLmFzbjEuREVSU2V0KHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuVExWPWIuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLlRMVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5hZGRCeVN0cmluZyhhLnN0cil9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuUkROLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5BdHRyaWJ1dGVUeXBlQW5kVmFsdWU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuQXR0cmlidXRlVHlwZUFuZFZhbHVlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgZD1udWxsO3ZhciBjPW51bGw7dmFyIGE9XCJ1dGY4XCI7dGhpcy5zZXRCeVN0cmluZz1mdW5jdGlvbihlKXtpZihlLm1hdGNoKC9eKFtePV0rKT0oLispJC8pKXt0aGlzLnNldEJ5QXR0clR5cGVBbmRWYWx1ZVN0cihSZWdFeHAuJDEsUmVnRXhwLiQyKX1lbHNle3Rocm93XCJtYWxmb3JtZWQgYXR0clR5cGVBbmRWYWx1ZVN0cjogXCIrZX19O3RoaXMuc2V0QnlBdHRyVHlwZUFuZFZhbHVlU3RyPWZ1bmN0aW9uKGcsZil7dGhpcy50eXBlT2JqPUtKVVIuYXNuMS54NTA5Lk9JRC5hdHlwZTJvYmooZyk7dmFyIGU9YTtpZihnPT1cIkNcIil7ZT1cInByblwifXRoaXMudmFsdWVPYmo9dGhpcy5nZXRWYWx1ZU9iaihlLGYpfTt0aGlzLmdldFZhbHVlT2JqPWZ1bmN0aW9uKGYsZSl7aWYoZj09XCJ1dGY4XCIpe3JldHVybiBuZXcgS0pVUi5hc24xLkRFUlVURjhTdHJpbmcoe3N0cjplfSl9aWYoZj09XCJwcm5cIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nKHtzdHI6ZX0pfWlmKGY9PVwidGVsXCIpe3JldHVybiBuZXcgS0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmcoe3N0cjplfSl9aWYoZj09XCJpYTVcIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSSUE1U3RyaW5nKHtzdHI6ZX0pfXRocm93XCJ1bnN1cHBvcnRlZCBkaXJlY3Rvcnkgc3RyaW5nIHR5cGU6IHR5cGU9XCIrZitcIiB2YWx1ZT1cIitlfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy50eXBlT2JqLHRoaXMudmFsdWVPYmpdfSk7dGhpcy5UTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5U3RyaW5nKGIuc3RyKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt0aGlzLnNldFJTQUtleT1mdW5jdGlvbihlKXtpZighUlNBS2V5LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGUpKXt0aHJvd1wiYXJndW1lbnQgaXMgbm90IFJTQUtleSBpbnN0YW5jZVwifXRoaXMucnNhS2V5PWU7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6ZS5ufSk7dmFyIGY9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOmUuZX0pO3ZhciBpPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltnLGZdfSk7dmFyIGg9aS5nZXRFbmNvZGVkSGV4KCk7dGhpcy5hc24xQWxnSWQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJyc2FFbmNyeXB0aW9uXCJ9KTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitofSl9O3RoaXMuc2V0UlNBUEVNPWZ1bmN0aW9uKGcpe2lmKGcubWF0Y2goLy0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tLykpe3ZhciBuPWc7bj1uLnJlcGxhY2UoL14tLS0tLVteLV0rLS0tLS0vLFwiXCIpO249bi5yZXBsYWNlKC8tLS0tLVteLV0rLS0tLS1cXHMqJC8sXCJcIik7dmFyIG09bi5yZXBsYWNlKC9cXHMrL2csXCJcIik7dmFyIGY9Q3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShtKTt2YXIgaT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShmKTt2YXIgaz1fcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChpKTt2YXIgaD1rWzFdO3ZhciBsPWguc3Vic3RyKDIpO3ZhciBlPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGwpO3ZhciBqPW5ldyBSU0FLZXkoKTtqLnNldFB1YmxpYyhlWzBdLGVbMV0pO3RoaXMuc2V0UlNBS2V5KGopfWVsc2V7dGhyb3dcImtleSBub3Qgc3VwcG9ydGVkXCJ9fTt0aGlzLmdldEFTTjFPYmplY3Q9ZnVuY3Rpb24oKXtpZih0aGlzLmFzbjFBbGdJZD09bnVsbHx8dGhpcy5hc24xU3VialBLZXk9PW51bGwpe3Rocm93XCJhbGdJZCBhbmQvb3Igc3VialB1YktleSBub3Qgc2V0XCJ9dmFyIGU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMUFsZ0lkLHRoaXMuYXNuMVN1YmpQS2V5XX0pO3JldHVybiBlfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEFTTjFPYmplY3QoKTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5fc2V0UlNBS2V5PWZ1bmN0aW9uKGUpe3ZhciBnPUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6e2JpZ2ludDplLm59fSx7XCJpbnRcIjp7XCJpbnRcIjplLmV9fV19KTt2YXIgZj1nLmdldEVuY29kZWRIZXgoKTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcInJzYUVuY3J5cHRpb25cIn0pO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK2Z9KX07dGhpcy5fc2V0RUM9ZnVuY3Rpb24oZSl7dmFyIGY9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKHtuYW1lOmUuY3VydmVOYW1lfSk7dGhpcy5hc24xQWxnSWQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJlY1B1YmxpY0tleVwiLGFzbjFwYXJhbXM6Zn0pO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK2UucHViS2V5SGV4fSl9O3RoaXMuX3NldERTQT1mdW5jdGlvbihlKXt2YXIgZj1uZXcgS0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjp7YmlnaW50OmUucH19LHtcImludFwiOntiaWdpbnQ6ZS5xfX0se1wiaW50XCI6e2JpZ2ludDplLmd9fV19KTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcImRzYVwiLGFzbjFwYXJhbXM6Zn0pO3ZhciBnPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmUueX0pO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK2cuZ2V0RW5jb2RlZEhleCgpfSl9O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZkIGluc3RhbmNlb2YgUlNBS2V5KXt0aGlzLl9zZXRSU0FLZXkoZCl9ZWxzZXtpZih0eXBlb2YgS0pVUi5jcnlwdG8uRUNEU0EhPVwidW5kZWZpbmVkXCImJmQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7dGhpcy5fc2V0RUMoZCl9ZWxzZXtpZih0eXBlb2YgS0pVUi5jcnlwdG8uRFNBIT1cInVuZGVmaW5lZFwiJiZkIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBKXt0aGlzLl9zZXREU0EoZCl9ZWxzZXtpZih0eXBlb2YgZC5yc2FrZXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0UlNBS2V5KGQucnNha2V5KX1lbHNle2lmKHR5cGVvZiBkLnJzYXBlbSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRSU0FQRU0oZC5yc2FwZW0pfX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuVGltZT1mdW5jdGlvbihjKXtLSlVSLmFzbjEueDUwOS5UaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBhPW51bGw7dGhpcy5zZXRUaW1lUGFyYW1zPWZ1bmN0aW9uKGQpe3RoaXMudGltZVBhcmFtcz1kfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZD1udWxsO2lmKHRoaXMudGltZVBhcmFtcyE9bnVsbCl7aWYodGhpcy50eXBlPT1cInV0Y1wiKXtkPW5ldyBLSlVSLmFzbjEuREVSVVRDVGltZSh0aGlzLnRpbWVQYXJhbXMpfWVsc2V7ZD1uZXcgS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZSh0aGlzLnRpbWVQYXJhbXMpfX1lbHNle2lmKHRoaXMudHlwZT09XCJ1dGNcIil7ZD1uZXcgS0pVUi5hc24xLkRFUlVUQ1RpbWUoKX1lbHNle2Q9bmV3IEtKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUoKX19dGhpcy5UTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuVExWfTt0aGlzLnR5cGU9XCJ1dGNcIjtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMudHlwZSE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPWMudHlwZX1lbHNle2lmKHR5cGVvZiBjLnN0ciE9XCJ1bmRlZmluZWRcIil7aWYoYy5zdHIubWF0Y2goL15bMC05XXsxMn1aJC8pKXt0aGlzLnR5cGU9XCJ1dGNcIn1pZihjLnN0ci5tYXRjaCgvXlswLTldezE0fVokLykpe3RoaXMudHlwZT1cImdlblwifX19dGhpcy50aW1lUGFyYW1zPWN9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5UaW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyPWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dmFyIGQ9bnVsbDt2YXIgYj1udWxsO3ZhciBjPWZhbHNlO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMubmFtZUFsZz09bnVsbCYmdGhpcy5hc24xQWxnPT1udWxsKXt0aHJvd1wiYWxnb3JpdGhtIG5vdCBzcGVjaWZpZWRcIn1pZih0aGlzLm5hbWVBbGchPW51bGwmJnRoaXMuYXNuMUFsZz09bnVsbCl7dGhpcy5hc24xQWxnPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9iaih0aGlzLm5hbWVBbGcpfXZhciBmPVt0aGlzLmFzbjFBbGddO2lmKCF0aGlzLnBhcmFtRW1wdHkpe2YucHVzaCh0aGlzLmFzbjFQYXJhbXMpfXZhciBnPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmZ9KTt0aGlzLmhUTFY9Zy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBlLm5hbWUhPVwidW5kZWZpbmVkXCIpe3RoaXMubmFtZUFsZz1lLm5hbWV9aWYodHlwZW9mIGUuYXNuMXBhcmFtcyE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xUGFyYW1zPWUuYXNuMXBhcmFtc31pZih0eXBlb2YgZS5wYXJhbWVtcHR5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnBhcmFtRW1wdHk9ZS5wYXJhbWVtcHR5fX1pZih0aGlzLmFzbjFQYXJhbXM9PW51bGwpe3RoaXMuYXNuMVBhcmFtcz1uZXcgS0pVUi5hc24xLkRFUk51bGwoKX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYz1udWxsO3ZhciBiPW51bGw7dmFyIGE9e3JmYzgyMjpcIjgxXCIsZG5zOlwiODJcIixkbjpcImE0XCIsdXJpOlwiODZcIn07dGhpcy5leHBsaWNpdD1mYWxzZTt0aGlzLnNldEJ5UGFyYW09ZnVuY3Rpb24oayl7dmFyIGo9bnVsbDt2YXIgZz1udWxsO2lmKHR5cGVvZiBrPT1cInVuZGVmaW5lZFwiKXtyZXR1cm59aWYodHlwZW9mIGsucmZjODIyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9XCJyZmM4MjJcIjtnPW5ldyBLSlVSLmFzbjEuREVSSUE1U3RyaW5nKHtzdHI6a1t0aGlzLnR5cGVdfSl9aWYodHlwZW9mIGsuZG5zIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9XCJkbnNcIjtnPW5ldyBLSlVSLmFzbjEuREVSSUE1U3RyaW5nKHtzdHI6a1t0aGlzLnR5cGVdfSl9aWYodHlwZW9mIGsudXJpIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9XCJ1cmlcIjtnPW5ldyBLSlVSLmFzbjEuREVSSUE1U3RyaW5nKHtzdHI6a1t0aGlzLnR5cGVdfSl9aWYodHlwZW9mIGsuY2VydGlzc3VlciE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwiZG5cIjt0aGlzLmV4cGxpY2l0PXRydWU7dmFyIGg9ay5jZXJ0aXNzdWVyO3ZhciBmPW51bGw7aWYoaC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7Zj09aH1pZihoLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe2Y9WDUwOS5wZW1Ub0hleChoKX1pZihmPT1udWxsKXt0aHJvd1wiY2VydGlzc3VlciBwYXJhbSBub3QgY2VydFwifXZhciBlPW5ldyBYNTA5KCk7ZS5oZXg9Zjt2YXIgaT1lLmdldElzc3VlckhleCgpO2c9bmV3IEtKVVIuYXNuMS5BU04xT2JqZWN0KCk7Zy5oVExWPWl9aWYodHlwZW9mIGsuY2VydHN1YmohPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cImRuXCI7dGhpcy5leHBsaWNpdD10cnVlO3ZhciBoPWsuY2VydHN1Ymo7dmFyIGY9bnVsbDtpZihoLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXtmPT1ofWlmKGguaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7Zj1YNTA5LnBlbVRvSGV4KGgpfWlmKGY9PW51bGwpe3Rocm93XCJjZXJ0c3ViaiBwYXJhbSBub3QgY2VydFwifXZhciBlPW5ldyBYNTA5KCk7ZS5oZXg9Zjt2YXIgaT1lLmdldFN1YmplY3RIZXgoKTtnPW5ldyBLSlVSLmFzbjEuQVNOMU9iamVjdCgpO2cuaFRMVj1pfWlmKHRoaXMudHlwZT09bnVsbCl7dGhyb3dcInVuc3VwcG9ydGVkIHR5cGUgaW4gcGFyYW1zPVwiK2t9dGhpcy5hc24xT2JqPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDp0aGlzLmV4cGxpY2l0LHRhZzphW3RoaXMudHlwZV0sb2JqOmd9KX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNuMU9iai5nZXRFbmNvZGVkSGV4KCl9O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5UGFyYW0oZCl9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWVzPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLnNldEJ5UGFyYW1BcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIGM9MDtjPGUubGVuZ3RoO2MrKyl7dmFyIGQ9bmV3IEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lKGVbY10pO3RoaXMuYXNuMUFycmF5LnB1c2goZCl9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3JldHVybiBjLmdldEVuY29kZWRIZXgoKX07dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlQYXJhbUFycmF5KGIpfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWVzLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgZT1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt2YXIgZD1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMudHlwZSE9XCJmdWxsXCIpe3Rocm93XCJjdXJyZW50bHkgdHlwZSBzaGFsbCBiZSAnZnVsbCc6IFwiK3RoaXMudHlwZX10aGlzLmFzbjFPYmo9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OmZhbHNlLHRhZzp0aGlzLnRhZyxvYmo6dGhpcy5hc24xVn0pO3RoaXMuaFRMVj10aGlzLmFzbjFPYmouZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZihLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYikpe3RoaXMudHlwZT1cImZ1bGxcIjt0aGlzLnRhZz1cImEwXCI7dGhpcy5hc24xVj1ifWVsc2V7dGhyb3dcIlRoaXMgY2xhc3Mgc3VwcG9ydHMgR2VuZXJhbE5hbWVzIG9ubHkgYXMgYXJndW1lbnRcIn19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50PWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2UoKTtpZih0aGlzLmFzbjFEUCE9bnVsbCl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OnRydWUsdGFnOlwiYTBcIixvYmo6dGhpcy5hc24xRFB9KTtjLmFwcGVuZEFTTjFPYmplY3QoZCl9dGhpcy5oVExWPWMuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5kcG9iaiE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xRFA9Yi5kcG9ian19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuT0lEPW5ldyBmdW5jdGlvbihhKXt0aGlzLmF0eXBlMm9pZExpc3Q9e0M6XCIyLjUuNC42XCIsTzpcIjIuNS40LjEwXCIsT1U6XCIyLjUuNC4xMVwiLFNUOlwiMi41LjQuOFwiLEw6XCIyLjUuNC43XCIsQ046XCIyLjUuNC4zXCIsU046XCIyLjUuNC40XCIsRE46XCIyLjUuNC40OVwiLERDOlwiMC45LjIzNDIuMTkyMDAzMDAuMTAwLjEuMjVcIix9O3RoaXMubmFtZTJvaWRMaXN0PXtzaGExOlwiMS4zLjE0LjMuMi4yNlwiLHNoYTI1NjpcIjIuMTYuODQwLjEuMTAxLjMuNC4yLjFcIixzaGEzODQ6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4yXCIsc2hhNTEyOlwiMi4xNi44NDAuMS4xMDEuMy40LjIuM1wiLHNoYTIyNDpcIjIuMTYuODQwLjEuMTAxLjMuNC4yLjRcIixtZDU6XCIxLjIuODQwLjExMzU0OS4yLjVcIixtZDI6XCIxLjMuMTQuNy4yLjIuMVwiLHJpcGVtZDE2MDpcIjEuMy4zNi4zLjIuMVwiLE1EMndpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMlwiLE1ENHdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuM1wiLE1ENXdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuNFwiLFNIQTF3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjVcIixTSEEyMjR3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjE0XCIsU0hBMjU2d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xMVwiLFNIQTM4NHdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTJcIixTSEE1MTJ3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjEzXCIsU0hBMXdpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4xXCIsU0hBMjI0d2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjMuMVwiLFNIQTI1NndpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4zLjJcIixTSEEzODR3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy4zXCIsU0hBNTEyd2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjMuNFwiLGRzYTpcIjEuMi44NDAuMTAwNDAuNC4xXCIsU0hBMXdpdGhEU0E6XCIxLjIuODQwLjEwMDQwLjQuM1wiLFNIQTIyNHdpdGhEU0E6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMy4xXCIsU0hBMjU2d2l0aERTQTpcIjIuMTYuODQwLjEuMTAxLjMuNC4zLjJcIixyc2FFbmNyeXB0aW9uOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjFcIixjb3VudHJ5TmFtZTpcIjIuNS40LjZcIixvcmdhbml6YXRpb246XCIyLjUuNC4xMFwiLG9yZ2FuaXphdGlvbmFsVW5pdDpcIjIuNS40LjExXCIsc3RhdGVPclByb3ZpbmNlTmFtZTpcIjIuNS40LjhcIixsb2NhbGl0eTpcIjIuNS40LjdcIixjb21tb25OYW1lOlwiMi41LjQuM1wiLHN1YmplY3RLZXlJZGVudGlmaWVyOlwiMi41LjI5LjE0XCIsa2V5VXNhZ2U6XCIyLjUuMjkuMTVcIixzdWJqZWN0QWx0TmFtZTpcIjIuNS4yOS4xN1wiLGJhc2ljQ29uc3RyYWludHM6XCIyLjUuMjkuMTlcIixuYW1lQ29uc3RyYWludHM6XCIyLjUuMjkuMzBcIixjUkxEaXN0cmlidXRpb25Qb2ludHM6XCIyLjUuMjkuMzFcIixjZXJ0aWZpY2F0ZVBvbGljaWVzOlwiMi41LjI5LjMyXCIsYXV0aG9yaXR5S2V5SWRlbnRpZmllcjpcIjIuNS4yOS4zNVwiLHBvbGljeUNvbnN0cmFpbnRzOlwiMi41LjI5LjM2XCIsZXh0S2V5VXNhZ2U6XCIyLjUuMjkuMzdcIixhdXRob3JpdHlJbmZvQWNjZXNzOlwiMS4zLjYuMS41LjUuNy4xLjFcIixhbnlFeHRlbmRlZEtleVVzYWdlOlwiMi41LjI5LjM3LjBcIixzZXJ2ZXJBdXRoOlwiMS4zLjYuMS41LjUuNy4zLjFcIixjbGllbnRBdXRoOlwiMS4zLjYuMS41LjUuNy4zLjJcIixjb2RlU2lnbmluZzpcIjEuMy42LjEuNS41LjcuMy4zXCIsZW1haWxQcm90ZWN0aW9uOlwiMS4zLjYuMS41LjUuNy4zLjRcIix0aW1lU3RhbXBpbmc6XCIxLjMuNi4xLjUuNS43LjMuOFwiLG9jc3BTaWduaW5nOlwiMS4zLjYuMS41LjUuNy4zLjlcIixlY1B1YmxpY0tleTpcIjEuMi44NDAuMTAwNDUuMi4xXCIsc2VjcDI1NnIxOlwiMS4yLjg0MC4xMDA0NS4zLjEuN1wiLHNlY3AyNTZrMTpcIjEuMy4xMzIuMC4xMFwiLHNlY3AzODRyMTpcIjEuMy4xMzIuMC4zNFwiLHBrY3M1UEJFUzI6XCIxLjIuODQwLjExMzU0OS4xLjUuMTNcIixwa2NzNVBCS0RGMjpcIjEuMi44NDAuMTEzNTQ5LjEuNS4xMlwiLFwiZGVzLUVERTMtQ0JDXCI6XCIxLjIuODQwLjExMzU0OS4zLjdcIixkYXRhOlwiMS4yLjg0MC4xMTM1NDkuMS43LjFcIixcInNpZ25lZC1kYXRhXCI6XCIxLjIuODQwLjExMzU0OS4xLjcuMlwiLFwiZW52ZWxvcGVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy4zXCIsXCJkaWdlc3RlZC1kYXRhXCI6XCIxLjIuODQwLjExMzU0OS4xLjcuNVwiLFwiZW5jcnlwdGVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy42XCIsXCJhdXRoZW50aWNhdGVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuOS4xNi4xLjJcIix0c3RpbmZvOlwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjEuNFwiLH07dGhpcy5vYmpDYWNoZT17fTt0aGlzLm5hbWUyb2JqPWZ1bmN0aW9uKGIpe2lmKHR5cGVvZiB0aGlzLm9iakNhY2hlW2JdIT1cInVuZGVmaW5lZFwiKXtyZXR1cm4gdGhpcy5vYmpDYWNoZVtiXX1pZih0eXBlb2YgdGhpcy5uYW1lMm9pZExpc3RbYl09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJOYW1lIG9mIE9iamVjdElkZW50aWZpZXIgbm90IGRlZmluZWQ6IFwiK2J9dmFyIGM9dGhpcy5uYW1lMm9pZExpc3RbYl07dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKHtvaWQ6Y30pO3RoaXMub2JqQ2FjaGVbYl09ZDtyZXR1cm4gZH07dGhpcy5hdHlwZTJvYmo9ZnVuY3Rpb24oYil7aWYodHlwZW9mIHRoaXMub2JqQ2FjaGVbYl0hPVwidW5kZWZpbmVkXCIpe3JldHVybiB0aGlzLm9iakNhY2hlW2JdfWlmKHR5cGVvZiB0aGlzLmF0eXBlMm9pZExpc3RbYl09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJBdHRyaWJ1dGVUeXBlIG5hbWUgdW5kZWZpbmVkOiBcIitifXZhciBjPXRoaXMuYXR5cGUyb2lkTGlzdFtiXTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDpjfSk7dGhpcy5vYmpDYWNoZVtiXT1kO3JldHVybiBkfX07S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lPWZ1bmN0aW9uKGIpe3ZhciBjPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3Q7Zm9yKHZhciBhIGluIGMpe2lmKGNbYV09PWIpe3JldHVybiBhfX1yZXR1cm5cIlwifTtLSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWQ9ZnVuY3Rpb24oYSl7dmFyIGI9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdDtpZihiW2FdPT09dW5kZWZpbmVkKXtyZXR1cm5cIlwifXJldHVybiBiW2FdfTtLSlVSLmFzbjEueDUwOS5YNTA5VXRpbD1uZXcgZnVuY3Rpb24oKXt0aGlzLmdldFBLQ1M4UHViS2V5UEVNZnJvbVJTQUtleT1mdW5jdGlvbihpKXt2YXIgaD1udWxsO3ZhciBmPUtKVVIuYXNuMS5BU04xVXRpbC5iaWdJbnRUb01pblR3b3NDb21wbGVtZW50c0hleChpLm4pO3ZhciBqPUtKVVIuYXNuMS5BU04xVXRpbC5pbnRlZ2VyVG9CeXRlSGV4KGkuZSk7dmFyIGE9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtoZXg6Zn0pO3ZhciBnPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7aGV4Omp9KTt2YXIgbD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbYSxnXX0pO3ZhciBjPWwuZ2V0RW5jb2RlZEhleCgpO3ZhciBkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwicnNhRW5jcnlwdGlvblwifSk7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrY30pO3ZhciBrPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltkLGJdfSk7dmFyIGU9ay5nZXRFbmNvZGVkSGV4KCk7dmFyIGg9S0pVUi5hc24xLkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoZSxcIlBVQkxJQyBLRVlcIik7cmV0dXJuIGh9fTtLSlVSLmFzbjEueDUwOS5YNTA5VXRpbC5uZXdDZXJ0UEVNPWZ1bmN0aW9uKGYpe3ZhciBjPUtKVVIuYXNuMS54NTA5O3ZhciBlPW5ldyBjLlRCU0NlcnRpZmljYXRlKCk7aWYoZi5zZXJpYWwhPT11bmRlZmluZWQpe2Uuc2V0U2VyaWFsTnVtYmVyQnlQYXJhbShmLnNlcmlhbCl9ZWxzZXt0aHJvd1wic2VyaWFsIG51bWJlciB1bmRlZmluZWQuXCJ9aWYodHlwZW9mIGYuc2lnYWxnLm5hbWU9PVwic3RyaW5nXCIpe2Uuc2V0U2lnbmF0dXJlQWxnQnlQYXJhbShmLnNpZ2FsZyl9ZWxzZXt0aHJvd1widW5wcm9wZXIgc2lnbmF0dXJlIGFsZ29yaXRobSBuYW1lXCJ9aWYoZi5pc3N1ZXIhPT11bmRlZmluZWQpe2Uuc2V0SXNzdWVyQnlQYXJhbShmLmlzc3Vlcil9ZWxzZXt0aHJvd1wiaXNzdWVyIG5hbWUgdW5kZWZpbmVkLlwifWlmKGYubm90YmVmb3JlIT09dW5kZWZpbmVkKXtlLnNldE5vdEJlZm9yZUJ5UGFyYW0oZi5ub3RiZWZvcmUpfWVsc2V7dGhyb3dcIm5vdGJlZm9yZSB1bmRlZmluZWQuXCJ9aWYoZi5ub3RhZnRlciE9PXVuZGVmaW5lZCl7ZS5zZXROb3RBZnRlckJ5UGFyYW0oZi5ub3RhZnRlcil9ZWxzZXt0aHJvd1wibm90YWZ0ZXIgdW5kZWZpbmVkLlwifWlmKGYuc3ViamVjdCE9PXVuZGVmaW5lZCl7ZS5zZXRTdWJqZWN0QnlQYXJhbShmLnN1YmplY3QpfWVsc2V7dGhyb3dcInN1YmplY3QgbmFtZSB1bmRlZmluZWQuXCJ9aWYoZi5zYmpwdWJrZXkhPT11bmRlZmluZWQpe2Uuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5KGYuc2JqcHVia2V5KX1lbHNle3Rocm93XCJzdWJqZWN0IHB1YmxpYyBrZXkgdW5kZWZpbmVkLlwifWlmKGYuZXh0IT09dW5kZWZpbmVkJiZmLmV4dC5sZW5ndGghPT11bmRlZmluZWQpe2Zvcih2YXIgYj0wO2I8Zi5leHQubGVuZ3RoO2IrKyl7Zm9yKGtleSBpbiBmLmV4dFtiXSl7ZS5hcHBlbmRFeHRlbnNpb25CeU5hbWUoa2V5LGYuZXh0W2JdW2tleV0pfX19aWYoZi5jYWtleT09PXVuZGVmaW5lZCYmZi5zaWdoZXg9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbSBjYWtleSBhbmQgc2lnaGV4IHVuZGVmaW5lZC5cIn12YXIgZD1udWxsO3ZhciBhPW51bGw7aWYoZi5jYWtleSl7ZD1LRVlVVElMLmdldEtleS5hcHBseShudWxsLGYuY2FrZXkpO2E9bmV3IGMuQ2VydGlmaWNhdGUoe3Ric2NlcnRvYmo6ZSxwcnZrZXlvYmo6ZH0pO2Euc2lnbigpfWlmKGYuc2lnaGV4KXthPW5ldyBjLkNlcnRpZmljYXRlKHt0YnNjZXJ0b2JqOmV9KTthLnNldFNpZ25hdHVyZUhleChmLnNpZ2hleCl9cmV0dXJuIGEuZ2V0UEVNU3RyaW5nKCl9O1xuLyohIGFzbjFjbXMtMS4wLjIuanMgKGMpIDIwMTMtMjAxNCBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuYXNuMT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMSl7S0pVUi5hc24xPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjEuY21zPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xLmNtcyl7S0pVUi5hc24xLmNtcz17fX1LSlVSLmFzbjEuY21zLkF0dHJpYnV0ZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9W107dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGYsZSxjO2Y9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKHtvaWQ6dGhpcy5hdHRyVHlwZU9pZH0pO2U9bmV3IEtKVVIuYXNuMS5ERVJTZXQoe2FycmF5OnRoaXMudmFsdWVMaXN0fSk7dHJ5e2UuZ2V0RW5jb2RlZEhleCgpfWNhdGNoKGQpe3Rocm93XCJmYWlsIHZhbHVlU2V0LmdldEVuY29kZWRIZXggaW4gQXR0cmlidXRlKDEpL1wiK2R9Yz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbZixlXX0pO3RyeXt0aGlzLmhUTFY9Yy5nZXRFbmNvZGVkSGV4KCl9Y2F0Y2goZCl7dGhyb3dcImZhaWxlZCBzZXEuZ2V0RW5jb2RlZEhleCBpbiBBdHRyaWJ1dGUoMikvXCIrZH1yZXR1cm4gdGhpcy5oVExWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuQ29udGVudFR5cGU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLmNtcy5Db250ZW50VHlwZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS4zXCI7dmFyIGE9bnVsbDtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7dmFyIGE9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKGIpO3RoaXMudmFsdWVMaXN0PVthXX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQ29udGVudFR5cGUsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuTWVzc2FnZURpZ2VzdD1mdW5jdGlvbihlKXtLSlVSLmFzbjEuY21zLk1lc3NhZ2VEaWdlc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuNFwiO2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZihlLmVjaU9iaiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuRW5jYXBzdWxhdGVkQ29udGVudEluZm8mJnR5cGVvZiBlLmhhc2hBbGc9PVwic3RyaW5nXCIpe3ZhciBiPWUuZWNpT2JqLmVDb250ZW50VmFsdWVIZXg7dmFyIGE9ZS5oYXNoQWxnO3ZhciBjPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChiLGEpO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoe2hleDpjfSk7ZC5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2RdfWVsc2V7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyhlKTtkLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bZF19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5NZXNzYWdlRGlnZXN0LEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY21zLlNpZ25pbmdUaW1lPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuU2lnbmluZ1RpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuNVwiO2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXt2YXIgYT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShjKTt0cnl7YS5nZXRFbmNvZGVkSGV4KCl9Y2F0Y2goYil7dGhyb3dcIlNpZ25pbmdUaW1lLmdldEVuY29kZWRIZXgoKSBmYWlsZWQvXCIrYn10aGlzLnZhbHVlTGlzdD1bYV19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLlNpZ25pbmdUaW1lLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZT1mdW5jdGlvbihkKXtLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS4xNi4yLjEyXCI7dmFyIGE9S0pVUi5hc24xO3ZhciBjPUtKVVIuYXNuMS5jbXM7dmFyIGI9S0pVUi5jcnlwdG87dGhpcy5zZXRDZXJ0cz1mdW5jdGlvbihsKXt2YXIgaj1bXTtmb3IodmFyIGg9MDtoPGwubGVuZ3RoO2grKyl7dmFyIGY9S0VZVVRJTC5nZXRIZXhGcm9tUEVNKGxbaF0pO3ZhciBlPWIuVXRpbC5oYXNoSGV4KGYsXCJzaGExXCIpO3ZhciBtPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6ZX0pO20uZ2V0RW5jb2RlZEhleCgpO3ZhciBrPW5ldyBjLklzc3VlckFuZFNlcmlhbE51bWJlcih7Y2VydDpsW2hdfSk7ay5nZXRFbmNvZGVkSGV4KCk7dmFyIG49bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OlttLGtdfSk7bi5nZXRFbmNvZGVkSGV4KCk7ai5wdXNoKG4pfXZhciBnPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpqfSk7Zy5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2ddfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGQuYXJyYXk9PVwib2JqZWN0XCIpe3RoaXMuc2V0Q2VydHMoZC5hcnJheSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGUsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlVjI9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGVWMi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS4xNi4yLjQ3XCI7dmFyIGI9S0pVUi5hc24xO3ZhciBmPUtKVVIuYXNuMS54NTA5O3ZhciBkPUtKVVIuYXNuMS5jbXM7dmFyIGM9S0pVUi5jcnlwdG87dGhpcy5zZXRDZXJ0cz1mdW5jdGlvbihwLGgpe3ZhciBuPVtdO2Zvcih2YXIgbD0wO2w8cC5sZW5ndGg7bCsrKXt2YXIgaj1LRVlVVElMLmdldEhleEZyb21QRU0ocFtsXSk7dmFyIHI9W107aWYoaCE9XCJzaGEyNTZcIil7ci5wdXNoKG5ldyBmLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6aH0pKX12YXIgZz1jLlV0aWwuaGFzaEhleChqLGgpO3ZhciBxPW5ldyBiLkRFUk9jdGV0U3RyaW5nKHtoZXg6Z30pO3EuZ2V0RW5jb2RlZEhleCgpO3IucHVzaChxKTt2YXIgbT1uZXcgZC5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoe2NlcnQ6cFtsXX0pO20uZ2V0RW5jb2RlZEhleCgpO3IucHVzaChtKTt2YXIgbz1uZXcgYi5ERVJTZXF1ZW5jZSh7YXJyYXk6cn0pO28uZ2V0RW5jb2RlZEhleCgpO24ucHVzaChvKX12YXIgaz1uZXcgYi5ERVJTZXF1ZW5jZSh7YXJyYXk6bn0pO2suZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtrXX07aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBlLmFycmF5PT1cIm9iamVjdFwiKXt2YXIgYT1cInNoYTI1NlwiO2lmKHR5cGVvZiBlLmhhc2hBbGc9PVwic3RyaW5nXCIpe2E9ZS5oYXNoQWxnfXRoaXMuc2V0Q2VydHMoZS5hcnJheSxhKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZVYyLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY21zLklzc3VlckFuZFNlcmlhbE51bWJlcj1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLklzc3VlckFuZFNlcmlhbE51bWJlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGU9bnVsbDt2YXIgYj1udWxsO3ZhciBhPUtKVVIuYXNuMTt2YXIgZD1hLng1MDk7dGhpcy5zZXRCeUNlcnRQRU09ZnVuY3Rpb24oaSl7dmFyIGc9S0VZVVRJTC5nZXRIZXhGcm9tUEVNKGkpO3ZhciBmPW5ldyBYNTA5KCk7Zi5oZXg9Zzt2YXIgaj1mLmdldElzc3VlckhleCgpO3RoaXMuZElzc3Vlcj1uZXcgZC5YNTAwTmFtZSgpO3RoaXMuZElzc3Vlci5oVExWPWo7dmFyIGg9Zi5nZXRTZXJpYWxOdW1iZXJIZXgoKTt0aGlzLmRTZXJpYWw9bmV3IGEuREVSSW50ZWdlcih7aGV4Omh9KX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGY9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuZElzc3Vlcix0aGlzLmRTZXJpYWxdfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJzdHJpbmdcIiYmYy5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0aGlzLnNldEJ5Q2VydFBFTShjKX1pZihjLmlzc3VlciYmYy5zZXJpYWwpe2lmKGMuaXNzdWVyIGluc3RhbmNlb2YgS0pVUi5hc24xLng1MDkuWDUwME5hbWUpe3RoaXMuZElzc3Vlcj1jLmlzc3Vlcn1lbHNle3RoaXMuZElzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYy5pc3N1ZXIpfWlmKGMuc2VyaWFsIGluc3RhbmNlb2YgS0pVUi5hc24xLkRFUkludGVnZXIpe3RoaXMuZFNlcmlhbD1jLnNlcmlhbH1lbHNle3RoaXMuZFNlcmlhbD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoYy5zZXJpYWwpfX1pZih0eXBlb2YgYy5jZXJ0PT1cInN0cmluZ1wiKXt0aGlzLnNldEJ5Q2VydFBFTShjLmNlcnQpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZUxpc3Q9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLmNtcy5BdHRyaWJ1dGVMaXN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmxpc3Q9bmV3IEFycmF5KCk7dGhpcy5zb3J0RmxhZz10cnVlO3RoaXMuYWRkPWZ1bmN0aW9uKGIpe2lmKGIgaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSl7dGhpcy5saXN0LnB1c2goYil9fTt0aGlzLmxlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxpc3QubGVuZ3RofTt0aGlzLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5saXN0PW5ldyBBcnJheSgpO3RoaXMuaFRMVj1udWxsO3RoaXMuaFY9bnVsbH07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFRMVj09XCJzdHJpbmdcIil7cmV0dXJuIHRoaXMuaFRMVn12YXIgYj1uZXcgS0pVUi5hc24xLkRFUlNldCh7YXJyYXk6dGhpcy5saXN0LHNvcnRmbGFnOnRoaXMuc29ydEZsYWd9KTt0aGlzLmhUTFY9Yi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLnNvcnRmbGFnIT1cInVuZGVmaW5lZFwiJiZhLnNvcnRmbGFnPT1mYWxzZSl7dGhpcy5zb3J0RmxhZz1mYWxzZX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZUxpc3QsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuU2lnbmVySW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLlNpZ25lckluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY21zO3ZhciBkPUtKVVIuYXNuMS54NTA5O3RoaXMuZENNU1ZlcnNpb249bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjoxfSk7dGhpcy5kU2lnbmVySWRlbnRpZmllcj1udWxsO3RoaXMuZERpZ2VzdEFsZ29yaXRobT1udWxsO3RoaXMuZFNpZ25lZEF0dHJzPW5ldyBiLkF0dHJpYnV0ZUxpc3QoKTt0aGlzLmRTaWdBbGc9bnVsbDt0aGlzLmRTaWc9bnVsbDt0aGlzLmRVbnNpZ25lZEF0dHJzPW5ldyBiLkF0dHJpYnV0ZUxpc3QoKTt0aGlzLnNldFNpZ25lcklkZW50aWZpZXI9ZnVuY3Rpb24oZil7aWYodHlwZW9mIGY9PVwic3RyaW5nXCImJmYuaW5kZXhPZihcIkNFUlRJRklDQVRFXCIpIT0tMSYmZi5pbmRleE9mKFwiQkVHSU5cIikhPS0xJiZmLmluZGV4T2YoXCJFTkRcIikhPS0xKXt2YXIgZT1mO3RoaXMuZFNpZ25lcklkZW50aWZpZXI9bmV3IGIuSXNzdWVyQW5kU2VyaWFsTnVtYmVyKHtjZXJ0OmZ9KX19O3RoaXMuc2V0Rm9yQ29udGVudEFuZEhhc2g9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKGUuZWNpT2JqIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbyl7dGhpcy5kU2lnbmVkQXR0cnMuYWRkKG5ldyBiLkNvbnRlbnRUeXBlKHtvaWQ6XCIxLjIuODQwLjExMzU0OS4xLjcuMVwifSkpO3RoaXMuZFNpZ25lZEF0dHJzLmFkZChuZXcgYi5NZXNzYWdlRGlnZXN0KHtlY2lPYmo6ZS5lY2lPYmosaGFzaEFsZzplLmhhc2hBbGd9KSl9aWYodHlwZW9mIGUuc2RPYmohPVwidW5kZWZpbmVkXCImJmUuc2RPYmogaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLlNpZ25lZERhdGEpe2lmKGUuc2RPYmouZGlnZXN0QWxnTmFtZUxpc3Quam9pbihcIjpcIikuaW5kZXhPZihlLmhhc2hBbGcpPT0tMSl7ZS5zZE9iai5kaWdlc3RBbGdOYW1lTGlzdC5wdXNoKGUuaGFzaEFsZyl9fWlmKHR5cGVvZiBlLmhhc2hBbGc9PVwic3RyaW5nXCIpe3RoaXMuZERpZ2VzdEFsZ29yaXRobT1uZXcgZC5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmUuaGFzaEFsZ30pfX19O3RoaXMuc2lnbj1mdW5jdGlvbihqLGYpe3RoaXMuZFNpZ0FsZz1uZXcgZC5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmZ9KTt2YXIgZz10aGlzLmRTaWduZWRBdHRycy5nZXRFbmNvZGVkSGV4KCk7dmFyIGU9S0VZVVRJTC5nZXRLZXkoaik7dmFyIGk9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOmZ9KTtpLmluaXQoZSk7aS51cGRhdGVIZXgoZyk7dmFyIGg9aS5zaWduKCk7dGhpcy5kU2lnPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6aH0pfTt0aGlzLmFkZFVuc2lnbmVkPWZ1bmN0aW9uKGUpe3RoaXMuaFRMVj1udWxsO3RoaXMuZFVuc2lnbmVkQXR0cnMuaFRMVj1udWxsO3RoaXMuZFVuc2lnbmVkQXR0cnMuYWRkKGUpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRTaWduZWRBdHRycyBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdCYmdGhpcy5kU2lnbmVkQXR0cnMubGVuZ3RoKCk9PTApe3Rocm93XCJTaWduZWRBdHRycyBsZW5ndGggPSAwIChlbXB0eSlcIn12YXIgZT1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajp0aGlzLmRTaWduZWRBdHRycyx0YWc6XCJhMFwiLGV4cGxpY2l0OmZhbHNlfSk7dmFyIGg9bnVsbDtpZih0aGlzLmRVbnNpZ25lZEF0dHJzLmxlbmd0aCgpPjApe2g9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6dGhpcy5kVW5zaWduZWRBdHRycyx0YWc6XCJhMVwiLGV4cGxpY2l0OmZhbHNlfSl9dmFyIGc9W3RoaXMuZENNU1ZlcnNpb24sdGhpcy5kU2lnbmVySWRlbnRpZmllcix0aGlzLmREaWdlc3RBbGdvcml0aG0sZSx0aGlzLmRTaWdBbGcsdGhpcy5kU2lnLF07aWYoaCE9bnVsbCl7Zy5wdXNoKGgpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpnfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLlNpZ25lckluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuRW5jYXBzdWxhdGVkQ29udGVudEluZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jbXM7dmFyIGQ9S0pVUi5hc24xLng1MDk7dGhpcy5kRUNvbnRlbnRUeXBlPW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe25hbWU6XCJkYXRhXCJ9KTt0aGlzLmRFQ29udGVudD1udWxsO3RoaXMuaXNEZXRhY2hlZD1mYWxzZTt0aGlzLmVDb250ZW50VmFsdWVIZXg9bnVsbDt0aGlzLnNldENvbnRlbnRUeXBlPWZ1bmN0aW9uKGUpe2lmKGUubWF0Y2goL15bMC0yXVsuXVswLTkuXSskLykpe3RoaXMuZEVDb250ZW50VHlwZT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKHtvaWQ6ZX0pfWVsc2V7dGhpcy5kRUNvbnRlbnRUeXBlPW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe25hbWU6ZX0pfX07dGhpcy5zZXRDb250ZW50VmFsdWU9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBlLmhleD09XCJzdHJpbmdcIil7dGhpcy5lQ29udGVudFZhbHVlSGV4PWUuaGV4fWVsc2V7aWYodHlwZW9mIGUuc3RyPT1cInN0cmluZ1wiKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9dXRmOHRvaGV4KGUuc3RyKX19fX07dGhpcy5zZXRDb250ZW50VmFsdWVIZXg9ZnVuY3Rpb24oZSl7dGhpcy5lQ29udGVudFZhbHVlSGV4PWV9O3RoaXMuc2V0Q29udGVudFZhbHVlU3RyPWZ1bmN0aW9uKGUpe3RoaXMuZUNvbnRlbnRWYWx1ZUhleD11dGY4dG9oZXgoZSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmVDb250ZW50VmFsdWVIZXghPVwic3RyaW5nXCIpe3Rocm93XCJlQ29udGVudFZhbHVlIG5vdCB5ZXQgc2V0XCJ9dmFyIGc9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDp0aGlzLmVDb250ZW50VmFsdWVIZXh9KTt0aGlzLmRFQ29udGVudD1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpnLHRhZzpcImEwXCIsZXhwbGljaXQ6dHJ1ZX0pO3ZhciBlPVt0aGlzLmRFQ29udGVudFR5cGVdO2lmKCF0aGlzLmlzRGV0YWNoZWQpe2UucHVzaCh0aGlzLmRFQ29udGVudCl9dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmV9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuRW5jYXBzdWxhdGVkQ29udGVudEluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuQ29udGVudEluZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5Db250ZW50SW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jbXM7dmFyIGQ9S0pVUi5hc24xLng1MDk7dGhpcy5kQ29udGVudFR5cGU9bnVsbDt0aGlzLmRDb250ZW50PW51bGw7dGhpcy5zZXRDb250ZW50VHlwZT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIil7dGhpcy5kQ29udGVudFR5cGU9ZC5PSUQubmFtZTJvYmooZSl9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajp0aGlzLmRDb250ZW50LHRhZzpcImEwXCIsZXhwbGljaXQ6dHJ1ZX0pO3ZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kQ29udGVudFR5cGUsZl19KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKGMudHlwZSl7dGhpcy5zZXRDb250ZW50VHlwZShjLnR5cGUpfWlmKGMub2JqJiZjLm9iaiBpbnN0YW5jZW9mIGEuQVNOMU9iamVjdCl7dGhpcy5kQ29udGVudD1jLm9ian19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkNvbnRlbnRJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLlNpZ25lZERhdGE9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5TaWduZWREYXRhLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRDTVNWZXJzaW9uPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6MX0pO3RoaXMuZERpZ2VzdEFsZ3M9bnVsbDt0aGlzLmRpZ2VzdEFsZ05hbWVMaXN0PVtdO3RoaXMuZEVuY2FwQ29udGVudEluZm89bmV3IGIuRW5jYXBzdWxhdGVkQ29udGVudEluZm8oKTt0aGlzLmRDZXJ0cz1udWxsO3RoaXMuY2VydGlmaWNhdGVMaXN0PVtdO3RoaXMuY3JsTGlzdD1bXTt0aGlzLnNpZ25lckluZm9MaXN0PVtuZXcgYi5TaWduZXJJbmZvKCldO3RoaXMuYWRkQ2VydGlmaWNhdGVzQnlQRU09ZnVuY3Rpb24oZSl7dmFyIGY9S0VZVVRJTC5nZXRIZXhGcm9tUEVNKGUpO3ZhciBnPW5ldyBhLkFTTjFPYmplY3QoKTtnLmhUTFY9Zjt0aGlzLmNlcnRpZmljYXRlTGlzdC5wdXNoKGcpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfWlmKHRoaXMuZERpZ2VzdEFsZ3M9PW51bGwpe3ZhciBrPVtdO2Zvcih2YXIgaj0wO2o8dGhpcy5kaWdlc3RBbGdOYW1lTGlzdC5sZW5ndGg7aisrKXt2YXIgaD10aGlzLmRpZ2VzdEFsZ05hbWVMaXN0W2pdO3ZhciBtPW5ldyBkLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6aH0pO2sucHVzaChtKX10aGlzLmREaWdlc3RBbGdzPW5ldyBhLkRFUlNldCh7YXJyYXk6a30pfXZhciBlPVt0aGlzLmRDTVNWZXJzaW9uLHRoaXMuZERpZ2VzdEFsZ3MsdGhpcy5kRW5jYXBDb250ZW50SW5mb107aWYodGhpcy5kQ2VydHM9PW51bGwpe2lmKHRoaXMuY2VydGlmaWNhdGVMaXN0Lmxlbmd0aD4wKXt2YXIgbD1uZXcgYS5ERVJTZXQoe2FycmF5OnRoaXMuY2VydGlmaWNhdGVMaXN0fSk7dGhpcy5kQ2VydHM9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6bCx0YWc6XCJhMFwiLGV4cGxpY2l0OmZhbHNlfSl9fWlmKHRoaXMuZENlcnRzIT1udWxsKXtlLnB1c2godGhpcy5kQ2VydHMpfXZhciBnPW5ldyBhLkRFUlNldCh7YXJyYXk6dGhpcy5zaWduZXJJbmZvTGlzdH0pO2UucHVzaChnKTt2YXIgZj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZX0pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLmdldENvbnRlbnRJbmZvPWZ1bmN0aW9uKCl7dGhpcy5nZXRFbmNvZGVkSGV4KCk7dmFyIGU9bmV3IGIuQ29udGVudEluZm8oe3R5cGU6XCJzaWduZWQtZGF0YVwiLG9iajp0aGlzfSk7cmV0dXJuIGV9O3RoaXMuZ2V0Q29udGVudEluZm9FbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb250ZW50SW5mbygpO3ZhciBmPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiBmfTt0aGlzLmdldFBFTT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q29udGVudEluZm9FbmNvZGVkSGV4KCk7dmFyIGY9YS5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGUsXCJDTVNcIik7cmV0dXJuIGZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLlNpZ25lZERhdGEsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuQ01TVXRpbD1uZXcgZnVuY3Rpb24oKXt9O0tKVVIuYXNuMS5jbXMuQ01TVXRpbC5uZXdTaWduZWREYXRhPWZ1bmN0aW9uKGEpe3ZhciBoPUtKVVIuYXNuMS5jbXM7dmFyIGc9S0pVUi5hc24xLmNhZGVzO3ZhciBmPW5ldyBoLlNpZ25lZERhdGEoKTtmLmRFbmNhcENvbnRlbnRJbmZvLnNldENvbnRlbnRWYWx1ZShhLmNvbnRlbnQpO2lmKHR5cGVvZiBhLmNlcnRzPT1cIm9iamVjdFwiKXtmb3IodmFyIGI9MDtiPGEuY2VydHMubGVuZ3RoO2IrKyl7Zi5hZGRDZXJ0aWZpY2F0ZXNCeVBFTShhLmNlcnRzW2JdKX19Zi5zaWduZXJJbmZvTGlzdD1bXTtmb3IodmFyIGI9MDtiPGEuc2lnbmVySW5mb3MubGVuZ3RoO2IrKyl7dmFyIGQ9YS5zaWduZXJJbmZvc1tiXTt2YXIgYz1uZXcgaC5TaWduZXJJbmZvKCk7Yy5zZXRTaWduZXJJZGVudGlmaWVyKGQuc2lnbmVyQ2VydCk7Yy5zZXRGb3JDb250ZW50QW5kSGFzaCh7c2RPYmo6ZixlY2lPYmo6Zi5kRW5jYXBDb250ZW50SW5mbyxoYXNoQWxnOmQuaGFzaEFsZ30pO2ZvcihhdHRyTmFtZSBpbiBkLnNBdHRyKXt2YXIgaj1kLnNBdHRyW2F0dHJOYW1lXTtpZihhdHRyTmFtZT09XCJTaWduaW5nVGltZVwiKXt2YXIgZT1uZXcgaC5TaWduaW5nVGltZShqKTtjLmRTaWduZWRBdHRycy5hZGQoZSl9aWYoYXR0ck5hbWU9PVwiU2lnbmluZ0NlcnRpZmljYXRlXCIpe3ZhciBlPW5ldyBoLlNpZ25pbmdDZXJ0aWZpY2F0ZShqKTtjLmRTaWduZWRBdHRycy5hZGQoZSl9aWYoYXR0ck5hbWU9PVwiU2lnbmluZ0NlcnRpZmljYXRlVjJcIil7dmFyIGU9bmV3IGguU2lnbmluZ0NlcnRpZmljYXRlVjIoaik7Yy5kU2lnbmVkQXR0cnMuYWRkKGUpfWlmKGF0dHJOYW1lPT1cIlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXJcIil7dmFyIGU9bmV3IGcuU2lnbmF0dXJlUG9saWN5SWRlbnRpZmllcihqKTtjLmRTaWduZWRBdHRycy5hZGQoZSl9fWMuc2lnbihkLnNpZ25lclBydktleSxkLnNpZ0FsZyk7Zi5zaWduZXJJbmZvTGlzdC5wdXNoKGMpfXJldHVybiBmfTtcbi8qISBhc24xdHNwLTEuMC4xLmpzIChjKSAyMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS50c3A9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEudHNwKXtLSlVSLmFzbjEudHNwPXt9fUtKVVIuYXNuMS50c3AuQWNjdXJhY3k9ZnVuY3Rpb24oYil7S0pVUi5hc24xLnRzcC5BY2N1cmFjeS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3RoaXMuc2Vjb25kcz1udWxsO3RoaXMubWlsbGlzPW51bGw7dGhpcy5taWNyb3M9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT1udWxsO3ZhciBnPW51bGw7dmFyIGk9bnVsbDt2YXIgYz1bXTtpZih0aGlzLnNlY29uZHMhPW51bGwpe2U9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjp0aGlzLnNlY29uZHN9KTtjLnB1c2goZSl9aWYodGhpcy5taWxsaXMhPW51bGwpe3ZhciBoPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6dGhpcy5taWxsaXN9KTtnPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOmgsdGFnOlwiODBcIixleHBsaWNpdDpmYWxzZX0pO2MucHVzaChnKX1pZih0aGlzLm1pY3JvcyE9bnVsbCl7dmFyIGY9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjp0aGlzLm1pY3Jvc30pO2k9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6Zix0YWc6XCI4MVwiLGV4cGxpY2l0OmZhbHNlfSk7Yy5wdXNoKGkpfXZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpjfSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5zZWNvbmRzPT1cIm51bWJlclwiKXt0aGlzLnNlY29uZHM9Yi5zZWNvbmRzfWlmKHR5cGVvZiBiLm1pbGxpcz09XCJudW1iZXJcIil7dGhpcy5taWxsaXM9Yi5taWxsaXN9aWYodHlwZW9mIGIubWljcm9zPT1cIm51bWJlclwiKXt0aGlzLm1pY3Jvcz1iLm1pY3Jvc319fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLkFjY3VyYWN5LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50PWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYz1LSlVSLmFzbjEueDUwOTt0aGlzLmRIYXNoQWxnPW51bGw7dGhpcy5kSGFzaFZhbHVlPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFRMVj09XCJzdHJpbmdcIil7cmV0dXJuIHRoaXMuaFRMVn12YXIgZD1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuZEhhc2hBbGcsdGhpcy5kSGFzaFZhbHVlXX0pO3JldHVybiBkLmdldEVuY29kZWRIZXgoKX07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmhhc2hBbGc9PVwic3RyaW5nXCIpe3RoaXMuZEhhc2hBbGc9bmV3IGMuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpiLmhhc2hBbGd9KX1pZih0eXBlb2YgYi5oYXNoVmFsdWU9PVwic3RyaW5nXCIpe3RoaXMuZEhhc2hWYWx1ZT1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OmIuaGFzaFZhbHVlfSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXE9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXEuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3RoaXMuZFZlcnNpb249bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjoxfSk7dGhpcy5kTWVzc2FnZUltcHJpbnQ9bnVsbDt0aGlzLmRQb2xpY3k9bnVsbDt0aGlzLmROb25jZT1udWxsO3RoaXMuY2VydFJlcT10cnVlO3RoaXMuc2V0TWVzc2FnZUltcHJpbnQ9ZnVuY3Rpb24oZCl7aWYoZCBpbnN0YW5jZW9mIEtKVVIuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQpe3RoaXMuZE1lc3NhZ2VJbXByaW50PWQ7cmV0dXJufWlmKHR5cGVvZiBkPT1cIm9iamVjdFwiKXt0aGlzLmRNZXNzYWdlSW1wcmludD1uZXcgYi5NZXNzYWdlSW1wcmludChkKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZE1lc3NhZ2VJbXByaW50PT1udWxsKXt0aHJvd1wibWVzc2FnZUltcHJpbnQgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9dmFyIGQ9W3RoaXMuZFZlcnNpb24sdGhpcy5kTWVzc2FnZUltcHJpbnRdO2lmKHRoaXMuZFBvbGljeSE9bnVsbCl7ZC5wdXNoKHRoaXMuZFBvbGljeSl9aWYodGhpcy5kTm9uY2UhPW51bGwpe2QucHVzaCh0aGlzLmROb25jZSl9aWYodGhpcy5jZXJ0UmVxKXtkLnB1c2gobmV3IGEuREVSQm9vbGVhbigpKX12YXIgZT1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZH0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMubWk9PVwib2JqZWN0XCIpe3RoaXMuc2V0TWVzc2FnZUltcHJpbnQoYy5taSl9aWYodHlwZW9mIGMucG9saWN5PT1cIm9iamVjdFwiKXt0aGlzLmRQb2xpY3k9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcihjLnBvbGljeSl9aWYodHlwZW9mIGMubm9uY2U9PVwib2JqZWN0XCIpe3RoaXMuZE5vbmNlPW5ldyBhLkRFUkludGVnZXIoYy5ub25jZSl9aWYodHlwZW9mIGMuY2VydHJlcT09XCJib29sZWFuXCIpe3RoaXMuY2VydFJlcT1jLmNlcnRyZXF9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXEsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuVFNUSW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEudHNwLlRTVEluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgZD1LSlVSLmFzbjEueDUwOTt2YXIgYj1LSlVSLmFzbjEudHNwO3RoaXMuZFZlcnNpb249bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjoxfSk7dGhpcy5kUG9saWN5PW51bGw7dGhpcy5kTWVzc2FnZUltcHJpbnQ9bnVsbDt0aGlzLmRTZXJpYWxOdW1iZXI9bnVsbDt0aGlzLmRHZW5UaW1lPW51bGw7dGhpcy5kQWNjdXJhY3k9bnVsbDt0aGlzLmRPcmRlcmluZz1udWxsO3RoaXMuZE5vbmNlPW51bGw7dGhpcy5kVHNhPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGU9W3RoaXMuZFZlcnNpb25dO2lmKHRoaXMuZFBvbGljeT09bnVsbCl7dGhyb3dcInBvbGljeSBzaGFsbCBiZSBzcGVjaWZpZWQuXCJ9ZS5wdXNoKHRoaXMuZFBvbGljeSk7aWYodGhpcy5kTWVzc2FnZUltcHJpbnQ9PW51bGwpe3Rocm93XCJtZXNzYWdlSW1wcmludCBzaGFsbCBiZSBzcGVjaWZpZWQuXCJ9ZS5wdXNoKHRoaXMuZE1lc3NhZ2VJbXByaW50KTtpZih0aGlzLmRTZXJpYWxOdW1iZXI9PW51bGwpe3Rocm93XCJzZXJpYWxOdW1iZXIgc2hhbGwgYmUgc3BlY2lmaWVkLlwifWUucHVzaCh0aGlzLmRTZXJpYWxOdW1iZXIpO2lmKHRoaXMuZEdlblRpbWU9PW51bGwpe3Rocm93XCJnZW5UaW1lIHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kR2VuVGltZSk7aWYodGhpcy5kQWNjdXJhY3khPW51bGwpe2UucHVzaCh0aGlzLmRBY2N1cmFjeSl9aWYodGhpcy5kT3JkZXJpbmchPW51bGwpe2UucHVzaCh0aGlzLmRPcmRlcmluZyl9aWYodGhpcy5kTm9uY2UhPW51bGwpe2UucHVzaCh0aGlzLmROb25jZSl9aWYodGhpcy5kVHNhIT1udWxsKXtlLnB1c2godGhpcy5kVHNhKX12YXIgZj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZX0pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMucG9saWN5PT1cInN0cmluZ1wiKXtpZighYy5wb2xpY3kubWF0Y2goL15bMC05Ll0rJC8pKXt0aHJvd1wicG9saWN5IHNoYWxsIGJlIG9pZCBsaWtlIDAuMS40LjEzNFwifXRoaXMuZFBvbGljeT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKHtvaWQ6Yy5wb2xpY3l9KX1pZih0eXBlb2YgYy5tZXNzYWdlSW1wcmludCE9XCJ1bmRlZmluZWRcIil7dGhpcy5kTWVzc2FnZUltcHJpbnQ9bmV3IGIuTWVzc2FnZUltcHJpbnQoYy5tZXNzYWdlSW1wcmludCl9aWYodHlwZW9mIGMuc2VyaWFsTnVtYmVyIT1cInVuZGVmaW5lZFwiKXt0aGlzLmRTZXJpYWxOdW1iZXI9bmV3IGEuREVSSW50ZWdlcihjLnNlcmlhbE51bWJlcil9aWYodHlwZW9mIGMuZ2VuVGltZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5kR2VuVGltZT1uZXcgYS5ERVJHZW5lcmFsaXplZFRpbWUoYy5nZW5UaW1lKX1pZih0eXBlb2YgYy5hY2N1cmFjeSE9XCJ1bmRlZmluZFwiKXt0aGlzLmRBY2N1cmFjeT1uZXcgYi5BY2N1cmFjeShjLmFjY3VyYWN5KX1pZih0eXBlb2YgYy5vcmRlcmluZyE9XCJ1bmRlZmluZWRcIiYmYy5vcmRlcmluZz09dHJ1ZSl7dGhpcy5kT3JkZXJpbmc9bmV3IGEuREVSQm9vbGVhbigpfWlmKHR5cGVvZiBjLm5vbmNlIT1cInVuZGVmaW5lZFwiKXt0aGlzLmROb25jZT1uZXcgYS5ERVJJbnRlZ2VyKGMubm9uY2UpfWlmKHR5cGVvZiBjLnRzYSE9XCJ1bmRlZmluZWRcIil7dGhpcy5kVHNhPW5ldyBkLlg1MDBOYW1lKGMudHNhKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlRTVEluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVzcD1mdW5jdGlvbihjKXtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlc3Auc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3RoaXMuZFN0YXR1cz1udWxsO3RoaXMuZFRTVD1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZFN0YXR1cz09bnVsbCl7dGhyb3dcInN0YXR1cyBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZD1bdGhpcy5kU3RhdHVzXTtpZih0aGlzLmRUU1QhPW51bGwpe2QucHVzaCh0aGlzLmRUU1QpfXZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5zdGF0dXM9PVwib2JqZWN0XCIpe3RoaXMuZFN0YXR1cz1uZXcgYi5QS0lTdGF0dXNJbmZvKGMuc3RhdHVzKX1pZih0eXBlb2YgYy50c3QhPVwidW5kZWZpbmVkXCImJmMudHN0IGluc3RhbmNlb2YgS0pVUi5hc24xLkFTTjFPYmplY3Qpe3RoaXMuZFRTVD1jLnRzdC5nZXRDb250ZW50SW5mbygpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVzcCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXNJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuUEtJU3RhdHVzSW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kU3RhdHVzPW51bGw7dGhpcy5kU3RhdHVzU3RyaW5nPW51bGw7dGhpcy5kRmFpbHVyZUluZm89bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRTdGF0dXM9PW51bGwpe3Rocm93XCJzdGF0dXMgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9dmFyIGQ9W3RoaXMuZFN0YXR1c107aWYodGhpcy5kU3RhdHVzU3RyaW5nIT1udWxsKXtkLnB1c2godGhpcy5kU3RhdHVzU3RyaW5nKX1pZih0aGlzLmRGYWlsdXJlSW5mbyE9bnVsbCl7ZC5wdXNoKHRoaXMuZEZhaWx1cmVJbmZvKX12YXIgZT1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZH0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMuc3RhdHVzPT1cIm9iamVjdFwiKXt0aGlzLmRTdGF0dXM9bmV3IGIuUEtJU3RhdHVzKGMuc3RhdHVzKX1pZih0eXBlb2YgYy5zdGF0c3RyPT1cIm9iamVjdFwiKXt0aGlzLmRTdGF0dXNTdHJpbmc9bmV3IGIuUEtJRnJlZVRleHQoe2FycmF5OmMuc3RhdHN0cn0pfWlmKHR5cGVvZiBjLmZhaWxpbmZvPT1cIm9iamVjdFwiKXt0aGlzLmRGYWlsdXJlSW5mbz1uZXcgYi5QS0lGYWlsdXJlSW5mbyhjLmZhaWxpbmZvKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSVN0YXR1c0luZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuUEtJU3RhdHVzPWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS50c3AuUEtJU3RhdHVzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt2YXIgZD1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3RoaXMuaFRMVj10aGlzLmRTdGF0dXMuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5uYW1lIT1cInVuZGVmaW5lZFwiKXt2YXIgYz1iLlBLSVN0YXR1cy52YWx1ZUxpc3Q7aWYodHlwZW9mIGNbZS5uYW1lXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIm5hbWUgdW5kZWZpbmVkOiBcIitlLm5hbWV9dGhpcy5kU3RhdHVzPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6Y1tlLm5hbWVdfSl9ZWxzZXt0aGlzLmRTdGF0dXM9bmV3IGEuREVSSW50ZWdlcihlKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSVN0YXR1cyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXMudmFsdWVMaXN0PXtncmFudGVkOjAsZ3JhbnRlZFdpdGhNb2RzOjEscmVqZWN0aW9uOjIsd2FpdGluZzozLHJldm9jYXRpb25XYXJuaW5nOjQscmV2b2NhdGlvbk5vdGlmaWNhdGlvbjo1fTtLSlVSLmFzbjEudHNwLlBLSUZyZWVUZXh0PWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS50c3AuUEtJRnJlZVRleHQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt0aGlzLnRleHRMaXN0PVtdO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBjPVtdO2Zvcih2YXIgZT0wO2U8dGhpcy50ZXh0TGlzdC5sZW5ndGg7ZSsrKXtjLnB1c2gobmV3IGEuREVSVVRGOFN0cmluZyh7c3RyOnRoaXMudGV4dExpc3RbZV19KSl9dmFyIGQ9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmN9KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmFycmF5PT1cIm9iamVjdFwiKXt0aGlzLnRleHRMaXN0PWIuYXJyYXl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5QS0lGcmVlVGV4dCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5QS0lGYWlsdXJlSW5mbz1mdW5jdGlvbihkKXtLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLnZhbHVlPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy52YWx1ZT09bnVsbCl7dGhyb3dcInZhbHVlIHNoYWxsIGJlIHNwZWNpZmllZFwifXZhciBlPW5ldyBOdW1iZXIodGhpcy52YWx1ZSkudG9TdHJpbmcoMik7dmFyIGY9bmV3IGEuREVSQml0U3RyaW5nKCk7Zi5zZXRCeUJpbmFyeVN0cmluZyhlKTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBkLm5hbWU9PVwic3RyaW5nXCIpe3ZhciBjPWIuUEtJRmFpbHVyZUluZm8udmFsdWVMaXN0O2lmKHR5cGVvZiBjW2QubmFtZV09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJuYW1lIHVuZGVmaW5lZDogXCIrZC5uYW1lfXRoaXMudmFsdWU9Y1tkLm5hbWVdfWVsc2V7aWYodHlwZW9mIGRbXCJpbnRcIl09PVwibnVtYmVyXCIpe3RoaXMudmFsdWU9ZFtcImludFwiXX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5QS0lGYWlsdXJlSW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5QS0lGYWlsdXJlSW5mby52YWx1ZUxpc3Q9e2JhZEFsZzowLGJhZFJlcXVlc3Q6MixiYWREYXRhRm9ybWF0OjUsdGltZU5vdEF2YWlsYWJsZToxNCx1bmFjY2VwdGVkUG9saWN5OjE1LHVuYWNjZXB0ZWRFeHRlbnNpb246MTYsYWRkSW5mb05vdEF2YWlsYWJsZToxNyxzeXN0ZW1GYWlsdXJlOjI1fTtLSlVSLmFzbjEudHNwLkFic3RyYWN0VFNBQWRhcHRlcj1mdW5jdGlvbihhKXt0aGlzLmdldFRTVEhleD1mdW5jdGlvbihjLGIpe3Rocm93XCJub3QgaW1wbGVtZW50ZWQgeWV0XCJ9fTtLSlVSLmFzbjEudHNwLlNpbXBsZVRTQUFkYXB0ZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLnRzcC5TaW1wbGVUU0FBZGFwdGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLnBhcmFtcz1udWxsO3RoaXMuc2VyaWFsPTA7dGhpcy5nZXRUU1RIZXg9ZnVuY3Rpb24oYyxiKXt2YXIgZT1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoYyxiKTt0aGlzLnBhcmFtcy50c3RJbmZvLm1lc3NhZ2VJbXByaW50PXtoYXNoQWxnOmIsaGFzaFZhbHVlOmV9O3RoaXMucGFyYW1zLnRzdEluZm8uc2VyaWFsTnVtYmVyPXtcImludFwiOnRoaXMuc2VyaWFsKyt9O3ZhciBkPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxMDAwMDAwMDAwKTt0aGlzLnBhcmFtcy50c3RJbmZvLm5vbmNlPXtcImludFwiOmR9O3ZhciBmPUtKVVIuYXNuMS50c3AuVFNQVXRpbC5uZXdUaW1lU3RhbXBUb2tlbih0aGlzLnBhcmFtcyk7cmV0dXJuIGYuZ2V0Q29udGVudEluZm9FbmNvZGVkSGV4KCl9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXt0aGlzLnBhcmFtcz1hfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5TaW1wbGVUU0FBZGFwdGVyLEtKVVIuYXNuMS50c3AuQWJzdHJhY3RUU0FBZGFwdGVyKTtLSlVSLmFzbjEudHNwLkZpeGVkVFNBQWRhcHRlcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEudHNwLkZpeGVkVFNBQWRhcHRlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5wYXJhbXM9bnVsbDt0aGlzLmdldFRTVEhleD1mdW5jdGlvbihjLGIpe3ZhciBkPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChjLGIpO3RoaXMucGFyYW1zLnRzdEluZm8ubWVzc2FnZUltcHJpbnQ9e2hhc2hBbGc6YixoYXNoVmFsdWU6ZH07dmFyIGU9S0pVUi5hc24xLnRzcC5UU1BVdGlsLm5ld1RpbWVTdGFtcFRva2VuKHRoaXMucGFyYW1zKTtyZXR1cm4gZS5nZXRDb250ZW50SW5mb0VuY29kZWRIZXgoKX07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe3RoaXMucGFyYW1zPWF9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLkZpeGVkVFNBQWRhcHRlcixLSlVSLmFzbjEudHNwLkFic3RyYWN0VFNBQWRhcHRlcik7S0pVUi5hc24xLnRzcC5UU1BVdGlsPW5ldyBmdW5jdGlvbigpe307S0pVUi5hc24xLnRzcC5UU1BVdGlsLm5ld1RpbWVTdGFtcFRva2VuPWZ1bmN0aW9uKGIpe3ZhciBqPUtKVVIuYXNuMS5jbXM7dmFyIGE9S0pVUi5hc24xLnRzcDt2YXIgZz1uZXcgai5TaWduZWREYXRhKCk7dmFyIGU9bmV3IGEuVFNUSW5mbyhiLnRzdEluZm8pO3ZhciBmPWUuZ2V0RW5jb2RlZEhleCgpO2cuZEVuY2FwQ29udGVudEluZm8uc2V0Q29udGVudFZhbHVlKHtoZXg6Zn0pO2cuZEVuY2FwQ29udGVudEluZm8uc2V0Q29udGVudFR5cGUoXCJ0c3RpbmZvXCIpO2lmKHR5cGVvZiBiLmNlcnRzPT1cIm9iamVjdFwiKXtmb3IodmFyIGM9MDtjPGIuY2VydHMubGVuZ3RoO2MrKyl7Zy5hZGRDZXJ0aWZpY2F0ZXNCeVBFTShiLmNlcnRzW2NdKX19dmFyIGQ9Zy5zaWduZXJJbmZvTGlzdFswXTtkLnNldFNpZ25lcklkZW50aWZpZXIoYi5zaWduZXJDZXJ0KTtkLnNldEZvckNvbnRlbnRBbmRIYXNoKHtzZE9iajpnLGVjaU9iajpnLmRFbmNhcENvbnRlbnRJbmZvLGhhc2hBbGc6Yi5oYXNoQWxnfSk7dmFyIGg9bmV3IGouU2lnbmluZ0NlcnRpZmljYXRlKHthcnJheTpbYi5zaWduZXJDZXJ0XX0pO2QuZFNpZ25lZEF0dHJzLmFkZChoKTtkLnNpZ24oYi5zaWduZXJQcnZLZXksYi5zaWdBbGcpO3JldHVybiBnfTtLSlVSLmFzbjEudHNwLlRTUFV0aWwucGFyc2VUaW1lU3RhbXBSZXE9ZnVuY3Rpb24oZCl7dmFyIGY9e307Zi5jZXJ0cmVxPWZhbHNlO3ZhciBoPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsMCk7aWYoaC5sZW5ndGg8Mil7dGhyb3dcIlRpbWVTdGFtcFJlcSBtdXN0IGhhdmUgYXQgbGVhc3QgMiBpdGVtc1wifXZhciBjPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxoWzFdKTtmLm1pPUtKVVIuYXNuMS50c3AuVFNQVXRpbC5wYXJzZU1lc3NhZ2VJbXByaW50KGMpO2Zvcih2YXIgZT0yO2U8aC5sZW5ndGg7ZSsrKXt2YXIgYj1oW2VdO3ZhciBhPWQuc3Vic3RyKGIsMik7aWYoYT09XCIwNlwiKXt2YXIgZz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihkLGIpO2YucG9saWN5PUFTTjFIRVguaGV4dG9vaWRzdHIoZyl9aWYoYT09XCIwMlwiKXtmLm5vbmNlPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGQsYil9aWYoYT09XCIwMVwiKXtmLmNlcnRyZXE9dHJ1ZX19cmV0dXJuIGZ9O0tKVVIuYXNuMS50c3AuVFNQVXRpbC5wYXJzZU1lc3NhZ2VJbXByaW50PWZ1bmN0aW9uKGMpe3ZhciBoPXt9O2lmKGMuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcImhlYWQgb2YgbWVzc2FnZUltcHJpbnQgaGV4IHNoYWxsIGJlICczMCdcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihjLDApO3ZhciBpPUFTTjFIRVguZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoYywwLFswLDBdKTt2YXIgZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihjLGkpO3ZhciBlPUFTTjFIRVguaGV4dG9vaWRzdHIoZCk7dmFyIGc9S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGUpO2lmKGc9PVwiXCIpe3Rocm93XCJoYXNoQWxnIG5hbWUgdW5kZWZpbmVkOiBcIitlfXZhciBiPWc7dmFyIGY9QVNOMUhFWC5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChjLDAsWzFdKTtoLmhhc2hBbGc9YjtoLmhhc2hWYWx1ZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihjLGYpO3JldHVybiBofTtcbi8qISBhc24xY2FkZXMtMS4wLjAuanMgKGMpIDIwMTMtMjAxNCBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuYXNuMT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMSl7S0pVUi5hc24xPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjEuY2FkZXM9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEuY2FkZXMpe0tKVVIuYXNuMS5jYWRlcz17fX1LSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlUG9saWN5SWRlbnRpZmllcj1mdW5jdGlvbihlKXtLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlUG9saWN5SWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS4xNi4yLjE1XCI7dmFyIGI9S0pVUi5hc24xO3ZhciBkPUtKVVIuYXNuMS5jYWRlcztpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUub2lkPT1cInN0cmluZ1wiJiZ0eXBlb2YgZS5oYXNoPT1cIm9iamVjdFwiKXt2YXIgZj1uZXcgYi5ERVJPYmplY3RJZGVudGlmaWVyKHtvaWQ6ZS5vaWR9KTt2YXIgYT1uZXcgZC5PdGhlckhhc2hBbGdBbmRWYWx1ZShlLmhhc2gpO3ZhciBjPW5ldyBiLkRFUlNlcXVlbmNlKHthcnJheTpbZixhXX0pO3RoaXMudmFsdWVMaXN0PVtjXX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlUG9saWN5SWRlbnRpZmllcixLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaEFsZ0FuZFZhbHVlPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2hBbGdBbmRWYWx1ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBjPUtKVVIuYXNuMS54NTA5O3RoaXMuZEFsZz1udWxsO3RoaXMuZEhhc2g9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZD1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuZEFsZyx0aGlzLmRIYXNoXX0pO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuYWxnPT1cInN0cmluZ1wiJiZ0eXBlb2YgYi5oYXNoPT1cInN0cmluZ1wiKXt0aGlzLmRBbGc9bmV3IGMuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpiLmFsZ30pO3RoaXMuZEhhc2g9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpiLmhhc2h9KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoQWxnQW5kVmFsdWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVUaW1lU3RhbXA9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVRpbWVTdGFtcC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS4xNi4yLjE0XCI7dGhpcy50c3RIZXg9bnVsbDt2YXIgYT1LSlVSLmFzbjE7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnJlcyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMucmVzPT1cInN0cmluZ1wiJiZjLnJlcy5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7fWVsc2V7aWYoYy5yZXMgaW5zdGFuY2VvZiBLSlVSLmFzbjEuQVNOMU9iamVjdCl7fWVsc2V7dGhyb3dcInJlcyBwYXJhbSBzaGFsbCBiZSBBU04xT2JqZWN0IG9yIGhleCBzdHJpbmdcIn19fWlmKHR5cGVvZiBjLnRzdCE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMudHN0PT1cInN0cmluZ1wiJiZjLnRzdC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7dmFyIGI9bmV3IGEuQVNOMU9iamVjdCgpO3RoaXMudHN0SGV4PWMudHN0O2IuaFRMVj10aGlzLnRzdEhleDtiLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bYl19ZWxzZXtpZihjLnRzdCBpbnN0YW5jZW9mIEtKVVIuYXNuMS5BU04xT2JqZWN0KXt9ZWxzZXt0aHJvd1widHN0IHBhcmFtIHNoYWxsIGJlIEFTTjFPYmplY3Qgb3IgaGV4IHN0cmluZ1wifX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVRpbWVTdGFtcCxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNhZGVzLkNvbXBsZXRlQ2VydGlmaWNhdGVSZWZzPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jYWRlcy5Db21wbGV0ZUNlcnRpZmljYXRlUmVmcy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS4xNi4yLjIxXCI7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jYWRlczt0aGlzLnNldEJ5QXJyYXk9ZnVuY3Rpb24oZCl7dGhpcy52YWx1ZUxpc3Q9W107Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPW5ldyBiLk90aGVyQ2VydElEKGRbZV0pO3RoaXMudmFsdWVMaXN0LnB1c2goZil9fTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwib2JqZWN0XCImJnR5cGVvZiBjLmxlbmd0aD09XCJudW1iZXJcIil7dGhpcy5zZXRCeUFycmF5KGMpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5Db21wbGV0ZUNlcnRpZmljYXRlUmVmcyxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNhZGVzLk90aGVyQ2VydElEPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS5jYWRlcy5PdGhlckNlcnRJRC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBjPUtKVVIuYXNuMS5jbXM7dmFyIGI9S0pVUi5hc24xLmNhZGVzO3RoaXMuaGFzSXNzdWVyU2VyaWFsPXRydWU7dGhpcy5kT3RoZXJDZXJ0SGFzaD1udWxsO3RoaXMuZElzc3VlclNlcmlhbD1udWxsO3RoaXMuc2V0QnlDZXJ0UEVNPWZ1bmN0aW9uKGUpe3RoaXMuZE90aGVyQ2VydEhhc2g9bmV3IGIuT3RoZXJIYXNoKGUpO2lmKHRoaXMuaGFzSXNzdWVyU2VyaWFsKXt0aGlzLmRJc3N1ZXJTZXJpYWw9bmV3IGMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyKGUpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfWlmKHRoaXMuZE90aGVyQ2VydEhhc2g9PW51bGwpe3Rocm93XCJvdGhlckNlcnRIYXNoIG5vdCBzZXRcIn12YXIgZT1bdGhpcy5kT3RoZXJDZXJ0SGFzaF07aWYodGhpcy5kSXNzdWVyU2VyaWFsIT1udWxsKXtlLnB1c2godGhpcy5kSXNzdWVyU2VyaWFsKX12YXIgZj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZX0pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGQ9PVwic3RyaW5nXCImJmQuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7dGhpcy5zZXRCeUNlcnRQRU0oZCl9aWYodHlwZW9mIGQ9PVwib2JqZWN0XCIpe2lmKGQuaGFzaXM9PT1mYWxzZSl7dGhpcy5oYXNJc3N1ZXJTZXJpYWw9ZmFsc2V9aWYodHlwZW9mIGQuY2VydD09XCJzdHJpbmdcIil7dGhpcy5zZXRCeUNlcnRQRU0oZC5jZXJ0KX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLk90aGVyQ2VydElELEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2guc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY2FkZXM7dGhpcy5hbGc9XCJzaGEyNTZcIjt0aGlzLmRPdGhlckhhc2g9bnVsbDt0aGlzLnNldEJ5Q2VydFBFTT1mdW5jdGlvbihkKXtpZihkLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKT09LTEpe3Rocm93XCJjZXJ0UEVNIG5vdCB0byBzZWVtIFBFTSBmb3JtYXRcIn12YXIgZT1YNTA5LnBlbVRvSGV4KGQpO3ZhciBmPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChlLHRoaXMuYWxnKTt0aGlzLmRPdGhlckhhc2g9bmV3IGIuT3RoZXJIYXNoQWxnQW5kVmFsdWUoe2FsZzp0aGlzLmFsZyxoYXNoOmZ9KX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kT3RoZXJIYXNoPT1udWxsKXt0aHJvd1wiT3RoZXJIYXNoIG5vdCBzZXRcIn1yZXR1cm4gdGhpcy5kT3RoZXJIYXNoLmdldEVuY29kZWRIZXgoKX07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiKXtpZihjLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe3RoaXMuc2V0QnlDZXJ0UEVNKGMpfWVsc2V7aWYoYy5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7dGhpcy5kT3RoZXJIYXNoPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6Y30pfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIHN0cmluZyB2YWx1ZSBmb3IgcGFyYW1zXCJ9fX1lbHNle2lmKHR5cGVvZiBjPT1cIm9iamVjdFwiKXtpZih0eXBlb2YgYy5jZXJ0PT1cInN0cmluZ1wiKXtpZih0eXBlb2YgYy5hbGc9PVwic3RyaW5nXCIpe3RoaXMuYWxnPWMuYWxnfXRoaXMuc2V0QnlDZXJ0UEVNKGMuY2VydCl9ZWxzZXt0aGlzLmRPdGhlckhhc2g9bmV3IGIuT3RoZXJIYXNoQWxnQW5kVmFsdWUoYyl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsPW5ldyBmdW5jdGlvbigpe307S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbC5hZGRTaWdUUz1mdW5jdGlvbihjLGIsYSl7fTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsLnBhcnNlU2lnbmVkRGF0YUZvckFkZGluZ1Vuc2lnbmVkPWZ1bmN0aW9uKGQpe3ZhciBxPUtKVVIuYXNuMTt2YXIgcD1LSlVSLmFzbjEuY21zO3ZhciBjPUtKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWw7dmFyIGE9e307aWYoQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QoZCwwLFswXSkhPVwiMDYwOTJhODY0ODg2ZjcwZDAxMDcwMlwiKXt0aHJvd1wiaGV4IGlzIG5vdCBDTVMgU2lnbmVkRGF0YVwifXZhciBzPUFTTjFIRVguZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCwwLFsxLDBdKTt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLHMpO2lmKGIubGVuZ3RoPDQpe3Rocm93XCJudW0gb2YgU2lnbmVkRGF0YSBlbGVtIHNoYWxsIGJlIDQgYXQgbGVhc3RcIn12YXIgZj1iLnNoaWZ0KCk7YS52ZXJzaW9uPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxmKTt2YXIgbD1iLnNoaWZ0KCk7YS5hbGdzPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxsKTt2YXIgbT1iLnNoaWZ0KCk7YS5lbmNhcGNvbnRlbnQ9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLG0pO2EuY2VydHM9bnVsbDthLnJldnM9bnVsbDthLnNpPVtdO3ZhciBuPWIuc2hpZnQoKTtpZihkLnN1YnN0cihuLDIpPT1cImEwXCIpe2EuY2VydHM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLG4pO249Yi5zaGlmdCgpfWlmKGQuc3Vic3RyKG4sMik9PVwiYTFcIil7YS5yZXZzPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxuKTtuPWIuc2hpZnQoKX12YXIgaz1uO2lmKGQuc3Vic3RyKGssMikhPVwiMzFcIil7dGhyb3dcIkNhbid0IGZpbmQgc2lnbmVySW5mb3NcIn12YXIgaj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLGspO2Zvcih2YXIgaD0wO2g8ai5sZW5ndGg7aCsrKXt2YXIgbz1qW2hdO3ZhciBlPWMucGFyc2VTaWduZXJJbmZvRm9yQWRkaW5nVW5zaWduZWQoZCxvLGgpO2Euc2lbaF09ZX12YXIgZz1udWxsO2Eub2JqPW5ldyBwLlNpZ25lZERhdGEoKTtnPW5ldyBxLkFTTjFPYmplY3QoKTtnLmhUTFY9YS52ZXJzaW9uO2Eub2JqLmRDTVNWZXJzaW9uPWc7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEuYWxnczthLm9iai5kRGlnZXN0QWxncz1nO2c9bmV3IHEuQVNOMU9iamVjdCgpO2cuaFRMVj1hLmVuY2FwY29udGVudDthLm9iai5kRW5jYXBDb250ZW50SW5mbz1nO2c9bmV3IHEuQVNOMU9iamVjdCgpO2cuaFRMVj1hLmNlcnRzO2Eub2JqLmRDZXJ0cz1nO2Eub2JqLnNpZ25lckluZm9MaXN0PVtdO2Zvcih2YXIgaD0wO2g8YS5zaS5sZW5ndGg7aCsrKXthLm9iai5zaWduZXJJbmZvTGlzdC5wdXNoKGEuc2lbaF0ub2JqKX1yZXR1cm4gYX07S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbC5wYXJzZVNpZ25lckluZm9Gb3JBZGRpbmdVbnNpZ25lZD1mdW5jdGlvbihkLGssYSl7dmFyIG09S0pVUi5hc24xO3ZhciBsPUtKVVIuYXNuMS5jbXM7dmFyIGI9e307dmFyIGU9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCxrKTtpZihlLmxlbmd0aCE9Nil7dGhyb3dcIm5vdCBzdXBwb3J0ZWQgaXRlbXMgZm9yIFNpZ25lckluZm8gKCE9NilcIn12YXIgZj1lLnNoaWZ0KCk7Yi52ZXJzaW9uPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxmKTt2YXIgbj1lLnNoaWZ0KCk7Yi5zaT1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbik7dmFyIGg9ZS5zaGlmdCgpO2IuZGlnYWxnPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxoKTt2YXIgYz1lLnNoaWZ0KCk7Yi5zYXR0cnM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGMpO3ZhciBpPWUuc2hpZnQoKTtiLnNpZ2FsZz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsaSk7dmFyIGo9ZS5zaGlmdCgpO2Iuc2lnPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxqKTtiLnNpZ3ZhbD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihkLGopO3ZhciBnPW51bGw7Yi5vYmo9bmV3IGwuU2lnbmVySW5mbygpO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnZlcnNpb247Yi5vYmouZENNU1ZlcnNpb249ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zaTtiLm9iai5kU2lnbmVySWRlbnRpZmllcj1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLmRpZ2FsZztiLm9iai5kRGlnZXN0QWxnb3JpdGhtPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuc2F0dHJzO2Iub2JqLmRTaWduZWRBdHRycz1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnNpZ2FsZztiLm9iai5kU2lnQWxnPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuc2lnO2Iub2JqLmRTaWc9ZztiLm9iai5kVW5zaWduZWRBdHRycz1uZXcgbC5BdHRyaWJ1dGVMaXN0KCk7cmV0dXJuIGJ9O1xuLyohIGFzbjFjc3ItMS4wLjAuanMgKGMpIDIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVIuYXNuMS5jc3I9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEuY3NyKXtLSlVSLmFzbjEuY3NyPXt9fUtKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3Q9ZnVuY3Rpb24oZil7S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgZD1udWxsO3ZhciBlPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3RoaXMuc2lnbj1mdW5jdGlvbihpLGgpe2lmKHRoaXMucHJ2S2V5PT1udWxsKXt0aGlzLnBydktleT1ofXRoaXMuYXNuMVNpZ25hdHVyZUFsZz1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTppfSk7c2lnPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzppfSk7c2lnLmluaXRTaWduKHRoaXMucHJ2S2V5KTtzaWcudXBkYXRlSGV4KHRoaXMuYXNuMUNTUkluZm8uZ2V0RW5jb2RlZEhleCgpKTt0aGlzLmhleFNpZz1zaWcuc2lnbigpO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBnPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFDU1JJbmZvLHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWcuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5nZXRQRU1TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZz1LSlVSLmFzbjEuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleCh0aGlzLmdldEVuY29kZWRIZXgoKSxcIkNFUlRJRklDQVRFIFJFUVVFU1RcIik7cmV0dXJuIGd9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaXNNb2RpZmllZD09ZmFsc2UmJnRoaXMuaFRMViE9bnVsbCl7cmV0dXJuIHRoaXMuaFRMVn10aHJvd1wibm90IHNpZ25lZCB5ZXRcIn07aWYodHlwZW9mIGYhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBmLmNzcmluZm8hPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMUNTUkluZm89Zi5jc3JpbmZvfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3QsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLl9pbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xVmVyc2lvbj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6MH0pO3RoaXMuYXNuMVN1YmplY3Q9bnVsbDt0aGlzLmFzbjFTdWJqUEtleT1udWxsO3RoaXMuZXh0ZW5zaW9uc0FycmF5PW5ldyBBcnJheSgpfTt0aGlzLnNldFN1YmplY3RCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVN1YmplY3Q9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldFN1YmplY3RQdWJsaWNLZXlCeUdldEtleT1mdW5jdGlvbihjKXt2YXIgYj1LRVlVVElMLmdldEtleShjKTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8oYil9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xVmVyc2lvbik7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTdWJqZWN0KTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmpQS2V5KTt2YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmV4dGVuc2lvbnNBcnJheX0pO3ZhciBiPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDpmYWxzZSx0YWc6XCJhMFwiLG9iajpjfSk7dGhpcy5hc24xQXJyYXkucHVzaChiKTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2U7cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5faW5pdGlhbGl6ZSgpfTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNzci5DU1JVdGlsPW5ldyBmdW5jdGlvbigpe307S0pVUi5hc24xLmNzci5DU1JVdGlsLm5ld0NTUlBFTT1mdW5jdGlvbihmKXt2YXIgYz1LSlVSLmFzbjEuY3NyO2lmKGYuc3ViamVjdD09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtZXRlciBzdWJqZWN0IHVuZGVmaW5lZFwifWlmKGYuc2JqcHVia2V5PT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHNianB1YmtleSB1bmRlZmluZWRcIn1pZihmLnNpZ2FsZz09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtZXRlciBzaWdhbGcgdW5kZWZpbmVkXCJ9aWYoZi5zYmpwcnZrZXk9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbWV0ZXIgc2JqcHVia2V5IHVuZGVmaW5lZFwifXZhciBiPW5ldyBjLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbygpO2Iuc2V0U3ViamVjdEJ5UGFyYW0oZi5zdWJqZWN0KTtiLnNldFN1YmplY3RQdWJsaWNLZXlCeUdldEtleShmLnNianB1YmtleSk7dmFyIGQ9bmV3IGMuQ2VydGlmaWNhdGlvblJlcXVlc3Qoe2NzcmluZm86Yn0pO3ZhciBhPUtFWVVUSUwuZ2V0S2V5KGYuc2JqcHJ2a2V5KTtkLnNpZ24oZi5zaWdhbGcsYSk7dmFyIGU9ZC5nZXRQRU1TdHJpbmcoKTtyZXR1cm4gZX07XG4vKiEgYmFzZTY0eC0xLjEuNyAoYykgMjAxMi0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBLSlVSO2lmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5sYW5nPT1cInVuZGVmaW5lZFwifHwhS0pVUi5sYW5nKXtLSlVSLmxhbmc9e319S0pVUi5sYW5nLlN0cmluZz1mdW5jdGlvbigpe307ZnVuY3Rpb24gQmFzZTY0eCgpe31mdW5jdGlvbiBzdG9CQShkKXt2YXIgYj1uZXcgQXJyYXkoKTtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7YltjXT1kLmNoYXJDb2RlQXQoYyl9cmV0dXJuIGJ9ZnVuY3Rpb24gQkF0b3MoYil7dmFyIGQ9XCJcIjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7ZD1kK1N0cmluZy5mcm9tQ2hhckNvZGUoYltjXSl9cmV0dXJuIGR9ZnVuY3Rpb24gQkF0b2hleChiKXt2YXIgZT1cIlwiO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgYz1iW2RdLnRvU3RyaW5nKDE2KTtpZihjLmxlbmd0aD09MSl7Yz1cIjBcIitjfWU9ZStjfXJldHVybiBlfWZ1bmN0aW9uIHN0b2hleChhKXtyZXR1cm4gQkF0b2hleChzdG9CQShhKSl9ZnVuY3Rpb24gc3RvYjY0KGEpe3JldHVybiBoZXgyYjY0KHN0b2hleChhKSl9ZnVuY3Rpb24gc3RvYjY0dShhKXtyZXR1cm4gYjY0dG9iNjR1KGhleDJiNjQoc3RvaGV4KGEpKSl9ZnVuY3Rpb24gYjY0dXRvcyhhKXtyZXR1cm4gQkF0b3MoYjY0dG9CQShiNjR1dG9iNjQoYSkpKX1mdW5jdGlvbiBiNjR0b2I2NHUoYSl7YT1hLnJlcGxhY2UoL1xcPS9nLFwiXCIpO2E9YS5yZXBsYWNlKC9cXCsvZyxcIi1cIik7YT1hLnJlcGxhY2UoL1xcLy9nLFwiX1wiKTtyZXR1cm4gYX1mdW5jdGlvbiBiNjR1dG9iNjQoYSl7aWYoYS5sZW5ndGglND09Mil7YT1hK1wiPT1cIn1lbHNle2lmKGEubGVuZ3RoJTQ9PTMpe2E9YStcIj1cIn19YT1hLnJlcGxhY2UoLy0vZyxcIitcIik7YT1hLnJlcGxhY2UoL18vZyxcIi9cIik7cmV0dXJuIGF9ZnVuY3Rpb24gaGV4dG9iNjR1KGEpe2lmKGEubGVuZ3RoJTI9PTEpe2E9XCIwXCIrYX1yZXR1cm4gYjY0dG9iNjR1KGhleDJiNjQoYSkpfWZ1bmN0aW9uIGI2NHV0b2hleChhKXtyZXR1cm4gYjY0dG9oZXgoYjY0dXRvYjY0KGEpKX12YXIgdXRmOHRvYjY0dSxiNjR1dG91dGY4O2lmKHR5cGVvZiBCdWZmZXI9PT1cImZ1bmN0aW9uXCIpe3V0Zjh0b2I2NHU9ZnVuY3Rpb24oYSl7cmV0dXJuIGI2NHRvYjY0dShuZXcgQnVmZmVyKGEsXCJ1dGY4XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpKX07YjY0dXRvdXRmOD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEJ1ZmZlcihiNjR1dG9iNjQoYSksXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpfX1lbHNle3V0Zjh0b2I2NHU9ZnVuY3Rpb24oYSl7cmV0dXJuIGhleHRvYjY0dSh1cmljbXB0b2hleChlbmNvZGVVUklDb21wb25lbnRBbGwoYSkpKX07YjY0dXRvdXRmOD1mdW5jdGlvbihhKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGhleHRvdXJpY21wKGI2NHV0b2hleChhKSkpfX1mdW5jdGlvbiB1dGY4dG9iNjQoYSl7cmV0dXJuIGhleDJiNjQodXJpY21wdG9oZXgoZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpKSl9ZnVuY3Rpb24gYjY0dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYjY0dG9oZXgoYSkpKX1mdW5jdGlvbiB1dGY4dG9oZXgoYSl7cmV0dXJuIHVyaWNtcHRvaGV4KGVuY29kZVVSSUNvbXBvbmVudEFsbChhKSl9ZnVuY3Rpb24gaGV4dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYSkpfWZ1bmN0aW9uIGhleHRvcnN0cihjKXt2YXIgYj1cIlwiO2Zvcih2YXIgYT0wO2E8Yy5sZW5ndGgtMTthKz0yKXtiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGMuc3Vic3RyKGEsMiksMTYpKX1yZXR1cm4gYn1mdW5jdGlvbiByc3RydG9oZXgoYyl7dmFyIGE9XCJcIjtmb3IodmFyIGI9MDtiPGMubGVuZ3RoO2IrKyl7YSs9KFwiMFwiK2MuY2hhckNvZGVBdChiKS50b1N0cmluZygxNikpLnNsaWNlKC0yKX1yZXR1cm4gYX1mdW5jdGlvbiBoZXh0b2I2NChhKXtyZXR1cm4gaGV4MmI2NChhKX1mdW5jdGlvbiBoZXh0b2I2NG5sKGIpe3ZhciBhPWhleHRvYjY0KGIpO3ZhciBjPWEucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7Yz1jLnJlcGxhY2UoL1xcclxcbiQvLFwiXCIpO3JldHVybiBjfWZ1bmN0aW9uIGI2NG5sdG9oZXgoYil7dmFyIGE9Yi5yZXBsYWNlKC9bXjAtOUEtWmEtelxcLys9XSovZyxcIlwiKTt2YXIgYz1iNjR0b2hleChhKTtyZXR1cm4gY31mdW5jdGlvbiB1cmljbXB0b2hleChhKXtyZXR1cm4gYS5yZXBsYWNlKC8lL2csXCJcIil9ZnVuY3Rpb24gaGV4dG91cmljbXAoYSl7cmV0dXJuIGEucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpfWZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudEFsbChhKXt2YXIgZD1lbmNvZGVVUklDb21wb25lbnQoYSk7dmFyIGI9XCJcIjtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7aWYoZFtjXT09XCIlXCIpe2I9YitkLnN1YnN0cihjLDMpO2M9YysyfWVsc2V7Yj1iK1wiJVwiK3N0b2hleChkW2NdKX19cmV0dXJuIGJ9ZnVuY3Rpb24gbmV3bGluZV90b1VuaXgoYSl7YT1hLnJlcGxhY2UoL1xcclxcbi9tZyxcIlxcblwiKTtyZXR1cm4gYX1mdW5jdGlvbiBuZXdsaW5lX3RvRG9zKGEpe2E9YS5yZXBsYWNlKC9cXHJcXG4vbWcsXCJcXG5cIik7YT1hLnJlcGxhY2UoL1xcbi9tZyxcIlxcclxcblwiKTtyZXR1cm4gYX1LSlVSLmxhbmcuU3RyaW5nLmlzSW50ZWdlcj1mdW5jdGlvbihhKXtpZihhLm1hdGNoKC9eWzAtOV0rJC8pKXtyZXR1cm4gdHJ1ZX1lbHNle2lmKGEubWF0Y2goL14tWzAtOV0rJC8pKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19fTtLSlVSLmxhbmcuU3RyaW5nLmlzSGV4PWZ1bmN0aW9uKGEpe2lmKGEubGVuZ3RoJTI9PTAmJihhLm1hdGNoKC9eWzAtOWEtZl0rJC8pfHxhLm1hdGNoKC9eWzAtOUEtRl0rJC8pKSl7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gZmFsc2V9fTtLSlVSLmxhbmcuU3RyaW5nLmlzQmFzZTY0PWZ1bmN0aW9uKGEpe2E9YS5yZXBsYWNlKC9cXHMrL2csXCJcIik7aWYoYS5tYXRjaCgvXlswLTlBLVphLXorXFwvXSs9ezAsM30kLykmJmEubGVuZ3RoJTQ9PTApe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX07S0pVUi5sYW5nLlN0cmluZy5pc0Jhc2U2NFVSTD1mdW5jdGlvbihhKXtpZihhLm1hdGNoKC9bKy89XS8pKXtyZXR1cm4gZmFsc2V9YT1iNjR1dG9iNjQoYSk7cmV0dXJuIEtKVVIubGFuZy5TdHJpbmcuaXNCYXNlNjQoYSl9O0tKVVIubGFuZy5TdHJpbmcuaXNJbnRlZ2VyQXJyYXk9ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoL1xccysvZyxcIlwiKTtpZihhLm1hdGNoKC9eXFxbWzAtOSxdK1xcXSQvKSl7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gZmFsc2V9fTtmdW5jdGlvbiBpbnRhcnlzdHJ0b2hleChiKXtiPWIucmVwbGFjZSgvXlxccypcXFtcXHMqLyxcIlwiKTtiPWIucmVwbGFjZSgvXFxzKlxcXVxccyokLyxcIlwiKTtiPWIucmVwbGFjZSgvXFxzKi9nLFwiXCIpO3RyeXt2YXIgYz1iLnNwbGl0KC8sLykubWFwKGZ1bmN0aW9uKGcsZSxoKXt2YXIgZj1wYXJzZUludChnKTtpZihmPDB8fDI1NTxmKXt0aHJvd1wiaW50ZWdlciBub3QgaW4gcmFuZ2UgMC0yNTVcIn12YXIgZD0oXCIwMFwiK2YudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7cmV0dXJuIGR9KS5qb2luKFwiXCIpO3JldHVybiBjfWNhdGNoKGEpe3Rocm93XCJtYWxmb3JtZWQgaW50ZWdlciBhcnJheSBzdHJpbmc6IFwiK2F9fXZhciBzdHJkaWZmaWR4PWZ1bmN0aW9uKGMsYSl7dmFyIGQ9Yy5sZW5ndGg7aWYoYy5sZW5ndGg+YS5sZW5ndGgpe2Q9YS5sZW5ndGh9Zm9yKHZhciBiPTA7YjxkO2IrKyl7aWYoYy5jaGFyQ29kZUF0KGIpIT1hLmNoYXJDb2RlQXQoYikpe3JldHVybiBifX1pZihjLmxlbmd0aCE9YS5sZW5ndGgpe3JldHVybiBkfXJldHVybiAtMX07XG4vKiEgY3J5cHRvLTEuMS44LmpzIChjKSAyMDEzLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5VdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuRElHRVNUSU5GT0hFQUQ9e3NoYTE6XCIzMDIxMzAwOTA2MDUyYjBlMDMwMjFhMDUwMDA0MTRcIixzaGEyMjQ6XCIzMDJkMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDQwNTAwMDQxY1wiLHNoYTI1NjpcIjMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwXCIsc2hhMzg0OlwiMzA0MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAyMDUwMDA0MzBcIixzaGE1MTI6XCIzMDUxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDMwNTAwMDQ0MFwiLG1kMjpcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDIwNTAwMDQxMFwiLG1kNTpcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDUwNTAwMDQxMFwiLHJpcGVtZDE2MDpcIjMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNFwiLH07dGhpcy5ERUZBVUxUUFJPVklERVI9e21kNTpcImNyeXB0b2pzXCIsc2hhMTpcImNyeXB0b2pzXCIsc2hhMjI0OlwiY3J5cHRvanNcIixzaGEyNTY6XCJjcnlwdG9qc1wiLHNoYTM4NDpcImNyeXB0b2pzXCIsc2hhNTEyOlwiY3J5cHRvanNcIixyaXBlbWQxNjA6XCJjcnlwdG9qc1wiLGhtYWNtZDU6XCJjcnlwdG9qc1wiLGhtYWNzaGExOlwiY3J5cHRvanNcIixobWFjc2hhMjI0OlwiY3J5cHRvanNcIixobWFjc2hhMjU2OlwiY3J5cHRvanNcIixobWFjc2hhMzg0OlwiY3J5cHRvanNcIixobWFjc2hhNTEyOlwiY3J5cHRvanNcIixobWFjcmlwZW1kMTYwOlwiY3J5cHRvanNcIixNRDV3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBNTEyd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsTUQ1d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFJJUEVNRDE2MHdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMXdpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLE1ENXdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEEyNTZ3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTUxMndpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixSSVBFTUQxNjB3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsfTt0aGlzLkNSWVBUT0pTTUVTU0FHRURJR0VTVE5BTUU9e21kNTpDcnlwdG9KUy5hbGdvLk1ENSxzaGExOkNyeXB0b0pTLmFsZ28uU0hBMSxzaGEyMjQ6Q3J5cHRvSlMuYWxnby5TSEEyMjQsc2hhMjU2OkNyeXB0b0pTLmFsZ28uU0hBMjU2LHNoYTM4NDpDcnlwdG9KUy5hbGdvLlNIQTM4NCxzaGE1MTI6Q3J5cHRvSlMuYWxnby5TSEE1MTIscmlwZW1kMTYwOkNyeXB0b0pTLmFsZ28uUklQRU1EMTYwfTt0aGlzLmdldERpZ2VzdEluZm9IZXg9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgdGhpcy5ESUdFU1RJTkZPSEVBRFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcImFsZyBub3Qgc3VwcG9ydGVkIGluIFV0aWwuRElHRVNUSU5GT0hFQUQ6IFwiK2J9cmV0dXJuIHRoaXMuRElHRVNUSU5GT0hFQURbYl0rYX07dGhpcy5nZXRQYWRkZWREaWdlc3RJbmZvSGV4PWZ1bmN0aW9uKGgsYSxqKXt2YXIgYz10aGlzLmdldERpZ2VzdEluZm9IZXgoaCxhKTt2YXIgZD1qLzQ7aWYoYy5sZW5ndGgrMjI+ZCl7dGhyb3dcImtleSBpcyB0b28gc2hvcnQgZm9yIFNpZ0FsZzoga2V5bGVuPVwiK2orXCIsXCIrYX12YXIgYj1cIjAwMDFcIjt2YXIgaz1cIjAwXCIrYzt2YXIgZz1cIlwiO3ZhciBsPWQtYi5sZW5ndGgtay5sZW5ndGg7Zm9yKHZhciBmPTA7ZjxsO2YrPTIpe2crPVwiZmZcIn12YXIgZT1iK2craztyZXR1cm4gZX07dGhpcy5oYXNoU3RyaW5nPWZ1bmN0aW9uKGEsYyl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpjfSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLmhhc2hIZXg9ZnVuY3Rpb24oYixjKXt2YXIgYT1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOmN9KTtyZXR1cm4gYS5kaWdlc3RIZXgoYil9O3RoaXMuc2hhMT1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhMVwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnNoYTI1Nj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhMjU2XCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhMjU2SGV4PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGEyNTZcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdEhleChhKX07dGhpcy5zaGE1MTI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTUxMlwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnNoYTUxMkhleD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhNTEyXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RIZXgoYSl9O3RoaXMubWQ1PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJtZDVcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5yaXBlbWQxNjA9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInJpcGVtZDE2MFwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLmdldENyeXB0b0pTTURCeU5hbWU9ZnVuY3Rpb24oYSl7fX07S0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdD1mdW5jdGlvbihjKXt2YXIgYj1udWxsO3ZhciBhPW51bGw7dmFyIGQ9bnVsbDt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKGcsZil7aWYoZyE9bnVsbCYmZj09PXVuZGVmaW5lZCl7Zj1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUltnXX1pZihcIjptZDU6c2hhMTpzaGEyMjQ6c2hhMjU2OnNoYTM4NDpzaGE1MTI6cmlwZW1kMTYwOlwiLmluZGV4T2YoZykhPS0xJiZmPT1cImNyeXB0b2pzXCIpe3RyeXt0aGlzLm1kPUtKVVIuY3J5cHRvLlV0aWwuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRVtnXS5jcmVhdGUoKX1jYXRjaChlKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK2crXCIvXCIrZX10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihoKXt0aGlzLm1kLnVwZGF0ZShoKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oaCl7dmFyIGk9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShoKTt0aGlzLm1kLnVwZGF0ZShpKX07dGhpcy5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLm1kLmZpbmFsaXplKCk7cmV0dXJuIGgudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleCl9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlU3RyaW5nKGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZUhleChoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX19aWYoXCI6c2hhMjU2OlwiLmluZGV4T2YoZykhPS0xJiZmPT1cInNqY2xcIil7dHJ5e3RoaXMubWQ9bmV3IHNqY2wuaGFzaC5zaGEyNTYoKX1jYXRjaChlKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK2crXCIvXCIrZX10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihoKXt0aGlzLm1kLnVwZGF0ZShoKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oaSl7dmFyIGg9c2pjbC5jb2RlYy5oZXgudG9CaXRzKGkpO3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBoPXRoaXMubWQuZmluYWxpemUoKTtyZXR1cm4gc2pjbC5jb2RlYy5oZXguZnJvbUJpdHMoaCl9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlU3RyaW5nKGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZUhleChoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX19fTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihlKXt0aHJvd1widXBkYXRlU3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGUpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3Q9ZnVuY3Rpb24oKXt0aHJvd1wiZGlnZXN0KCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGUpe3Rocm93XCJkaWdlc3RTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3RIZXg9ZnVuY3Rpb24oZSl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTtpZihjIT09dW5kZWZpbmVkKXtpZihjLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPWMuYWxnO2lmKGMucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfXRoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpfX19O0tKVVIuY3J5cHRvLk1hYz1mdW5jdGlvbihkKXt2YXIgZj1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt2YXIgZT1udWxsO3ZhciBiPW51bGw7dGhpcy5zZXRBbGdBbmRQcm92aWRlcj1mdW5jdGlvbihrLGkpe2s9ay50b0xvd2VyQ2FzZSgpO2lmKGs9PW51bGwpe2s9XCJobWFjc2hhMVwifWs9ay50b0xvd2VyQ2FzZSgpO2lmKGsuc3Vic3RyKDAsNCkhPVwiaG1hY1wiKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgdW5zdXBwb3J0ZWQgSE1BQyBhbGc6IFwiK2t9aWYoaT09PXVuZGVmaW5lZCl7aT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUltrXX10aGlzLmFsZ1Byb3Y9aytcIi9cIitpO3ZhciBnPWsuc3Vic3RyKDQpO2lmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZihnKSE9LTEmJmk9PVwiY3J5cHRvanNcIil7dHJ5e3ZhciBqPUtKVVIuY3J5cHRvLlV0aWwuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRVtnXTt0aGlzLm1hYz1DcnlwdG9KUy5hbGdvLkhNQUMuY3JlYXRlKGosdGhpcy5wYXNzKX1jYXRjaChoKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgaGFzaEFsZz1cIitnK1wiL1wiK2h9dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24obCl7dGhpcy5tYWMudXBkYXRlKGwpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihsKXt2YXIgbT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGwpO3RoaXMubWFjLnVwZGF0ZShtKX07dGhpcy5kb0ZpbmFsPWZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5tYWMuZmluYWxpemUoKTtyZXR1cm4gbC50b1N0cmluZyhDcnlwdG9KUy5lbmMuSGV4KX07dGhpcy5kb0ZpbmFsU3RyaW5nPWZ1bmN0aW9uKGwpe3RoaXMudXBkYXRlU3RyaW5nKGwpO3JldHVybiB0aGlzLmRvRmluYWwoKX07dGhpcy5kb0ZpbmFsSGV4PWZ1bmN0aW9uKGwpe3RoaXMudXBkYXRlSGV4KGwpO3JldHVybiB0aGlzLmRvRmluYWwoKX19fTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihnKXt0aHJvd1widXBkYXRlU3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihnKXt0aHJvd1widXBkYXRlSGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWw9ZnVuY3Rpb24oKXt0aHJvd1wiZGlnZXN0KCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWxTdHJpbmc9ZnVuY3Rpb24oZyl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5kb0ZpbmFsSGV4PWZ1bmN0aW9uKGcpe3Rocm93XCJkaWdlc3RIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuc2V0UGFzc3dvcmQ9ZnVuY3Rpb24oaCl7aWYodHlwZW9mIGg9PVwic3RyaW5nXCIpe3ZhciBnPWg7aWYoaC5sZW5ndGglMj09MXx8IWgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe2c9cnN0cnRvaGV4KGgpfXRoaXMucGFzcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGcpO3JldHVybn1pZih0eXBlb2YgaCE9XCJvYmplY3RcIil7dGhyb3dcIktKVVIuY3J5cHRvLk1hYyB1bnN1cHBvcnRlZCBwYXNzd29yZCB0eXBlOiBcIitofXZhciBnPW51bGw7aWYoaC5oZXghPT11bmRlZmluZWQpe2lmKGguaGV4Lmxlbmd0aCUyIT0wfHwhaC5oZXgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe3Rocm93XCJNYWM6IHdyb25nIGhleCBwYXNzd29yZDogXCIraC5oZXh9Zz1oLmhleH1pZihoLnV0ZjghPT11bmRlZmluZWQpe2c9dXRmOHRvaGV4KGgudXRmOCl9aWYoaC5yc3RyIT09dW5kZWZpbmVkKXtnPXJzdHJ0b2hleChoLnJzdHIpfWlmKGguYjY0IT09dW5kZWZpbmVkKXtnPWI2NHRvaGV4KGguYjY0KX1pZihoLmI2NHUhPT11bmRlZmluZWQpe2c9YjY0dXRvaGV4KGguYjY0dSl9aWYoZz09bnVsbCl7dGhyb3dcIktKVVIuY3J5cHRvLk1hYyB1bnN1cHBvcnRlZCBwYXNzd29yZCB0eXBlOiBcIitofXRoaXMucGFzcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGcpfTtpZihkIT09dW5kZWZpbmVkKXtpZihkLnBhc3MhPT11bmRlZmluZWQpe3RoaXMuc2V0UGFzc3dvcmQoZC5wYXNzKX1pZihkLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPWQuYWxnO2lmKGQucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfXRoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpfX19O0tKVVIuY3J5cHRvLlNpZ25hdHVyZT1mdW5jdGlvbihvKXt2YXIgcT1udWxsO3ZhciBuPW51bGw7dmFyIHI9bnVsbDt2YXIgYz1udWxsO3ZhciBsPW51bGw7dmFyIGQ9bnVsbDt2YXIgaz1udWxsO3ZhciBoPW51bGw7dmFyIHA9bnVsbDt2YXIgZT1udWxsO3ZhciBiPS0xO3ZhciBnPW51bGw7dmFyIGo9bnVsbDt2YXIgYT1udWxsO3ZhciBpPW51bGw7dmFyIGY9bnVsbDt0aGlzLl9zZXRBbGdOYW1lcz1mdW5jdGlvbigpe2lmKHRoaXMuYWxnTmFtZS5tYXRjaCgvXiguKyl3aXRoKC4rKSQvKSl7dGhpcy5tZEFsZ05hbWU9UmVnRXhwLiQxLnRvTG93ZXJDYXNlKCk7dGhpcy5wdWJrZXlBbGdOYW1lPVJlZ0V4cC4kMi50b0xvd2VyQ2FzZSgpfX07dGhpcy5femVyb1BhZGRpbmdPZlNpZ25hdHVyZT1mdW5jdGlvbih4LHcpe3ZhciB2PVwiXCI7dmFyIHQ9dy80LXgubGVuZ3RoO2Zvcih2YXIgdT0wO3U8dDt1Kyspe3Y9ditcIjBcIn1yZXR1cm4gdit4fTt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKHUsdCl7dGhpcy5fc2V0QWxnTmFtZXMoKTtpZih0IT1cImNyeXB0b2pzL2pzcnNhXCIpe3Rocm93XCJwcm92aWRlciBub3Qgc3VwcG9ydGVkOiBcIit0fWlmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZih0aGlzLm1kQWxnTmFtZSkhPS0xKXt0cnl7dGhpcy5tZD1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOnRoaXMubWRBbGdOYW1lfSl9Y2F0Y2gocyl7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIGhhc2ggYWxnIHNldCBmYWlsIGFsZz1cIit0aGlzLm1kQWxnTmFtZStcIi9cIitzfXRoaXMuaW5pdD1mdW5jdGlvbih3LHgpe3ZhciB5PW51bGw7dHJ5e2lmKHg9PT11bmRlZmluZWQpe3k9S0VZVVRJTC5nZXRLZXkodyl9ZWxzZXt5PUtFWVVUSUwuZ2V0S2V5KHcseCl9fWNhdGNoKHYpe3Rocm93XCJpbml0IGZhaWxlZDpcIit2fWlmKHkuaXNQcml2YXRlPT09dHJ1ZSl7dGhpcy5wcnZLZXk9eTt0aGlzLnN0YXRlPVwiU0lHTlwifWVsc2V7aWYoeS5pc1B1YmxpYz09PXRydWUpe3RoaXMucHViS2V5PXk7dGhpcy5zdGF0ZT1cIlZFUklGWVwifWVsc2V7dGhyb3dcImluaXQgZmFpbGVkLjpcIit5fX19O3RoaXMuaW5pdFNpZ249ZnVuY3Rpb24odil7aWYodHlwZW9mIHYuZWNwcnZoZXg9PVwic3RyaW5nXCImJnR5cGVvZiB2LmVjY3VydmVuYW1lPT1cInN0cmluZ1wiKXt0aGlzLmVjcHJ2aGV4PXYuZWNwcnZoZXg7dGhpcy5lY2N1cnZlbmFtZT12LmVjY3VydmVuYW1lfWVsc2V7dGhpcy5wcnZLZXk9dn10aGlzLnN0YXRlPVwiU0lHTlwifTt0aGlzLmluaXRWZXJpZnlCeVB1YmxpY0tleT1mdW5jdGlvbih2KXtpZih0eXBlb2Ygdi5lY3B1YmhleD09XCJzdHJpbmdcIiYmdHlwZW9mIHYuZWNjdXJ2ZW5hbWU9PVwic3RyaW5nXCIpe3RoaXMuZWNwdWJoZXg9di5lY3B1YmhleDt0aGlzLmVjY3VydmVuYW1lPXYuZWNjdXJ2ZW5hbWV9ZWxzZXtpZih2IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3RoaXMucHViS2V5PXZ9ZWxzZXtpZih2IGluc3RhbmNlb2YgUlNBS2V5KXt0aGlzLnB1YktleT12fX19dGhpcy5zdGF0ZT1cIlZFUklGWVwifTt0aGlzLmluaXRWZXJpZnlCeUNlcnRpZmljYXRlUEVNPWZ1bmN0aW9uKHYpe3ZhciB3PW5ldyBYNTA5KCk7dy5yZWFkQ2VydFBFTSh2KTt0aGlzLnB1YktleT13LnN1YmplY3RQdWJsaWNLZXlSU0E7dGhpcy5zdGF0ZT1cIlZFUklGWVwifTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbih2KXt0aGlzLm1kLnVwZGF0ZVN0cmluZyh2KX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24odil7dGhpcy5tZC51cGRhdGVIZXgodil9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3RoaXMuc0hhc2hIZXg9dGhpcy5tZC5kaWdlc3QoKTtpZih0eXBlb2YgdGhpcy5lY3BydmhleCE9XCJ1bmRlZmluZWRcIiYmdHlwZW9mIHRoaXMuZWNjdXJ2ZW5hbWUhPVwidW5kZWZpbmVkXCIpe3ZhciB2PW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6dGhpcy5lY2N1cnZlbmFtZX0pO3RoaXMuaFNpZ249di5zaWduSGV4KHRoaXMuc0hhc2hIZXgsdGhpcy5lY3BydmhleCl9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIFJTQUtleSYmdGhpcy5wdWJrZXlBbGdOYW1lPT1cInJzYWFuZG1nZjFcIil7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKHRoaXMuc0hhc2hIZXgsdGhpcy5tZEFsZ05hbWUsdGhpcy5wc3NTYWx0TGVuKX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhXCIpe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHRoaXMubWRBbGdOYW1lKX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4KX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCl9ZWxzZXt0aHJvd1wiU2lnbmF0dXJlOiB1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZzogXCIrdGhpcy5wdWJrZXlBbGdOYW1lfX19fX1yZXR1cm4gdGhpcy5oU2lnbn07dGhpcy5zaWduU3RyaW5nPWZ1bmN0aW9uKHYpe3RoaXMudXBkYXRlU3RyaW5nKHYpO3JldHVybiB0aGlzLnNpZ24oKX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKHYpe3RoaXMudXBkYXRlSGV4KHYpO3JldHVybiB0aGlzLnNpZ24oKX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24odil7dGhpcy5zSGFzaEhleD10aGlzLm1kLmRpZ2VzdCgpO2lmKHR5cGVvZiB0aGlzLmVjcHViaGV4IT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5lY2N1cnZlbmFtZSE9XCJ1bmRlZmluZWRcIil7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp0aGlzLmVjY3VydmVuYW1lfSk7cmV0dXJuIHcudmVyaWZ5SGV4KHRoaXMuc0hhc2hIZXgsdix0aGlzLmVjcHViaGV4KX1lbHNle2lmKHRoaXMucHViS2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhYW5kbWdmMVwiKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTKHRoaXMuc0hhc2hIZXgsdix0aGlzLm1kQWxnTmFtZSx0aGlzLnBzc1NhbHRMZW4pfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FcIil7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3JldHVybiB0aGlzLnB1YktleS52ZXJpZnlXaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCx2KX1lbHNle3Rocm93XCJTaWduYXR1cmU6IHVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnOiBcIit0aGlzLnB1YmtleUFsZ05hbWV9fX19fX19fTt0aGlzLmluaXQ9ZnVuY3Rpb24ocyx0KXt0aHJvd1wiaW5pdChrZXksIHBhc3MpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0VmVyaWZ5QnlQdWJsaWNLZXk9ZnVuY3Rpb24ocyl7dGhyb3dcImluaXRWZXJpZnlCeVB1YmxpY0tleShyc2FQdWJLZXl5KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuaW5pdFZlcmlmeUJ5Q2VydGlmaWNhdGVQRU09ZnVuY3Rpb24ocyl7dGhyb3dcImluaXRWZXJpZnlCeUNlcnRpZmljYXRlUEVNKGNlcnRQRU0pIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0U2lnbj1mdW5jdGlvbihzKXt0aHJvd1wiaW5pdFNpZ24ocHJ2S2V5KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3Rocm93XCJzaWduKCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnNpZ25TdHJpbmc9ZnVuY3Rpb24ocyl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJkaWdlc3RIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKHMpe3Rocm93XCJ2ZXJpZnkoaFNpZ1ZhbCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRQYXJhbXM9bztpZihvIT09dW5kZWZpbmVkKXtpZihvLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPW8uYWxnO2lmKG8ucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfWVsc2V7dGhpcy5wcm92TmFtZT1vLnByb3Z9dGhpcy5hbGdQcm92TmFtZT10aGlzLmFsZ05hbWUrXCI6XCIrdGhpcy5wcm92TmFtZTt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyKHRoaXMuYWxnTmFtZSx0aGlzLnByb3ZOYW1lKTt0aGlzLl9zZXRBbGdOYW1lcygpfWlmKG8ucHNzc2FsdGxlbiE9PXVuZGVmaW5lZCl7dGhpcy5wc3NTYWx0TGVuPW8ucHNzc2FsdGxlbn1pZihvLnBydmtleXBlbSE9PXVuZGVmaW5lZCl7aWYoby5wcnZrZXlwYXMhPT11bmRlZmluZWQpe3Rocm93XCJib3RoIHBydmtleXBlbSBhbmQgcHJ2a2V5cGFzIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZFwifWVsc2V7dHJ5e3ZhciBxPW5ldyBSU0FLZXkoKTtxLnJlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZyhvLnBydmtleXBlbSk7dGhpcy5pbml0U2lnbihxKX1jYXRjaChtKXt0aHJvd1wiZmF0YWwgZXJyb3IgdG8gbG9hZCBwZW0gcHJpdmF0ZSBrZXk6IFwiK219fX19fTtLSlVSLmNyeXB0by5PSUQ9bmV3IGZ1bmN0aW9uKCl7dGhpcy5vaWRoZXgybmFtZT17XCIyYTg2NDg4NmY3MGQwMTAxMDFcIjpcInJzYUVuY3J5cHRpb25cIixcIjJhODY0OGNlM2QwMjAxXCI6XCJlY1B1YmxpY0tleVwiLFwiMmE4NjQ4Y2UzODA0MDFcIjpcImRzYVwiLFwiMmE4NjQ4Y2UzZDAzMDEwN1wiOlwic2VjcDI1NnIxXCIsXCIyYjgxMDQwMDFmXCI6XCJzZWNwMTkyazFcIixcIjJiODEwNDAwMjFcIjpcInNlY3AyMjRyMVwiLFwiMmI4MTA0MDAwYVwiOlwic2VjcDI1NmsxXCIsXCIyYjgxMDQwMDIzXCI6XCJzZWNwNTIxcjFcIixcIjJiODEwNDAwMjJcIjpcInNlY3AzODRyMVwiLFwiMmE4NjQ4Y2UzODA0MDNcIjpcIlNIQTF3aXRoRFNBXCIsXCI2MDg2NDgwMTY1MDMwNDAzMDFcIjpcIlNIQTIyNHdpdGhEU0FcIixcIjYwODY0ODAxNjUwMzA0MDMwMlwiOlwiU0hBMjU2d2l0aERTQVwiLH19O1xuLyohIGVjZHNhLW1vZGlmaWVkLTEuMC41LmpzIChjKSBTdGVwaGFuIFRob21hcywgS2VuamkgVXJ1c2hpbWEgfCBnaXRodWIuY29tL2JpdGNvaW5qcy9iaXRjb2luanMtbGliL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5FQ0RTQT1mdW5jdGlvbihoKXt2YXIgZT1cInNlY3AyNTZyMVwiO3ZhciBnPW51bGw7dmFyIGI9bnVsbDt2YXIgZj1udWxsO3ZhciBhPW5ldyBTZWN1cmVSYW5kb20oKTt2YXIgZD1udWxsO3RoaXMudHlwZT1cIkVDXCI7ZnVuY3Rpb24gYyhzLG8scixuKXt2YXIgaj1NYXRoLm1heChvLmJpdExlbmd0aCgpLG4uYml0TGVuZ3RoKCkpO3ZhciB0PXMuYWRkMkQocik7dmFyIHE9cy5jdXJ2ZS5nZXRJbmZpbml0eSgpO2Zvcih2YXIgcD1qLTE7cD49MDstLXApe3E9cS50d2ljZTJEKCk7cS56PUJpZ0ludGVnZXIuT05FO2lmKG8udGVzdEJpdChwKSl7aWYobi50ZXN0Qml0KHApKXtxPXEuYWRkMkQodCl9ZWxzZXtxPXEuYWRkMkQocyl9fWVsc2V7aWYobi50ZXN0Qml0KHApKXtxPXEuYWRkMkQocil9fX1yZXR1cm4gcX10aGlzLmdldEJpZ1JhbmRvbT1mdW5jdGlvbihpKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoaS5iaXRMZW5ndGgoKSxhKS5tb2QoaS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpLmFkZChCaWdJbnRlZ2VyLk9ORSl9O3RoaXMuc2V0TmFtZWRDdXJ2ZT1mdW5jdGlvbihpKXt0aGlzLmVjcGFyYW1zPUtKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIuZ2V0QnlOYW1lKGkpO3RoaXMucHJ2S2V5SGV4PW51bGw7dGhpcy5wdWJLZXlIZXg9bnVsbDt0aGlzLmN1cnZlTmFtZT1pfTt0aGlzLnNldFByaXZhdGVLZXlIZXg9ZnVuY3Rpb24oaSl7dGhpcy5pc1ByaXZhdGU9dHJ1ZTt0aGlzLnBydktleUhleD1pfTt0aGlzLnNldFB1YmxpY0tleUhleD1mdW5jdGlvbihpKXt0aGlzLmlzUHVibGljPXRydWU7dGhpcy5wdWJLZXlIZXg9aX07dGhpcy5nZXRQdWJsaWNLZXlYWUhleD1mdW5jdGlvbigpe3ZhciBrPXRoaXMucHViS2V5SGV4O2lmKGsuc3Vic3RyKDAsMikhPT1cIjA0XCIpe3Rocm93XCJ0aGlzIG1ldGhvZCBzdXBwb3J0cyB1bmNvbXByZXNzZWQgZm9ybWF0KDA0KSBvbmx5XCJ9dmFyIGo9dGhpcy5lY3BhcmFtcy5rZXlsZW4vNDtpZihrLmxlbmd0aCE9PTIraioyKXt0aHJvd1wibWFsZm9ybWVkIHB1YmxpYyBrZXkgaGV4IGxlbmd0aFwifXZhciBpPXt9O2kueD1rLnN1YnN0cigyLGopO2kueT1rLnN1YnN0cigyK2opO3JldHVybiBpfTt0aGlzLmdldFNob3J0TklTVFBDdXJ2ZU5hbWU9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmN1cnZlTmFtZTtpZihpPT09XCJzZWNwMjU2cjFcInx8aT09PVwiTklTVCBQLTI1NlwifHxpPT09XCJQLTI1NlwifHxpPT09XCJwcmltZTI1NnYxXCIpe3JldHVyblwiUC0yNTZcIn1pZihpPT09XCJzZWNwMzg0cjFcInx8aT09PVwiTklTVCBQLTM4NFwifHxpPT09XCJQLTM4NFwiKXtyZXR1cm5cIlAtMzg0XCJ9cmV0dXJuIG51bGx9O3RoaXMuZ2VuZXJhdGVLZXlQYWlySGV4PWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5lY3BhcmFtcy5uO3ZhciBuPXRoaXMuZ2V0QmlnUmFuZG9tKGspO3ZhciBsPXRoaXMuZWNwYXJhbXMuRy5tdWx0aXBseShuKTt2YXIgcT1sLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgbz1sLmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgaT10aGlzLmVjcGFyYW1zLmtleWxlbi80O3ZhciBtPShcIjAwMDAwMDAwMDBcIituLnRvU3RyaW5nKDE2KSkuc2xpY2UoLWkpO3ZhciByPShcIjAwMDAwMDAwMDBcIitxLnRvU3RyaW5nKDE2KSkuc2xpY2UoLWkpO3ZhciBwPShcIjAwMDAwMDAwMDBcIitvLnRvU3RyaW5nKDE2KSkuc2xpY2UoLWkpO3ZhciBqPVwiMDRcIityK3A7dGhpcy5zZXRQcml2YXRlS2V5SGV4KG0pO3RoaXMuc2V0UHVibGljS2V5SGV4KGopO3JldHVybntlY3BydmhleDptLGVjcHViaGV4Omp9fTt0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMuc2lnbkhleChpLHRoaXMucHJ2S2V5SGV4KX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKG8sail7dmFyIHQ9bmV3IEJpZ0ludGVnZXIoaiwxNik7dmFyIGw9dGhpcy5lY3BhcmFtcy5uO3ZhciBxPW5ldyBCaWdJbnRlZ2VyKG8sMTYpO2Rve3ZhciBtPXRoaXMuZ2V0QmlnUmFuZG9tKGwpO3ZhciB1PXRoaXMuZWNwYXJhbXMuRzt2YXIgcD11Lm11bHRpcGx5KG0pO3ZhciBpPXAuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZChsKX13aGlsZShpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPD0wKTt2YXIgdj1tLm1vZEludmVyc2UobCkubXVsdGlwbHkocS5hZGQodC5tdWx0aXBseShpKSkpLm1vZChsKTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuYmlSU1NpZ1RvQVNOMVNpZyhpLHYpfTt0aGlzLnNpZ249ZnVuY3Rpb24obSx1KXt2YXIgcT11O3ZhciBqPXRoaXMuZWNwYXJhbXMubjt2YXIgcD1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChtKTtkb3t2YXIgbD10aGlzLmdldEJpZ1JhbmRvbShqKTt2YXIgdD10aGlzLmVjcGFyYW1zLkc7dmFyIG89dC5tdWx0aXBseShsKTt2YXIgaT1vLmdldFgoKS50b0JpZ0ludGVnZXIoKS5tb2Qoail9d2hpbGUoaS5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKTw9MCk7dmFyIHY9bC5tb2RJbnZlcnNlKGopLm11bHRpcGx5KHAuYWRkKHEubXVsdGlwbHkoaSkpKS5tb2Qoaik7cmV0dXJuIHRoaXMuc2VyaWFsaXplU2lnKGksdil9O3RoaXMudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKGosaSl7cmV0dXJuIHRoaXMudmVyaWZ5SGV4KGosaSx0aGlzLnB1YktleUhleCl9O3RoaXMudmVyaWZ5SGV4PWZ1bmN0aW9uKG0saSxwKXt2YXIgbCxqO3ZhciBvPUtKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4KGkpO2w9by5yO2o9by5zO3ZhciBrO2s9RUNQb2ludEZwLmRlY29kZUZyb21IZXgodGhpcy5lY3BhcmFtcy5jdXJ2ZSxwKTt2YXIgbj1uZXcgQmlnSW50ZWdlcihtLDE2KTtyZXR1cm4gdGhpcy52ZXJpZnlSYXcobixsLGosayl9O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKG8scCxqKXt2YXIgbCxpO2lmKEJpdGNvaW4uVXRpbC5pc0FycmF5KHApKXt2YXIgbj10aGlzLnBhcnNlU2lnKHApO2w9bi5yO2k9bi5zfWVsc2V7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBwJiZwLnImJnAucyl7bD1wLnI7aT1wLnN9ZWxzZXt0aHJvd1wiSW52YWxpZCB2YWx1ZSBmb3Igc2lnbmF0dXJlXCJ9fXZhciBrO2lmKGogaW5zdGFuY2VvZiBFQ1BvaW50RnApe2s9an1lbHNle2lmKEJpdGNvaW4uVXRpbC5pc0FycmF5KGopKXtrPUVDUG9pbnRGcC5kZWNvZGVGcm9tKHRoaXMuZWNwYXJhbXMuY3VydmUsail9ZWxzZXt0aHJvd1wiSW52YWxpZCBmb3JtYXQgZm9yIHB1YmtleSB2YWx1ZSwgbXVzdCBiZSBieXRlIGFycmF5IG9yIEVDUG9pbnRGcFwifX12YXIgbT1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChvKTtyZXR1cm4gdGhpcy52ZXJpZnlSYXcobSxsLGksayl9O3RoaXMudmVyaWZ5UmF3PWZ1bmN0aW9uKG8saSx3LG0pe3ZhciBsPXRoaXMuZWNwYXJhbXMubjt2YXIgdT10aGlzLmVjcGFyYW1zLkc7aWYoaS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fGkuY29tcGFyZVRvKGwpPj0wKXtyZXR1cm4gZmFsc2V9aWYody5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fHcuY29tcGFyZVRvKGwpPj0wKXtyZXR1cm4gZmFsc2V9dmFyIHA9dy5tb2RJbnZlcnNlKGwpO3ZhciBrPW8ubXVsdGlwbHkocCkubW9kKGwpO3ZhciBqPWkubXVsdGlwbHkocCkubW9kKGwpO3ZhciBxPXUubXVsdGlwbHkoaykuYWRkKG0ubXVsdGlwbHkoaikpO3ZhciB0PXEuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZChsKTtyZXR1cm4gdC5lcXVhbHMoaSl9O3RoaXMuc2VyaWFsaXplU2lnPWZ1bmN0aW9uKGssail7dmFyIGw9ay50b0J5dGVBcnJheVNpZ25lZCgpO3ZhciBpPWoudG9CeXRlQXJyYXlTaWduZWQoKTt2YXIgbT1bXTttLnB1c2goMik7bS5wdXNoKGwubGVuZ3RoKTttPW0uY29uY2F0KGwpO20ucHVzaCgyKTttLnB1c2goaS5sZW5ndGgpO209bS5jb25jYXQoaSk7bS51bnNoaWZ0KG0ubGVuZ3RoKTttLnVuc2hpZnQoNDgpO3JldHVybiBtfTt0aGlzLnBhcnNlU2lnPWZ1bmN0aW9uKG4pe3ZhciBtO2lmKG5bMF0hPTQ4KXt0aHJvdyBuZXcgRXJyb3IoXCJTaWduYXR1cmUgbm90IGEgdmFsaWQgREVSU2VxdWVuY2VcIil9bT0yO2lmKG5bbV0hPTIpe3Rocm93IG5ldyBFcnJvcihcIkZpcnN0IGVsZW1lbnQgaW4gc2lnbmF0dXJlIG11c3QgYmUgYSBERVJJbnRlZ2VyXCIpfXZhciBsPW4uc2xpY2UobSsyLG0rMituW20rMV0pO20rPTIrblttKzFdO2lmKG5bbV0hPTIpe3Rocm93IG5ldyBFcnJvcihcIlNlY29uZCBlbGVtZW50IGluIHNpZ25hdHVyZSBtdXN0IGJlIGEgREVSSW50ZWdlclwiKX12YXIgaT1uLnNsaWNlKG0rMixtKzIrblttKzFdKTttKz0yK25bbSsxXTt2YXIgaz1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChsKTt2YXIgaj1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChpKTtyZXR1cm57cjprLHM6an19O3RoaXMucGFyc2VTaWdDb21wYWN0PWZ1bmN0aW9uKG0pe2lmKG0ubGVuZ3RoIT09NjUpe3Rocm93XCJTaWduYXR1cmUgaGFzIHRoZSB3cm9uZyBsZW5ndGhcIn12YXIgaj1tWzBdLTI3O2lmKGo8MHx8aj43KXt0aHJvd1wiSW52YWxpZCBzaWduYXR1cmUgdHlwZVwifXZhciBvPXRoaXMuZWNwYXJhbXMubjt2YXIgbD1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChtLnNsaWNlKDEsMzMpKS5tb2Qobyk7dmFyIGs9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobS5zbGljZSgzMyw2NSkpLm1vZChvKTtyZXR1cm57cjpsLHM6ayxpOmp9fTtpZihoIT09dW5kZWZpbmVkKXtpZihoLmN1cnZlIT09dW5kZWZpbmVkKXt0aGlzLmN1cnZlTmFtZT1oLmN1cnZlfX1pZih0aGlzLmN1cnZlTmFtZT09PXVuZGVmaW5lZCl7dGhpcy5jdXJ2ZU5hbWU9ZX10aGlzLnNldE5hbWVkQ3VydmUodGhpcy5jdXJ2ZU5hbWUpO2lmKGghPT11bmRlZmluZWQpe2lmKGgucHJ2IT09dW5kZWZpbmVkKXt0aGlzLnNldFByaXZhdGVLZXlIZXgoaC5wcnYpfWlmKGgucHViIT09dW5kZWZpbmVkKXt0aGlzLnNldFB1YmxpY0tleUhleChoLnB1Yil9fX07S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXg9ZnVuY3Rpb24oYSl7dmFyIGI9S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXhJbkhleFJTKGEpO3ZhciBkPW5ldyBCaWdJbnRlZ2VyKGIuciwxNik7dmFyIGM9bmV3IEJpZ0ludGVnZXIoYi5zLDE2KTtyZXR1cm57cjpkLHM6Y319O0tKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4SW5IZXhSUz1mdW5jdGlvbihjKXtpZihjLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJzaWduYXR1cmUgaXMgbm90IGEgQVNOLjEgc2VxdWVuY2VcIn12YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihjLDApO2lmKGIubGVuZ3RoIT0yKXt0aHJvd1wibnVtYmVyIG9mIHNpZ25hdHVyZSBBU04uMSBzZXF1ZW5jZSBlbGVtZW50cyBzZWVtIHdyb25nXCJ9dmFyIGc9YlswXTt2YXIgZj1iWzFdO2lmKGMuc3Vic3RyKGcsMikhPVwiMDJcIil7dGhyb3dcIjFzdCBpdGVtIG9mIHNlcXVlbmUgb2Ygc2lnbmF0dXJlIGlzIG5vdCBBU04uMSBpbnRlZ2VyXCJ9aWYoYy5zdWJzdHIoZiwyKSE9XCIwMlwiKXt0aHJvd1wiMm5kIGl0ZW0gb2Ygc2VxdWVuZSBvZiBzaWduYXR1cmUgaXMgbm90IEFTTi4xIGludGVnZXJcIn12YXIgZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihjLGcpO3ZhciBkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsZik7cmV0dXJue3I6ZSxzOmR9fTtLSlVSLmNyeXB0by5FQ0RTQS5hc24xU2lnVG9Db25jYXRTaWc9ZnVuY3Rpb24oYyl7dmFyIGQ9S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXhJbkhleFJTKGMpO3ZhciBiPWQucjt2YXIgYT1kLnM7aWYoYi5zdWJzdHIoMCwyKT09XCIwMFwiJiYoKChiLmxlbmd0aC8yKSo4KSUoMTYqOCkpPT04KXtiPWIuc3Vic3RyKDIpfWlmKGEuc3Vic3RyKDAsMik9PVwiMDBcIiYmKCgoYS5sZW5ndGgvMikqOCklKDE2KjgpKT09OCl7YT1hLnN1YnN0cigyKX1pZigoKChiLmxlbmd0aC8yKSo4KSUoMTYqOCkpIT0wKXt0aHJvd1widW5rbm93biBFQ0RTQSBzaWcgciBsZW5ndGggZXJyb3JcIn1pZigoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpIT0wKXt0aHJvd1widW5rbm93biBFQ0RTQSBzaWcgcyBsZW5ndGggZXJyb3JcIn1yZXR1cm4gYithfTtLSlVSLmNyeXB0by5FQ0RTQS5jb25jYXRTaWdUb0FTTjFTaWc9ZnVuY3Rpb24oYSl7aWYoKCgoYS5sZW5ndGgvMikqOCklKDE2KjgpKSE9MCl7dGhyb3dcInVua25vd24gRUNEU0EgY29uY2F0aW5hdGVkIHItcyBzaWcgIGxlbmd0aCBlcnJvclwifXZhciBjPWEuc3Vic3RyKDAsYS5sZW5ndGgvMik7dmFyIGI9YS5zdWJzdHIoYS5sZW5ndGgvMik7cmV0dXJuIEtKVVIuY3J5cHRvLkVDRFNBLmhleFJTU2lnVG9BU04xU2lnKGMsYil9O0tKVVIuY3J5cHRvLkVDRFNBLmhleFJTU2lnVG9BU04xU2lnPWZ1bmN0aW9uKGIsYSl7dmFyIGQ9bmV3IEJpZ0ludGVnZXIoYiwxNik7dmFyIGM9bmV3IEJpZ0ludGVnZXIoYSwxNik7cmV0dXJuIEtKVVIuY3J5cHRvLkVDRFNBLmJpUlNTaWdUb0FTTjFTaWcoZCxjKX07S0pVUi5jcnlwdG8uRUNEU0EuYmlSU1NpZ1RvQVNOMVNpZz1mdW5jdGlvbihlLGMpe3ZhciBiPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmV9KTt2YXIgYT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpjfSk7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2IsYV19KTtyZXR1cm4gZC5nZXRFbmNvZGVkSGV4KCl9O1xuLyohIGVjcGFyYW0tMS4wLjAuanMgKGMpIDIwMTMgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCPW5ldyBmdW5jdGlvbigpe3ZhciBiPXt9O3ZhciBjPXt9O2Z1bmN0aW9uIGEoZCl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGQsMTYpfXRoaXMuZ2V0QnlOYW1lPWZ1bmN0aW9uKGUpe3ZhciBkPWU7aWYodHlwZW9mIGNbZF0hPVwidW5kZWZpbmVkXCIpe2Q9Y1tlXX1pZih0eXBlb2YgYltkXSE9XCJ1bmRlZmluZWRcIil7cmV0dXJuIGJbZF19dGhyb3dcInVucmVnaXN0ZXJlZCBFQyBjdXJ2ZSBuYW1lOiBcIitkfTt0aGlzLnJlZ2lzdD1mdW5jdGlvbihBLGwsbyxnLG0sZSxqLGYsayx1LGQseCl7YltBXT17fTt2YXIgcz1hKG8pO3ZhciB6PWEoZyk7dmFyIHk9YShtKTt2YXIgdD1hKGUpO3ZhciB3PWEoaik7dmFyIHI9bmV3IEVDQ3VydmVGcChzLHoseSk7dmFyIHE9ci5kZWNvZGVQb2ludEhleChcIjA0XCIrZitrKTtiW0FdW1wibmFtZVwiXT1BO2JbQV1bXCJrZXlsZW5cIl09bDtiW0FdW1wiY3VydmVcIl09cjtiW0FdW1wiR1wiXT1xO2JbQV1bXCJuXCJdPXQ7YltBXVtcImhcIl09dztiW0FdW1wib2lkXCJdPWQ7YltBXVtcImluZm9cIl09eDtmb3IodmFyIHY9MDt2PHUubGVuZ3RoO3YrKyl7Y1t1W3ZdXT1BfX19O0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDEyOHIxXCIsMTI4LFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIixcIkZGRkZGRkZERkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDXCIsXCJFODc1NzlDMTEwNzlGNDNERDgyNDk5M0MyQ0VFNUVEM1wiLFwiRkZGRkZGRkUwMDAwMDAwMDc1QTMwRDFCOTAzOEExMTVcIixcIjFcIixcIjE2MUZGNzUyOEI4OTlCMkQwQzI4NjA3Q0E1MkM1Qjg2XCIsXCJDRjVBQzgzOTVCQUZFQjEzQzAyREEyOTJEREVEN0E4M1wiLFtdLFwiXCIsXCJzZWNwMTI4cjEgOiBTRUNHIGN1cnZlIG92ZXIgYSAxMjggYml0IHByaW1lIGZpZWxkXCIpO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE2MGsxXCIsMTYwLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGQUM3M1wiLFwiMFwiLFwiN1wiLFwiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMUI4RkExNkRGQUI5QUNBMTZCNkIzXCIsXCIxXCIsXCIzQjRDMzgyQ0UzN0FBMTkyQTQwMTlFNzYzMDM2RjRGNURENEQ3RUJCXCIsXCI5MzhDRjkzNTMxOEZEQ0VENkJDMjgyODY1MzE3MzNDM0YwM0M0RkVFXCIsW10sXCJcIixcInNlY3AxNjBrMSA6IFNFQ0cgY3VydmUgb3ZlciBhIDE2MCBiaXQgcHJpbWUgZmllbGRcIik7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTYwcjFcIiwxNjAsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZDXCIsXCIxQzk3QkVGQzU0QkQ3QThCNjVBQ0Y4OUY4MUQ0RDRBREM1NjVGQTQ1XCIsXCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAxRjRDOEY5MjdBRUQzQ0E3NTIyNTdcIixcIjFcIixcIjRBOTZCNTY4OEVGNTczMjg0NjY0Njk4OTY4QzM4QkI5MTNDQkZDODJcIixcIjIzQTYyODU1MzE2ODk0N0Q1OURDQzkxMjA0MjM1MTM3N0FDNUZCMzJcIixbXSxcIlwiLFwic2VjcDE2MHIxIDogU0VDRyBjdXJ2ZSBvdmVyIGEgMTYwIGJpdCBwcmltZSBmaWVsZFwiKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxOTJrMVwiLDE5MixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRUUzN1wiLFwiMFwiLFwiM1wiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFMjZGMkZDMTcwRjY5NDY2QTc0REVGRDhEXCIsXCIxXCIsXCJEQjRGRjEwRUMwNTdFOUFFMjZCMDdEMDI4MEI3RjQzNDFEQTVEMUIxRUFFMDZDN0RcIixcIjlCMkYyRjZEOUM1NjI4QTc4NDQxNjNEMDE1QkU4NjM0NDA4MkFBODhEOTVFMkY5RFwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxOTJyMVwiLDE5MixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZDXCIsXCI2NDIxMDUxOUU1OUM4MEU3MEZBN0U5QUI3MjI0MzA0OUZFQjhERUVDQzE0NkI5QjFcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjk5REVGODM2MTQ2QkM5QjFCNEQyMjgzMVwiLFwiMVwiLFwiMTg4REE4MEVCMDMwOTBGNjdDQkYyMEVCNDNBMTg4MDBGNEZGMEFGRDgyRkYxMDEyXCIsXCIwNzE5MkI5NUZGQzhEQTc4NjMxMDExRUQ2QjI0Q0RENTczRjk3N0ExMUU3OTQ4MTFcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMjI0cjFcIiwyMjQsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMVwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVcIixcIkI0MDUwQTg1MEMwNEIzQUJGNTQxMzI1NjUwNDRCMEI3RDdCRkQ4QkEyNzBCMzk0MzIzNTVGRkI0XCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMTZBMkUwQjhGMDNFMTNERDI5NDU1QzVDMkEzRFwiLFwiMVwiLFwiQjcwRTBDQkQ2QkI0QkY3RjMyMTM5MEI5NEEwM0MxRDM1NkMyMTEyMjM0MzI4MEQ2MTE1QzFEMjFcIixcIkJEMzc2Mzg4QjVGNzIzRkI0QzIyREZFNkNENDM3NUEwNUEwNzQ3NjQ0NEQ1ODE5OTg1MDA3RTM0XCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDI1NmsxXCIsMjU2LFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkMyRlwiLFwiMFwiLFwiN1wiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVCQUFFRENFNkFGNDhBMDNCQkZEMjVFOENEMDM2NDE0MVwiLFwiMVwiLFwiNzlCRTY2N0VGOURDQkJBQzU1QTA2Mjk1Q0U4NzBCMDcwMjlCRkNEQjJEQ0UyOEQ5NTlGMjgxNUIxNkY4MTc5OFwiLFwiNDgzQURBNzcyNkEzQzQ2NTVEQTRGQkZDMEUxMTA4QThGRDE3QjQ0OEE2ODU1NDE5OUM0N0QwOEZGQjEwRDRCOFwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AyNTZyMVwiLDI1NixcIkZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIixcIkZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIjVBQzYzNUQ4QUEzQTkzRTdCM0VCQkQ1NTc2OTg4NkJDNjUxRDA2QjBDQzUzQjBGNjNCQ0UzQzNFMjdEMjYwNEJcIixcIkZGRkZGRkZGMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGQkNFNkZBQURBNzE3OUU4NEYzQjlDQUMyRkM2MzI1NTFcIixcIjFcIixcIjZCMTdEMUYyRTEyQzQyNDdGOEJDRTZFNTYzQTQ0MEYyNzcwMzdEODEyREVCMzNBMEY0QTEzOTQ1RDg5OEMyOTZcIixcIjRGRTM0MkUyRkUxQTdGOUI4RUU3RUI0QTdDMEY5RTE2MkJDRTMzNTc2QjMxNUVDRUNCQjY0MDY4MzdCRjUxRjVcIixbXCJOSVNUIFAtMjU2XCIsXCJQLTI1NlwiLFwicHJpbWUyNTZ2MVwiXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMzg0cjFcIiwzODQsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGQ1wiLFwiQjMzMTJGQTdFMjNFRTdFNDk4OEUwNTZCRTNGODJEMTkxODFEOUM2RUZFODE0MTEyMDMxNDA4OEY1MDEzODc1QUM2NTYzOThEOEEyRUQxOUQyQTg1QzhFREQzRUMyQUVGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDNzYzNEQ4MUY0MzcyRERGNTgxQTBEQjI0OEIwQTc3QUVDRUMxOTZBQ0NDNTI5NzNcIixcIjFcIixcIkFBODdDQTIyQkU4QjA1Mzc4RUIxQzcxRUYzMjBBRDc0NkUxRDNCNjI4QkE3OUI5ODU5Rjc0MUUwODI1NDJBMzg1NTAyRjI1REJGNTUyOTZDM0E1NDVFMzg3Mjc2MEFCN1wiLFwiMzYxN2RlNGE5NjI2MmM2ZjVkOWU5OGJmOTI5MmRjMjlmOGY0MWRiZDI4OWExNDdjZTlkYTMxMTNiNWYwYjhjMDBhNjBiMWNlMWQ3ZTgxOWQ3YTQzMWQ3YzkwZWEwZTVmXCIsW1wiTklTVCBQLTM4NFwiLFwiUC0zODRcIl0pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDUyMXIxXCIsNTIxLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIixcIjFGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDXCIsXCIwNTE5NTNFQjk2MThFMUM5QTFGOTI5QTIxQTBCNjg1NDBFRUEyREE3MjVCOTlCMzE1RjNCOEI0ODk5MThFRjEwOUUxNTYxOTM5NTFFQzdFOTM3QjE2NTJDMEJEM0JCMUJGMDczNTczREY4ODNEMkMzNEYxRUY0NTFGRDQ2QjUwM0YwMFwiLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQTUxODY4NzgzQkYyRjk2NkI3RkNDMDE0OEY3MDlBNUQwM0JCNUM5Qjg4OTlDNDdBRUJCNkZCNzFFOTEzODY0MDlcIixcIjFcIixcIkM2ODU4RTA2QjcwNDA0RTlDRDlFM0VDQjY2MjM5NUI0NDI5QzY0ODEzOTA1M0ZCNTIxRjgyOEFGNjA2QjREM0RCQUExNEI1RTc3RUZFNzU5MjhGRTFEQzEyN0EyRkZBOERFMzM0OEIzQzE4NTZBNDI5QkY5N0U3RTMxQzJFNUJENjZcIixcIjAxMTgzOTI5NmE3ODlhM2JjMDA0NWM4YTVmYjQyYzdkMWJkOTk4ZjU0NDQ5NTc5YjQ0NjgxN2FmYmQxNzI3M2U2NjJjOTdlZTcyOTk1ZWY0MjY0MGM1NTBiOTAxM2ZhZDA3NjEzNTNjNzA4NmEyNzJjMjQwODhiZTk0NzY5ZmQxNjY1MFwiLFtcIk5JU1QgUC01MjFcIixcIlAtNTIxXCJdKTtcbi8qISBkc2EtbW9kaWZpZWQtMS4wLjEuanMgKGMpIFJlY3VyaXR5IExhYnMgR21iSCwgS2VuamkgVXJ1c2hpbW1hIHwgZ2l0aHViLmNvbS9vcGVucGdwanMvb3BlbnBncGpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5EU0E9ZnVuY3Rpb24oKXt0aGlzLnA9bnVsbDt0aGlzLnE9bnVsbDt0aGlzLmc9bnVsbDt0aGlzLnk9bnVsbDt0aGlzLng9bnVsbDt0aGlzLnR5cGU9XCJEU0FcIjt0aGlzLnNldFByaXZhdGU9ZnVuY3Rpb24oeix3LHYsQSx1KXt0aGlzLmlzUHJpdmF0ZT10cnVlO3RoaXMucD16O3RoaXMucT13O3RoaXMuZz12O3RoaXMueT1BO3RoaXMueD11fTt0aGlzLnNldFB1YmxpYz1mdW5jdGlvbih3LHYsdSx6KXt0aGlzLmlzUHVibGljPXRydWU7dGhpcy5wPXc7dGhpcy5xPXY7dGhpcy5nPXU7dGhpcy55PXo7dGhpcy54PW51bGx9O3RoaXMuc2lnbldpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbih6KXt2YXIgdj10aGlzLnA7dmFyIHU9dGhpcy5xO3ZhciBDPXRoaXMuZzt2YXIgRD10aGlzLnk7dmFyIEU9dGhpcy54O3ZhciBBPXouc3Vic3RyKDAsdS5iaXRMZW5ndGgoKS80KTt2YXIgQj1uZXcgQmlnSW50ZWdlcih6LDE2KTt2YXIgdz1uKEJpZ0ludGVnZXIuT05FLmFkZChCaWdJbnRlZ2VyLk9ORSksdS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpO3ZhciBHPShDLm1vZFBvdyh3LHYpKS5tb2QodSk7dmFyIEY9KHcubW9kSW52ZXJzZSh1KS5tdWx0aXBseShCLmFkZChFLm11bHRpcGx5KEcpKSkpLm1vZCh1KTt2YXIgSD1LSlVSLmFzbjEuQVNOMVV0aWwuanNvblRvQVNOMUhFWCh7c2VxOlt7XCJpbnRcIjp7YmlnaW50Okd9fSx7XCJpbnRcIjp7YmlnaW50OkZ9fV19KTtyZXR1cm4gSH07dGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24oQyxCKXt2YXIgej10aGlzLnA7dmFyIHU9dGhpcy5xO3ZhciBHPXRoaXMuZzt2YXIgSD10aGlzLnk7dmFyIEU9dGhpcy5wYXJzZUFTTjFTaWduYXR1cmUoQik7dmFyIEs9RVswXTt2YXIgSj1FWzFdO3ZhciBDPUMuc3Vic3RyKDAsdS5iaXRMZW5ndGgoKS80KTt2YXIgRD1uZXcgQmlnSW50ZWdlcihDLDE2KTtpZihCaWdJbnRlZ2VyLlpFUk8uY29tcGFyZVRvKEspPjB8fEsuY29tcGFyZVRvKHUpPjB8fEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSik+MHx8Si5jb21wYXJlVG8odSk+MCl7dGhyb3dcImludmFsaWQgRFNBIHNpZ25hdHVyZVwifXZhciBJPUoubW9kSW52ZXJzZSh1KTt2YXIgQT1ELm11bHRpcGx5KEkpLm1vZCh1KTt2YXIgdj1LLm11bHRpcGx5KEkpLm1vZCh1KTt2YXIgRj1HLm1vZFBvdyhBLHopLm11bHRpcGx5KEgubW9kUG93KHYseikpLm1vZCh6KS5tb2QodSk7cmV0dXJuIEYuY29tcGFyZVRvKEspPT0wfTt0aGlzLnBhcnNlQVNOMVNpZ25hdHVyZT1mdW5jdGlvbih1KXt0cnl7dmFyIHk9bmV3IEJpZ0ludGVnZXIoQVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMF0sXCIwMlwiKSwxNik7dmFyIHY9bmV3IEJpZ0ludGVnZXIoQVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMV0sXCIwMlwiKSwxNik7cmV0dXJuW3ksdl19Y2F0Y2godyl7dGhyb3dcIm1hbGZvcm1lZCBEU0Egc2lnbmF0dXJlXCJ9fTtmdW5jdGlvbiBkKEUsdyxCLHYsdSxDKXt2YXIgej1LSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcodyxFLnRvTG93ZXJDYXNlKCkpO3ZhciB6PXouc3Vic3RyKDAsdS5iaXRMZW5ndGgoKS80KTt2YXIgQT1uZXcgQmlnSW50ZWdlcih6LDE2KTt2YXIgeT1uKEJpZ0ludGVnZXIuT05FLmFkZChCaWdJbnRlZ2VyLk9ORSksdS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpO3ZhciBGPShCLm1vZFBvdyh5LHYpKS5tb2QodSk7dmFyIEQ9KHkubW9kSW52ZXJzZSh1KS5tdWx0aXBseShBLmFkZChDLm11bHRpcGx5KEYpKSkpLm1vZCh1KTt2YXIgRz1uZXcgQXJyYXkoKTtHWzBdPUY7R1sxXT1EO3JldHVybiBHfWZ1bmN0aW9uIHIodil7dmFyIHU9b3BlbnBncC5jb25maWcuY29uZmlnLnByZWZlcl9oYXNoX2FsZ29yaXRobTtzd2l0Y2goTWF0aC5yb3VuZCh2LmJpdExlbmd0aCgpLzgpKXtjYXNlIDIwOmlmKHUhPTImJnU+MTEmJnUhPTEwJiZ1PDgpe3JldHVybiAyfXJldHVybiB1O2Nhc2UgMjg6aWYodT4xMSYmdTw4KXtyZXR1cm4gMTF9cmV0dXJuIHU7Y2FzZSAzMjppZih1PjEwJiZ1PDgpe3JldHVybiA4fXJldHVybiB1O2RlZmF1bHQ6dXRpbC5wcmludF9kZWJ1ZyhcIkRTQSBzZWxlY3QgaGFzaCBhbGdvcml0aG06IHJldHVybmluZyBudWxsIGZvciBhbiB1bmtub3duIGxlbmd0aCBvZiBxXCIpO3JldHVybiBudWxsfX10aGlzLnNlbGVjdF9oYXNoX2FsZ29yaXRobT1yO2Z1bmN0aW9uIG0oSSxLLEosQix6LHUsRixHKXt2YXIgQz1LSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoQixJLnRvTG93ZXJDYXNlKCkpO3ZhciBDPUMuc3Vic3RyKDAsdS5iaXRMZW5ndGgoKS80KTt2YXIgRD1uZXcgQmlnSW50ZWdlcihDLDE2KTtpZihCaWdJbnRlZ2VyLlpFUk8uY29tcGFyZVRvKEspPjB8fEsuY29tcGFyZVRvKHUpPjB8fEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSik+MHx8Si5jb21wYXJlVG8odSk+MCl7dXRpbC5wcmludF9lcnJvcihcImludmFsaWQgRFNBIFNpZ25hdHVyZVwiKTtyZXR1cm4gbnVsbH12YXIgSD1KLm1vZEludmVyc2UodSk7dmFyIEE9RC5tdWx0aXBseShIKS5tb2QodSk7dmFyIHY9Sy5tdWx0aXBseShIKS5tb2QodSk7dmFyIEU9Ri5tb2RQb3coQSx6KS5tdWx0aXBseShHLm1vZFBvdyh2LHopKS5tb2QoeikubW9kKHUpO3JldHVybiBFLmNvbXBhcmVUbyhLKT09MH1mdW5jdGlvbiBhKHope3ZhciBBPW5ldyBCaWdJbnRlZ2VyKHoscHJpbWVDZW50ZXJpZSk7dmFyIHk9aihxLDUxMik7dmFyIHU9dChwLHEseik7dmFyIHY7ZG97dj1uZXcgQmlnSW50ZWdlcihxLmJpdENvdW50KCkscmFuZCl9d2hpbGUoeC5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSE9MSYmeC5jb21wYXJlVG8ocSkhPS0xKTt2YXIgdz1nLm1vZFBvdyh4LHApO3JldHVybnt4OnYscTpBLHA6eSxnOnUseTp3fX1mdW5jdGlvbiBqKHkseix3KXtpZih6JTY0IT0wKXtyZXR1cm4gZmFsc2V9dmFyIHU7dmFyIHY7ZG97dT13KGJpdGNvdW50LHRydWUpO3Y9dS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7dT11LnN1YnRyYWN0KHYucmVtYWluZGVyKHkpKX13aGlsZSghdS5pc1Byb2JhYmxlUHJpbWUocHJpbWVDZW50ZXJpZSl8fHUuYml0TGVuZ3RoKCkhPWwpO3JldHVybiB1fWZ1bmN0aW9uIHQoQix6LEEsdyl7dmFyIHU9Qi5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7dmFyIHk9dS5kaXZpZGUoeik7dmFyIHY7ZG97dj13KEEpfXdoaWxlKHYuY29tcGFyZVRvKHUpIT0tMSYmdi5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpIT0xKTtyZXR1cm4gdi5tb2RQb3coeSxCKX1mdW5jdGlvbiBvKHcseSx1KXt2YXIgdjtkb3t2PXUoeSxmYWxzZSl9d2hpbGUodi5jb21wYXJlVG8odykhPS0xJiZ2LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pIT0xKTtyZXR1cm4gdn1mdW5jdGlvbiBpKHYsdyl7az1vKHYpO3ZhciB1PWcubW9kUG93KGssdykubW9kKHYpO3JldHVybiB1fWZ1bmN0aW9uIGgoQix3LHksdix6LHUpe3ZhciBBPUIodik7cz0ody5tb2RJbnZlcnNlKHopLm11bHRpcGx5KEEuYWRkKHUubXVsdGlwbHkoeSkpKSkubW9kKHopO3JldHVybiBzfXRoaXMuc2lnbj1kO3RoaXMudmVyaWZ5PW07ZnVuY3Rpb24gbih3LHUpe2lmKHUuY29tcGFyZVRvKHcpPD0wKXtyZXR1cm59dmFyIHY9dS5zdWJ0cmFjdCh3KTt2YXIgeT1lKHYuYml0TGVuZ3RoKCkpO3doaWxlKHk+dil7eT1lKHYuYml0TGVuZ3RoKCkpfXJldHVybiB3LmFkZCh5KX1mdW5jdGlvbiBlKHcpe2lmKHc8MCl7cmV0dXJuIG51bGx9dmFyIHU9TWF0aC5mbG9vcigodys3KS84KTt2YXIgdj1jKHUpO2lmKHclOD4wKXt2PVN0cmluZy5mcm9tQ2hhckNvZGUoKE1hdGgucG93KDIsdyU4KS0xKSZ2LmNoYXJDb2RlQXQoMCkpK3Yuc3Vic3RyaW5nKDEpfXJldHVybiBuZXcgQmlnSW50ZWdlcihmKHYpLDE2KX1mdW5jdGlvbiBjKHcpe3ZhciB1PVwiXCI7Zm9yKHZhciB2PTA7djx3O3YrKyl7dSs9U3RyaW5nLmZyb21DaGFyQ29kZShiKCkpfXJldHVybiB1fWZ1bmN0aW9uIGIoKXt2YXIgdT1uZXcgVWludDMyQXJyYXkoMSk7d2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXModSk7cmV0dXJuIHVbMF0mMjU1fWZ1bmN0aW9uIGYoeSl7aWYoeT09bnVsbCl7cmV0dXJuXCJcIn12YXIgdj1bXTt2YXIgdz15Lmxlbmd0aDt2YXIgej0wO3ZhciB1O3doaWxlKHo8dyl7dT15W3orK10uY2hhckNvZGVBdCgpLnRvU3RyaW5nKDE2KTt3aGlsZSh1Lmxlbmd0aDwyKXt1PVwiMFwiK3V9di5wdXNoKFwiXCIrdSl9cmV0dXJuIHYuam9pbihcIlwiKX10aGlzLmdldFJhbmRvbUJpZ0ludGVnZXJJblJhbmdlPW47dGhpcy5nZXRSYW5kb21CaWdJbnRlZ2VyPWU7dGhpcy5nZXRSYW5kb21CeXRlcz1jfTtcbi8qISBwa2NzNXBrZXktMS4wLjYuanMgKGMpIDIwMTMtMjAxNCBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG52YXIgUEtDUzVQS0VZPWZ1bmN0aW9uKCl7dmFyIGM9ZnVuY3Rpb24obixwLG8pe3JldHVybiBpKENyeXB0b0pTLkFFUyxuLHAsbyl9O3ZhciBkPWZ1bmN0aW9uKG4scCxvKXtyZXR1cm4gaShDcnlwdG9KUy5UcmlwbGVERVMsbixwLG8pfTt2YXIgaT1mdW5jdGlvbihxLHYscyxvKXt2YXIgcD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciB1PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uocyk7dmFyIG49Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShvKTt2YXIgcj17fTtyLmtleT11O3IuaXY9bjtyLmNpcGhlcnRleHQ9cDt2YXIgdD1xLmRlY3J5cHQocix1LHtpdjpufSk7cmV0dXJuIENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHQpfTt2YXIgaj1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGUoQ3J5cHRvSlMuQUVTLG4scCxvKX07dmFyIG09ZnVuY3Rpb24obixwLG8pe3JldHVybiBlKENyeXB0b0pTLlRyaXBsZURFUyxuLHAsbyl9O3ZhciBlPWZ1bmN0aW9uKHMseCx2LHApe3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoeCk7dmFyIHc9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh2KTt2YXIgbz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHApO3ZhciBuPXt9O3ZhciB1PXMuZW5jcnlwdChyLHcse2l2Om99KTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUudG9TdHJpbmcoKSk7dmFyIHQ9Q3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkocSk7cmV0dXJuIHR9O3ZhciBnPXtcIkFFUy0yNTYtQ0JDXCI6e3Byb2M6YyxlcHJvYzpqLGtleWxlbjozMixpdmxlbjoxNn0sXCJBRVMtMTkyLUNCQ1wiOntwcm9jOmMsZXByb2M6aixrZXlsZW46MjQsaXZsZW46MTZ9LFwiQUVTLTEyOC1DQkNcIjp7cHJvYzpjLGVwcm9jOmosa2V5bGVuOjE2LGl2bGVuOjE2fSxcIkRFUy1FREUzLUNCQ1wiOntwcm9jOmQsZXByb2M6bSxrZXlsZW46MjQsaXZsZW46OH19O3ZhciBiPWZ1bmN0aW9uKG4pe3JldHVybiBnW25dW1wicHJvY1wiXX07dmFyIGs9ZnVuY3Rpb24obil7dmFyIHA9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20obik7dmFyIG89Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocCk7cmV0dXJuIG99O3ZhciBsPWZ1bmN0aW9uKHEpe3ZhciByPXt9O2lmKHEubWF0Y2gobmV3IFJlZ0V4cChcIkRFSy1JbmZvOiAoW14sXSspLChbMC05QS1GYS1mXSspXCIsXCJtXCIpKSl7ci5jaXBoZXI9UmVnRXhwLiQxO3IuaXZzYWx0PVJlZ0V4cC4kMn1pZihxLm1hdGNoKG5ldyBSZWdFeHAoXCItLS0tLUJFR0lOIChbQS1aXSspIFBSSVZBVEUgS0VZLS0tLS1cIikpKXtyLnR5cGU9UmVnRXhwLiQxfXZhciBwPS0xO3ZhciB0PTA7aWYocS5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpIT0tMSl7cD1xLmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIik7dD0yfWlmKHEuaW5kZXhPZihcIlxcblxcblwiKSE9LTEpe3A9cS5pbmRleE9mKFwiXFxuXFxuXCIpO3Q9MX12YXIgbz1xLmluZGV4T2YoXCItLS0tLUVORFwiKTtpZihwIT0tMSYmbyE9LTEpe3ZhciBuPXEuc3Vic3RyaW5nKHArdCoyLG8tdCk7bj1uLnJlcGxhY2UoL1xccysvZyxcIlwiKTtyLmRhdGE9bn1yZXR1cm4gcn07dmFyIGg9ZnVuY3Rpb24obyx3LG4pe3ZhciB0PW4uc3Vic3RyaW5nKDAsMTYpO3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodCk7dmFyIHA9Q3J5cHRvSlMuZW5jLlV0ZjgucGFyc2Uodyk7dmFyIHM9Z1tvXVtcImtleWxlblwiXStnW29dW1wiaXZsZW5cIl07dmFyIHY9XCJcIjt2YXIgdT1udWxsO2Zvcig7Oyl7dmFyIHE9Q3J5cHRvSlMuYWxnby5NRDUuY3JlYXRlKCk7aWYodSE9bnVsbCl7cS51cGRhdGUodSl9cS51cGRhdGUocCk7cS51cGRhdGUocik7dT1xLmZpbmFsaXplKCk7dj12K0NyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHUpO2lmKHYubGVuZ3RoPj1zKjIpe2JyZWFrfX12YXIgeD17fTt4LmtleWhleD12LnN1YnN0cigwLGdbb11bXCJrZXlsZW5cIl0qMik7eC5pdmhleD12LnN1YnN0cihnW29dW1wia2V5bGVuXCJdKjIsZ1tvXVtcIml2bGVuXCJdKjIpO3JldHVybiB4fTt2YXIgYT1mdW5jdGlvbihuLHQscCx1KXt2YXIgcT1DcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKG4pO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHEpO3ZhciBzPWdbdF1bXCJwcm9jXCJdO3ZhciByPXMobyxwLHUpO3JldHVybiByfTt2YXIgZj1mdW5jdGlvbihuLHEsbyxzKXt2YXIgcD1nW3FdW1wiZXByb2NcIl07dmFyIHI9cChuLG8scyk7cmV0dXJuIHJ9O3JldHVybnt2ZXJzaW9uOlwiMS4wLjVcIixnZXRIZXhGcm9tUEVNOmZ1bmN0aW9uKG8scil7dmFyIHA9bztpZihwLmluZGV4T2YoXCJCRUdJTiBcIityKT09LTEpe3Rocm93XCJjYW4ndCBmaW5kIFBFTSBoZWFkZXI6IFwiK3J9cD1wLnJlcGxhY2UoXCItLS0tLUJFR0lOIFwiK3IrXCItLS0tLVwiLFwiXCIpO3A9cC5yZXBsYWNlKFwiLS0tLS1FTkQgXCIrcitcIi0tLS0tXCIsXCJcIik7dmFyIHE9cC5yZXBsYWNlKC9cXHMrL2csXCJcIik7dmFyIG49YjY0dG9oZXgocSk7cmV0dXJuIG59LGdldERlY3J5cHRlZEtleUhleEJ5S2V5SVY6ZnVuY3Rpb24obyxyLHEscCl7dmFyIG49YihyKTtyZXR1cm4gbihvLHEscCl9LHBhcnNlUEtDUzVQRU06ZnVuY3Rpb24obil7cmV0dXJuIGwobil9LGdldEtleUFuZFVudXNlZEl2QnlQYXNzY29kZUFuZEl2c2FsdDpmdW5jdGlvbihvLG4scCl7cmV0dXJuIGgobyxuLHApfSxkZWNyeXB0S2V5QjY0OmZ1bmN0aW9uKG4scCxvLHEpe3JldHVybiBhKG4scCxvLHEpfSxnZXREZWNyeXB0ZWRLZXlIZXg6ZnVuY3Rpb24odyx2KXt2YXIgbz1sKHcpO3ZhciByPW8udHlwZTt2YXIgcD1vLmNpcGhlcjt2YXIgbj1vLml2c2FsdDt2YXIgcT1vLmRhdGE7dmFyIHU9aChwLHYsbik7dmFyIHQ9dS5rZXloZXg7dmFyIHM9YShxLHAsdCxuKTtyZXR1cm4gc30sZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKHAsbyl7dmFyIHE9dGhpcy5nZXREZWNyeXB0ZWRLZXlIZXgocCxvKTt2YXIgbj1uZXcgUlNBS2V5KCk7bi5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHEpO3JldHVybiBufSxnZXRFcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4OmZ1bmN0aW9uKHEseCxyLHApe3ZhciBuPVwiXCI7aWYodHlwZW9mIHI9PVwidW5kZWZpbmVkXCJ8fHI9PW51bGwpe3I9XCJBRVMtMjU2LUNCQ1wifWlmKHR5cGVvZiBnW3JdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiUEtDUzVQS0VZIHVuc3VwcG9ydGVkIGFsZ29yaXRobTogXCIrcn1pZih0eXBlb2YgcD09XCJ1bmRlZmluZWRcInx8cD09bnVsbCl7dmFyIHQ9Z1tyXVtcIml2bGVuXCJdO3ZhciBzPWsodCk7cD1zLnRvVXBwZXJDYXNlKCl9dmFyIHc9aChyLHgscCk7dmFyIHY9dy5rZXloZXg7dmFyIHU9ZihxLHIsdixwKTt2YXIgbz11LnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO3ZhciBuPVwiLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO24rPVwiUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFxcclxcblwiO24rPVwiREVLLUluZm86IFwiK3IrXCIsXCIrcCtcIlxcclxcblwiO24rPVwiXFxyXFxuXCI7bis9bztuKz1cIlxcclxcbi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tXFxyXFxuXCI7cmV0dXJuIG59LGdldEVyeXB0ZWRQS0NTNVBFTUZyb21SU0FLZXk6ZnVuY3Rpb24oQyxELG8scyl7dmFyIEE9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOjB9KTt2YXIgdj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLm59KTt2YXIgej1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6Qy5lfSk7dmFyIEI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Qy5kfSk7dmFyIHQ9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Qy5wfSk7dmFyIHI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Qy5xfSk7dmFyIHk9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Qy5kbXAxfSk7dmFyIHU9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Qy5kbXExfSk7dmFyIHg9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Qy5jb2VmZn0pO3ZhciBFPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltBLHYseixCLHQscix5LHUseF19KTt2YXIgdz1FLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5nZXRFcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KHcsRCxvLHMpfSxuZXdFbmNyeXB0ZWRQS0NTNVBFTTpmdW5jdGlvbihuLG8scixzKXtpZih0eXBlb2Ygbz09XCJ1bmRlZmluZWRcInx8bz09bnVsbCl7bz0xMDI0fWlmKHR5cGVvZiByPT1cInVuZGVmaW5lZFwifHxyPT1udWxsKXtyPVwiMTAwMDFcIn12YXIgcD1uZXcgUlNBS2V5KCk7cC5nZW5lcmF0ZShvLHIpO3ZhciBxPW51bGw7aWYodHlwZW9mIHM9PVwidW5kZWZpbmVkXCJ8fHM9PW51bGwpe3E9dGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21SU0FLZXkocGtleSxuKX1lbHNle3E9dGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21SU0FLZXkocGtleSxuLHMpfXJldHVybiBxfSxnZXRSU0FLZXlGcm9tUGxhaW5QS0NTOFBFTTpmdW5jdGlvbihwKXtpZihwLm1hdGNoKC9FTkNSWVBURUQvKSl7dGhyb3dcInBlbSBzaGFsbCBiZSBub3QgRU5DUllQVEVEXCJ9dmFyIG89dGhpcy5nZXRIZXhGcm9tUEVNKHAsXCJQUklWQVRFIEtFWVwiKTt2YXIgbj10aGlzLmdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4KG8pO3JldHVybiBufSxnZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLDApO2lmKHAubGVuZ3RoIT0zKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAzIGVsZW1lbnRzOiBcIitwLmxlbmd0aH12YXIgbz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHEscFsxXSk7aWYobyE9XCIzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwMTA1MDBcIil7dGhyb3dcIlBLQ1M4IEFsZ29yaXRobUlkZW50aWZpZXIgaXMgbm90IHJzYUVuYzogXCIrb312YXIgbz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHEscFsxXSk7dmFyIHI9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihxLHBbMl0pO3ZhciBzPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIsMCk7dmFyIG49bmV3IFJTQUtleSgpO24ucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhzKTtyZXR1cm4gbn0scGFyc2VIZXhPZkVuY3J5cHRlZFBLQ1M4OmZ1bmN0aW9uKHUpe3ZhciBxPXt9O3ZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUsMCk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwKS5pdGVtcyAhPSAyOiBcIitwLmxlbmd0aH1xLmNpcGhlcnRleHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSxwWzFdKTt2YXIgdz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LHBbMF0pO2lmKHcubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wKS5pdGVtcyAhPSAyOiBcIit3Lmxlbmd0aH1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaih1LHdbMF0pIT1cIjJhODY0ODg2ZjcwZDAxMDUwZFwiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIHBrY3M1UEJFUzJcIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LHdbMV0pO2lmKHcubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEpLml0ZW1zICE9IDI6IFwiK24ubGVuZ3RofXZhciBvPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUsblsxXSk7aWYoby5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4xKS5pdGVtcyAhPSAyOiBcIitvLmxlbmd0aH1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaih1LG9bMF0pIT1cIjJhODY0ODg2ZjcwZDAzMDdcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBUcmlwbGVERVNcIn1xLmVuY3J5cHRpb25TY2hlbWVBbGc9XCJUcmlwbGVERVNcIjtxLmVuY3J5cHRpb25TY2hlbWVJVj1BU04xSEVYLmdldEhleE9mVl9BdE9iaih1LG9bMV0pO3ZhciByPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUsblswXSk7aWYoci5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wKS5pdGVtcyAhPSAyOiBcIityLmxlbmd0aH1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaih1LHJbMF0pIT1cIjJhODY0ODg2ZjcwZDAxMDUwY1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIHBrY3M1UEJLREYyXCJ9dmFyIHY9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxyWzFdKTtpZih2Lmxlbmd0aDwyKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMC4xKS5pdGVtcyA8IDI6IFwiK3YubGVuZ3RofXEucGJrZGYyU2FsdD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih1LHZbMF0pO3ZhciBzPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsdlsxXSk7dHJ5e3EucGJrZGYySXRlcj1wYXJzZUludChzLDE2KX1jYXRjaCh0KXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdCBwYmtkZjJJdGVyOiBcIitzfXJldHVybiBxfSxnZXRQQktERjJLZXlIZXhGcm9tUGFyYW06ZnVuY3Rpb24ocyxuKXt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHMucGJrZGYyU2FsdCk7dmFyIG89cy5wYmtkZjJJdGVyO3ZhciBxPUNyeXB0b0pTLlBCS0RGMihuLHIse2tleVNpemU6MTkyLzMyLGl0ZXJhdGlvbnM6b30pO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHEpO3JldHVybiBwfSxnZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHYsdyl7dmFyIHA9dGhpcy5nZXRIZXhGcm9tUEVNKHYsXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIik7dmFyIG49dGhpcy5wYXJzZUhleE9mRW5jcnlwdGVkUEtDUzgocCk7dmFyIHM9UEtDUzVQS0VZLmdldFBCS0RGMktleUhleEZyb21QYXJhbShuLHcpO3ZhciB0PXt9O3QuY2lwaGVydGV4dD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKG4uY2lwaGVydGV4dCk7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShzKTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKG4uZW5jcnlwdGlvblNjaGVtZUlWKTt2YXIgdT1DcnlwdG9KUy5UcmlwbGVERVMuZGVjcnlwdCh0LHIse2l2OnF9KTt2YXIgbz1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh1KTtyZXR1cm4gb30sZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHEscCl7dmFyIG89dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHEscCk7dmFyIG49dGhpcy5nZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleChvKTtyZXR1cm4gbn0sZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHEsbyl7dmFyIG49dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHEsbyk7dmFyIHA9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgobik7cmV0dXJuIHB9LHBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24ocSl7dmFyIG89e307by5hbGdwYXJhbT1udWxsO2lmKHEuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBwbGFpbiBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLDApO2lmKHAubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAyKVwifWlmKHEuc3Vic3RyKHBbMV0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMylcIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLHBbMV0pO2lmKG4ubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA0KVwifWlmKHEuc3Vic3RyKG5bMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNSlcIn1vLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMF0pO2lmKHEuc3Vic3RyKG5bMV0sMik9PVwiMDZcIil7by5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMV0pfWlmKHEuc3Vic3RyKHBbMl0sMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNilcIn1vLmtleWlkeD1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHEscFsyXSk7cmV0dXJuIG99LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOFBFTTpmdW5jdGlvbihvKXt2YXIgbj10aGlzLmdldEhleEZyb21QRU0obyxcIlBSSVZBVEUgS0VZXCIpO3ZhciBwPXRoaXMuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4KG4pO3JldHVybiBwfSxnZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24obil7dmFyIHA9dGhpcy5wYXJzZVBsYWluUHJpdmF0ZVBLQ1M4SGV4KG4pO2lmKHAuYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqKG4scCk7dmFyIG89cC5rZXk7dmFyIHE9bmV3IFJTQUtleSgpO3Euc2V0UHJpdmF0ZUV4KG8ubixvLmUsby5kLG8ucCxvLnEsby5kcCxvLmRxLG8uY28pO3JldHVybiBxfWVsc2V7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7dGhpcy5wYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqKG4scCk7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3AuYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrcC5hbGdwYXJhbX12YXIgcj1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbcC5hbGdwYXJhbV07dmFyIHE9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpyLHBydjpwLmtleX0pO3JldHVybiBxfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIHByaXZhdGUga2V5IGFsZ29yaXRobVwifX19LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihvKXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0obyxcIlBVQkxJQyBLRVlcIik7dmFyIG49dGhpcy5nZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXgocCk7cmV0dXJuIG59LGdldEtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihvKXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0obyxcIlBVQkxJQyBLRVlcIik7dmFyIG49dGhpcy5nZXRLZXlGcm9tUHVibGljUEtDUzhIZXgocCk7cmV0dXJuIG59LGdldEtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbihvKXt2YXIgbj10aGlzLnBhcnNlUHVibGljUEtDUzhIZXgobyk7aWYobi5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3ZhciByPXRoaXMucGFyc2VQdWJsaWNSYXdSU0FLZXlIZXgobi5rZXkpO3ZhciBwPW5ldyBSU0FLZXkoKTtwLnNldFB1YmxpYyhyLm4sci5lKTtyZXR1cm4gcH1lbHNle2lmKG4uYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtuLmFsZ3BhcmFtXT09PXVuZGVmaW5lZCl7dGhyb3dcIktKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZSB1bmRlZmluZWQ6IFwiK24uYWxncGFyYW19dmFyIHE9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW24uYWxncGFyYW1dO3ZhciBwPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6cSxwdWI6bi5rZXl9KTtyZXR1cm4gcH1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZ29yaXRobVwifX19LHBhcnNlUHVibGljUmF3UlNBS2V5SGV4OmZ1bmN0aW9uKHApe3ZhciBuPXt9O2lmKHAuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAxKVwifXZhciBvPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHAsMCk7aWYoby5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMilcIn1pZihwLnN1YnN0cihvWzBdLDIpIT1cIjAyXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMylcIn1uLm49QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocCxvWzBdKTtpZihwLnN1YnN0cihvWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwNClcIn1uLmU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocCxvWzFdKTtyZXR1cm4gbn0scGFyc2VQcml2YXRlUmF3UlNBS2V5SGV4QXRPYmo6ZnVuY3Rpb24obyxxKXt2YXIgcD1xLmtleWlkeDtpZihvLnN1YnN0cihwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKG8scCk7aWYobi5sZW5ndGghPTkpe3Rocm93XCJtYWxmb3JtZWQgUlNBIHByaXZhdGUga2V5KGNvZGU6MDAyKVwifXEua2V5PXt9O3Eua2V5Lm49QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzFdKTtxLmtleS5lPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sblsyXSk7cS5rZXkuZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bM10pO3Eua2V5LnA9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzRdKTtxLmtleS5xPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls1XSk7cS5rZXkuZHA9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzZdKTtxLmtleS5kcT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bN10pO3Eua2V5LmNvPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls4XSl9LHBhcnNlUHJpdmF0ZVJhd0VDS2V5SGV4QXRPYmo6ZnVuY3Rpb24obyxxKXt2YXIgcD1xLmtleWlkeDtpZihvLnN1YnN0cihwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgRUNDIHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKG8scCk7aWYobi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgRUNDIHByaXZhdGUga2V5KGNvZGU6MDAyKVwifWlmKG8uc3Vic3RyKG5bMV0sMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBFQ0MgcHJpdmF0ZSBrZXkoY29kZTowMDMpXCJ9cS5rZXk9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzFdKX0scGFyc2VQdWJsaWNQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgbz17fTtvLmFsZ3BhcmFtPW51bGw7dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSwwKTtpZihwLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrcC5sZW5ndGh9dmFyIHI9cFswXTtpZihxLnN1YnN0cihyLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMSlcIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLHIpO2lmKG4ubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDIpXCJ9aWYocS5zdWJzdHIoblswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDMpXCJ9by5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxuWzBdKTtpZihxLnN1YnN0cihuWzFdLDIpPT1cIjA2XCIpe28uYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxuWzFdKX1pZihxLnN1YnN0cihwWzFdLDIpIT1cIjAzXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwNClcIn1vLmtleT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbMV0pLnN1YnN0cigyKTtyZXR1cm4gb30sZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHIpe3ZhciBxPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHIsMCk7aWYocS5sZW5ndGghPTIpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3EubGVuZ3RofXZhciBwPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocixxWzBdKTtpZihwIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWQgaXMgbm90IHJzYUVuY3J5cHRpb25cIn1pZihyLnN1YnN0cihxWzFdLDIpIT1cIjAzXCIpe3Rocm93XCJQS0NTOCBQdWJsaWMgS2V5IGlzIG5vdCBCSVRTVFJJTkcgZW5jYXBzbGF0ZWQuXCJ9dmFyIHQ9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihyLHFbMV0pKzI7aWYoci5zdWJzdHIodCwyKSE9XCIzMFwiKXt0aHJvd1wiUEtDUzggUHVibGljIEtleSBpcyBub3QgU0VRVUVOQ0UuXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocix0KTtpZihuLmxlbmd0aCE9Mil7dGhyb3dcImlubmVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrbi5sZW5ndGh9aWYoci5zdWJzdHIoblswXSwyKSE9XCIwMlwiKXt0aHJvd1wiTiBpcyBub3QgQVNOLjEgSU5URUdFUlwifWlmKHIuc3Vic3RyKG5bMV0sMikhPVwiMDJcIil7dGhyb3dcIkUgaXMgbm90IEFTTi4xIElOVEVHRVJcIn12YXIgdT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihyLG5bMF0pO3ZhciBzPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIsblsxXSk7dmFyIG89bmV3IFJTQUtleSgpO28uc2V0UHVibGljKHUscyk7cmV0dXJuIG99LH19KCk7XG4vKiEga2V5dXRpbC0xLjAuMTMuanMgKGMpIDIwMTMtMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG52YXIgS0VZVVRJTD1mdW5jdGlvbigpe3ZhciBkPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gayhDcnlwdG9KUy5BRVMscCxyLHEpfTt2YXIgZT1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGsoQ3J5cHRvSlMuVHJpcGxlREVTLHAscixxKX07dmFyIGE9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBrKENyeXB0b0pTLkRFUyxwLHIscSl9O3ZhciBrPWZ1bmN0aW9uKHMseCx1LHEpe3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoeCk7dmFyIHc9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh1KTt2YXIgcD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHEpO3ZhciB0PXt9O3Qua2V5PXc7dC5pdj1wO3QuY2lwaGVydGV4dD1yO3ZhciB2PXMuZGVjcnlwdCh0LHcse2l2OnB9KTtyZXR1cm4gQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodil9O3ZhciBsPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gZyhDcnlwdG9KUy5BRVMscCxyLHEpfTt2YXIgbz1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGcoQ3J5cHRvSlMuVHJpcGxlREVTLHAscixxKX07dmFyIGY9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBnKENyeXB0b0pTLkRFUyxwLHIscSl9O3ZhciBnPWZ1bmN0aW9uKHQseSx2LHEpe3ZhciBzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoeSk7dmFyIHg9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh2KTt2YXIgcD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHEpO3ZhciB3PXQuZW5jcnlwdChzLHgse2l2OnB9KTt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHcudG9TdHJpbmcoKSk7dmFyIHU9Q3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkocik7cmV0dXJuIHV9O3ZhciBpPXtcIkFFUy0yNTYtQ0JDXCI6e3Byb2M6ZCxlcHJvYzpsLGtleWxlbjozMixpdmxlbjoxNn0sXCJBRVMtMTkyLUNCQ1wiOntwcm9jOmQsZXByb2M6bCxrZXlsZW46MjQsaXZsZW46MTZ9LFwiQUVTLTEyOC1DQkNcIjp7cHJvYzpkLGVwcm9jOmwsa2V5bGVuOjE2LGl2bGVuOjE2fSxcIkRFUy1FREUzLUNCQ1wiOntwcm9jOmUsZXByb2M6byxrZXlsZW46MjQsaXZsZW46OH0sXCJERVMtQ0JDXCI6e3Byb2M6YSxlcHJvYzpmLGtleWxlbjo4LGl2bGVuOjh9fTt2YXIgYz1mdW5jdGlvbihwKXtyZXR1cm4gaVtwXVtcInByb2NcIl19O3ZhciBtPWZ1bmN0aW9uKHApe3ZhciByPUNyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKHApO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHIpO3JldHVybiBxfTt2YXIgbj1mdW5jdGlvbih0KXt2YXIgdT17fTtpZih0Lm1hdGNoKG5ldyBSZWdFeHAoXCJERUstSW5mbzogKFteLF0rKSwoWzAtOUEtRmEtZl0rKVwiLFwibVwiKSkpe3UuY2lwaGVyPVJlZ0V4cC4kMTt1Lml2c2FsdD1SZWdFeHAuJDJ9aWYodC5tYXRjaChuZXcgUmVnRXhwKFwiLS0tLS1CRUdJTiAoW0EtWl0rKSBQUklWQVRFIEtFWS0tLS0tXCIpKSl7dS50eXBlPVJlZ0V4cC4kMX12YXIgcj0tMTt2YXIgdj0wO2lmKHQuaW5kZXhPZihcIlxcclxcblxcclxcblwiKSE9LTEpe3I9dC5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpO3Y9Mn1pZih0LmluZGV4T2YoXCJcXG5cXG5cIikhPS0xKXtyPXQuaW5kZXhPZihcIlxcblxcblwiKTt2PTF9dmFyIHE9dC5pbmRleE9mKFwiLS0tLS1FTkRcIik7aWYociE9LTEmJnEhPS0xKXt2YXIgcD10LnN1YnN0cmluZyhyK3YqMixxLXYpO3A9cC5yZXBsYWNlKC9cXHMrL2csXCJcIik7dS5kYXRhPXB9cmV0dXJuIHV9O3ZhciBqPWZ1bmN0aW9uKHEseSxwKXt2YXIgdj1wLnN1YnN0cmluZygwLDE2KTt2YXIgdD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciByPUNyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHkpO3ZhciB1PWlbcV1bXCJrZXlsZW5cIl0raVtxXVtcIml2bGVuXCJdO3ZhciB4PVwiXCI7dmFyIHc9bnVsbDtmb3IoOzspe3ZhciBzPUNyeXB0b0pTLmFsZ28uTUQ1LmNyZWF0ZSgpO2lmKHchPW51bGwpe3MudXBkYXRlKHcpfXMudXBkYXRlKHIpO3MudXBkYXRlKHQpO3c9cy5maW5hbGl6ZSgpO3g9eCtDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh3KTtpZih4Lmxlbmd0aD49dSoyKXticmVha319dmFyIHo9e307ei5rZXloZXg9eC5zdWJzdHIoMCxpW3FdW1wia2V5bGVuXCJdKjIpO3ouaXZoZXg9eC5zdWJzdHIoaVtxXVtcImtleWxlblwiXSoyLGlbcV1bXCJpdmxlblwiXSoyKTtyZXR1cm4gen07dmFyIGI9ZnVuY3Rpb24ocCx2LHIsdyl7dmFyIHM9Q3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShwKTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShzKTt2YXIgdT1pW3ZdW1wicHJvY1wiXTt2YXIgdD11KHEscix3KTtyZXR1cm4gdH07dmFyIGg9ZnVuY3Rpb24ocCxzLHEsdSl7dmFyIHI9aVtzXVtcImVwcm9jXCJdO3ZhciB0PXIocCxxLHUpO3JldHVybiB0fTtyZXR1cm57dmVyc2lvbjpcIjEuMC4wXCIsZ2V0SGV4RnJvbVBFTTpmdW5jdGlvbihxLHUpe3ZhciByPXE7aWYoci5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIik9PS0xKXt0aHJvd1wiY2FuJ3QgZmluZCBQRU0gaGVhZGVyOiBcIit1fWlmKHR5cGVvZiB1PT1cInN0cmluZ1wiJiZ1IT1cIlwiKXtyPXIucmVwbGFjZShcIi0tLS0tQkVHSU4gXCIrdStcIi0tLS0tXCIsXCJcIik7cj1yLnJlcGxhY2UoXCItLS0tLUVORCBcIit1K1wiLS0tLS1cIixcIlwiKX1lbHNle3I9ci5yZXBsYWNlKC8tLS0tLUJFR0lOIFteLV0rLS0tLS0vLFwiXCIpO3I9ci5yZXBsYWNlKC8tLS0tLUVORCBbXi1dKy0tLS0tLyxcIlwiKX12YXIgdD1yLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgcD1iNjR0b2hleCh0KTtyZXR1cm4gcH0sZ2V0RGVjcnlwdGVkS2V5SGV4QnlLZXlJVjpmdW5jdGlvbihxLHQscyxyKXt2YXIgcD1jKHQpO3JldHVybiBwKHEscyxyKX0scGFyc2VQS0NTNVBFTTpmdW5jdGlvbihwKXtyZXR1cm4gbihwKX0sZ2V0S2V5QW5kVW51c2VkSXZCeVBhc3Njb2RlQW5kSXZzYWx0OmZ1bmN0aW9uKHEscCxyKXtyZXR1cm4gaihxLHAscil9LGRlY3J5cHRLZXlCNjQ6ZnVuY3Rpb24ocCxyLHEscyl7cmV0dXJuIGIocCxyLHEscyl9LGdldERlY3J5cHRlZEtleUhleDpmdW5jdGlvbih5LHgpe3ZhciBxPW4oeSk7dmFyIHQ9cS50eXBlO3ZhciByPXEuY2lwaGVyO3ZhciBwPXEuaXZzYWx0O3ZhciBzPXEuZGF0YTt2YXIgdz1qKHIseCxwKTt2YXIgdj13LmtleWhleDt2YXIgdT1iKHMscix2LHApO3JldHVybiB1fSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzVQRU06ZnVuY3Rpb24ocixxKXt2YXIgcz10aGlzLmdldERlY3J5cHRlZEtleUhleChyLHEpO3ZhciBwPW5ldyBSU0FLZXkoKTtwLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcocyk7cmV0dXJuIHB9LGdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleDpmdW5jdGlvbih4LHMsQSx0LHIpe3ZhciBwPVwiXCI7aWYodHlwZW9mIHQ9PVwidW5kZWZpbmVkXCJ8fHQ9PW51bGwpe3Q9XCJBRVMtMjU2LUNCQ1wifWlmKHR5cGVvZiBpW3RdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiS0VZVVRJTCB1bnN1cHBvcnRlZCBhbGdvcml0aG06IFwiK3R9aWYodHlwZW9mIHI9PVwidW5kZWZpbmVkXCJ8fHI9PW51bGwpe3ZhciB2PWlbdF1bXCJpdmxlblwiXTt2YXIgdT1tKHYpO3I9dS50b1VwcGVyQ2FzZSgpfXZhciB6PWoodCxBLHIpO3ZhciB5PXoua2V5aGV4O3ZhciB3PWgocyx0LHkscik7dmFyIHE9dy5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTt2YXIgcD1cIi0tLS0tQkVHSU4gXCIreCtcIiBQUklWQVRFIEtFWS0tLS0tXFxyXFxuXCI7cCs9XCJQcm9jLVR5cGU6IDQsRU5DUllQVEVEXFxyXFxuXCI7cCs9XCJERUstSW5mbzogXCIrdCtcIixcIityK1wiXFxyXFxuXCI7cCs9XCJcXHJcXG5cIjtwKz1xO3ArPVwiXFxyXFxuLS0tLS1FTkQgXCIreCtcIiBQUklWQVRFIEtFWS0tLS0tXFxyXFxuXCI7cmV0dXJuIHB9LGdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleTpmdW5jdGlvbihELEUscix0KXt2YXIgQj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6MH0pO3ZhciB3PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQubn0pO3ZhciBBPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjpELmV9KTt2YXIgQz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpELmR9KTt2YXIgdT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpELnB9KTt2YXIgcz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpELnF9KTt2YXIgej1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpELmRtcDF9KTt2YXIgdj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpELmRtcTF9KTt2YXIgeT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpELmNvZWZmfSk7dmFyIEY9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W0IsdyxBLEMsdSxzLHosdix5XX0pO3ZhciB4PUYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIlJTQVwiLHgsRSxyLHQpfSxuZXdFbmNyeXB0ZWRQS0NTNVBFTTpmdW5jdGlvbihwLHEsdCx1KXtpZih0eXBlb2YgcT09XCJ1bmRlZmluZWRcInx8cT09bnVsbCl7cT0xMDI0fWlmKHR5cGVvZiB0PT1cInVuZGVmaW5lZFwifHx0PT1udWxsKXt0PVwiMTAwMDFcIn12YXIgcj1uZXcgUlNBS2V5KCk7ci5nZW5lcmF0ZShxLHQpO3ZhciBzPW51bGw7aWYodHlwZW9mIHU9PVwidW5kZWZpbmVkXCJ8fHU9PW51bGwpe3M9dGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21SU0FLZXkocixwKX1lbHNle3M9dGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21SU0FLZXkocixwLHUpfXJldHVybiBzfSxnZXRSU0FLZXlGcm9tUGxhaW5QS0NTOFBFTTpmdW5jdGlvbihyKXtpZihyLm1hdGNoKC9FTkNSWVBURUQvKSl7dGhyb3dcInBlbSBzaGFsbCBiZSBub3QgRU5DUllQVEVEXCJ9dmFyIHE9dGhpcy5nZXRIZXhGcm9tUEVNKHIsXCJQUklWQVRFIEtFWVwiKTt2YXIgcD10aGlzLmdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4KHEpO3JldHVybiBwfSxnZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleDpmdW5jdGlvbihzKXt2YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLDApO2lmKHIubGVuZ3RoIT0zKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAzIGVsZW1lbnRzOiBcIityLmxlbmd0aH12YXIgcT1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHMsclsxXSk7aWYocSE9XCIzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwMTA1MDBcIil7dGhyb3dcIlBLQ1M4IEFsZ29yaXRobUlkZW50aWZpZXIgaXMgbm90IHJzYUVuYzogXCIrcX12YXIgcT1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHMsclsxXSk7dmFyIHQ9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihzLHJbMl0pO3ZhciB1PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHQsMCk7dmFyIHA9bmV3IFJTQUtleSgpO3AucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyh1KTtyZXR1cm4gcH0scGFyc2VIZXhPZkVuY3J5cHRlZFBLQ1M4OmZ1bmN0aW9uKHcpe3ZhciBzPXt9O3ZhciByPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcsMCk7aWYoci5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwKS5pdGVtcyAhPSAyOiBcIityLmxlbmd0aH1zLmNpcGhlcnRleHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyxyWzFdKTt2YXIgeT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHJbMF0pO2lmKHkubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wKS5pdGVtcyAhPSAyOiBcIit5Lmxlbmd0aH1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHlbMF0pIT1cIjJhODY0ODg2ZjcwZDAxMDUwZFwiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIHBrY3M1UEJFUzJcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHlbMV0pO2lmKHkubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEpLml0ZW1zICE9IDI6IFwiK3AubGVuZ3RofXZhciBxPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcscFsxXSk7aWYocS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4xKS5pdGVtcyAhPSAyOiBcIitxLmxlbmd0aH1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHFbMF0pIT1cIjJhODY0ODg2ZjcwZDAzMDdcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBUcmlwbGVERVNcIn1zLmVuY3J5cHRpb25TY2hlbWVBbGc9XCJUcmlwbGVERVNcIjtzLmVuY3J5cHRpb25TY2hlbWVJVj1BU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHFbMV0pO3ZhciB0PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcscFswXSk7aWYodC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wKS5pdGVtcyAhPSAyOiBcIit0Lmxlbmd0aH1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHRbMF0pIT1cIjJhODY0ODg2ZjcwZDAxMDUwY1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIHBrY3M1UEJLREYyXCJ9dmFyIHg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyx0WzFdKTtpZih4Lmxlbmd0aDwyKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMC4xKS5pdGVtcyA8IDI6IFwiK3gubGVuZ3RofXMucGJrZGYyU2FsdD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHhbMF0pO3ZhciB1PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcseFsxXSk7dHJ5e3MucGJrZGYySXRlcj1wYXJzZUludCh1LDE2KX1jYXRjaCh2KXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdCBwYmtkZjJJdGVyOiBcIit1fXJldHVybiBzfSxnZXRQQktERjJLZXlIZXhGcm9tUGFyYW06ZnVuY3Rpb24odSxwKXt2YXIgdD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUucGJrZGYyU2FsdCk7dmFyIHE9dS5wYmtkZjJJdGVyO3ZhciBzPUNyeXB0b0pTLlBCS0RGMihwLHQse2tleVNpemU6MTkyLzMyLGl0ZXJhdGlvbnM6cX0pO3ZhciByPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3JldHVybiByfSxnZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHgseSl7dmFyIHI9dGhpcy5nZXRIZXhGcm9tUEVNKHgsXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIik7dmFyIHA9dGhpcy5wYXJzZUhleE9mRW5jcnlwdGVkUEtDUzgocik7dmFyIHU9S0VZVVRJTC5nZXRQQktERjJLZXlIZXhGcm9tUGFyYW0ocCx5KTt2YXIgdj17fTt2LmNpcGhlcnRleHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShwLmNpcGhlcnRleHQpO3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodSk7dmFyIHM9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShwLmVuY3J5cHRpb25TY2hlbWVJVik7dmFyIHc9Q3J5cHRvSlMuVHJpcGxlREVTLmRlY3J5cHQodix0LHtpdjpzfSk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodyk7cmV0dXJuIHF9LGdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbihzLHIpe3ZhciBxPXRoaXMuZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTShzLHIpO3ZhciBwPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgocSk7cmV0dXJuIHB9LGdldEtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbihzLHEpe3ZhciBwPXRoaXMuZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTShzLHEpO3ZhciByPXRoaXMuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4KHApO3JldHVybiByfSxwYXJzZVBsYWluUHJpdmF0ZVBLQ1M4SGV4OmZ1bmN0aW9uKHMpe3ZhciBxPXt9O3EuYWxncGFyYW09bnVsbDtpZihzLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocywwKTtpZihyLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBwbGFpbiBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMilcIn1pZihzLnN1YnN0cihyWzFdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDMpXCJ9dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocyxyWzFdKTtpZihwLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNClcIn1pZihzLnN1YnN0cihwWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDUpXCJ9cS5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzBdKTtpZihzLnN1YnN0cihwWzFdLDIpPT1cIjA2XCIpe3EuYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzFdKX1pZihzLnN1YnN0cihyWzJdLDIpIT1cIjA0XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDYpXCJ9cS5rZXlpZHg9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihzLHJbMl0pO3JldHVybiBxfSxnZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhQRU06ZnVuY3Rpb24ocSl7dmFyIHA9dGhpcy5nZXRIZXhGcm9tUEVNKHEsXCJQUklWQVRFIEtFWVwiKTt2YXIgcj10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChwKTtyZXR1cm4gcn0sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4OmZ1bmN0aW9uKHApe3ZhciB3PXRoaXMucGFyc2VQbGFpblByaXZhdGVQS0NTOEhleChwKTtpZih3LmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dGhpcy5wYXJzZVByaXZhdGVSYXdSU0FLZXlIZXhBdE9iaihwLHcpO3ZhciB1PXcua2V5O3ZhciB6PW5ldyBSU0FLZXkoKTt6LnNldFByaXZhdGVFeCh1Lm4sdS5lLHUuZCx1LnAsdS5xLHUuZHAsdS5kcSx1LmNvKTtyZXR1cm4gen1lbHNle2lmKHcuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe3RoaXMucGFyc2VQcml2YXRlUmF3RUNLZXlIZXhBdE9iaihwLHcpO2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVt3LmFsZ3BhcmFtXT09PXVuZGVmaW5lZCl7dGhyb3dcIktKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZSB1bmRlZmluZWQ6IFwiK3cuYWxncGFyYW19dmFyIHY9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3cuYWxncGFyYW1dO3ZhciB6PW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6dn0pO3ouc2V0UHVibGljS2V5SGV4KHcucHVia2V5KTt6LnNldFByaXZhdGVLZXlIZXgody5rZXkpO3ouaXNQdWJsaWM9ZmFsc2U7cmV0dXJuIHp9ZWxzZXtpZih3LmFsZ29pZD09XCIyYTg2NDhjZTM4MDQwMVwiKXt2YXIgdD1BU04xSEVYLmdldFZieUxpc3QocCwwLFsxLDEsMF0sXCIwMlwiKTt2YXIgcz1BU04xSEVYLmdldFZieUxpc3QocCwwLFsxLDEsMV0sXCIwMlwiKTt2YXIgeT1BU04xSEVYLmdldFZieUxpc3QocCwwLFsxLDEsMl0sXCIwMlwiKTt2YXIgQj1BU04xSEVYLmdldFZieUxpc3QocCwwLFsyLDBdLFwiMDJcIik7dmFyIHI9bmV3IEJpZ0ludGVnZXIodCwxNik7dmFyIHE9bmV3IEJpZ0ludGVnZXIocywxNik7dmFyIHg9bmV3IEJpZ0ludGVnZXIoeSwxNik7dmFyIEE9bmV3IEJpZ0ludGVnZXIoQiwxNik7dmFyIHo9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3ouc2V0UHJpdmF0ZShyLHEseCxudWxsLEEpO3JldHVybiB6fWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIHByaXZhdGUga2V5IGFsZ29yaXRobVwifX19fSxnZXRSU0FLZXlGcm9tUHVibGljUEtDUzhQRU06ZnVuY3Rpb24ocSl7dmFyIHI9dGhpcy5nZXRIZXhGcm9tUEVNKHEsXCJQVUJMSUMgS0VZXCIpO3ZhciBwPXRoaXMuZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4SGV4KHIpO3JldHVybiBwfSxnZXRLZXlGcm9tUHVibGljUEtDUzhQRU06ZnVuY3Rpb24ocSl7dmFyIHI9dGhpcy5nZXRIZXhGcm9tUEVNKHEsXCJQVUJMSUMgS0VZXCIpO3ZhciBwPXRoaXMuZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4KHIpO3JldHVybiBwfSxnZXRLZXlGcm9tUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24ocSl7dmFyIHA9dGhpcy5wYXJzZVB1YmxpY1BLQ1M4SGV4KHEpO2lmKHAuYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt2YXIgdT10aGlzLnBhcnNlUHVibGljUmF3UlNBS2V5SGV4KHAua2V5KTt2YXIgcj1uZXcgUlNBS2V5KCk7ci5zZXRQdWJsaWModS5uLHUuZSk7cmV0dXJuIHJ9ZWxzZXtpZihwLmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbcC5hbGdwYXJhbV09PT11bmRlZmluZWQpe3Rocm93XCJLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWUgdW5kZWZpbmVkOiBcIitwLmFsZ3BhcmFtfXZhciBzPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXTt2YXIgcj1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnMscHViOnAua2V5fSk7cmV0dXJuIHJ9ZWxzZXtpZihwLmFsZ29pZD09XCIyYTg2NDhjZTM4MDQwMVwiKXt2YXIgdD1wLmFsZ3BhcmFtO3ZhciB2PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHAua2V5LDApO3ZhciByPW5ldyBLSlVSLmNyeXB0by5EU0EoKTtyLnNldFB1YmxpYyhuZXcgQmlnSW50ZWdlcih0LnAsMTYpLG5ldyBCaWdJbnRlZ2VyKHQucSwxNiksbmV3IEJpZ0ludGVnZXIodC5nLDE2KSxuZXcgQmlnSW50ZWdlcih2LDE2KSk7cmV0dXJuIHJ9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHVibGljIGtleSBhbGdvcml0aG1cIn19fX0scGFyc2VQdWJsaWNSYXdSU0FLZXlIZXg6ZnVuY3Rpb24ocil7dmFyIHA9e307aWYoci5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDEpXCJ9dmFyIHE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoociwwKTtpZihxLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAyKVwifWlmKHIuc3Vic3RyKHFbMF0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAzKVwifXAubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihyLHFbMF0pO2lmKHIuc3Vic3RyKHFbMV0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDA0KVwifXAuZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihyLHFbMV0pO3JldHVybiBwfSxwYXJzZVByaXZhdGVSYXdSU0FLZXlIZXhBdE9iajpmdW5jdGlvbihxLHMpe3ZhciByPXMua2V5aWR4O2lmKHEuc3Vic3RyKHIsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSxyKTtpZihwLmxlbmd0aCE9OSl7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9cy5rZXk9e307cy5rZXkubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbMV0pO3Mua2V5LmU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzJdKTtzLmtleS5kPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFszXSk7cy5rZXkucD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbNF0pO3Mua2V5LnE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzVdKTtzLmtleS5kcD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbNl0pO3Mua2V5LmRxPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs3XSk7cy5rZXkuY289QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzhdKX0scGFyc2VQcml2YXRlUmF3RUNLZXlIZXhBdE9iajpmdW5jdGlvbihwLHQpe3ZhciBxPXQua2V5aWR4O3ZhciByPUFTTjFIRVguZ2V0VmJ5TGlzdChwLHEsWzFdLFwiMDRcIik7dmFyIHM9QVNOMUhFWC5nZXRWYnlMaXN0KHAscSxbMiwwXSxcIjAzXCIpLnN1YnN0cigyKTt0LmtleT1yO3QucHVia2V5PXN9LHBhcnNlUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24ocyl7dmFyIHE9e307cS5hbGdwYXJhbT1udWxsO3ZhciByPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsMCk7aWYoci5sZW5ndGghPTIpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3IubGVuZ3RofXZhciB0PXJbMF07aWYocy5zdWJzdHIodCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDEpXCJ9dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocyx0KTtpZihwLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAyKVwifWlmKHMuc3Vic3RyKHBbMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAzKVwifXEuYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHMscFswXSk7aWYocy5zdWJzdHIocFsxXSwyKT09XCIwNlwiKXtxLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHMscFsxXSl9ZWxzZXtpZihzLnN1YnN0cihwWzFdLDIpPT1cIjMwXCIpe3EuYWxncGFyYW09e307cS5hbGdwYXJhbS5wPUFTTjFIRVguZ2V0VmJ5TGlzdChzLHBbMV0sWzBdLFwiMDJcIik7cS5hbGdwYXJhbS5xPUFTTjFIRVguZ2V0VmJ5TGlzdChzLHBbMV0sWzFdLFwiMDJcIik7cS5hbGdwYXJhbS5nPUFTTjFIRVguZ2V0VmJ5TGlzdChzLHBbMV0sWzJdLFwiMDJcIil9fWlmKHMuc3Vic3RyKHJbMV0sMikhPVwiMDNcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDA0KVwifXEua2V5PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHMsclsxXSkuc3Vic3RyKDIpO3JldHVybiBxfSxnZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24odCl7dmFyIHM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodCwwKTtpZihzLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrcy5sZW5ndGh9dmFyIHI9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaih0LHNbMF0pO2lmKHIhPVwiMzAwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwXCIpe3Rocm93XCJQS0NTOCBBbGdvcml0aG1JZCBpcyBub3QgcnNhRW5jcnlwdGlvblwifWlmKHQuc3Vic3RyKHNbMV0sMikhPVwiMDNcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IEJJVFNUUklORyBlbmNhcHNsYXRlZC5cIn12YXIgdj1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHQsc1sxXSkrMjtpZih0LnN1YnN0cih2LDIpIT1cIjMwXCIpe3Rocm93XCJQS0NTOCBQdWJsaWMgS2V5IGlzIG5vdCBTRVFVRU5DRS5cIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih0LHYpO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wiaW5uZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitwLmxlbmd0aH1pZih0LnN1YnN0cihwWzBdLDIpIT1cIjAyXCIpe3Rocm93XCJOIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9aWYodC5zdWJzdHIocFsxXSwyKSE9XCIwMlwiKXt0aHJvd1wiRSBpcyBub3QgQVNOLjEgSU5URUdFUlwifXZhciB3PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHQscFswXSk7dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodCxwWzFdKTt2YXIgcT1uZXcgUlNBS2V5KCk7cS5zZXRQdWJsaWModyx1KTtyZXR1cm4gcX0sfX0oKTtLRVlVVElMLmdldEtleT1mdW5jdGlvbihmLGUsaCl7aWYodHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmZiBpbnN0YW5jZW9mIFJTQUtleSl7cmV0dXJuIGZ9aWYodHlwZW9mIEtKVVIuY3J5cHRvLkVDRFNBIT1cInVuZGVmaW5lZFwiJiZmIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3JldHVybiBmfWlmKHR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmYgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3JldHVybiBmfWlmKGYuY3VydmUhPT11bmRlZmluZWQmJmYueHkhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7cmV0dXJuIG5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7cHViOmYueHksY3VydmU6Zi5jdXJ2ZX0pfWlmKGYuY3VydmUhPT11bmRlZmluZWQmJmYuZCE9PXVuZGVmaW5lZCl7cmV0dXJuIG5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7cHJ2OmYuZCxjdXJ2ZTpmLmN1cnZlfSl9aWYoZi5rdHk9PT11bmRlZmluZWQmJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQ9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFB1YmxpYyhmLm4sZi5lKTtyZXR1cm4gd31pZihmLmt0eT09PXVuZGVmaW5lZCYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZCE9PXVuZGVmaW5lZCYmZi5wIT09dW5kZWZpbmVkJiZmLnEhPT11bmRlZmluZWQmJmYuZHAhPT11bmRlZmluZWQmJmYuZHEhPT11bmRlZmluZWQmJmYuY28hPT11bmRlZmluZWQmJmYucWk9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGVFeChmLm4sZi5lLGYuZCxmLnAsZi5xLGYuZHAsZi5kcSxmLmNvKTtyZXR1cm4gd31pZihmLmt0eT09PXVuZGVmaW5lZCYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZCE9PXVuZGVmaW5lZCYmZi5wPT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5zZXRQcml2YXRlKGYubixmLmUsZi5kKTtyZXR1cm4gd31pZihmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5nIT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYueD09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHVibGljKGYucCxmLnEsZi5nLGYueSk7cmV0dXJuIHd9aWYoZi5wIT09dW5kZWZpbmVkJiZmLnEhPT11bmRlZmluZWQmJmYuZyE9PXVuZGVmaW5lZCYmZi55IT09dW5kZWZpbmVkJiZmLnghPT11bmRlZmluZWQpe3ZhciB3PW5ldyBLSlVSLmNyeXB0by5EU0EoKTt3LnNldFByaXZhdGUoZi5wLGYucSxmLmcsZi55LGYueCk7cmV0dXJuIHd9aWYoZi5rdHk9PT1cIlJTQVwiJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kPT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5zZXRQdWJsaWMoYjY0dXRvaGV4KGYubiksYjY0dXRvaGV4KGYuZSkpO3JldHVybiB3fWlmKGYua3R5PT09XCJSU0FcIiYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZCE9PXVuZGVmaW5lZCYmZi5wIT09dW5kZWZpbmVkJiZmLnEhPT11bmRlZmluZWQmJmYuZHAhPT11bmRlZmluZWQmJmYuZHEhPT11bmRlZmluZWQmJmYucWkhPT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGVFeChiNjR1dG9oZXgoZi5uKSxiNjR1dG9oZXgoZi5lKSxiNjR1dG9oZXgoZi5kKSxiNjR1dG9oZXgoZi5wKSxiNjR1dG9oZXgoZi5xKSxiNjR1dG9oZXgoZi5kcCksYjY0dXRvaGV4KGYuZHEpLGI2NHV0b2hleChmLnFpKSk7cmV0dXJuIHd9aWYoZi5rdHk9PT1cIlJTQVwiJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5zZXRQcml2YXRlKGI2NHV0b2hleChmLm4pLGI2NHV0b2hleChmLmUpLGI2NHV0b2hleChmLmQpKTtyZXR1cm4gd31pZihmLmt0eT09PVwiRUNcIiYmZi5jcnYhPT11bmRlZmluZWQmJmYueCE9PXVuZGVmaW5lZCYmZi55IT09dW5kZWZpbmVkJiZmLmQ9PT11bmRlZmluZWQpe3ZhciBkPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6Zi5jcnZ9KTt2YXIgbD1kLmVjcGFyYW1zLmtleWxlbi80O3ZhciByPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgoZi54KSkuc2xpY2UoLWwpO3ZhciBuPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgoZi55KSkuc2xpY2UoLWwpO3ZhciBtPVwiMDRcIityK247ZC5zZXRQdWJsaWNLZXlIZXgobSk7cmV0dXJuIGR9aWYoZi5rdHk9PT1cIkVDXCImJmYuY3J2IT09dW5kZWZpbmVkJiZmLnghPT11bmRlZmluZWQmJmYueSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkKXt2YXIgZD1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmYuY3J2fSk7dmFyIGw9ZC5lY3BhcmFtcy5rZXlsZW4vNDt2YXIgcj0oXCIwMDAwMDAwMDAwXCIrYjY0dXRvaGV4KGYueCkpLnNsaWNlKC1sKTt2YXIgbj0oXCIwMDAwMDAwMDAwXCIrYjY0dXRvaGV4KGYueSkpLnNsaWNlKC1sKTt2YXIgbT1cIjA0XCIrcituO3ZhciBhPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgoZi5kKSkuc2xpY2UoLWwpO2Quc2V0UHVibGljS2V5SGV4KG0pO2Quc2V0UHJpdmF0ZUtleUhleChhKTtyZXR1cm4gZH1pZihmLmluZGV4T2YoXCItRU5EIENFUlRJRklDQVRFLVwiLDApIT0tMXx8Zi5pbmRleE9mKFwiLUVORCBYNTA5IENFUlRJRklDQVRFLVwiLDApIT0tMXx8Zi5pbmRleE9mKFwiLUVORCBUUlVTVEVEIENFUlRJRklDQVRFLVwiLDApIT0tMSl7cmV0dXJuIFg1MDkuZ2V0UHVibGljS2V5RnJvbUNlcnRQRU0oZil9aWYoaD09PVwicGtjczhwdWJcIil7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4KGYpfWlmKGYuaW5kZXhPZihcIi1FTkQgUFVCTElDIEtFWS1cIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tUHVibGljUEtDUzhQRU0oZil9aWYoaD09PVwicGtjczVwcnZcIil7dmFyIHc9bmV3IFJTQUtleSgpO3cucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhmKTtyZXR1cm4gd31pZihoPT09XCJwa2NzNXBydlwiKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGYpO3JldHVybiB3fWlmKGYuaW5kZXhPZihcIi1FTkQgUlNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpPT0tMSl7dmFyIGk9S0VZVVRJTC5nZXRIZXhGcm9tUEVNKGYsXCJSU0EgUFJJVkFURSBLRVlcIik7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5KGksbnVsbCxcInBrY3M1cHJ2XCIpfWlmKGYuaW5kZXhPZihcIi1FTkQgRFNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpPT0tMSl7dmFyIHU9dGhpcy5nZXRIZXhGcm9tUEVNKGYsXCJEU0EgUFJJVkFURSBLRVlcIik7dmFyIHQ9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMV0sXCIwMlwiKTt2YXIgcz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsyXSxcIjAyXCIpO3ZhciB2PUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzNdLFwiMDJcIik7dmFyIGo9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbNF0sXCIwMlwiKTt2YXIgaz1BU04xSEVYLmdldFZieUxpc3QodSwwLFs1XSxcIjAyXCIpO3ZhciB3PW5ldyBLSlVSLmNyeXB0by5EU0EoKTt3LnNldFByaXZhdGUobmV3IEJpZ0ludGVnZXIodCwxNiksbmV3IEJpZ0ludGVnZXIocywxNiksbmV3IEJpZ0ludGVnZXIodiwxNiksbmV3IEJpZ0ludGVnZXIoaiwxNiksbmV3IEJpZ0ludGVnZXIoaywxNikpO3JldHVybiB3fWlmKGYuaW5kZXhPZihcIi1FTkQgUFJJVkFURSBLRVktXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNKGYpfWlmKGYuaW5kZXhPZihcIi1FTkQgUlNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M1UEVNKGYsZSl9aWYoZi5pbmRleE9mKFwiLUVORCBFQyBQUklWQVRFIEtFWS1cIikhPS0xJiZmLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKSE9LTEpe3ZhciB1PUtFWVVUSUwuZ2V0RGVjcnlwdGVkS2V5SGV4KGYsZSk7dmFyIHc9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMV0sXCIwNFwiKTt2YXIgYz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsyLDBdLFwiMDZcIik7dmFyIG89QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMywwXSxcIjAzXCIpLnN1YnN0cigyKTt2YXIgYj1cIlwiO2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtjXSE9PXVuZGVmaW5lZCl7Yj1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbY119ZWxzZXt0aHJvd1widW5kZWZpbmVkIE9JRChoZXgpIGluIEtKVVIuY3J5cHRvLk9JRDogXCIrY312YXIgZD1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe25hbWU6Yn0pO2Quc2V0UHVibGljS2V5SGV4KG8pO2Quc2V0UHJpdmF0ZUtleUhleCh3KTtkLmlzUHVibGljPWZhbHNlO3JldHVybiBkfWlmKGYuaW5kZXhPZihcIi1FTkQgRFNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7dmFyIHU9S0VZVVRJTC5nZXREZWNyeXB0ZWRLZXlIZXgoZixlKTt2YXIgdD1BU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzJdLFwiMDJcIik7dmFyIHY9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbM10sXCIwMlwiKTt2YXIgaj1BU04xSEVYLmdldFZieUxpc3QodSwwLFs0XSxcIjAyXCIpO3ZhciBrPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzVdLFwiMDJcIik7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShuZXcgQmlnSW50ZWdlcih0LDE2KSxuZXcgQmlnSW50ZWdlcihzLDE2KSxuZXcgQmlnSW50ZWdlcih2LDE2KSxuZXcgQmlnSW50ZWdlcihqLDE2KSxuZXcgQmlnSW50ZWdlcihrLDE2KSk7cmV0dXJuIHd9aWYoZi5pbmRleE9mKFwiLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKGYsZSl9dGhyb3dcIm5vdCBzdXBwb3J0ZWQgYXJndW1lbnRcIn07S0VZVVRJTC5nZW5lcmF0ZUtleXBhaXI9ZnVuY3Rpb24oYSxjKXtpZihhPT1cIlJTQVwiKXt2YXIgYj1jO3ZhciBoPW5ldyBSU0FLZXkoKTtoLmdlbmVyYXRlKGIsXCIxMDAwMVwiKTtoLmlzUHJpdmF0ZT10cnVlO2guaXNQdWJsaWM9dHJ1ZTt2YXIgZj1uZXcgUlNBS2V5KCk7dmFyIGU9aC5uLnRvU3RyaW5nKDE2KTt2YXIgaT1oLmUudG9TdHJpbmcoMTYpO2Yuc2V0UHVibGljKGUsaSk7Zi5pc1ByaXZhdGU9ZmFsc2U7Zi5pc1B1YmxpYz10cnVlO3ZhciBrPXt9O2sucHJ2S2V5T2JqPWg7ay5wdWJLZXlPYmo9ZjtyZXR1cm4ga31lbHNle2lmKGE9PVwiRUNcIil7dmFyIGQ9Yzt2YXIgZz1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmR9KTt2YXIgaj1nLmdlbmVyYXRlS2V5UGFpckhleCgpO3ZhciBoPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZH0pO2guc2V0UHVibGljS2V5SGV4KGouZWNwdWJoZXgpO2guc2V0UHJpdmF0ZUtleUhleChqLmVjcHJ2aGV4KTtoLmlzUHJpdmF0ZT10cnVlO2guaXNQdWJsaWM9ZmFsc2U7dmFyIGY9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpkfSk7Zi5zZXRQdWJsaWNLZXlIZXgoai5lY3B1YmhleCk7Zi5pc1ByaXZhdGU9ZmFsc2U7Zi5pc1B1YmxpYz10cnVlO3ZhciBrPXt9O2sucHJ2S2V5T2JqPWg7ay5wdWJLZXlPYmo9ZjtyZXR1cm4ga31lbHNle3Rocm93XCJ1bmtub3duIGFsZ29yaXRobTogXCIrYX19fTtLRVlVVElMLmdldFBFTT1mdW5jdGlvbihhLHIsbyxnLGope3ZhciB2PUtKVVIuYXNuMTt2YXIgdT1LSlVSLmNyeXB0bztmdW5jdGlvbiBwKHMpe3ZhciB3PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se1wiaW50XCI6e2JpZ2ludDpzLm59fSx7XCJpbnRcIjpzLmV9LHtcImludFwiOntiaWdpbnQ6cy5kfX0se1wiaW50XCI6e2JpZ2ludDpzLnB9fSx7XCJpbnRcIjp7YmlnaW50OnMucX19LHtcImludFwiOntiaWdpbnQ6cy5kbXAxfX0se1wiaW50XCI6e2JpZ2ludDpzLmRtcTF9fSx7XCJpbnRcIjp7YmlnaW50OnMuY29lZmZ9fV19KTtyZXR1cm4gd31mdW5jdGlvbiBxKHcpe3ZhciBzPUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MX0se29jdHN0cjp7aGV4OncucHJ2S2V5SGV4fX0se3RhZzpbXCJhMFwiLHRydWUse29pZDp7bmFtZTp3LmN1cnZlTmFtZX19XX0se3RhZzpbXCJhMVwiLHRydWUse2JpdHN0cjp7aGV4OlwiMDBcIit3LnB1YktleUhleH19XX1dfSk7cmV0dXJuIHN9ZnVuY3Rpb24gbihzKXt2YXIgdz1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtcImludFwiOntiaWdpbnQ6cy5wfX0se1wiaW50XCI6e2JpZ2ludDpzLnF9fSx7XCJpbnRcIjp7YmlnaW50OnMuZ319LHtcImludFwiOntiaWdpbnQ6cy55fX0se1wiaW50XCI6e2JpZ2ludDpzLnh9fV19KTtyZXR1cm4gd31pZigoKHR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkpfHwodHlwZW9mIHUuRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgdS5EU0EpfHwodHlwZW9mIHUuRUNEU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiB1LkVDRFNBKSkmJmEuaXNQdWJsaWM9PXRydWUmJihyPT09dW5kZWZpbmVkfHxyPT1cIlBLQ1M4UFVCXCIpKXt2YXIgdD1uZXcgS0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8oYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFVCTElDIEtFWVwiKX1pZihyPT1cIlBLQ1MxUFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkmJihvPT09dW5kZWZpbmVkfHxvPT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PXAoYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUlNBIFBSSVZBVEUgS0VZXCIpfWlmKHI9PVwiUEtDUzFQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiYobz09PXVuZGVmaW5lZHx8bz09bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe25hbWU6YS5jdXJ2ZU5hbWV9KTt2YXIgbD1mLmdldEVuY29kZWRIZXgoKTt2YXIgZT1xKGEpO3ZhciBrPWUuZ2V0RW5jb2RlZEhleCgpO3ZhciBpPVwiXCI7aSs9di5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGwsXCJFQyBQQVJBTUVURVJTXCIpO2krPXYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRUMgUFJJVkFURSBLRVlcIik7cmV0dXJuIGl9aWYocj09XCJQS0NTMVBSVlwiJiZ0eXBlb2YgS0pVUi5jcnlwdG8uRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBJiYobz09PXVuZGVmaW5lZHx8bz09bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgdD1uKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIkRTQSBQUklWQVRFIEtFWVwiKX1pZihyPT1cIlBLQ1M1UFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkmJihvIT09dW5kZWZpbmVkJiZvIT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PXAoYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYoZz09PXVuZGVmaW5lZCl7Zz1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIlJTQVwiLG0sbyxnKX1pZihyPT1cIlBLQ1M1UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiYobyE9PXVuZGVmaW5lZCYmbyE9bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgdD1xKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKGc9PT11bmRlZmluZWQpe2c9XCJERVMtRURFMy1DQkNcIn1yZXR1cm4gdGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgoXCJFQ1wiLG0sbyxnKX1pZihyPT1cIlBLQ1M1UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0EmJihvIT09dW5kZWZpbmVkJiZvIT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PW4oYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYoZz09PXVuZGVmaW5lZCl7Zz1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIkRTQVwiLG0sbyxnKX12YXIgaD1mdW5jdGlvbih3LHMpe3ZhciB5PWIodyxzKTt2YXIgeD1uZXcgS0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7c2VxOlt7b2lkOntuYW1lOlwicGtjczVQQkVTMlwifX0se3NlcTpbe3NlcTpbe29pZDp7bmFtZTpcInBrY3M1UEJLREYyXCJ9fSx7c2VxOlt7b2N0c3RyOntoZXg6eS5wYmtkZjJTYWx0fX0se1wiaW50XCI6eS5wYmtkZjJJdGVyfV19XX0se3NlcTpbe29pZDp7bmFtZTpcImRlcy1FREUzLUNCQ1wifX0se29jdHN0cjp7aGV4OnkuZW5jcnlwdGlvblNjaGVtZUlWfX1dfV19XX0se29jdHN0cjp7aGV4OnkuY2lwaGVydGV4dH19XX0pO3JldHVybiB4LmdldEVuY29kZWRIZXgoKX07dmFyIGI9ZnVuY3Rpb24oRCxFKXt2YXIgeD0xMDA7dmFyIEM9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oOCk7dmFyIEI9XCJERVMtRURFMy1DQkNcIjt2YXIgcz1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSg4KTt2YXIgeT1DcnlwdG9KUy5QQktERjIoRSxDLHtrZXlTaXplOjE5Mi8zMixpdGVyYXRpb25zOnh9KTt2YXIgej1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKEQpO3ZhciBBPUNyeXB0b0pTLlRyaXBsZURFUy5lbmNyeXB0KHoseSx7aXY6c30pK1wiXCI7dmFyIHc9e307dy5jaXBoZXJ0ZXh0PUE7dy5wYmtkZjJTYWx0PUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KEMpO3cucGJrZGYySXRlcj14O3cuZW5jcnlwdGlvblNjaGVtZUFsZz1CO3cuZW5jcnlwdGlvblNjaGVtZUlWPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3JldHVybiB3fTtpZihyPT1cIlBLQ1M4UFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZD1wKGEpO3ZhciBjPWQuZ2V0RW5jb2RlZEhleCgpO3ZhciB0PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcInJzYUVuY3J5cHRpb25cIn19LHtcIm51bGxcIjp0cnVlfV19LHtvY3RzdHI6e2hleDpjfX1dfSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYobz09PXVuZGVmaW5lZHx8bz09bnVsbCl7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgaz1oKG0sbyk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX1pZihyPT1cIlBLQ1M4UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MX0se29jdHN0cjp7aGV4OmEucHJ2S2V5SGV4fX0se3RhZzpbXCJhMVwiLHRydWUse2JpdHN0cjp7aGV4OlwiMDBcIithLnB1YktleUhleH19XX1dfSk7dmFyIGM9ZC5nZXRFbmNvZGVkSGV4KCk7dmFyIHQ9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7c2VxOlt7b2lkOntuYW1lOlwiZWNQdWJsaWNLZXlcIn19LHtvaWQ6e25hbWU6YS5jdXJ2ZU5hbWV9fV19LHtvY3RzdHI6e2hleDpjfX1dfSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYobz09PXVuZGVmaW5lZHx8bz09bnVsbCl7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgaz1oKG0sbyk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX1pZihyPT1cIlBLQ1M4UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0EmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDphLnh9KTt2YXIgYz1kLmdldEVuY29kZWRIZXgoKTt2YXIgdD1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJkc2FcIn19LHtzZXE6W3tcImludFwiOntiaWdpbnQ6YS5wfX0se1wiaW50XCI6e2JpZ2ludDphLnF9fSx7XCJpbnRcIjp7YmlnaW50OmEuZ319XX1dfSx7b2N0c3RyOntoZXg6Y319XX0pO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKG89PT11bmRlZmluZWR8fG89PW51bGwpe3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIlBSSVZBVEUgS0VZXCIpfWVsc2V7dmFyIGs9aChtLG8pO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoayxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKX19dGhyb3dcInVuc3VwcG9ydGVkIG9iamVjdCBub3IgZm9ybWF0XCJ9O0tFWVVUSUwuZ2V0S2V5RnJvbUNTUlBFTT1mdW5jdGlvbihiKXt2YXIgYT1LRVlVVElMLmdldEhleEZyb21QRU0oYixcIkNFUlRJRklDQVRFIFJFUVVFU1RcIik7dmFyIGM9S0VZVVRJTC5nZXRLZXlGcm9tQ1NSSGV4KGEpO3JldHVybiBjfTtLRVlVVElMLmdldEtleUZyb21DU1JIZXg9ZnVuY3Rpb24oYSl7dmFyIGM9S0VZVVRJTC5wYXJzZUNTUkhleChhKTt2YXIgYj1LRVlVVElMLmdldEtleShjLnA4cHVia2V5aGV4LG51bGwsXCJwa2NzOHB1YlwiKTtyZXR1cm4gYn07S0VZVVRJTC5wYXJzZUNTUkhleD1mdW5jdGlvbihjKXt2YXIgYj17fTt2YXIgZT1jO2lmKGUuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDEpXCJ9dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSwwKTtpZihkLmxlbmd0aDwxKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwMilcIn1pZihlLnN1YnN0cihkWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAzKVwifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsZFswXSk7aWYoYS5sZW5ndGg8Myl7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDQpXCJ9Yi5wOHB1YmtleWhleD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGUsYVsyXSk7cmV0dXJuIGJ9O0tFWVVUSUwuZ2V0SldLRnJvbUtleT1mdW5jdGlvbihkKXt2YXIgYj17fTtpZihkIGluc3RhbmNlb2YgUlNBS2V5JiZkLmlzUHJpdmF0ZSl7Yi5rdHk9XCJSU0FcIjtiLm49aGV4dG9iNjR1KGQubi50b1N0cmluZygxNikpO2IuZT1oZXh0b2I2NHUoZC5lLnRvU3RyaW5nKDE2KSk7Yi5kPWhleHRvYjY0dShkLmQudG9TdHJpbmcoMTYpKTtiLnA9aGV4dG9iNjR1KGQucC50b1N0cmluZygxNikpO2IucT1oZXh0b2I2NHUoZC5xLnRvU3RyaW5nKDE2KSk7Yi5kcD1oZXh0b2I2NHUoZC5kbXAxLnRvU3RyaW5nKDE2KSk7Yi5kcT1oZXh0b2I2NHUoZC5kbXExLnRvU3RyaW5nKDE2KSk7Yi5xaT1oZXh0b2I2NHUoZC5jb2VmZi50b1N0cmluZygxNikpO3JldHVybiBifWVsc2V7aWYoZCBpbnN0YW5jZW9mIFJTQUtleSYmZC5pc1B1YmxpYyl7Yi5rdHk9XCJSU0FcIjtiLm49aGV4dG9iNjR1KGQubi50b1N0cmluZygxNikpO2IuZT1oZXh0b2I2NHUoZC5lLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGJ9ZWxzZXtpZihkIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJmQuaXNQcml2YXRlKXt2YXIgYT1kLmdldFNob3J0TklTVFBDdXJ2ZU5hbWUoKTtpZihhIT09XCJQLTI1NlwiJiZhIT09XCJQLTM4NFwiKXt0aHJvd1widW5zdXBwb3J0ZWQgY3VydmUgbmFtZSBmb3IgSldUOiBcIithfXZhciBjPWQuZ2V0UHVibGljS2V5WFlIZXgoKTtiLmt0eT1cIkVDXCI7Yi5jcnY9YTtiLng9aGV4dG9iNjR1KGMueCk7Yi55PWhleHRvYjY0dShjLnkpO2IuZD1oZXh0b2I2NHUoZC5wcnZLZXlIZXgpO3JldHVybiBifWVsc2V7aWYoZCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiZkLmlzUHVibGljKXt2YXIgYT1kLmdldFNob3J0TklTVFBDdXJ2ZU5hbWUoKTtpZihhIT09XCJQLTI1NlwiJiZhIT09XCJQLTM4NFwiKXt0aHJvd1widW5zdXBwb3J0ZWQgY3VydmUgbmFtZSBmb3IgSldUOiBcIithfXZhciBjPWQuZ2V0UHVibGljS2V5WFlIZXgoKTtiLmt0eT1cIkVDXCI7Yi5jcnY9YTtiLng9aGV4dG9iNjR1KGMueCk7Yi55PWhleHRvYjY0dShjLnkpO3JldHVybiBifX19fXRocm93XCJub3Qgc3VwcG9ydGVkIGtleSBvYmplY3RcIn07XG4vKiEgcnNhcGVtLTEuMS5qcyAoYykgMjAxMiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5mdW5jdGlvbiBfcnNhcGVtX3BlbVRvQmFzZTY0KGIpe3ZhciBhPWI7YT1hLnJlcGxhY2UoXCItLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tXCIsXCJcIik7YT1hLnJlcGxhY2UoXCItLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLVwiLFwiXCIpO2E9YS5yZXBsYWNlKC9bIFxcbl0rL2csXCJcIik7cmV0dXJuIGF9ZnVuY3Rpb24gX3JzYXBlbV9nZXRQb3NBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGQpe3ZhciBqPW5ldyBBcnJheSgpO3ZhciBrPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooZCwwKTt2YXIgZj1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxrKTt2YXIgaD1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxmKTt2YXIgYj1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxoKTt2YXIgbD1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxiKTt2YXIgZT1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxsKTt2YXIgZz1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxlKTt2YXIgYz1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxnKTt2YXIgaT1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxjKTtqLnB1c2goayxmLGgsYixsLGUsZyxjLGkpO3JldHVybiBqfWZ1bmN0aW9uIF9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGkpe3ZhciBvPV9yc2FwZW1fZ2V0UG9zQXJyYXlPZkNoaWxkcmVuRnJvbUhleChpKTt2YXIgcj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bMF0pO3ZhciBmPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1sxXSk7dmFyIGo9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzJdKTt2YXIgaz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bM10pO3ZhciBjPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s0XSk7dmFyIGI9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzVdKTt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bNl0pO3ZhciBnPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s3XSk7dmFyIGw9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzhdKTt2YXIgbT1uZXcgQXJyYXkoKTttLnB1c2gocixmLGosayxjLGIsaCxnLGwpO3JldHVybiBtfWZ1bmN0aW9uIF9yc2FwZW1fcmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhjKXt2YXIgYj1fcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChjKTt0aGlzLnNldFByaXZhdGVFeChiWzFdLGJbMl0sYlszXSxiWzRdLGJbNV0sYls2XSxiWzddLGJbOF0pfWZ1bmN0aW9uIF9yc2FwZW1fcmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nKGUpe3ZhciBjPV9yc2FwZW1fcGVtVG9CYXNlNjQoZSk7dmFyIGQ9YjY0dG9oZXgoYyk7dmFyIGI9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoZCk7dGhpcy5zZXRQcml2YXRlRXgoYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdLGJbNl0sYls3XSxiWzhdKX1SU0FLZXkucHJvdG90eXBlLnJlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZz1fcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZztSU0FLZXkucHJvdG90eXBlLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmc9X3JzYXBlbV9yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nO1xuLyohIHJzYXNpZ24tMS4yLjcuanMgKGMpIDIwMTIgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIF9SRV9IRVhERUNPTkxZPW5ldyBSZWdFeHAoXCJcIik7X1JFX0hFWERFQ09OTFkuY29tcGlsZShcIlteMC05YS1mXVwiLFwiZ2lcIik7ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0SGV4UGFkZGVkRGlnZXN0SW5mb0ZvclN0cmluZyhkLGUsYSl7dmFyIGI9ZnVuY3Rpb24oZil7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhmLGEpfTt2YXIgYz1iKGQpO3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmdldFBhZGRlZERpZ2VzdEluZm9IZXgoYyxhLGUpfWZ1bmN0aW9uIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKGUsZCl7dmFyIGM9XCJcIjt2YXIgYT1kLzQtZS5sZW5ndGg7Zm9yKHZhciBiPTA7YjxhO2IrKyl7Yz1jK1wiMFwifXJldHVybiBjK2V9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnblN0cmluZyhkLGEpe3ZhciBiPWZ1bmN0aW9uKGUpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoZSxhKX07dmFyIGM9YihkKTtyZXR1cm4gdGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoKGMsYSl9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnbldpdGhNZXNzYWdlSGFzaChlLGMpe3ZhciBmPUtKVVIuY3J5cHRvLlV0aWwuZ2V0UGFkZGVkRGlnZXN0SW5mb0hleChlLGMsdGhpcy5uLmJpdExlbmd0aCgpKTt2YXIgYj1wYXJzZUJpZ0ludChmLDE2KTt2YXIgZD10aGlzLmRvUHJpdmF0ZShiKTt2YXIgYT1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gX3plcm9QYWRkaW5nT2ZTaWduYXR1cmUoYSx0aGlzLm4uYml0TGVuZ3RoKCkpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMShhKXtyZXR1cm4gX3JzYXNpZ25fc2lnblN0cmluZy5jYWxsKHRoaXMsYSxcInNoYTFcIil9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEEyNTYoYSl7cmV0dXJuIF9yc2FzaWduX3NpZ25TdHJpbmcuY2FsbCh0aGlzLGEsXCJzaGEyNTZcIil9ZnVuY3Rpb24gcHNzX21nZjFfc3RyKGMsYSxlKXt2YXIgYj1cIlwiLGQ9MDt3aGlsZShiLmxlbmd0aDxhKXtiKz1oZXh0b3JzdHIoZShyc3RydG9oZXgoYytTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxbKGQmNDI3ODE5MDA4MCk+PjI0LChkJjE2NzExNjgwKT4+MTYsKGQmNjUyODApPj44LGQmMjU1XSkpKSk7ZCs9MX1yZXR1cm4gYn1mdW5jdGlvbiBfcnNhc2lnbl9zaWduU3RyaW5nUFNTKGUsYSxkKXt2YXIgYz1mdW5jdGlvbihmKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGYsYSl9O3ZhciBiPWMocnN0cnRvaGV4KGUpKTtpZihkPT09dW5kZWZpbmVkKXtkPS0xfXJldHVybiB0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2hQU1MoYixhLGQpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2hQU1MobCxhLGspe3ZhciBiPWhleHRvcnN0cihsKTt2YXIgZz1iLmxlbmd0aDt2YXIgbT10aGlzLm4uYml0TGVuZ3RoKCktMTt2YXIgYz1NYXRoLmNlaWwobS84KTt2YXIgZDt2YXIgbz1mdW5jdGlvbihpKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGksYSl9O2lmKGs9PT0tMXx8az09PXVuZGVmaW5lZCl7az1nfWVsc2V7aWYoaz09PS0yKXtrPWMtZy0yfWVsc2V7aWYoazwtMil7dGhyb3dcImludmFsaWQgc2FsdCBsZW5ndGhcIn19fWlmKGM8KGcraysyKSl7dGhyb3dcImRhdGEgdG9vIGxvbmdcIn12YXIgZj1cIlwiO2lmKGs+MCl7Zj1uZXcgQXJyYXkoayk7bmV3IFNlY3VyZVJhbmRvbSgpLm5leHRCeXRlcyhmKTtmPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGYpfXZhciBuPWhleHRvcnN0cihvKHJzdHJ0b2hleChcIlxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcIitiK2YpKSk7dmFyIGo9W107Zm9yKGQ9MDtkPGMtay1nLTI7ZCs9MSl7altkXT0wfXZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGopK1wiXFx4MDFcIitmO3ZhciBoPXBzc19tZ2YxX3N0cihuLGUubGVuZ3RoLG8pO3ZhciBxPVtdO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKz0xKXtxW2RdPWUuY2hhckNvZGVBdChkKV5oLmNoYXJDb2RlQXQoZCl9dmFyIHA9KDY1MjgwPj4oOCpjLW0pKSYyNTU7cVswXSY9fnA7Zm9yKGQ9MDtkPGc7ZCsrKXtxLnB1c2gobi5jaGFyQ29kZUF0KGQpKX1xLnB1c2goMTg4KTtyZXR1cm4gX3plcm9QYWRkaW5nT2ZTaWduYXR1cmUodGhpcy5kb1ByaXZhdGUobmV3IEJpZ0ludGVnZXIocSkpLnRvU3RyaW5nKDE2KSx0aGlzLm4uYml0TGVuZ3RoKCkpfWZ1bmN0aW9uIF9yc2FzaWduX2dldERlY3J5cHRTaWduYXR1cmVCSShhLGQsYyl7dmFyIGI9bmV3IFJTQUtleSgpO2Iuc2V0UHVibGljKGQsYyk7dmFyIGU9Yi5kb1B1YmxpYyhhKTtyZXR1cm4gZX1mdW5jdGlvbiBfcnNhc2lnbl9nZXRIZXhEaWdlc3RJbmZvRnJvbVNpZyhhLGMsYil7dmFyIGU9X3JzYXNpZ25fZ2V0RGVjcnlwdFNpZ25hdHVyZUJJKGEsYyxiKTt2YXIgZD1lLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3JldHVybiBkfWZ1bmN0aW9uIF9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGYpe2Zvcih2YXIgZSBpbiBLSlVSLmNyeXB0by5VdGlsLkRJR0VTVElORk9IRUFEKXt2YXIgZD1LSlVSLmNyeXB0by5VdGlsLkRJR0VTVElORk9IRUFEW2VdO3ZhciBiPWQubGVuZ3RoO2lmKGYuc3Vic3RyaW5nKDAsYik9PWQpe3ZhciBjPVtlLGYuc3Vic3RyaW5nKGIpXTtyZXR1cm4gY319cmV0dXJuW119ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5U2lnbmF0dXJlV2l0aEFyZ3MoZixiLGcsail7dmFyIGU9X3JzYXNpZ25fZ2V0SGV4RGlnZXN0SW5mb0Zyb21TaWcoYixnLGopO3ZhciBoPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGUpO2lmKGgubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9aFswXTt2YXIgaT1oWzFdO3ZhciBhPWZ1bmN0aW9uKGspe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoayxkKX07dmFyIGM9YShmKTtyZXR1cm4oaT09Yyl9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZShjLGIpe3ZhciBkPXBhcnNlQmlnSW50KGMsMTYpO3ZhciBhPV9yc2FzaWduX3ZlcmlmeVNpZ25hdHVyZVdpdGhBcmdzKGIsZCx0aGlzLm4udG9TdHJpbmcoMTYpLHRoaXMuZS50b1N0cmluZygxNikpO3JldHVybiBhfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVN0cmluZyhmLGope2o9ai5yZXBsYWNlKF9SRV9IRVhERUNPTkxZLFwiXCIpO2o9ai5yZXBsYWNlKC9bIFxcbl0rL2csXCJcIik7dmFyIGI9cGFyc2VCaWdJbnQoaiwxNik7aWYoYi5iaXRMZW5ndGgoKT50aGlzLm4uYml0TGVuZ3RoKCkpe3JldHVybiAwfXZhciBpPXRoaXMuZG9QdWJsaWMoYik7dmFyIGU9aS50b1N0cmluZygxNikucmVwbGFjZSgvXjFmKzAwLyxcIlwiKTt2YXIgZz1fcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhlKTtpZihnLmxlbmd0aD09MCl7cmV0dXJuIGZhbHNlfXZhciBkPWdbMF07dmFyIGg9Z1sxXTt2YXIgYT1mdW5jdGlvbihrKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGssZCl9O3ZhciBjPWEoZik7cmV0dXJuKGg9PWMpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVdpdGhNZXNzYWdlSGFzaChlLGEpe2E9YS5yZXBsYWNlKF9SRV9IRVhERUNPTkxZLFwiXCIpO2E9YS5yZXBsYWNlKC9bIFxcbl0rL2csXCJcIik7dmFyIGI9cGFyc2VCaWdJbnQoYSwxNik7aWYoYi5iaXRMZW5ndGgoKT50aGlzLm4uYml0TGVuZ3RoKCkpe3JldHVybiAwfXZhciBoPXRoaXMuZG9QdWJsaWMoYik7dmFyIGc9aC50b1N0cmluZygxNikucmVwbGFjZSgvXjFmKzAwLyxcIlwiKTt2YXIgYz1fcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhnKTtpZihjLmxlbmd0aD09MCl7cmV0dXJuIGZhbHNlfXZhciBkPWNbMF07dmFyIGY9Y1sxXTtyZXR1cm4oZj09ZSl9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5U3RyaW5nUFNTKGMsYixhLGYpe3ZhciBlPWZ1bmN0aW9uKGcpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoZyxhKX07dmFyIGQ9ZShyc3RydG9oZXgoYykpO2lmKGY9PT11bmRlZmluZWQpe2Y9LTF9cmV0dXJuIHRoaXMudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTKGQsYixhLGYpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUyhmLHMsbCxjKXt2YXIgaz1uZXcgQmlnSW50ZWdlcihzLDE2KTtpZihrLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIGZhbHNlfXZhciByPWZ1bmN0aW9uKGkpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoaSxsKX07dmFyIGo9aGV4dG9yc3RyKGYpO3ZhciBoPWoubGVuZ3RoO3ZhciBnPXRoaXMubi5iaXRMZW5ndGgoKS0xO3ZhciBtPU1hdGguY2VpbChnLzgpO3ZhciBxO2lmKGM9PT0tMXx8Yz09PXVuZGVmaW5lZCl7Yz1ofWVsc2V7aWYoYz09PS0yKXtjPW0taC0yfWVsc2V7aWYoYzwtMil7dGhyb3dcImludmFsaWQgc2FsdCBsZW5ndGhcIn19fWlmKG08KGgrYysyKSl7dGhyb3dcImRhdGEgdG9vIGxvbmdcIn12YXIgYT10aGlzLmRvUHVibGljKGspLnRvQnl0ZUFycmF5KCk7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErPTEpe2FbcV0mPTI1NX13aGlsZShhLmxlbmd0aDxtKXthLnVuc2hpZnQoMCl9aWYoYVttLTFdIT09MTg4KXt0aHJvd1wiZW5jb2RlZCBtZXNzYWdlIGRvZXMgbm90IGVuZCBpbiAweGJjXCJ9YT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxhKTt2YXIgZD1hLnN1YnN0cigwLG0taC0xKTt2YXIgZT1hLnN1YnN0cihkLmxlbmd0aCxoKTt2YXIgcD0oNjUyODA+Pig4Km0tZykpJjI1NTtpZigoZC5jaGFyQ29kZUF0KDApJnApIT09MCl7dGhyb3dcImJpdHMgYmV5b25kIGtleXNpemUgbm90IHplcm9cIn12YXIgbj1wc3NfbWdmMV9zdHIoZSxkLmxlbmd0aCxyKTt2YXIgbz1bXTtmb3IocT0wO3E8ZC5sZW5ndGg7cSs9MSl7b1txXT1kLmNoYXJDb2RlQXQocSlebi5jaGFyQ29kZUF0KHEpfW9bMF0mPX5wO3ZhciBiPW0taC1jLTI7Zm9yKHE9MDtxPGI7cSs9MSl7aWYob1txXSE9PTApe3Rocm93XCJsZWZ0bW9zdCBvY3RldHMgbm90IHplcm9cIn19aWYob1tiXSE9PTEpe3Rocm93XCIweDAxIG1hcmtlciBub3QgZm91bmRcIn1yZXR1cm4gZT09PWhleHRvcnN0cihyKHJzdHJ0b2hleChcIlxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcIitqK1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLG8uc2xpY2UoLWMpKSkpKX1SU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoTWVzc2FnZUhhc2g9X3JzYXNpZ25fc2lnbldpdGhNZXNzYWdlSGFzaDtSU0FLZXkucHJvdG90eXBlLnNpZ25TdHJpbmc9X3JzYXNpZ25fc2lnblN0cmluZztSU0FLZXkucHJvdG90eXBlLnNpZ25TdHJpbmdXaXRoU0hBMT1fcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTE7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nV2l0aFNIQTI1Nj1fcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTI1NjtSU0FLZXkucHJvdG90eXBlLnNpZ249X3JzYXNpZ25fc2lnblN0cmluZztSU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoU0hBMT1fcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTE7UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aFNIQTI1Nj1fcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTI1NjtSU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoTWVzc2FnZUhhc2hQU1M9X3JzYXNpZ25fc2lnbldpdGhNZXNzYWdlSGFzaFBTUztSU0FLZXkucHJvdG90eXBlLnNpZ25TdHJpbmdQU1M9X3JzYXNpZ25fc2lnblN0cmluZ1BTUztSU0FLZXkucHJvdG90eXBlLnNpZ25QU1M9X3JzYXNpZ25fc2lnblN0cmluZ1BTUztSU0FLZXkuU0FMVF9MRU5fSExFTj0tMTtSU0FLZXkuU0FMVF9MRU5fTUFYPS0yO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoPV9yc2FzaWduX3ZlcmlmeVdpdGhNZXNzYWdlSGFzaDtSU0FLZXkucHJvdG90eXBlLnZlcmlmeVN0cmluZz1fcnNhc2lnbl92ZXJpZnlTdHJpbmc7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlIZXhTaWduYXR1cmVGb3JNZXNzYWdlPV9yc2FzaWduX3ZlcmlmeUhleFNpZ25hdHVyZUZvck1lc3NhZ2U7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnk9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5SGV4U2lnbmF0dXJlRm9yQnl0ZUFycmF5TWVzc2FnZT1fcnNhc2lnbl92ZXJpZnlIZXhTaWduYXR1cmVGb3JNZXNzYWdlO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTPV9yc2FzaWduX3ZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUztSU0FLZXkucHJvdG90eXBlLnZlcmlmeVN0cmluZ1BTUz1fcnNhc2lnbl92ZXJpZnlTdHJpbmdQU1M7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlQU1M9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nUFNTO1JTQUtleS5TQUxUX0xFTl9SRUNPVkVSPS0yO1xuLyohIHg1MDktMS4xLjkuanMgKGMpIDIwMTItMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5mdW5jdGlvbiBYNTA5KCl7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBPW51bGw7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hOPW51bGw7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hFPW51bGw7dGhpcy5oZXg9bnVsbDt0aGlzLmdldFNlcmlhbE51bWJlckhleD1mdW5jdGlvbigpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCwxXSl9O3RoaXMuZ2V0U2lnbmF0dXJlQWxnb3JpdGhtRmllbGQ9ZnVuY3Rpb24oKXt2YXIgYj1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCwyLDBdKTt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQoYik7dmFyIGM9S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGEpO3JldHVybiBjfTt0aGlzLmdldElzc3VlckhleD1mdW5jdGlvbigpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDNdKX07dGhpcy5nZXRJc3N1ZXJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWDUwOS5oZXgyZG4oQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCwzXSkpfTt0aGlzLmdldFN1YmplY3RIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCw1XSl9O3RoaXMuZ2V0U3ViamVjdFN0cmluZz1mdW5jdGlvbigpe3JldHVybiBYNTA5LmhleDJkbihBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDVdKSl9O3RoaXMuZ2V0Tm90QmVmb3JlPWZ1bmN0aW9uKCl7dmFyIGE9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsNCwwXSk7YT1hLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTthPWRlY29kZVVSSUNvbXBvbmVudChhKTtyZXR1cm4gYX07dGhpcy5nZXROb3RBZnRlcj1mdW5jdGlvbigpe3ZhciBhPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDQsMV0pO2E9YS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIik7YT1kZWNvZGVVUklDb21wb25lbnQoYSk7cmV0dXJuIGF9O3RoaXMucmVhZENlcnRQRU09ZnVuY3Rpb24oYyl7dmFyIGU9WDUwOS5wZW1Ub0hleChjKTt2YXIgYj1YNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRIZXgoZSk7dmFyIGQ9bmV3IFJTQUtleSgpO2Quc2V0UHVibGljKGJbMF0sYlsxXSk7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBPWQ7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hOPWJbMF07dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hFPWJbMV07dGhpcy5oZXg9ZX07dGhpcy5yZWFkQ2VydFBFTVdpdGhvdXRSU0FJbml0PWZ1bmN0aW9uKGMpe3ZhciBkPVg1MDkucGVtVG9IZXgoYyk7dmFyIGI9WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4KGQpO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQS5zZXRQdWJsaWMoYlswXSxiWzFdKTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaE49YlswXTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaEU9YlsxXTt0aGlzLmhleD1kfTt0aGlzLmdldEluZm89ZnVuY3Rpb24oKXt2YXIgcD1cIkJhc2ljIEZpZWxkc1xcblwiO3ArPVwiICBzZXJpYWwgbnVtYmVyOiBcIit0aGlzLmdldFNlcmlhbE51bWJlckhleCgpK1wiXFxuXCI7cCs9XCIgIHNpZ25hdHVyZSBhbGdvcml0aG06IFwiK3RoaXMuZ2V0U2lnbmF0dXJlQWxnb3JpdGhtRmllbGQoKStcIlxcblwiO3ArPVwiICBpc3N1ZXI6IFwiK3RoaXMuZ2V0SXNzdWVyU3RyaW5nKCkrXCJcXG5cIjtwKz1cIiAgbm90QmVmb3JlOiBcIit0aGlzLmdldE5vdEJlZm9yZSgpK1wiXFxuXCI7cCs9XCIgIG5vdEFmdGVyOiBcIit0aGlzLmdldE5vdEFmdGVyKCkrXCJcXG5cIjtwKz1cIiAgc3ViamVjdDogXCIrdGhpcy5nZXRTdWJqZWN0U3RyaW5nKCkrXCJcXG5cIjtwKz1cIiAgc3ViamVjdCBwdWJsaWMga2V5IGluZm86IFxcblwiO3ZhciBqPVg1MDkuZ2V0U3ViamVjdFB1YmxpY0tleUluZm9Qb3NGcm9tQ2VydEhleCh0aGlzLmhleCk7dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaih0aGlzLmhleCxqKTt2YXIgbj1LRVlVVElMLmdldEtleShkLG51bGwsXCJwa2NzOHB1YlwiKTtpZihuIGluc3RhbmNlb2YgUlNBS2V5KXtwKz1cIiAgICBrZXkgYWxnb3JpdGhtOiBSU0FcXG5cIjtwKz1cIiAgICBuPVwiK24ubi50b1N0cmluZygxNikuc3Vic3RyKDAsMTYpK1wiLi4uXFxuXCI7cCs9XCIgICAgZT1cIituLmUudG9TdHJpbmcoMTYpK1wiXFxuXCJ9cCs9XCJYNTA5djMgRXh0ZW5zaW9uczpcXG5cIjt2YXIgbT1YNTA5LmdldFYzRXh0SW5mb0xpc3RPZkNlcnRIZXgodGhpcy5oZXgpO2Zvcih2YXIgZT0wO2U8bS5sZW5ndGg7ZSsrKXt2YXIgYj1tW2VdO3ZhciBvPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShiLm9pZCk7aWYobz09PVwiXCIpe289Yi5vaWR9dmFyIGs9XCJcIjtpZihiLmNyaXRpY2FsPT09dHJ1ZSl7az1cIkNSSVRJQ0FMXCJ9cCs9XCIgIFwiK28rXCIgXCIraytcIjpcXG5cIjtpZihvPT09XCJiYXNpY0NvbnN0cmFpbnRzXCIpe3ZhciBnPVg1MDkuZ2V0RXh0QmFzaWNDb25zdHJhaW50cyh0aGlzLmhleCk7aWYoZy5jQT09PXVuZGVmaW5lZCl7cCs9XCIgICAge31cXG5cIn1lbHNle3ArPVwiICAgIGNBPXRydWVcIjtpZihnLnBhdGhMZW4hPT11bmRlZmluZWQpe3ArPVwiLCBwYXRoTGVuPVwiK2cucGF0aExlbn1wKz1cIlxcblwifX1lbHNle2lmKG89PT1cImtleVVzYWdlXCIpe3ArPVwiICAgIFwiK1g1MDkuZ2V0RXh0S2V5VXNhZ2VTdHJpbmcodGhpcy5oZXgpK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJzdWJqZWN0S2V5SWRlbnRpZmllclwiKXtwKz1cIiAgICBcIitYNTA5LmdldEV4dFN1YmplY3RLZXlJZGVudGlmaWVyKHRoaXMuaGV4KStcIlxcblwifWVsc2V7aWYobz09PVwiYXV0aG9yaXR5S2V5SWRlbnRpZmllclwiKXt2YXIgYT1YNTA5LmdldEV4dEF1dGhvcml0eUtleUlkZW50aWZpZXIodGhpcy5oZXgpO2lmKGEua2lkIT09dW5kZWZpbmVkKXtwKz1cIiAgICBraWQ9XCIrYS5raWQrXCJcXG5cIn19ZWxzZXtpZihvPT09XCJleHRLZXlVc2FnZVwiKXt2YXIgaD1YNTA5LmdldEV4dEV4dEtleVVzYWdlTmFtZSh0aGlzLmhleCk7cCs9XCIgICAgXCIraC5qb2luKFwiLCBcIikrXCJcXG5cIn1lbHNle2lmKG89PT1cInN1YmplY3RBbHROYW1lXCIpe3ZhciBmPVg1MDkuZ2V0RXh0U3ViamVjdEFsdE5hbWUodGhpcy5oZXgpO3ArPVwiICAgIFwiK2Yuam9pbihcIiwgXCIpK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJjUkxEaXN0cmlidXRpb25Qb2ludHNcIil7dmFyIGw9WDUwOS5nZXRFeHRDUkxEaXN0cmlidXRpb25Qb2ludHNVUkkodGhpcy5oZXgpO3ArPVwiICAgIFwiK2wrXCJcXG5cIn1lbHNle2lmKG89PT1cImF1dGhvcml0eUluZm9BY2Nlc3NcIil7dmFyIGM9WDUwOS5nZXRFeHRBSUFJbmZvKHRoaXMuaGV4KTtpZihjLm9jc3AhPT11bmRlZmluZWQpe3ArPVwiICAgIG9jc3A6IFwiK2Mub2NzcC5qb2luKFwiLFwiKStcIlxcblwifWlmKGMuY2Fpc3N1ZXIhPT11bmRlZmluZWQpe3ArPVwiICAgIGNhaXNzdWVyOiBcIitjLmNhaXNzdWVyLmpvaW4oXCIsXCIpK1wiXFxuXCJ9fX19fX19fX19cCs9XCJzaWduYXR1cmUgYWxnb3JpdGhtOiBcIitYNTA5LmdldFNpZ25hdHVyZUFsZ29yaXRobU5hbWUodGhpcy5oZXgpK1wiXFxuXCI7cCs9XCJzaWduYXR1cmU6IFwiK1g1MDkuZ2V0U2lnbmF0dXJlVmFsdWVIZXgodGhpcy5oZXgpLnN1YnN0cigwLDE2KStcIi4uLlxcblwiO3JldHVybiBwfX1YNTA5LnBlbVRvQmFzZTY0PWZ1bmN0aW9uKGEpe3ZhciBiPWE7Yj1iLnJlcGxhY2UoXCItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cIixcIlwiKTtiPWIucmVwbGFjZShcIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cIixcIlwiKTtiPWIucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3JldHVybiBifTtYNTA5LnBlbVRvSGV4PWZ1bmN0aW9uKGEpe3ZhciBjPVg1MDkucGVtVG9CYXNlNjQoYSk7dmFyIGI9YjY0dG9oZXgoYyk7cmV0dXJuIGJ9O1g1MDkuZ2V0U3ViamVjdFB1YmxpY0tleVBvc0Zyb21DZXJ0SGV4PWZ1bmN0aW9uKGYpe3ZhciBlPVg1MDkuZ2V0U3ViamVjdFB1YmxpY0tleUluZm9Qb3NGcm9tQ2VydEhleChmKTtpZihlPT0tMSl7cmV0dXJuIC0xfXZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsZSk7aWYoYi5sZW5ndGghPTIpe3JldHVybiAtMX12YXIgZD1iWzFdO2lmKGYuc3Vic3RyaW5nKGQsZCsyKSE9XCIwM1wiKXtyZXR1cm4gLTF9dmFyIGM9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihmLGQpO2lmKGYuc3Vic3RyaW5nKGMsYysyKSE9XCIwMFwiKXtyZXR1cm4gLTF9cmV0dXJuIGMrMn07WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5SW5mb1Bvc0Zyb21DZXJ0SGV4PWZ1bmN0aW9uKGQpe3ZhciBjPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooZCwwKTt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLGMpO2lmKGIubGVuZ3RoPDEpe3JldHVybiAtMX1pZihkLnN1YnN0cmluZyhiWzBdLGJbMF0rMTApPT1cImEwMDMwMjAxMDJcIil7aWYoYi5sZW5ndGg8Nil7cmV0dXJuIC0xfXJldHVybiBiWzZdfWVsc2V7aWYoYi5sZW5ndGg8NSl7cmV0dXJuIC0xfXJldHVybiBiWzVdfX07WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4PWZ1bmN0aW9uKGYpe3ZhciBlPVg1MDkuZ2V0U3ViamVjdFB1YmxpY0tleVBvc0Zyb21DZXJ0SGV4KGYpO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsZSk7aWYoYi5sZW5ndGghPTIpe3JldHVybltdfXZhciBkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsYlswXSk7dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixiWzFdKTtpZihkIT1udWxsJiZjIT1udWxsKXtyZXR1cm5bZCxjXX1lbHNle3JldHVybltdfX07WDUwOS5nZXRIZXhUYnNDZXJ0aWZpY2F0ZUZyb21DZXJ0PWZ1bmN0aW9uKGIpe3ZhciBhPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooYiwwKTtyZXR1cm4gYX07WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0UEVNPWZ1bmN0aW9uKGMpe3ZhciBkPVg1MDkucGVtVG9IZXgoYyk7dmFyIGI9WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4KGQpO3JldHVybiBifTtYNTA5LmhleDJkbj1mdW5jdGlvbihlKXt2YXIgZj1cIlwiO3ZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsMCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBiPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZSxjW2RdKTtmPWYrXCIvXCIrWDUwOS5oZXgycmRuKGIpfXJldHVybiBmfTtYNTA5LmhleDJyZG49ZnVuY3Rpb24oYSl7dmFyIGY9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QoYSwwLFswLDBdKTt2YXIgZT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoYSwwLFswLDFdKTt2YXIgYz1cIlwiO3RyeXtjPVg1MDkuRE5fQVRUUkhFWFtmXX1jYXRjaChiKXtjPWZ9ZT1lLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTt2YXIgZD1kZWNvZGVVUklDb21wb25lbnQoZSk7cmV0dXJuIGMrXCI9XCIrZH07WDUwOS5ETl9BVFRSSEVYPXtcIjA2MDM1NTA0MDZcIjpcIkNcIixcIjA2MDM1NTA0MGFcIjpcIk9cIixcIjA2MDM1NTA0MGJcIjpcIk9VXCIsXCIwNjAzNTUwNDAzXCI6XCJDTlwiLFwiMDYwMzU1MDQwNVwiOlwiU05cIixcIjA2MDM1NTA0MDhcIjpcIlNUXCIsXCIwNjAzNTUwNDA3XCI6XCJMXCIsXCIwNjAzNTUwNDA5XCI6XCJzdHJlZXRBZGRyZXNzXCIsXCIwNjAzNTUwNDBmXCI6XCJidXNpbmVzc0NhdGVnb3J5XCIsXCIwNjAzNTUwNDExXCI6XCJwb3N0YWxDb2RlXCIsXCIwNjBiMmIwNjAxMDQwMTgyMzczYzAyMDEwMlwiOlwianVyaXNkaWN0aW9uT2ZJbmNvcnBvcmF0aW9uU1BcIixcIjA2MGIyYjA2MDEwNDAxODIzNzNjMDIwMTAzXCI6XCJqdXJpc2RpY3Rpb25PZkluY29ycG9yYXRpb25DXCIsfTtYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0UEVNPWZ1bmN0aW9uKGYpe3ZhciBjPVg1MDkuZ2V0UHVibGljS2V5SW5mb1Byb3BPZkNlcnRQRU0oZik7aWYoYy5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3ZhciBpPUtFWVVUSUwucGFyc2VQdWJsaWNSYXdSU0FLZXlIZXgoYy5rZXloZXgpO3ZhciBqPW5ldyBSU0FLZXkoKTtqLnNldFB1YmxpYyhpLm4saS5lKTtyZXR1cm4gan1lbHNle2lmKGMuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe3ZhciBlPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtjLmFsZ3BhcmFtXTt2YXIgaj1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmUsaW5mbzpjLmtleWhleH0pO2ouc2V0UHVibGljS2V5SGV4KGMua2V5aGV4KTtyZXR1cm4gan1lbHNle2lmKGMuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciBiPUFTTjFIRVguZ2V0VmJ5TGlzdChjLmFsZ3BhcmFtLDAsWzBdLFwiMDJcIik7dmFyIGE9QVNOMUhFWC5nZXRWYnlMaXN0KGMuYWxncGFyYW0sMCxbMV0sXCIwMlwiKTt2YXIgZD1BU04xSEVYLmdldFZieUxpc3QoYy5hbGdwYXJhbSwwLFsyXSxcIjAyXCIpO3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMua2V5aGV4LDApO2g9aC5zdWJzdHIoMik7dmFyIGo9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO2ouc2V0UHVibGljKG5ldyBCaWdJbnRlZ2VyKGIsMTYpLG5ldyBCaWdJbnRlZ2VyKGEsMTYpLG5ldyBCaWdJbnRlZ2VyKGQsMTYpLG5ldyBCaWdJbnRlZ2VyKGgsMTYpKTtyZXR1cm4gan1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBrZXlcIn19fX07WDUwOS5nZXRQdWJsaWNLZXlJbmZvUHJvcE9mQ2VydFBFTT1mdW5jdGlvbihlKXt2YXIgaT17fTtpLmFsZ3BhcmFtPW51bGw7dmFyIGY9WDUwOS5wZW1Ub0hleChlKTt2YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLDApO2lmKGQubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDEpXCJ9aWYoZi5zdWJzdHIoZFswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDIpXCJ9dmFyIGM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixkWzBdKTt2YXIgZz02O2lmKGYuc3Vic3RyKGNbMF0sMikhPT1cImEwXCIpe2c9NX1pZihjLmxlbmd0aDxnKzEpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMylcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGNbZ10pO2lmKGEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDQpXCJ9dmFyIGg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixhWzBdKTtpZihoLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA1KVwifWkuYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsaFswXSk7aWYoZi5zdWJzdHIoaFsxXSwyKT09XCIwNlwiKXtpLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsaFsxXSl9ZWxzZXtpZihmLnN1YnN0cihoWzFdLDIpPT1cIjMwXCIpe2kuYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihmLGhbMV0pfX1pZihmLnN1YnN0cihhWzFdLDIpIT1cIjAzXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNilcIn12YXIgYj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGFbMV0pO2kua2V5aGV4PWIuc3Vic3RyKDIpO3JldHVybiBpfTtYNTA5LmdldFB1YmxpY0tleUluZm9Qb3NPZkNlcnRIRVg9ZnVuY3Rpb24oYyl7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooYywwKTtpZihiLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAxKVwifWlmKGMuc3Vic3RyKGJbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAyKVwifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsYlswXSk7aWYoYS5sZW5ndGg8Nyl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAzKVwifXJldHVybiBhWzZdfTtYNTA5LmdldFYzRXh0SW5mb0xpc3RPZkNlcnRIZXg9ZnVuY3Rpb24oZyl7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZywwKTtpZihiLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAxKVwifWlmKGcuc3Vic3RyKGJbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAyKVwifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsYlswXSk7aWYoYS5sZW5ndGg8OCl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAzKVwifWlmKGcuc3Vic3RyKGFbN10sMikhPVwiYTNcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA0KVwifXZhciBoPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsYVs3XSk7aWYoaC5sZW5ndGghPTEpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNSlcIn1pZihnLnN1YnN0cihoWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNilcIn12YXIgZj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGhbMF0pO3ZhciBlPWYubGVuZ3RoO3ZhciBkPW5ldyBBcnJheShlKTtmb3IodmFyIGM9MDtjPGU7YysrKXtkW2NdPVg1MDkuZ2V0VjNFeHRJdGVtSW5mb19BdE9iaihnLGZbY10pfXJldHVybiBkfTtYNTA5LmdldFYzRXh0SXRlbUluZm9fQXRPYmo9ZnVuY3Rpb24oZixnKXt2YXIgZT17fTtlLnBvc1RMVj1nO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsZyk7aWYoYi5sZW5ndGghPTImJmIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5djMgRXh0IChjb2RlOjAwMSlcIn1pZihmLnN1YnN0cihiWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDl2MyBFeHQgKGNvZGU6MDAyKVwifXZhciBkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsYlswXSk7ZS5vaWQ9QVNOMUhFWC5oZXh0b29pZHN0cihkKTtlLmNyaXRpY2FsPWZhbHNlO2lmKGIubGVuZ3RoPT0zKXtlLmNyaXRpY2FsPXRydWV9dmFyIGM9YltiLmxlbmd0aC0xXTtpZihmLnN1YnN0cihjLDIpIT1cIjA0XCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDl2MyBFeHQgKGNvZGU6MDAzKVwifWUucG9zVj1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGYsYyk7cmV0dXJuIGV9O1g1MDkuZ2V0SGV4T2ZUTFZfVjNFeHRWYWx1ZT1mdW5jdGlvbihiLGEpe3ZhciBjPVg1MDkuZ2V0UG9zT2ZUTFZfVjNFeHRWYWx1ZShiLGEpO2lmKGM9PS0xKXtyZXR1cm4gbnVsbH1yZXR1cm4gQVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihiLGMpfTtYNTA5LmdldEhleE9mVl9WM0V4dFZhbHVlPWZ1bmN0aW9uKGIsYSl7dmFyIGM9WDUwOS5nZXRQb3NPZlRMVl9WM0V4dFZhbHVlKGIsYSk7aWYoYz09LTEpe3JldHVybiBudWxsfXJldHVybiBBU04xSEVYLmdldEhleE9mVl9BdE9iaihiLGMpfTtYNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWU9ZnVuY3Rpb24oZixiKXt2YXIgZD1iO2lmKCFiLm1hdGNoKC9eWzAtOS5dKyQvKSl7ZD1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWQoYil9aWYoZD09XCJcIil7cmV0dXJuIC0xfXZhciBjPVg1MDkuZ2V0VjNFeHRJbmZvTGlzdE9mQ2VydEhleChmKTtmb3IodmFyIGE9MDthPGMubGVuZ3RoO2ErKyl7dmFyIGU9Y1thXTtpZihlLm9pZD09ZCl7cmV0dXJuIGUucG9zVn19cmV0dXJuIC0xfTtYNTA5LmdldEV4dEJhc2ljQ29uc3RyYWludHM9ZnVuY3Rpb24oZCl7dmFyIGE9WDUwOS5nZXRIZXhPZlZfVjNFeHRWYWx1ZShkLFwiYmFzaWNDb25zdHJhaW50c1wiKTtpZihhPT09bnVsbCl7cmV0dXJuIG51bGx9aWYoYT09PVwiXCIpe3JldHVybnt9fWlmKGE9PT1cIjAxMDFmZlwiKXtyZXR1cm57Y0E6dHJ1ZX19aWYoYS5zdWJzdHIoMCw4KT09PVwiMDEwMWZmMDJcIil7dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYSw2KTt2YXIgYj1wYXJzZUludChjLDE2KTtyZXR1cm57Y0E6dHJ1ZSxwYXRoTGVuOmJ9fXRocm93XCJ1bmtub3duIGVycm9yXCJ9O1g1MDkuS0VZVVNBR0VfTkFNRT1bXCJkaWdpdGFsU2lnbmF0dXJlXCIsXCJub25SZXB1ZGlhdGlvblwiLFwia2V5RW5jaXBoZXJtZW50XCIsXCJkYXRhRW5jaXBoZXJtZW50XCIsXCJrZXlBZ3JlZW1lbnRcIixcImtleUNlcnRTaWduXCIsXCJjUkxTaWduXCIsXCJlbmNpcGhlck9ubHlcIixcImRlY2lwaGVyT25seVwiXTtYNTA5LmdldEV4dEtleVVzYWdlQmluPWZ1bmN0aW9uKGQpe3ZhciBiPVg1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWUoZCxcImtleVVzYWdlXCIpO2lmKGI9PVwiXCIpe3JldHVyblwiXCJ9aWYoYi5sZW5ndGglMiE9MHx8Yi5sZW5ndGg8PTIpe3Rocm93XCJtYWxmb3JtZWQga2V5IHVzYWdlIHZhbHVlXCJ9dmFyIGE9cGFyc2VJbnQoYi5zdWJzdHIoMCwyKSk7dmFyIGM9cGFyc2VJbnQoYi5zdWJzdHIoMiksMTYpLnRvU3RyaW5nKDIpO3JldHVybiBjLnN1YnN0cigwLGMubGVuZ3RoLWEpfTtYNTA5LmdldEV4dEtleVVzYWdlU3RyaW5nPWZ1bmN0aW9uKGUpe3ZhciBkPVg1MDkuZ2V0RXh0S2V5VXNhZ2VCaW4oZSk7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe2lmKGQuc3Vic3RyKGMsMSk9PVwiMVwiKXtiLnB1c2goWDUwOS5LRVlVU0FHRV9OQU1FW2NdKX19cmV0dXJuIGIuam9pbihcIixcIil9O1g1MDkuZ2V0RXh0U3ViamVjdEtleUlkZW50aWZpZXI9ZnVuY3Rpb24oYil7dmFyIGE9WDUwOS5nZXRIZXhPZlZfVjNFeHRWYWx1ZShiLFwic3ViamVjdEtleUlkZW50aWZpZXJcIik7cmV0dXJuIGF9O1g1MDkuZ2V0RXh0QXV0aG9yaXR5S2V5SWRlbnRpZmllcj1mdW5jdGlvbihmKXt2YXIgYj17fTt2YXIgZT1YNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWUoZixcImF1dGhvcml0eUtleUlkZW50aWZpZXJcIik7aWYoZT09PW51bGwpe3JldHVybiBudWxsfXZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsMCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe2lmKGUuc3Vic3RyKGNbZF0sMik9PT1cIjgwXCIpe2Iua2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsY1tkXSl9fXJldHVybiBifTtYNTA5LmdldEV4dEV4dEtleVVzYWdlTmFtZT1mdW5jdGlvbihrKXt2YXIgYj1uZXcgQXJyYXkoKTt2YXIgZj1YNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWUoayxcImV4dEtleVVzYWdlXCIpO2lmKGY9PT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLDApO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgaj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGNbZV0pO3ZhciBnPUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludChqKTt2YXIgZD1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoZyk7Yi5wdXNoKGQpfXJldHVybiBifTtYNTA5LmdldEV4dFN1YmplY3RBbHROYW1lPWZ1bmN0aW9uKGcpe3ZhciBiPW5ldyBBcnJheSgpO3ZhciBmPVg1MDkuZ2V0SGV4T2ZUTFZfVjNFeHRWYWx1ZShnLFwic3ViamVjdEFsdE5hbWVcIik7dmFyIGM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZiwwKTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7aWYoZi5zdWJzdHIoY1tlXSwyKT09PVwiODJcIil7dmFyIGQ9aGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsY1tlXSkpO2IucHVzaChkKX19cmV0dXJuIGJ9O1g1MDkuZ2V0RXh0Q1JMRGlzdHJpYnV0aW9uUG9pbnRzVVJJPWZ1bmN0aW9uKG4pe3ZhciBwPW5ldyBBcnJheSgpO3ZhciBrPVg1MDkuZ2V0SGV4T2ZUTFZfVjNFeHRWYWx1ZShuLFwiY1JMRGlzdHJpYnV0aW9uUG9pbnRzXCIpO3ZhciBvPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGssMCk7Zm9yKHZhciBnPTA7ZzxvLmxlbmd0aDtnKyspe3ZhciBsPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooayxvW2ddKTt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihsLDApO2Zvcih2YXIgZT0wO2U8Yi5sZW5ndGg7ZSsrKXtpZihsLnN1YnN0cihiW2VdLDIpPT09XCJhMFwiKXt2YXIgZj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihsLGJbZV0pO2lmKGYuc3Vic3RyKDAsMik9PT1cImEwXCIpe3ZhciBjPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsMCk7aWYoYy5zdWJzdHIoMCwyKT09PVwiODZcIil7dmFyIG09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYywwKTt2YXIgZD1oZXh0b3V0ZjgobSk7cC5wdXNoKGQpfX19fX1yZXR1cm4gcH07WDUwOS5nZXRFeHRBSUFJbmZvPWZ1bmN0aW9uKGcpe3ZhciBqPXt9O2oub2NzcD1bXTtqLmNhaXNzdWVyPVtdO3ZhciBoPVg1MDkuZ2V0UG9zT2ZUTFZfVjNFeHRWYWx1ZShnLFwiYXV0aG9yaXR5SW5mb0FjY2Vzc1wiKTtpZihoPT0tMSl7cmV0dXJuIG51bGx9aWYoZy5zdWJzdHIoaCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIEFJQSBFeHRuIFZhbHVlXCJ9dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxoKTtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7dmFyIGE9ZFtjXTt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGEpO2lmKGIubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIEFjY2Vzc0Rlc2NyaXB0aW9uIG9mIEFJQSBFeHRuXCJ9dmFyIGU9YlswXTt2YXIgZj1iWzFdO2lmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGcsZSk9PVwiMmIwNjAxMDUwNTA3MzAwMVwiKXtpZihnLnN1YnN0cihmLDIpPT1cIjg2XCIpe2oub2NzcC5wdXNoKGhleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGYpKSl9fWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGcsZSk9PVwiMmIwNjAxMDUwNTA3MzAwMlwiKXtpZihnLnN1YnN0cihmLDIpPT1cIjg2XCIpe2ouY2Fpc3N1ZXIucHVzaChoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxmKSkpfX19cmV0dXJuIGp9O1g1MDkuZ2V0U2lnbmF0dXJlQWxnb3JpdGhtTmFtZT1mdW5jdGlvbihkKXt2YXIgYj1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoZCwwLFsxLDBdKTt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQoYik7dmFyIGM9S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGEpO3JldHVybiBjfTtYNTA5LmdldFNpZ25hdHVyZVZhbHVlSGV4PWZ1bmN0aW9uKGIpe3ZhciBhPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdChiLDAsWzJdKTtpZihhLnN1YnN0cigwLDIpIT09XCIwMFwiKXt0aHJvd1wiY2FuJ3QgZ2V0IHNpZ25hdHVyZSB2YWx1ZVwifXJldHVybiBhLnN1YnN0cigyKX07WDUwOS5nZXRTZXJpYWxOdW1iZXJIZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdChhLDAsWzAsMV0pfTtcbi8qISBqd3MtMy4zLjQgKGMpIDIwMTMtMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuandzPT1cInVuZGVmaW5lZFwifHwhS0pVUi5qd3Mpe0tKVVIuandzPXt9fUtKVVIuandzLkpXUz1mdW5jdGlvbigpe3ZhciBhPUtKVVIuandzLkpXUzt0aGlzLnBhcnNlSldTPWZ1bmN0aW9uKGUsZyl7aWYoKHRoaXMucGFyc2VkSldTIT09dW5kZWZpbmVkKSYmKGd8fCh0aGlzLnBhcnNlZEpXUy5zaWd2YWxIIT09dW5kZWZpbmVkKSkpe3JldHVybn1pZihlLm1hdGNoKC9eKFteLl0rKVxcLihbXi5dKylcXC4oW14uXSspJC8pPT1udWxsKXt0aHJvd1wiSldTIHNpZ25hdHVyZSBpcyBub3QgYSBmb3JtIG9mICdIZWFkLlBheWxvYWQuU2lnVmFsdWUnLlwifXZhciBoPVJlZ0V4cC4kMTt2YXIgYz1SZWdFeHAuJDI7dmFyIGk9UmVnRXhwLiQzO3ZhciBrPWgrXCIuXCIrYzt0aGlzLnBhcnNlZEpXUz17fTt0aGlzLnBhcnNlZEpXUy5oZWFkQjY0VT1oO3RoaXMucGFyc2VkSldTLnBheWxvYWRCNjRVPWM7dGhpcy5wYXJzZWRKV1Muc2lndmFsQjY0VT1pO3RoaXMucGFyc2VkSldTLnNpPWs7aWYoIWcpe3ZhciBmPWI2NHV0b2hleChpKTt2YXIgZD1wYXJzZUJpZ0ludChmLDE2KTt0aGlzLnBhcnNlZEpXUy5zaWd2YWxIPWY7dGhpcy5wYXJzZWRKV1Muc2lndmFsQkk9ZH12YXIgYj1iNjR1dG91dGY4KGgpO3ZhciBqPWI2NHV0b3V0ZjgoYyk7dGhpcy5wYXJzZWRKV1MuaGVhZFM9Yjt0aGlzLnBhcnNlZEpXUy5wYXlsb2FkUz1qO2lmKCFhLmlzU2FmZUpTT05TdHJpbmcoYix0aGlzLnBhcnNlZEpXUyxcImhlYWRQXCIpKXt0aHJvd1wibWFsZm9ybWVkIEpTT04gc3RyaW5nIGZvciBKV1MgSGVhZDogXCIrYn19fTtLSlVSLmp3cy5KV1Muc2lnbj1mdW5jdGlvbihhLGksYyxtLGwpe3ZhciBrPUtKVVIuandzLkpXUzt2YXIgcSxlLGo7aWYodHlwZW9mIGkhPVwic3RyaW5nXCImJnR5cGVvZiBpIT1cIm9iamVjdFwiKXt0aHJvd1wic3BIZWFkZXIgbXVzdCBiZSBKU09OIHN0cmluZyBvciBvYmplY3Q6IFwiK2l9aWYodHlwZW9mIGk9PVwib2JqZWN0XCIpe2U9aTtxPUpTT04uc3RyaW5naWZ5KGUpfWlmKHR5cGVvZiBpPT1cInN0cmluZ1wiKXtxPWk7aWYoIWsuaXNTYWZlSlNPTlN0cmluZyhxKSl7dGhyb3dcIkpXUyBIZWFkIGlzIG5vdCBzYWZlIEpTT04gc3RyaW5nOiBcIitxfWU9ay5yZWFkU2FmZUpTT05TdHJpbmcocSl9aj1jO2lmKHR5cGVvZiBjPT1cIm9iamVjdFwiKXtqPUpTT04uc3RyaW5naWZ5KGMpfWlmKChhPT1cIlwifHxhPT1udWxsKSYmZS5hbGchPT11bmRlZmluZWQpe2E9ZS5hbGd9aWYoKGEhPVwiXCImJmEhPW51bGwpJiZlLmFsZz09PXVuZGVmaW5lZCl7ZS5hbGc9YTtxPUpTT04uc3RyaW5naWZ5KGUpfWlmKGEhPT1lLmFsZyl7dGhyb3dcImFsZyBhbmQgc0hlYWRlci5hbGcgZG9lc24ndCBtYXRjaDogXCIrYStcIiE9XCIrZS5hbGd9dmFyIGQ9bnVsbDtpZihrLmp3c2FsZzJzaWdhbGdbYV09PT11bmRlZmluZWQpe3Rocm93XCJ1bnN1cHBvcnRlZCBhbGcgbmFtZTogXCIrYX1lbHNle2Q9ay5qd3NhbGcyc2lnYWxnW2FdfXZhciBiPXV0Zjh0b2I2NHUocSk7dmFyIGc9dXRmOHRvYjY0dShqKTt2YXIgbz1iK1wiLlwiK2c7dmFyIG49XCJcIjtpZihkLnN1YnN0cigwLDQpPT1cIkhtYWNcIil7aWYobT09PXVuZGVmaW5lZCl7dGhyb3dcIm1hYyBrZXkgc2hhbGwgYmUgc3BlY2lmaWVkIGZvciBIUyogYWxnXCJ9dmFyIGg9bmV3IEtKVVIuY3J5cHRvLk1hYyh7YWxnOmQscHJvdjpcImNyeXB0b2pzXCIscGFzczptfSk7aC51cGRhdGVTdHJpbmcobyk7bj1oLmRvRmluYWwoKX1lbHNle2lmKGQuaW5kZXhPZihcIndpdGhFQ0RTQVwiKSE9LTEpe3ZhciBwPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpkfSk7cC5pbml0KG0sbCk7cC51cGRhdGVTdHJpbmcobyk7aEFTTjFTaWc9cC5zaWduKCk7bj1LSlVSLmNyeXB0by5FQ0RTQS5hc24xU2lnVG9Db25jYXRTaWcoaEFTTjFTaWcpfWVsc2V7aWYoZCE9XCJub25lXCIpe3ZhciBwPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpkfSk7cC5pbml0KG0sbCk7cC51cGRhdGVTdHJpbmcobyk7bj1wLnNpZ24oKX19fXZhciBmPWhleHRvYjY0dShuKTtyZXR1cm4gbytcIi5cIitmfTtLSlVSLmp3cy5KV1MudmVyaWZ5PWZ1bmN0aW9uKHAsdCxqKXt2YXIgbT1LSlVSLmp3cy5KV1M7dmFyIHE9cC5zcGxpdChcIi5cIik7dmFyIGQ9cVswXTt2YXIgbD1xWzFdO3ZhciBiPWQrXCIuXCIrbDt2YXIgcj1iNjR1dG9oZXgocVsyXSk7dmFyIGk9bS5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChxWzBdKSk7dmFyIGg9bnVsbDt2YXIgcz1udWxsO2lmKGkuYWxnPT09dW5kZWZpbmVkKXt0aHJvd1wiYWxnb3JpdGhtIG5vdCBzcGVjaWZpZWQgaW4gaGVhZGVyXCJ9ZWxzZXtoPWkuYWxnO3M9aC5zdWJzdHIoMCwyKX1pZihqIT1udWxsJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaik9PT1cIltvYmplY3QgQXJyYXldXCImJmoubGVuZ3RoPjApe3ZhciBjPVwiOlwiK2ouam9pbihcIjpcIikrXCI6XCI7aWYoYy5pbmRleE9mKFwiOlwiK2grXCI6XCIpPT0tMSl7dGhyb3dcImFsZ29yaXRobSAnXCIraCtcIicgbm90IGFjY2VwdGVkIGluIHRoZSBsaXN0XCJ9fWlmKGghPVwibm9uZVwiJiZ0PT09bnVsbCl7dGhyb3dcImtleSBzaGFsbCBiZSBzcGVjaWZpZWQgdG8gdmVyaWZ5LlwifWlmKHR5cGVvZiB0PT1cInN0cmluZ1wiJiZ0LmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe3Q9S0VZVVRJTC5nZXRLZXkodCl9aWYocz09XCJSU1wifHxzPT1cIlBTXCIpe2lmKCEodCBpbnN0YW5jZW9mIFJTQUtleSkpe3Rocm93XCJrZXkgc2hhbGwgYmUgYSBSU0FLZXkgb2JqIGZvciBSUyogYW5kIFBTKiBhbGdzXCJ9fWlmKHM9PVwiRVNcIil7aWYoISh0IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EpKXt0aHJvd1wia2V5IHNoYWxsIGJlIGEgRUNEU0Egb2JqIGZvciBFUyogYWxnc1wifX1pZihoPT1cIm5vbmVcIil7fXZhciBuPW51bGw7aWYobS5qd3NhbGcyc2lnYWxnW2kuYWxnXT09PXVuZGVmaW5lZCl7dGhyb3dcInVuc3VwcG9ydGVkIGFsZyBuYW1lOiBcIitofWVsc2V7bj1tLmp3c2FsZzJzaWdhbGdbaF19aWYobj09XCJub25lXCIpe3Rocm93XCJub3Qgc3VwcG9ydGVkXCJ9ZWxzZXtpZihuLnN1YnN0cigwLDQpPT1cIkhtYWNcIil7dmFyIGs9bnVsbDtpZih0PT09dW5kZWZpbmVkKXt0aHJvd1wiaGV4YWRlY2ltYWwga2V5IHNoYWxsIGJlIHNwZWNpZmllZCBmb3IgSE1BQ1wifXZhciBnPW5ldyBLSlVSLmNyeXB0by5NYWMoe2FsZzpuLHBhc3M6dH0pO2cudXBkYXRlU3RyaW5nKGIpO2s9Zy5kb0ZpbmFsKCk7cmV0dXJuIHI9PWt9ZWxzZXtpZihuLmluZGV4T2YoXCJ3aXRoRUNEU0FcIikhPS0xKXt2YXIgZj1udWxsO3RyeXtmPUtKVVIuY3J5cHRvLkVDRFNBLmNvbmNhdFNpZ1RvQVNOMVNpZyhyKX1jYXRjaChvKXtyZXR1cm4gZmFsc2V9dmFyIGU9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOm59KTtlLmluaXQodCk7ZS51cGRhdGVTdHJpbmcoYik7cmV0dXJuIGUudmVyaWZ5KGYpfWVsc2V7dmFyIGU9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOm59KTtlLmluaXQodCk7ZS51cGRhdGVTdHJpbmcoYik7cmV0dXJuIGUudmVyaWZ5KHIpfX19fTtLSlVSLmp3cy5KV1MucGFyc2U9ZnVuY3Rpb24oZyl7dmFyIGM9Zy5zcGxpdChcIi5cIik7dmFyIGI9e307dmFyIGYsZSxkO2lmKGMubGVuZ3RoIT0yJiZjLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBzSldTOiB3cm9uZyBudW1iZXIgb2YgJy4nIHNwbGl0dGVkIGVsZW1lbnRzXCJ9Zj1jWzBdO2U9Y1sxXTtpZihjLmxlbmd0aD09Myl7ZD1jWzJdfWIuaGVhZGVyT2JqPUtKVVIuandzLkpXUy5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChmKSk7Yi5wYXlsb2FkT2JqPUtKVVIuandzLkpXUy5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChlKSk7Yi5oZWFkZXJQUD1KU09OLnN0cmluZ2lmeShiLmhlYWRlck9iaixudWxsLFwiICBcIik7aWYoYi5wYXlsb2FkT2JqPT1udWxsKXtiLnBheWxvYWRQUD1iNjR1dG91dGY4KGUpfWVsc2V7Yi5wYXlsb2FkUFA9SlNPTi5zdHJpbmdpZnkoYi5wYXlsb2FkT2JqLG51bGwsXCIgIFwiKX1pZihkIT09dW5kZWZpbmVkKXtiLnNpZ0hleD1iNjR1dG9oZXgoZCl9cmV0dXJuIGJ9O0tKVVIuandzLkpXUy52ZXJpZnlKV1Q9ZnVuY3Rpb24oZCxqLGwpe3ZhciBoPUtKVVIuandzLkpXUzt2YXIgaT1kLnNwbGl0KFwiLlwiKTt2YXIgYz1pWzBdO3ZhciBnPWlbMV07dmFyIG09YytcIi5cIitnO3ZhciBrPWI2NHV0b2hleChpWzJdKTt2YXIgZj1oLnJlYWRTYWZlSlNPTlN0cmluZyhiNjR1dG91dGY4KGMpKTt2YXIgZT1oLnJlYWRTYWZlSlNPTlN0cmluZyhiNjR1dG91dGY4KGcpKTtpZihmLmFsZz09PXVuZGVmaW5lZCl7cmV0dXJuIGZhbHNlfWlmKGwuYWxnPT09dW5kZWZpbmVkKXt0aHJvd1wiYWNjZXB0RmllbGQuYWxnIHNoYWxsIGJlIHNwZWNpZmllZFwifWlmKCFoLmluQXJyYXkoZi5hbGcsbC5hbGcpKXtyZXR1cm4gZmFsc2V9aWYoZS5pc3MhPT11bmRlZmluZWQmJnR5cGVvZiBsLmlzcz09PVwib2JqZWN0XCIpe2lmKCFoLmluQXJyYXkoZS5pc3MsbC5pc3MpKXtyZXR1cm4gZmFsc2V9fWlmKGUuc3ViIT09dW5kZWZpbmVkJiZ0eXBlb2YgbC5zdWI9PT1cIm9iamVjdFwiKXtpZighaC5pbkFycmF5KGUuc3ViLGwuc3ViKSl7cmV0dXJuIGZhbHNlfX1pZihlLmF1ZCE9PXVuZGVmaW5lZCYmdHlwZW9mIGwuYXVkPT09XCJvYmplY3RcIil7aWYodHlwZW9mIGUuYXVkPT1cInN0cmluZ1wiKXtpZighaC5pbkFycmF5KGUuYXVkLGwuYXVkKSl7cmV0dXJuIGZhbHNlfX1lbHNle2lmKHR5cGVvZiBlLmF1ZD09XCJvYmplY3RcIil7aWYoIWguaW5jbHVkZWRBcnJheShlLmF1ZCxsLmF1ZCkpe3JldHVybiBmYWxzZX19fX12YXIgYj1LSlVSLmp3cy5JbnREYXRlLmdldE5vdygpO2lmKGwudmVyaWZ5QXQhPT11bmRlZmluZWQmJnR5cGVvZiBsLnZlcmlmeUF0PT09XCJudW1iZXJcIil7Yj1sLnZlcmlmeUF0fWlmKGwuZ3JhY2VQZXJpb2Q9PT11bmRlZmluZWR8fHR5cGVvZiBsLmdyYWNlUGVyaW9kIT09XCJudW1iZXJcIil7bC5ncmFjZVBlcmlvZD0wfWlmKGUuZXhwIT09dW5kZWZpbmVkJiZ0eXBlb2YgZS5leHA9PVwibnVtYmVyXCIpe2lmKGUuZXhwK2wuZ3JhY2VQZXJpb2Q8Yil7cmV0dXJuIGZhbHNlfX1pZihlLm5iZiE9PXVuZGVmaW5lZCYmdHlwZW9mIGUubmJmPT1cIm51bWJlclwiKXtpZihiPGUubmJmLWwuZ3JhY2VQZXJpb2Qpe3JldHVybiBmYWxzZX19aWYoZS5pYXQhPT11bmRlZmluZWQmJnR5cGVvZiBlLmlhdD09XCJudW1iZXJcIil7aWYoYjxlLmlhdC1sLmdyYWNlUGVyaW9kKXtyZXR1cm4gZmFsc2V9fWlmKGUuanRpIT09dW5kZWZpbmVkJiZsLmp0aSE9PXVuZGVmaW5lZCl7aWYoZS5qdGkhPT1sLmp0aSl7cmV0dXJuIGZhbHNlfX1pZighS0pVUi5qd3MuSldTLnZlcmlmeShkLGosbC5hbGcpKXtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9O0tKVVIuandzLkpXUy5pbmNsdWRlZEFycmF5PWZ1bmN0aW9uKGIsYSl7dmFyIGQ9S0pVUi5qd3MuSldTLmluQXJyYXk7aWYoYj09PW51bGwpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYiE9PVwib2JqZWN0XCIpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYi5sZW5ndGghPT1cIm51bWJlclwiKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2lmKCFkKGJbY10sYSkpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O0tKVVIuandzLkpXUy5pbkFycmF5PWZ1bmN0aW9uKGQsYil7aWYoYj09PW51bGwpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYiE9PVwib2JqZWN0XCIpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYi5sZW5ndGghPT1cIm51bWJlclwiKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2lmKGJbY109PWQpe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9O0tKVVIuandzLkpXUy5qd3NhbGcyc2lnYWxnPXtIUzI1NjpcIkhtYWNTSEEyNTZcIixIUzM4NDpcIkhtYWNTSEEzODRcIixIUzUxMjpcIkhtYWNTSEE1MTJcIixSUzI1NjpcIlNIQTI1NndpdGhSU0FcIixSUzM4NDpcIlNIQTM4NHdpdGhSU0FcIixSUzUxMjpcIlNIQTUxMndpdGhSU0FcIixFUzI1NjpcIlNIQTI1NndpdGhFQ0RTQVwiLEVTMzg0OlwiU0hBMzg0d2l0aEVDRFNBXCIsUFMyNTY6XCJTSEEyNTZ3aXRoUlNBYW5kTUdGMVwiLFBTMzg0OlwiU0hBMzg0d2l0aFJTQWFuZE1HRjFcIixQUzUxMjpcIlNIQTUxMndpdGhSU0FhbmRNR0YxXCIsbm9uZTpcIm5vbmVcIix9O0tKVVIuandzLkpXUy5pc1NhZmVKU09OU3RyaW5nPWZ1bmN0aW9uKGMsYixkKXt2YXIgZT1udWxsO3RyeXtlPWpzb25QYXJzZShjKTtpZih0eXBlb2YgZSE9XCJvYmplY3RcIil7cmV0dXJuIDB9aWYoZS5jb25zdHJ1Y3Rvcj09PUFycmF5KXtyZXR1cm4gMH1pZihiKXtiW2RdPWV9cmV0dXJuIDF9Y2F0Y2goYSl7cmV0dXJuIDB9fTtLSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nPWZ1bmN0aW9uKGIpe3ZhciBjPW51bGw7dHJ5e2M9anNvblBhcnNlKGIpO2lmKHR5cGVvZiBjIT1cIm9iamVjdFwiKXtyZXR1cm4gbnVsbH1pZihjLmNvbnN0cnVjdG9yPT09QXJyYXkpe3JldHVybiBudWxsfXJldHVybiBjfWNhdGNoKGEpe3JldHVybiBudWxsfX07S0pVUi5qd3MuSldTLmdldEVuY29kZWRTaWduYXR1cmVWYWx1ZUZyb21KV1M9ZnVuY3Rpb24oYSl7aWYoYS5tYXRjaCgvXlteLl0rXFwuW14uXStcXC4oW14uXSspJC8pPT1udWxsKXt0aHJvd1wiSldTIHNpZ25hdHVyZSBpcyBub3QgYSBmb3JtIG9mICdIZWFkLlBheWxvYWQuU2lnVmFsdWUnLlwifXJldHVybiBSZWdFeHAuJDF9O0tKVVIuandzLkpXUy5nZXRKV0t0aHVtYnByaW50PWZ1bmN0aW9uKGQpe2lmKGQua3R5IT09XCJSU0FcIiYmZC5rdHkhPT1cIkVDXCImJmQua3R5IT09XCJvY3RcIil7dGhyb3dcInVuc3VwcG9ydGVkIGFsZ29yaXRobSBmb3IgSldLIFRodW1wcmludFwifXZhciBhPVwie1wiO2lmKGQua3R5PT09XCJSU0FcIil7aWYodHlwZW9mIGQubiE9XCJzdHJpbmdcInx8dHlwZW9mIGQuZSE9XCJzdHJpbmdcIil7dGhyb3dcIndyb25nIG4gYW5kIGUgdmFsdWUgZm9yIFJTQSBrZXlcIn1hKz0nXCJlXCI6XCInK2QuZSsnXCIsJzthKz0nXCJrdHlcIjpcIicrZC5rdHkrJ1wiLCc7YSs9J1wiblwiOlwiJytkLm4rJ1wifSd9ZWxzZXtpZihkLmt0eT09PVwiRUNcIil7aWYodHlwZW9mIGQuY3J2IT1cInN0cmluZ1wifHx0eXBlb2YgZC54IT1cInN0cmluZ1wifHx0eXBlb2YgZC55IT1cInN0cmluZ1wiKXt0aHJvd1wid3JvbmcgY3J2LCB4IGFuZCB5IHZhbHVlIGZvciBFQyBrZXlcIn1hKz0nXCJjcnZcIjpcIicrZC5jcnYrJ1wiLCc7YSs9J1wia3R5XCI6XCInK2Qua3R5KydcIiwnO2ErPSdcInhcIjpcIicrZC54KydcIiwnO2ErPSdcInlcIjpcIicrZC55KydcIn0nfWVsc2V7aWYoZC5rdHk9PT1cIm9jdFwiKXtpZih0eXBlb2YgZC5rIT1cInN0cmluZ1wiKXt0aHJvd1wid3JvbmcgayB2YWx1ZSBmb3Igb2N0KHN5bW1ldHJpYykga2V5XCJ9YSs9J1wia3R5XCI6XCInK2Qua3R5KydcIiwnO2ErPSdcImtcIjpcIicrZC5rKydcIn0nfX19dmFyIGI9cnN0cnRvaGV4KGEpO3ZhciBjPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChiLFwic2hhMjU2XCIpO3ZhciBlPWhleHRvYjY0dShjKTtyZXR1cm4gZX07S0pVUi5qd3MuSW50RGF0ZT17fTtLSlVSLmp3cy5JbnREYXRlLmdldD1mdW5jdGlvbihhKXtpZihhPT1cIm5vd1wiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKX1lbHNle2lmKGE9PVwibm93ICsgMWhvdXJcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjB9ZWxzZXtpZihhPT1cIm5vdyArIDFkYXlcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjAqMjR9ZWxzZXtpZihhPT1cIm5vdyArIDFtb250aFwiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKSs2MCo2MCoyNCozMH1lbHNle2lmKGE9PVwibm93ICsgMXllYXJcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjAqMjQqMzY1fWVsc2V7aWYoYS5tYXRjaCgvWiQvKSl7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0WnVsdShhKX1lbHNle2lmKGEubWF0Y2goL15bMC05XSskLykpe3JldHVybiBwYXJzZUludChhKX19fX19fX10aHJvd1widW5zdXBwb3J0ZWQgZm9ybWF0OiBcIithfTtLSlVSLmp3cy5JbnREYXRlLmdldFp1bHU9ZnVuY3Rpb24obCl7dmFyIGs7aWYoaz1sLm1hdGNoKC8oXFxkKykoXFxkXFxkKShcXGRcXGQpKFxcZFxcZCkoXFxkXFxkKShcXGRcXGQpWi8pKXt2YXIgYj1SZWdFeHAuJDE7dmFyIGk9cGFyc2VJbnQoYik7aWYoYi5sZW5ndGg9PTQpe31lbHNle2lmKGIubGVuZ3RoPT0yKXtpZig1MDw9aSYmaTwxMDApe2k9MTkwMCtpfWVsc2V7aWYoMDw9aSYmaTw1MCl7aT0yMDAwK2l9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIHllYXIgc3RyaW5nIGZvciBVVENUaW1lXCJ9fX1lbHNle3Rocm93XCJtYWxmb3JtZWQgeWVhciBzdHJpbmdcIn19dmFyIGc9cGFyc2VJbnQoUmVnRXhwLiQyKS0xO3ZhciBqPXBhcnNlSW50KFJlZ0V4cC4kMyk7dmFyIGM9cGFyc2VJbnQoUmVnRXhwLiQ0KTt2YXIgZT1wYXJzZUludChSZWdFeHAuJDUpO3ZhciBmPXBhcnNlSW50KFJlZ0V4cC4kNik7dmFyIGg9bmV3IERhdGUoRGF0ZS5VVEMoaSxnLGosYyxlLGYpKTtyZXR1cm4gfn4oaC8xMDAwKX10aHJvd1widW5zdXBwb3J0ZWQgZm9ybWF0OiBcIitsfTtLSlVSLmp3cy5JbnREYXRlLmdldE5vdz1mdW5jdGlvbigpe3ZhciBhPX5+KG5ldyBEYXRlKCkvMTAwMCk7cmV0dXJuIGF9O0tKVVIuandzLkludERhdGUuaW50RGF0ZTJVVENTdHJpbmc9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGUoYSoxMDAwKTtyZXR1cm4gYi50b1VUQ1N0cmluZygpfTtLSlVSLmp3cy5JbnREYXRlLmludERhdGUyWnVsdT1mdW5jdGlvbihlKXt2YXIgaT1uZXcgRGF0ZShlKjEwMDApO3ZhciBoPShcIjAwMDBcIitpLmdldFVUQ0Z1bGxZZWFyKCkpLnNsaWNlKC00KTt2YXIgZz0oXCIwMFwiKyhpLmdldFVUQ01vbnRoKCkrMSkpLnNsaWNlKC0yKTt2YXIgYj0oXCIwMFwiK2kuZ2V0VVRDRGF0ZSgpKS5zbGljZSgtMik7dmFyIGE9KFwiMDBcIitpLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKTt2YXIgYz0oXCIwMFwiK2kuZ2V0VVRDTWludXRlcygpKS5zbGljZSgtMik7dmFyIGY9KFwiMDBcIitpLmdldFVUQ1NlY29uZHMoKSkuc2xpY2UoLTIpO3JldHVybiBoK2crYithK2MrZitcIlpcIn07XG4vKiEgandzanMtMi4xLjAgKGMpIDIwMTAtMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuandzPT1cInVuZGVmaW5lZFwifHwhS0pVUi5qd3Mpe0tKVVIuandzPXt9fUtKVVIuandzLkpXU0pTPWZ1bmN0aW9uKCl7dmFyIGI9S0pVUi5qd3MuSldTO3ZhciBhPUtKVVIuandzLkpXUzt0aGlzLmFIZWFkZXI9W107dGhpcy5zUGF5bG9hZD1cIlwiO3RoaXMuYVNpZ25hdHVyZT1bXTt0aGlzLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmFIZWFkZXI9W107dGhpcy5zUGF5bG9hZD11bmRlZmluZWQ7dGhpcy5hU2lnbmF0dXJlPVtdfTt0aGlzLmluaXRXaXRoSldTPWZ1bmN0aW9uKGQpe3RoaXMuaW5pdCgpO3ZhciBjPWQuc3BsaXQoXCIuXCIpO2lmKGMubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIGlucHV0IEpXU1wifXRoaXMuYUhlYWRlci5wdXNoKGNbMF0pO3RoaXMuc1BheWxvYWQ9Y1sxXTt0aGlzLmFTaWduYXR1cmUucHVzaChjWzJdKX07dGhpcy5hZGRTaWduYXR1cmU9ZnVuY3Rpb24oYyxmLGssaSl7aWYodGhpcy5zUGF5bG9hZD09PXVuZGVmaW5lZHx8dGhpcy5zUGF5bG9hZD09PW51bGwpe3Rocm93XCJ0aGVyZSdzIG5vIEpTT04tSlMgc2lnbmF0dXJlIHRvIGFkZC5cIn12YXIgaj10aGlzLmFIZWFkZXIubGVuZ3RoO2lmKHRoaXMuYUhlYWRlci5sZW5ndGghPXRoaXMuYVNpZ25hdHVyZS5sZW5ndGgpe3Rocm93XCJhSGVhZGVyLmxlbmd0aCAhPSBhU2lnbmF0dXJlLmxlbmd0aFwifXRyeXt2YXIgZD1LSlVSLmp3cy5KV1Muc2lnbihjLGYsdGhpcy5zUGF5bG9hZCxrLGkpO3ZhciBoPWQuc3BsaXQoXCIuXCIpO3ZhciBsPWhbMF07dmFyIGU9aFsyXTt0aGlzLmFIZWFkZXIucHVzaChoWzBdKTt0aGlzLmFTaWduYXR1cmUucHVzaChoWzJdKX1jYXRjaChnKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoPmope3RoaXMuYUhlYWRlci5wb3AoKX1pZih0aGlzLmFTaWduYXR1cmUubGVuZ3RoPmope3RoaXMuYVNpZ25hdHVyZS5wb3AoKX10aHJvd1wiYWRkU2lnbmF0dXJlIGZhaWxlZDogXCIrZ319O3RoaXMuYWRkU2lnbmF0dXJlQnlIZWFkZXJLZXk9ZnVuY3Rpb24oZixjKXt2YXIgZT1iNjR1dG91dGY4KHRoaXMuc1BheWxvYWQpO3ZhciBkPW5ldyBLSlVSLmp3cy5KV1MoKTt2YXIgZz1kLmdlbmVyYXRlSldTQnlQMVBydktleShmLGUsYyk7dGhpcy5hSGVhZGVyLnB1c2goZC5wYXJzZWRKV1MuaGVhZEI2NFUpO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGQucGFyc2VkSldTLnNpZ3ZhbEI2NFUpfTt0aGlzLmFkZFNpZ25hdHVyZUJ5SGVhZGVyUGF5bG9hZEtleT1mdW5jdGlvbihmLGUsYyl7dmFyIGQ9bmV3IEtKVVIuandzLkpXUygpO3ZhciBnPWQuZ2VuZXJhdGVKV1NCeVAxUHJ2S2V5KGYsZSxjKTt0aGlzLmFIZWFkZXIucHVzaChkLnBhcnNlZEpXUy5oZWFkQjY0VSk7dGhpcy5zUGF5bG9hZD1kLnBhcnNlZEpXUy5wYXlsb2FkQjY0VTt0aGlzLmFTaWduYXR1cmUucHVzaChkLnBhcnNlZEpXUy5zaWd2YWxCNjRVKX07dGhpcy52ZXJpZnlBbGw9ZnVuY3Rpb24oZil7aWYodGhpcy5hSGVhZGVyLmxlbmd0aCE9PWYubGVuZ3RofHx0aGlzLmFTaWduYXR1cmUubGVuZ3RoIT09Zi5sZW5ndGgpe3JldHVybiBmYWxzZX1mb3IodmFyIGU9MDtlPGYubGVuZ3RoO2UrKyl7dmFyIGQ9ZltlXTtpZihkLmxlbmd0aCE9PTIpe3JldHVybiBmYWxzZX12YXIgYz10aGlzLnZlcmlmeU50aChlLGRbMF0sZFsxXSk7aWYoYz09PWZhbHNlKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfTt0aGlzLnZlcmlmeU50aD1mdW5jdGlvbihkLGgsZSl7aWYodGhpcy5hSGVhZGVyLmxlbmd0aDw9ZHx8dGhpcy5hU2lnbmF0dXJlLmxlbmd0aDw9ZCl7cmV0dXJuIGZhbHNlfXZhciBmPXRoaXMuYUhlYWRlcltkXTt2YXIgaT10aGlzLmFTaWduYXR1cmVbZF07dmFyIGo9ZitcIi5cIit0aGlzLnNQYXlsb2FkK1wiLlwiK2k7dmFyIGM9ZmFsc2U7dHJ5e2M9YS52ZXJpZnkoaixoLGUpfWNhdGNoKGcpe3JldHVybiBmYWxzZX1yZXR1cm4gY307dGhpcy52ZXJpZnlXaXRoQ2VydHM9ZnVuY3Rpb24oZCl7aWYodGhpcy5hSGVhZGVyLmxlbmd0aCE9ZC5sZW5ndGgpe3Rocm93XCJudW0gaGVhZGVycyBkb2VzIG5vdCBtYXRjaCB3aXRoIG51bSBjZXJ0c1wifWlmKHRoaXMuYVNpZ25hdHVyZS5sZW5ndGghPWQubGVuZ3RoKXt0aHJvd1wibnVtIHNpZ25hdHVyZXMgZG9lcyBub3QgbWF0Y2ggd2l0aCBudW0gY2VydHNcIn12YXIgbD10aGlzLnNQYXlsb2FkO3ZhciBoPVwiXCI7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWRbZV07dmFyIGc9dGhpcy5hSGVhZGVyW2VdO3ZhciBuPXRoaXMuYVNpZ25hdHVyZVtlXTt2YXIgYz1nK1wiLlwiK2wrXCIuXCIrbjt2YXIgaz1uZXcgS0pVUi5qd3MuSldTKCk7dHJ5e3ZhciBtPWsudmVyaWZ5SldTQnlQZW1YNTA5Q2VydChjLGYpO2lmKG0hPTEpe2grPShlKzEpK1widGggc2lnbmF0dXJlIHVubWF0Y2guIFwifX1jYXRjaChqKXtoKz0oZSsxKStcInRoIHNpZ25hdHVyZSBmYWlsKFwiK2orXCIpLiBcIn19aWYoaD09XCJcIil7cmV0dXJuIDF9ZWxzZXt0aHJvdyBofX07dGhpcy5yZWFkSldTSlM9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PT1cInN0cmluZ1wiKXt2YXIgZD1iLnJlYWRTYWZlSlNPTlN0cmluZyhlKTtpZihkPT1udWxsKXt0aHJvd1wiYXJndW1lbnQgaXMgbm90IHNhZmUgSlNPTiBvYmplY3Qgc3RyaW5nXCJ9dGhpcy5hSGVhZGVyPWQuaGVhZGVyczt0aGlzLnNQYXlsb2FkPWQucGF5bG9hZDt0aGlzLmFTaWduYXR1cmU9ZC5zaWduYXR1cmVzfWVsc2V7dHJ5e2lmKGUuaGVhZGVycy5sZW5ndGg+MCl7dGhpcy5hSGVhZGVyPWUuaGVhZGVyc31lbHNle3Rocm93XCJtYWxmb3JtZWQgaGVhZGVyXCJ9aWYodHlwZW9mIGUucGF5bG9hZD09PVwic3RyaW5nXCIpe3RoaXMuc1BheWxvYWQ9ZS5wYXlsb2FkfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCBzaWduYXR1cmVzXCJ9aWYoZS5zaWduYXR1cmVzLmxlbmd0aD4wKXt0aGlzLnNpZ25hdHVyZXM9ZS5zaWduYXR1cmVzfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCBzaWduYXR1cmVzXCJ9fWNhdGNoKGMpe3Rocm93XCJtYWxmb3JtZWQgSldTLUpTIEpTT04gb2JqZWN0OiBcIitjfX19O3RoaXMuZ2V0SlNPTj1mdW5jdGlvbigpe3JldHVybntoZWFkZXJzOnRoaXMuYUhlYWRlcixwYXlsb2FkOnRoaXMuc1BheWxvYWQsc2lnbmF0dXJlczp0aGlzLmFTaWduYXR1cmV9fTt0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoPT0wKXtyZXR1cm4gMX1yZXR1cm4gMH19O1xuLyohIG5vZGV1dGlsLTEuMC4wIChjKSAyMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIHJlYWRGaWxlVVRGOChhKXtyZXR1cm4gcmVxdWlyZShcImZzXCIpLnJlYWRGaWxlU3luYyhhLFwidXRmOFwiKX1mdW5jdGlvbiByZWFkRmlsZUhleEJ5QmluKGMpe3ZhciBiPXJlcXVpcmUoXCJqc3JzYXNpZ25cIik7dmFyIGE9cmVxdWlyZShcImZzXCIpO3JldHVybiBiLnJzdHJ0b2hleChhLnJlYWRGaWxlU3luYyhjLFwiYmluYXJ5XCIpKX1mdW5jdGlvbiByZWFkRmlsZShiKXt2YXIgYT1yZXF1aXJlKFwiZnNcIik7cmV0dXJuIGEucmVhZEZpbGVTeW5jKGIsXCJiaW5hcnlcIil9ZnVuY3Rpb24gc2F2ZUZpbGUoYyxiKXt2YXIgYT1yZXF1aXJlKFwiZnNcIik7YS53cml0ZUZpbGVTeW5jKGMsYixcImJpbmFyeVwiKX1mdW5jdGlvbiBzYXZlRmlsZUJpbkJ5SGV4KGUsYil7dmFyIGE9cmVxdWlyZShcImZzXCIpO3ZhciBjPXJlcXVpcmUoXCJqc3JzYXNpZ25cIik7dmFyIGQ9Yy5oZXh0b3JzdHIoYik7YS53cml0ZUZpbGVTeW5jKGUsZCxcImJpbmFyeVwiKX07XG5leHBvcnRzLlNlY3VyZVJhbmRvbSA9IFNlY3VyZVJhbmRvbTtcbmV4cG9ydHMucm5nX3NlZWRfdGltZSA9IHJuZ19zZWVkX3RpbWU7XG5cbmV4cG9ydHMuQmlnSW50ZWdlciA9IEJpZ0ludGVnZXI7XG5leHBvcnRzLlJTQUtleSA9IFJTQUtleTtcbmV4cG9ydHMuRUNEU0EgPSBLSlVSLmNyeXB0by5FQ0RTQTtcbmV4cG9ydHMuRFNBID0gS0pVUi5jcnlwdG8uRFNBO1xuZXhwb3J0cy5TaWduYXR1cmUgPSBLSlVSLmNyeXB0by5TaWduYXR1cmU7XG5leHBvcnRzLk1lc3NhZ2VEaWdlc3QgPSBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0O1xuZXhwb3J0cy5NYWMgPSBLSlVSLmNyeXB0by5NYWM7XG5leHBvcnRzLktFWVVUSUwgPSBLRVlVVElMO1xuZXhwb3J0cy5BU04xSEVYID0gQVNOMUhFWDtcbmV4cG9ydHMuWDUwOSA9IFg1MDk7XG5leHBvcnRzLkNyeXB0b0pTID0gQ3J5cHRvSlM7XG5cbi8vIGV4dC9iYXNlNjQuanNcbmV4cG9ydHMuYjY0dG9oZXggPSBiNjR0b2hleDtcbmV4cG9ydHMuYjY0dG9CQSA9IGI2NHRvQkE7XG5cbi8vIGJhc2U2NHguanNcbmV4cG9ydHMuc3RvQkEgPSBzdG9CQTtcbmV4cG9ydHMuQkF0b3MgPSBCQXRvcztcbmV4cG9ydHMuQkF0b2hleCA9IEJBdG9oZXg7XG5leHBvcnRzLnN0b2hleCA9IHN0b2hleDtcbmV4cG9ydHMuc3RvYjY0ID0gc3RvYjY0O1xuZXhwb3J0cy5zdG9iNjR1ID0gc3RvYjY0dTtcbmV4cG9ydHMuYjY0dXRvcyA9IGI2NHV0b3M7XG5leHBvcnRzLmI2NHRvYjY0dSA9IGI2NHRvYjY0dTtcbmV4cG9ydHMuYjY0dXRvYjY0ID0gYjY0dXRvYjY0O1xuZXhwb3J0cy5oZXgyYjY0ID0gaGV4MmI2NDtcbmV4cG9ydHMuaGV4dG9iNjR1ID0gaGV4dG9iNjR1O1xuZXhwb3J0cy5iNjR1dG9oZXggPSBiNjR1dG9oZXg7XG5leHBvcnRzLmI2NHRvaGV4ID0gYjY0dG9oZXg7XG5leHBvcnRzLnV0Zjh0b2I2NHUgPSB1dGY4dG9iNjR1O1xuZXhwb3J0cy5iNjR1dG91dGY4ID0gYjY0dXRvdXRmODtcbmV4cG9ydHMudXRmOHRvYjY0ID0gdXRmOHRvYjY0O1xuZXhwb3J0cy5iNjR0b3V0ZjggPSBiNjR0b3V0Zjg7XG5leHBvcnRzLnV0Zjh0b2hleCA9IHV0Zjh0b2hleDtcbmV4cG9ydHMuaGV4dG91dGY4ID0gaGV4dG91dGY4O1xuZXhwb3J0cy5oZXh0b3JzdHIgPSBoZXh0b3JzdHI7XG5leHBvcnRzLnJzdHJ0b2hleCA9IHJzdHJ0b2hleDtcbmV4cG9ydHMubmV3bGluZV90b1VuaXggPSBuZXdsaW5lX3RvVW5peDtcbmV4cG9ydHMubmV3bGluZV90b0RvcyA9IG5ld2xpbmVfdG9Eb3M7XG5leHBvcnRzLmludGFyeXN0cnRvaGV4ID0gaW50YXJ5c3RydG9oZXg7XG5leHBvcnRzLnN0cmRpZmZpZHggPSBzdHJkaWZmaWR4O1xuXG5leHBvcnRzLktKVVIgPSBLSlVSO1xuZXhwb3J0cy5jcnlwdG8gPSBLSlVSLmNyeXB0bztcbmV4cG9ydHMuYXNuMSA9IEtKVVIuYXNuMTtcbmV4cG9ydHMuandzID0gS0pVUi5qd3M7XG5leHBvcnRzLmxhbmcgPSBLSlVSLmxhbmc7XG5cbmV4cG9ydHMucmVhZEZpbGVVVEY4ID0gcmVhZEZpbGVVVEY4O1xuZXhwb3J0cy5yZWFkRmlsZUhleEJ5QmluID0gcmVhZEZpbGVIZXhCeUJpbjtcbmV4cG9ydHMucmVhZEZpbGUgPSByZWFkRmlsZTtcbmV4cG9ydHMuc2F2ZUZpbGUgPSBzYXZlRmlsZTtcbmV4cG9ydHMuc2F2ZUZpbGVCaW5CeUhleCA9IHNhdmVGaWxlQmluQnlIZXg7XG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9qc3JzYXNpZ24vbGliL2pzcnNhc2lnbi5qc1xuLy8gbW9kdWxlIGlkID0gMzM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9idWZmZXIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDM0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBwbGFjZUhvbGRlcnNDb3VudCAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICByZXR1cm4gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIHJldHVybiAoYjY0Lmxlbmd0aCAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0NvdW50KGI2NClcbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgaSwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBwbGFjZUhvbGRlcnMgPSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG5cbiAgYXJyID0gbmV3IEFycigobGVuICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gNCkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Jhc2U2NC1qcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMzQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2llZWU3NTQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDM0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9pc2FycmF5L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAzNDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XHJcbmltcG9ydCBTaWduaW5TdGF0ZSBmcm9tICcuL1NpZ25pblN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpZ25pblJlcXVlc3Qge1xyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIC8vIG1hbmRhdG9yeVxyXG4gICAgICAgIHVybCwgY2xpZW50X2lkLCByZWRpcmVjdF91cmksIHJlc3BvbnNlX3R5cGUsIHNjb3BlLCBhdXRob3JpdHksXHJcbiAgICAgICAgLy8gb3B0aW9uYWxcclxuICAgICAgICBkYXRhLCBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsIHJlc291cmNlLFxyXG4gICAgICAgIHJlcXVlc3QsIHJlcXVlc3RfdXJpLCBleHRyYVF1ZXJ5UGFyYW1zLFxyXG4gICAgfSkge1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXJsXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNsaWVudF9pZCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBjbGllbnRfaWQgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFyZWRpcmVjdF91cmkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcmVkaXJlY3RfdXJpIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWRpcmVjdF91cmlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcmVzcG9uc2VfdHlwZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyByZXNwb25zZV90eXBlIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNwb25zZV90eXBlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNjb3BlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNjb3BlIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY29wZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXV0aG9yaXR5IHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdXRob3JpdHlcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgb2lkYyA9IFNpZ25pblJlcXVlc3QuaXNPaWRjKHJlc3BvbnNlX3R5cGUpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgU2lnbmluU3RhdGUoeyBub25jZTogb2lkYywgZGF0YSwgY2xpZW50X2lkLCBhdXRob3JpdHkgfSk7XHJcblxyXG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiY2xpZW50X2lkXCIsIGNsaWVudF9pZCk7XHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJyZWRpcmVjdF91cmlcIiwgcmVkaXJlY3RfdXJpKTtcclxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlc3BvbnNlX3R5cGVcIiwgcmVzcG9uc2VfdHlwZSk7XHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzY29wZVwiLCBzY29wZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcclxuICAgICAgICBpZiAob2lkYykge1xyXG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcIm5vbmNlXCIsIHRoaXMuc3RhdGUubm9uY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG9wdGlvbmFsID0geyBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsIHJlc291cmNlLCByZXF1ZXN0LCByZXF1ZXN0X3VyaSB9O1xyXG4gICAgICAgIGZvcihsZXQga2V5IGluIG9wdGlvbmFsKXtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbmFsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIGtleSwgb3B0aW9uYWxba2V5XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvcihsZXQga2V5IGluIGV4dHJhUXVlcnlQYXJhbXMpe1xyXG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBrZXksIGV4dHJhUXVlcnlQYXJhbXNba2V5XSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc09pZGMocmVzcG9uc2VfdHlwZSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSByZXNwb25zZV90eXBlLnNwbGl0KC9cXHMrL2cpLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtID09PSBcImlkX3Rva2VuXCI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICEhKHJlc3VsdFswXSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBpc09BdXRoKHJlc3BvbnNlX3R5cGUpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbSA9PT0gXCJ0b2tlblwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiAhIShyZXN1bHRbMF0pO1xyXG4gICAgfVxyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1NpZ25pblJlcXVlc3QuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcmxVdGlsaXR5IHtcclxuICAgIHN0YXRpYyBhZGRRdWVyeVBhcmFtKHVybCwgbmFtZSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodXJsLmluZGV4T2YoJz8nKSA8IDApIHtcclxuICAgICAgICAgICAgdXJsICs9IFwiP1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVybFt1cmwubGVuZ3RoIC0gMV0gIT09IFwiP1wiKSB7XHJcbiAgICAgICAgICAgIHVybCArPSBcIiZcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XHJcbiAgICAgICAgdXJsICs9IFwiPVwiO1xyXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBwYXJzZVVybEZyYWdtZW50KHZhbHVlLCBkZWxpbWl0ZXIgPSBcIiNcIiwgZ2xvYmFsID0gR2xvYmFsKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXJsVXRpbGl0eS5wYXJzZVVybEZyYWdtZW50XCIpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyl7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZ2xvYmFsLmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaWR4ID0gdmFsdWUubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcclxuICAgICAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHIoaWR4ICsgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcGFyYW1zID0ge30sXHJcbiAgICAgICAgICAgIHJlZ2V4ID0gLyhbXiY9XSspPShbXiZdKikvZyxcclxuICAgICAgICAgICAgbTtcclxuXHJcbiAgICAgICAgdmFyIGNvdW50ZXIgPSAwO1xyXG4gICAgICAgIHdoaWxlIChtID0gcmVnZXguZXhlYyh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChtWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQobVsyXSk7XHJcbiAgICAgICAgICAgIGlmIChjb3VudGVyKysgPiA1MCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwicmVzcG9uc2UgZXhjZWVkZWQgZXhwZWN0ZWQgbnVtYmVyIG9mIHBhcmFtZXRlcnNcIiwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogXCJSZXNwb25zZSBleGNlZWRlZCBleHBlY3RlZCBudW1iZXIgb2YgcGFyYW1ldGVyc1wiXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBwcm9wIGluIHBhcmFtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXJsVXRpbGl0eS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgU3RhdGUgZnJvbSAnLi9TdGF0ZSc7XHJcbmltcG9ydCByYW5kb20gZnJvbSAnLi9yYW5kb20nO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbmluU3RhdGUgZXh0ZW5kcyBTdGF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7bm9uY2UsIGF1dGhvcml0eSwgY2xpZW50X2lkfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIoYXJndW1lbnRzWzBdKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAobm9uY2UgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm9uY2UgPSByYW5kb20oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobm9uY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm9uY2UgPSBub25jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fYXV0aG9yaXR5ID0gYXV0aG9yaXR5O1xyXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm9uY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vbmNlO1xyXG4gICAgfVxyXG4gICAgZ2V0IGF1dGhvcml0eSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yaXR5O1xyXG4gICAgfVxyXG4gICAgZ2V0IGNsaWVudF9pZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2lkO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU2lnbmluU3RhdGUudG9TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZCxcclxuICAgICAgICAgICAgbm9uY2U6IHRoaXMubm9uY2UsXHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogdGhpcy5hdXRob3JpdHksXHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRfaWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlNpZ25pblN0YXRlLmZyb21TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzdG9yYWdlU3RyaW5nKTtcclxuICAgICAgICByZXR1cm4gbmV3IFNpZ25pblN0YXRlKGRhdGEpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TaWduaW5TdGF0ZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgcmFuZG9tIGZyb20gJy4vcmFuZG9tJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKHtpZCwgZGF0YSwgY3JlYXRlZH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuX2lkID0gaWQgfHwgcmFuZG9tKCk7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgY3JlYXRlZCA9PT0gJ251bWJlcicgJiYgY3JlYXRlZCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlZCA9IGNyZWF0ZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVkID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gICAgfVxyXG4gICAgZ2V0IGRhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9XHJcbiAgICBnZXQgY3JlYXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlZDtcclxuICAgIH1cclxuXHJcbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU3RhdGUudG9TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN0YXRlLmZyb21TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgU3RhdGUoSlNPTi5wYXJzZShzdG9yYWdlU3RyaW5nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNsZWFyU3RhbGVTdGF0ZShzdG9yYWdlLCBhZ2UpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5jbGVhclN0YWxlU3RhdGVcIik7XHJcblxyXG4gICAgICAgIHZhciBjdXRvZmYgPSBEYXRlLm5vdygpIC8gMTAwMCAtIGFnZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0b3JhZ2UuZ2V0QWxsS2V5cygpLnRoZW4oa2V5cyA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBrZXlzXCIsIGtleXMpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcCA9IHN0b3JhZ2UuZ2V0KGtleSkudGhlbihpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3ZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhpdGVtKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBpdGVtIGZyb20ga2V5OiBcIiwga2V5LCBzdGF0ZS5jcmVhdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuY3JlYXRlZCA8PSBjdXRvZmYpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBwYXJzaW5nIHN0YXRlIGZvciBrZXlcIiwga2V5LCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwibm8gaXRlbSBpbiBzdG9yYWdlIGZvciBrZXk6IFwiLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJyZW1vdmVkIGl0ZW0gZm9yIGtleTogXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIndhaXRpbmcgb24gcHJvbWlzZSBjb3VudDpcIiwgcHJvbWlzZXMubGVuZ3RoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU3RhdGUuanMiLCIvLyBOT1RJQ0U6IHRoZSBjb2RlIGluIHRoaXMgZmlsZSBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBNaWNyb3NvZnRcclxuLy8gb3JpZ2luYWwgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmVBRC9henVyZS1hY3RpdmVkaXJlY3RvcnktbGlicmFyeS1mb3ItanMvYmxvYi9tYXN0ZXIvbGliL2FkYWwuanMjTDEwMjlcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEFkYWxKUyB2MS4wLjhcclxuLy8gQHByZXNlcnZlIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IE9wZW4gVGVjaG5vbG9naWVzLCBJbmMuXHJcbi8vIEFsbCBSaWdodHMgUmVzZXJ2ZWRcclxuLy8gQXBhY2hlIExpY2Vuc2UgMi4wXHJcbi8vXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbi8vXHJcbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4vL1xyXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZG9tKCkge1xyXG4gICAgdmFyIGd1aWRIb2xkZXIgPSAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnO1xyXG4gICAgdmFyIGhleCA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcclxuICAgIHZhciByID0gMDtcclxuICAgIHZhciBndWlkUmVzcG9uc2UgPSBcIlwiO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBndWlkSG9sZGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGd1aWRIb2xkZXJbaV0gIT09ICctJyAmJiBndWlkSG9sZGVyW2ldICE9PSAnNCcpIHtcclxuICAgICAgICAgICAgLy8gZWFjaCB4IGFuZCB5IG5lZWRzIHRvIGJlIHJhbmRvbVxyXG4gICAgICAgICAgICByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChndWlkSG9sZGVyW2ldID09PSAneCcpIHtcclxuICAgICAgICAgICAgZ3VpZFJlc3BvbnNlICs9IGhleFtyXTtcclxuICAgICAgICB9IGVsc2UgaWYgKGd1aWRIb2xkZXJbaV0gPT09ICd5Jykge1xyXG4gICAgICAgICAgICAvLyBjbG9jay1zZXEtYW5kLXJlc2VydmVkIGZpcnN0IGhleCBpcyBmaWx0ZXJlZCBhbmQgcmVtYWluaW5nIGhleCB2YWx1ZXMgYXJlIHJhbmRvbVxyXG4gICAgICAgICAgICByICY9IDB4MzsgLy8gYml0IGFuZCB3aXRoIDAwMTEgdG8gc2V0IHBvcyAyIHRvIHplcm8gPzA/P1xyXG4gICAgICAgICAgICByIHw9IDB4ODsgLy8gc2V0IHBvcyAzIHRvIDEgYXMgMT8/P1xyXG4gICAgICAgICAgICBndWlkUmVzcG9uc2UgKz0gaGV4W3JdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGd1aWRSZXNwb25zZSArPSBndWlkSG9sZGVyW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBndWlkUmVzcG9uc2U7XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmFuZG9tLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcclxuXHJcbmNvbnN0IE9pZGNTY29wZSA9IFwib3BlbmlkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWduaW5SZXNwb25zZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih1cmwpIHtcclxuXHJcbiAgICAgICAgdmFyIHZhbHVlcyA9IFVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudCh1cmwsIFwiI1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5lcnJvciA9IHZhbHVlcy5lcnJvcjtcclxuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gdmFsdWVzLmVycm9yX2Rlc2NyaXB0aW9uO1xyXG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gdmFsdWVzLmVycm9yX3VyaTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnN0YXRlID0gdmFsdWVzLnN0YXRlO1xyXG4gICAgICAgIHRoaXMuaWRfdG9rZW4gPSB2YWx1ZXMuaWRfdG9rZW47XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gdmFsdWVzLnNlc3Npb25fc3RhdGU7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NfdG9rZW4gPSB2YWx1ZXMuYWNjZXNzX3Rva2VuO1xyXG4gICAgICAgIHRoaXMudG9rZW5fdHlwZSA9IHZhbHVlcy50b2tlbl90eXBlO1xyXG4gICAgICAgIHRoaXMuc2NvcGUgPSB2YWx1ZXMuc2NvcGU7XHJcbiAgICAgICAgdGhpcy5wcm9maWxlID0gdW5kZWZpbmVkOyAvLyB3aWxsIGJlIHNldCBmcm9tIFJlc3BvbnNlVmFsaWRhdG9yXHJcblxyXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gcGFyc2VJbnQodmFsdWVzLmV4cGlyZXNfaW4pO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXhwaXJlc19pbiA9PT0gJ251bWJlcicgJiYgZXhwaXJlc19pbiA+IDApIHtcclxuICAgICAgICAgICAgbGV0IG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICAgICAgdGhpcy5leHBpcmVzX2F0ID0gbm93ICsgZXhwaXJlc19pbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV4cGlyZXNfaW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXhwaXJlc19hdCkge1xyXG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHBpcmVzX2F0IC0gbm93O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBleHBpcmVkKCkge1xyXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gdGhpcy5leHBpcmVzX2luO1xyXG4gICAgICAgIGlmIChleHBpcmVzX2luICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV4cGlyZXNfaW4gPD0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2NvcGVzKCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zY29wZSB8fCBcIlwiKS5zcGxpdChcIiBcIik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBpc09wZW5JZENvbm5lY3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVzLmluZGV4T2YoT2lkY1Njb3BlKSA+PSAwIHx8ICEhdGhpcy5pZF90b2tlbjtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lnbmluUmVzcG9uc2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcclxuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbm91dFJlcXVlc3Qge1xyXG4gICAgY29uc3RydWN0b3Ioe3VybCwgaWRfdG9rZW5faGludCwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLCBkYXRhfSkge1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWQgdG8gU2lnbm91dFJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZF90b2tlbl9oaW50KSB7XHJcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiaWRfdG9rZW5faGludFwiLCBpZF90b2tlbl9oaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSkge1xyXG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaVwiLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgU3RhdGUoeyBkYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInN0YXRlXCIsIHRoaXMuc3RhdGUuaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TaWdub3V0UmVxdWVzdC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWdub3V0UmVzcG9uc2Uge1xyXG4gICAgY29uc3RydWN0b3IodXJsKSB7XHJcblxyXG4gICAgICAgIHZhciB2YWx1ZXMgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBcIj9cIik7XHJcblxyXG4gICAgICAgIHRoaXMuZXJyb3IgPSB2YWx1ZXMuZXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IHZhbHVlcy5lcnJvcl9kZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB2YWx1ZXMuc3RhdGU7XHJcbiAgICB9XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lnbm91dFJlc3BvbnNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbk1lbW9yeVdlYlN0b3JhZ2V7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0SXRlbShrZXkpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJbk1lbW9yeVdlYlN0b3JhZ2UuZ2V0SXRlbVwiLCBrZXkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhW2tleV07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSl7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSW5NZW1vcnlXZWJTdG9yYWdlLnNldEl0ZW1cIiwga2V5KTtcclxuICAgICAgICB0aGlzLl9kYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgIH0gICBcclxuICAgIFxyXG4gICAgcmVtb3ZlSXRlbShrZXkpe1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkluTWVtb3J5V2ViU3RvcmFnZS5yZW1vdmVJdGVtXCIsIGtleSk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2RhdGFba2V5XTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5fZGF0YSkubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBrZXkoaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5fZGF0YSlbaW5kZXhdO1xyXG4gICAgfVxyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0luTWVtb3J5V2ViU3RvcmFnZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgT2lkY0NsaWVudCBmcm9tICcuL09pZGNDbGllbnQnO1xyXG5pbXBvcnQgVXNlck1hbmFnZXJTZXR0aW5ncyBmcm9tICcuL1VzZXJNYW5hZ2VyU2V0dGluZ3MnO1xyXG5pbXBvcnQgVXNlciBmcm9tICcuL1VzZXInO1xyXG5pbXBvcnQgVXNlck1hbmFnZXJFdmVudHMgZnJvbSAnLi9Vc2VyTWFuYWdlckV2ZW50cyc7XHJcbmltcG9ydCBTaWxlbnRSZW5ld1NlcnZpY2UgZnJvbSAnLi9TaWxlbnRSZW5ld1NlcnZpY2UnO1xyXG5pbXBvcnQgU2Vzc2lvbk1vbml0b3IgZnJvbSAnLi9TZXNzaW9uTW9uaXRvcic7XHJcbmltcG9ydCBUb2tlblJldm9jYXRpb25DbGllbnQgZnJvbSAnLi9Ub2tlblJldm9jYXRpb25DbGllbnQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlck1hbmFnZXIgZXh0ZW5kcyBPaWRjQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzID0ge30sXHJcbiAgICAgICAgU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciA9IFNpbGVudFJlbmV3U2VydmljZSxcclxuICAgICAgICBTZXNzaW9uTW9uaXRvckN0b3IgPSBTZXNzaW9uTW9uaXRvcixcclxuICAgICAgICBUb2tlblJldm9jYXRpb25DbGllbnRDdG9yID0gVG9rZW5SZXZvY2F0aW9uQ2xpZW50XHJcbiAgICApIHtcclxuXHJcbiAgICAgICAgaWYgKCEoc2V0dGluZ3MgaW5zdGFuY2VvZiBVc2VyTWFuYWdlclNldHRpbmdzKSkge1xyXG4gICAgICAgICAgICBzZXR0aW5ncyA9IG5ldyBVc2VyTWFuYWdlclNldHRpbmdzKHNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIoc2V0dGluZ3MpO1xyXG5cclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgVXNlck1hbmFnZXJFdmVudHMoc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3U2VydmljZSA9IG5ldyBTaWxlbnRSZW5ld1NlcnZpY2VDdG9yKHRoaXMpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIG9yZGVyIGlzIGltcG9ydGFudCBmb3IgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOyB0aGVzZSBzZXJ2aWNlcyBkZXBlbmQgdXBvbiB0aGUgZXZlbnRzLlxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9tYXRpY1NpbGVudFJlbmV3KSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImF1dG9tYXRpY1NpbGVudFJlbmV3IGlzIGNvbmZpZ3VyZWQsIHNldHRpbmcgdXAgc2lsZW50IHJlbmV3XCIpO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2lsZW50UmVuZXcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLm1vbml0b3JTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm1vbml0b3JTZXNzaW9uIGlzIGNvbmZpZ3VyZWQsIHNldHRpbmcgdXAgc2Vzc2lvbiBtb25pdG9yXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uTW9uaXRvciA9IG5ldyBTZXNzaW9uTW9uaXRvckN0b3IodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90b2tlblJldm9jYXRpb25DbGllbnQgPSBuZXcgVG9rZW5SZXZvY2F0aW9uQ2xpZW50Q3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF9yZWRpcmVjdE5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5yZWRpcmVjdE5hdmlnYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBfcG9wdXBOYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MucG9wdXBOYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgX2lmcmFtZU5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5pZnJhbWVOYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgX3VzZXJTdG9yZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy51c2VyU3RvcmU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV2ZW50cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXIoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuZ2V0VXNlclwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciBsb2FkZWRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmxvYWQodXNlciwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIG5vdCBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVVc2VyKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnJlbW92ZVVzZXJcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcihudWxsKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIHJlbW92ZWQgZnJvbSBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMudW5sb2FkKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbmluUmVkaXJlY3QoYXJncykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblJlZGlyZWN0XCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5TdGFydChhcmdzLCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvcikudGhlbigoKT0+e1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblJlZGlyZWN0IHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWduaW5SZWRpcmVjdENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblJlZGlyZWN0Q2FsbGJhY2tcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkVuZCh1cmwgfHwgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IudXJsKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5SZWRpcmVjdENhbGxiYWNrIHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluUmVkaXJlY3RDYWxsYmFjayBzdWNjZXNzZnVsXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc2lnbmluUG9wdXAoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbmluUG9wdXBcIik7XHJcblxyXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnBvcHVwX3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnJlZGlyZWN0X3VyaTtcclxuICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XHJcbiAgICAgICAgYXJncy5kaXNwbGF5ID0gXCJwb3B1cFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX3BvcHVwTmF2aWdhdG9yLCB7XHJcbiAgICAgICAgICAgIHN0YXJ0VXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHBvcHVwV2luZG93RmVhdHVyZXM6IGFyZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93RmVhdHVyZXMsXHJcbiAgICAgICAgICAgIHBvcHVwV2luZG93VGFyZ2V0OiBhcmdzLnBvcHVwV2luZG93VGFyZ2V0IHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dUYXJnZXRcclxuICAgICAgICB9KS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5Qb3B1cCBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblBvcHVwIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2lnbmluUG9wdXBDYWxsYmFjayh1cmwpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cENhbGxiYWNrXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5DYWxsYmFjayh1cmwsIHRoaXMuX3BvcHVwTmF2aWdhdG9yKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5Qb3B1cENhbGxiYWNrIHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluUG9wdXBDYWxsYmFjayBzdWNjZXNzZnVsXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaWduaW5TaWxlbnQoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5zaWxlbnRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcmdzLnJlZGlyZWN0X3VyaSA9IHVybDtcclxuICAgICAgICBhcmdzLnByb21wdCA9IFwibm9uZVwiO1xyXG5cclxuICAgICAgICBsZXQgc2V0SWRUb2tlbjtcclxuICAgICAgICBpZiAoYXJncy5pZF90b2tlbl9oaW50IHx8ICF0aGlzLnNldHRpbmdzLmluY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldykge1xyXG4gICAgICAgICAgICBzZXRJZFRva2VuID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRJZFRva2VuID0gdGhpcy5fbG9hZFVzZXIoKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgYXJncy5pZF90b2tlbl9oaW50ID0gdXNlciAmJiB1c2VyLmlkX3Rva2VuO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZXRJZFRva2VuLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRVcmw6IHVybCxcclxuICAgICAgICAgICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0OiBhcmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0IHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50UmVxdWVzdFRpbWVvdXRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLnN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluU2lsZW50IHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluU2lsZW50IHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2lnbmluU2lsZW50Q2FsbGJhY2sodXJsKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50Q2FsbGJhY2tcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkNhbGxiYWNrKHVybCwgdGhpcy5faWZyYW1lTmF2aWdhdG9yKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5TaWxlbnRDYWxsYmFjayBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblNpbGVudENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXJ5U2Vzc2lvblN0YXR1cyhhcmdzID0ge30pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5xdWVyeVNlc3Npb25TdGF0dXNcIik7XHJcblxyXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnNpbGVudF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgaWYgKCF1cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2lsZW50X3JlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc2lsZW50X3JlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFyZ3MucmVkaXJlY3RfdXJpID0gdXJsO1xyXG4gICAgICAgIGFyZ3MucHJvbXB0ID0gXCJub25lXCI7XHJcbiAgICAgICAgYXJncy5yZXNwb25zZV90eXBlID0gXCJpZF90b2tlblwiO1xyXG4gICAgICAgIGFyZ3Muc2NvcGUgPSBcIm9wZW5pZFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluU3RhcnQoYXJncywgdGhpcy5faWZyYW1lTmF2aWdhdG9yLCB7XHJcbiAgICAgICAgICAgIHN0YXJ0VXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0OiBhcmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0IHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50UmVxdWVzdFRpbWVvdXRcclxuICAgICAgICB9KS50aGVuKG5hdlJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25pblJlc3BvbnNlKG5hdlJlc3BvbnNlLnVybCkudGhlbihzaWduaW5SZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJnb3Qgc2lnbmluIHJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaWduaW5SZXNwb25zZS5zZXNzaW9uX3N0YXRlICYmIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViICYmIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJxdWVyeVNlc3Npb25TdGF0dXMgc3VjY2VzcyBmb3Igc3ViOiBcIiwgIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX3N0YXRlOiBzaWduaW5SZXNwb25zZS5zZXNzaW9uX3N0YXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWI6IHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWQ6IHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc2lkXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwicXVlcnlTZXNzaW9uU3RhdHVzIHN1Y2Nlc3NmdWwsIHVzZXIgbm90IGF1dGhlbnRpY2F0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9zaWduaW4oYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIl9zaWduaW5cIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zKS50aGVuKG5hdlJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkVuZChuYXZSZXNwb25zZS51cmwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25pblN0YXJ0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluU3RhcnRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IucHJlcGFyZShuYXZpZ2F0b3JQYXJhbXMpLnRoZW4oaGFuZGxlID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbmluUmVxdWVzdChhcmdzKS50aGVuKHNpZ25pblJlcXVlc3QgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25pbiByZXF1ZXN0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy51cmwgPSBzaWduaW5SZXF1ZXN0LnVybDtcclxuICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy5pZCA9IHNpZ25pblJlcXVlc3Quc3RhdGUuaWQ7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUubmF2aWdhdGUobmF2aWdhdG9yUGFyYW1zKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuY2xvc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJFcnJvciBhZnRlciBwcmVwYXJpbmcgbmF2aWdhdG9yLCBjbG9zaW5nIG5hdmlnYXRvciB3aW5kb3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25pbkVuZCh1cmwpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluRW5kXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2lnbmluUmVzcG9uc2UodXJsKS50aGVuKHNpZ25pblJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25pbiByZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgICAgIGxldCB1c2VyID0gbmV3IFVzZXIoc2lnbmluUmVzcG9uc2UpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVVc2VyKHVzZXIpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBzdG9yZWRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmxvYWQodXNlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25pbkNhbGxiYWNrKHVybCwgbmF2aWdhdG9yKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiX3NpZ25pbkNhbGxiYWNrXCIpO1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2FsbGJhY2sodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBzaWdub3V0UmVkaXJlY3QoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbm91dFJlZGlyZWN0XCIpO1xyXG4gICAgICAgIGxldCBwb3N0TG9nb3V0UmVkaXJlY3RVcmkgPSBhcmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcclxuICAgICAgICBpZiAocG9zdExvZ291dFJlZGlyZWN0VXJpKXtcclxuICAgICAgICAgICAgYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0TG9nb3V0UmVkaXJlY3RVcmk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IpLnRoZW4oKCk9PntcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJzaWdub3V0UmVkaXJlY3Qgc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHNpZ25vdXRSZWRpcmVjdENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25vdXRSZWRpcmVjdENhbGxiYWNrXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0RW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpLnRoZW4ocmVzcG9uc2U9PntcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJzaWdub3V0UmVkaXJlY3RDYWxsYmFjayBzdWNjZXNzZnVsXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbm91dFBvcHVwKGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwXCIpO1xyXG5cclxuICAgICAgICBsZXQgdXJsID0gYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSB1cmw7XHJcbiAgICAgICAgYXJncy5kaXNwbGF5ID0gXCJwb3B1cFwiO1xyXG4gICAgICAgIGlmIChhcmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSl7XHJcbiAgICAgICAgICAgIC8vIHdlJ3JlIHB1dHRpbmcgYSBkdW1teSBlbnRyeSBpbiBoZXJlIGJlY2F1c2Ugd2UgXHJcbiAgICAgICAgICAgIC8vIG5lZWQgYSB1bmlxdWUgaWQgZnJvbSB0aGUgc3RhdGUgZm9yIG5vdGlmaWNhdGlvblxyXG4gICAgICAgICAgICAvLyB0byB0aGUgcGFyZW50IHdpbmRvdywgd2hpY2ggaXMgbmVjZXNzYXJ5IGlmIHdlXHJcbiAgICAgICAgICAgIC8vIHBsYW4gdG8gcmV0dXJuIGJhY2sgdG8gdGhlIGNsaWVudCBhZnRlciBzaWdub3V0XHJcbiAgICAgICAgICAgIC8vIGFuZCBzbyB3ZSBjYW4gY2xvc2UgdGhlIHBvcHVwIGFmdGVyIHNpZ25vdXRcclxuICAgICAgICAgICAgYXJncy5zdGF0ZSA9IGFyZ3Muc3RhdGUgfHwge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dChhcmdzLCB0aGlzLl9wb3B1cE5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd0ZlYXR1cmVzOiBhcmdzLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cFdpbmRvd0ZlYXR1cmVzLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd1RhcmdldDogYXJncy5wb3B1cFdpbmRvd1RhcmdldCB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93VGFyZ2V0XHJcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbm91dFBvcHVwIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWdub3V0UG9wdXBDYWxsYmFjayh1cmwsIGtlZXBPcGVuKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihrZWVwT3BlbikgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZih1cmwpID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgdXJsID0gbnVsbDtcclxuICAgICAgICAgICAga2VlcE9wZW4gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWdub3V0UG9wdXBDYWxsYmFja1wiKTtcclxuICAgICAgICBsZXQgZGVsaW1pdGVyID0gJz8nO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cE5hdmlnYXRvci5jYWxsYmFjayh1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25vdXRQb3B1cENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3NpZ25vdXQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIl9zaWdub3V0XCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMpLnRoZW4obmF2UmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dEVuZChuYXZSZXNwb25zZS51cmwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25vdXRTdGFydChhcmdzID0ge30sIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbm91dFN0YXJ0XCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnByZXBhcmUobmF2aWdhdG9yUGFyYW1zKS50aGVuKGhhbmRsZSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBuYXZpZ2F0b3Igd2luZG93IGhhbmRsZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkVXNlcigpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJsb2FkZWQgY3VycmVudCB1c2VyIGZyb20gc3RvcmFnZVwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgcmV2b2tlUHJvbWlzZSA9IHRoaXMuX3NldHRpbmdzLnJldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0ID8gdGhpcy5fcmV2b2tlSW50ZXJuYWwodXNlcikgOiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXZva2VQcm9taXNlLnRoZW4oKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWRfdG9rZW4gPSBhcmdzLmlkX3Rva2VuX2hpbnQgfHwgdXNlciAmJiB1c2VyLmlkX3Rva2VuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZF90b2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXR0aW5nIGlkX3Rva2VuIGludG8gc2lnbm91dCByZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmlkX3Rva2VuX2hpbnQgPSBpZF90b2tlbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVVzZXIoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciByZW1vdmVkLCBjcmVhdGluZyBzaWdub3V0IHJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWdub3V0UmVxdWVzdChhcmdzKS50aGVuKHNpZ25vdXRSZXF1ZXN0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBzaWdub3V0IHJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yUGFyYW1zLnVybCA9IHNpZ25vdXRSZXF1ZXN0LnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWdub3V0UmVxdWVzdC5zdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy5pZCA9IHNpZ25vdXRSZXF1ZXN0LnN0YXRlLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS5uYXZpZ2F0ZShuYXZpZ2F0b3JQYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5jbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkVycm9yIGFmdGVyIHByZXBhcmluZyBuYXZpZ2F0b3IsIGNsb3NpbmcgbmF2aWdhdG9yIHdpbmRvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfc2lnbm91dEVuZCh1cmwpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbm91dEVuZFwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25vdXRSZXNwb25zZSh1cmwpLnRoZW4oc2lnbm91dFJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25vdXQgcmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc2lnbm91dFJlc3BvbnNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldm9rZUFjY2Vzc1Rva2VuKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnJldm9rZUFjY2Vzc1Rva2VuXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFVzZXIoKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlSW50ZXJuYWwodXNlciwgdHJ1ZSkudGhlbihzdWNjZXNzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicmVtb3ZpbmcgdG9rZW4gcHJvcGVydGllcyBmcm9tIHVzZXIgYW5kIHJlLXN0b3JpbmdcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIuYWNjZXNzX3Rva2VuID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyLmV4cGlyZXNfYXQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIudG9rZW5fdHlwZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcih1c2VyKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBzdG9yZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKCgpPT57XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiYWNjZXNzIHRva2VuIHJldm9rZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9yZXZva2VJbnRlcm5hbCh1c2VyLCByZXF1aXJlZCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcImNoZWNraW5nIGlmIHRva2VuIHJldm9jYXRpb24gaXMgbmVjZXNzYXJ5XCIpO1xyXG5cclxuICAgICAgICB2YXIgYWNjZXNzX3Rva2VuID0gdXNlciAmJiB1c2VyLmFjY2Vzc190b2tlbjtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIEpXVCB2cy4gcmVmZXJlbmNlIHRva2VuXHJcbiAgICAgICAgaWYgKCFhY2Nlc3NfdG9rZW4gfHwgYWNjZXNzX3Rva2VuLmluZGV4T2YoJy4nKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm5vIG5lZWQgdG8gcmV2b2tlIGR1ZSB0byBubyB1c2VyLCB0b2tlbiwgb3IgSldUIGZvcm1hdFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZShhY2Nlc3NfdG9rZW4sIHJlcXVpcmVkKS50aGVuKCgpID0+IHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0U2lsZW50UmVuZXcoKSB7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdTZXJ2aWNlLnN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcFNpbGVudFJlbmV3KCkge1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3U2VydmljZS5zdG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF91c2VyU3RvcmVLZXkoKSB7XHJcbiAgICAgICAgcmV0dXJuIGB1c2VyOiR7dGhpcy5zZXR0aW5ncy5hdXRob3JpdHl9OiR7dGhpcy5zZXR0aW5ncy5jbGllbnRfaWR9YDtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZFVzZXIoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiX2xvYWRVc2VyXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLmdldCh0aGlzLl91c2VyU3RvcmVLZXkpLnRoZW4oc3RvcmFnZVN0cmluZyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdG9yYWdlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ1c2VyIHN0b3JhZ2VTdHJpbmcgbG9hZGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFVzZXIuZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm5vIHVzZXIgc3RvcmFnZVN0cmluZ1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcmVVc2VyKHVzZXIpIHtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJzdG9yZVVzZXIgc3RvcmluZyB1c2VyXCIpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHN0b3JhZ2VTdHJpbmcgPSB1c2VyLnRvU3RvcmFnZVN0cmluZygpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLnNldCh0aGlzLl91c2VyU3RvcmVLZXksIHN0b3JhZ2VTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwic3RvcmVVc2VyIHJlbW92aW5nIHVzZXIgc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZS5yZW1vdmUodGhpcy5fdXNlclN0b3JlS2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1VzZXJNYW5hZ2VyLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBPaWRjQ2xpZW50U2V0dGluZ3MgZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MnO1xyXG5pbXBvcnQgUmVkaXJlY3ROYXZpZ2F0b3IgZnJvbSAnLi9SZWRpcmVjdE5hdmlnYXRvcic7XHJcbmltcG9ydCBQb3B1cE5hdmlnYXRvciBmcm9tICcuL1BvcHVwTmF2aWdhdG9yJztcclxuaW1wb3J0IElGcmFtZU5hdmlnYXRvciBmcm9tICcuL0lGcmFtZU5hdmlnYXRvcic7XHJcbmltcG9ydCBXZWJTdG9yYWdlU3RhdGVTdG9yZSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcblxyXG5jb25zdCBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSA2MDtcclxuY29uc3QgRGVmYXVsdENoZWNrU2Vzc2lvbkludGVydmFsID0gMjAwMDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJNYW5hZ2VyU2V0dGluZ3MgZXh0ZW5kcyBPaWRjQ2xpZW50U2V0dGluZ3Mge1xyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIHBvcHVwX3JlZGlyZWN0X3VyaSxcclxuICAgICAgICBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlcyxcclxuICAgICAgICBwb3B1cFdpbmRvd1RhcmdldCxcclxuICAgICAgICBzaWxlbnRfcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0LFxyXG4gICAgICAgIGF1dG9tYXRpY1NpbGVudFJlbmV3ID0gZmFsc2UsXHJcbiAgICAgICAgaW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3ID0gdHJ1ZSxcclxuICAgICAgICBtb25pdG9yU2Vzc2lvbiA9IHRydWUsXHJcbiAgICAgICAgY2hlY2tTZXNzaW9uSW50ZXJ2YWwgPSBEZWZhdWx0Q2hlY2tTZXNzaW9uSW50ZXJ2YWwsXHJcbiAgICAgICAgcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQgPSBmYWxzZSxcclxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSxcclxuICAgICAgICByZWRpcmVjdE5hdmlnYXRvciA9IG5ldyBSZWRpcmVjdE5hdmlnYXRvcigpLFxyXG4gICAgICAgIHBvcHVwTmF2aWdhdG9yID0gbmV3IFBvcHVwTmF2aWdhdG9yKCksXHJcbiAgICAgICAgaWZyYW1lTmF2aWdhdG9yID0gbmV3IElGcmFtZU5hdmlnYXRvcigpLFxyXG4gICAgICAgIHVzZXJTdG9yZSA9IG5ldyBXZWJTdG9yYWdlU3RhdGVTdG9yZSh7IHN0b3JlOiBHbG9iYWwuc2Vzc2lvblN0b3JhZ2UgfSlcclxuICAgIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcHVwX3JlZGlyZWN0X3VyaSA9IHBvcHVwX3JlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBXaW5kb3dGZWF0dXJlcyA9IHBvcHVwV2luZG93RmVhdHVyZXM7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBXaW5kb3dUYXJnZXQgPSBwb3B1cFdpbmRvd1RhcmdldDtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9zaWxlbnRfcmVkaXJlY3RfdXJpID0gc2lsZW50X3JlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZXF1ZXN0VGltZW91dCA9IHNpbGVudFJlcXVlc3RUaW1lb3V0O1xyXG4gICAgICAgIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3ID0gISFhdXRvbWF0aWNTaWxlbnRSZW5ldztcclxuICAgICAgICB0aGlzLl9pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcgPSBpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXc7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcclxuXHJcbiAgICAgICAgdGhpcy5fbW9uaXRvclNlc3Npb24gPSBtb25pdG9yU2Vzc2lvbjtcclxuICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbCA9IGNoZWNrU2Vzc2lvbkludGVydmFsO1xyXG4gICAgICAgIHRoaXMuX3Jldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0ID0gcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yID0gcmVkaXJlY3ROYXZpZ2F0b3I7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBOYXZpZ2F0b3IgPSBwb3B1cE5hdmlnYXRvcjtcclxuICAgICAgICB0aGlzLl9pZnJhbWVOYXZpZ2F0b3IgPSBpZnJhbWVOYXZpZ2F0b3I7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fdXNlclN0b3JlID0gdXNlclN0b3JlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwb3B1cF9yZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwX3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuICAgIGdldCBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuICAgIGdldCBwb3B1cFdpbmRvd0ZlYXR1cmVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cFdpbmRvd0ZlYXR1cmVzO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBvcHVwV2luZG93VGFyZ2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cFdpbmRvd1RhcmdldDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lsZW50X3JlZGlyZWN0X3VyaSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lsZW50X3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuICAgICBnZXQgc2lsZW50UmVxdWVzdFRpbWVvdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpbGVudFJlcXVlc3RUaW1lb3V0O1xyXG4gICAgfVxyXG4gICAgZ2V0IGF1dG9tYXRpY1NpbGVudFJlbmV3KCkge1xyXG4gICAgICAgIHJldHVybiAhISh0aGlzLnNpbGVudF9yZWRpcmVjdF91cmkgJiYgdGhpcy5fYXV0b21hdGljU2lsZW50UmVuZXcpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGluY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3O1xyXG4gICAgfVxyXG4gICAgZ2V0IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9uaXRvclNlc3Npb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbml0b3JTZXNzaW9uO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNoZWNrU2Vzc2lvbkludGVydmFsKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbDtcclxuICAgIH1cclxuICAgIGdldCByZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlZGlyZWN0TmF2aWdhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBwb3B1cE5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBOYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgaWZyYW1lTmF2aWdhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pZnJhbWVOYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCB1c2VyU3RvcmUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXNlck1hbmFnZXJTZXR0aW5ncy5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3ROYXZpZ2F0b3Ige1xyXG4gICAgXHJcbiAgICBwcmVwYXJlKCkge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVkaXJlY3ROYXZpZ2F0b3IubmF2aWdhdGVcIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB1cmwoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVkaXJlY3ROYXZpZ2F0b3IudXJsXCIpO1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUmVkaXJlY3ROYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFBvcHVwV2luZG93IGZyb20gJy4vUG9wdXBXaW5kb3cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9wdXBOYXZpZ2F0b3Ige1xyXG4gICAgXHJcbiAgICBwcmVwYXJlKHBhcmFtcykge1xyXG4gICAgICAgIGxldCBwb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9wdXApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjYWxsYmFjayh1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cE5hdmlnYXRvci5jYWxsYmFja1wiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgUG9wdXBXaW5kb3cubm90aWZ5T3BlbmVyKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUG9wdXBOYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcclxuXHJcbmNvbnN0IENoZWNrRm9yUG9wdXBDbG9zZWRJbnRlcnZhbCA9IDUwMDtcclxuY29uc3QgRGVmYXVsdFBvcHVwRmVhdHVyZXMgPSAnbG9jYXRpb249bm8sdG9vbGJhcj1ubyx3aWR0aD01MDAsaGVpZ2h0PTUwMCxsZWZ0PTEwMCx0b3A9MTAwOyc7XHJcbi8vY29uc3QgRGVmYXVsdFBvcHVwRmVhdHVyZXMgPSAnbG9jYXRpb249bm8sdG9vbGJhcj1ubyx3aWR0aD01MDAsaGVpZ2h0PTUwMCxsZWZ0PTEwMCx0b3A9MTAwO3Jlc2l6YWJsZT15ZXMnO1xyXG5cclxuY29uc3QgRGVmYXVsdFBvcHVwVGFyZ2V0ID0gXCJfYmxhbmtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcHVwV2luZG93IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5jdG9yXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0ID0gcGFyYW1zLnBvcHVwV2luZG93VGFyZ2V0IHx8IERlZmF1bHRQb3B1cFRhcmdldDtcclxuICAgICAgICBsZXQgZmVhdHVyZXMgPSBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCBEZWZhdWx0UG9wdXBGZWF0dXJlcztcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wdXAgPSB3aW5kb3cub3BlbignJywgdGFyZ2V0LCBmZWF0dXJlcyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInBvcHVwIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZC5iaW5kKHRoaXMpLCBDaGVja0ZvclBvcHVwQ2xvc2VkSW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJvbWlzZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5uYXZpZ2F0ZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9wb3B1cCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2V0dGluZyBVUkwgaW4gcG9wdXBcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9pZCA9IHBhcmFtcy5pZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lkKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3dbXCJwb3B1cENhbGxiYWNrX1wiICsgcGFyYW1zLmlkXSA9IHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLndpbmRvdy5sb2NhdGlvbiA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9zdWNjZXNzKGRhdGEpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBwb3B1cCB3aW5kb3dcIik7XHJcbiAgICAgICAgdGhpcy5fcmVzb2x2ZShkYXRhKTtcclxuICAgIH1cclxuICAgIF9lcnJvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG5cclxuICAgICAgICBMb2cuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5fcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NsZWFudXAoa2VlcE9wZW4pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5fY2xlYW51cFwiKTtcclxuXHJcbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyKTtcclxuICAgICAgICB0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIgPSBudWxsO1xyXG5cclxuICAgICAgICBkZWxldGUgd2luZG93W1wicG9wdXBDYWxsYmFja19cIiArIHRoaXMuX2lkXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmICFrZWVwT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgX2NoZWNrRm9yUG9wdXBDbG9zZWQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuX2NoZWNrRm9yUG9wdXBDbG9zZWRcIik7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXAgfHwgdGhpcy5fcG9wdXAuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXAgd2luZG93IGNsb3NlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2NhbGxiYWNrKHVybCwga2VlcE9wZW4pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5fY2FsbGJhY2tcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoa2VlcE9wZW4pO1xyXG5cclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3MoeyB1cmw6IHVybCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiSW52YWxpZCByZXNwb25zZSBmcm9tIHBvcHVwXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbm90aWZ5T3BlbmVyKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcikge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lclwiKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5vcGVuZXIpIHtcclxuICAgICAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICBpZiAodXJsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBkZWxpbWl0ZXIpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gXCJwb3B1cENhbGxiYWNrX1wiICsgZGF0YS5zdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSB3aW5kb3cub3BlbmVyW25hbWVdOyBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicGFzc2luZyB1cmwgbWVzc2FnZSB0byBvcGVuZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVybCwga2VlcE9wZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJubyBtYXRjaGluZyBjYWxsYmFjayBmb3VuZCBvbiBvcGVuZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJubyBzdGF0ZSBmb3VuZCBpbiByZXNwb25zZSB1cmxcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1BvcHVwV2luZG93LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBJRnJhbWVXaW5kb3cgZnJvbSAnLi9JRnJhbWVXaW5kb3cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSUZyYW1lTmF2aWdhdG9yIHtcclxuXHJcbiAgICBwcmVwYXJlKHBhcmFtcykge1xyXG4gICAgICAgIGxldCBmcmFtZSA9IG5ldyBJRnJhbWVXaW5kb3cocGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZyYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBjYWxsYmFjayh1cmwpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVOYXZpZ2F0b3IuY2FsbGJhY2tcIik7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIElGcmFtZVdpbmRvdy5ub3RpZnlQYXJlbnQodXJsKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9JRnJhbWVOYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmNvbnN0IERlZmF1bHRUaW1lb3V0ID0gMTAwMDA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJRnJhbWVXaW5kb3cge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdy5jdG9yXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCA9IHRoaXMuX21lc3NhZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9mcmFtZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG5cclxuICAgICAgICAvLyBzaG90Z3VuIGFwcHJvYWNoXHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLndpZHRoID0gMDtcclxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5oZWlnaHQgPSAwO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2ZyYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cubmF2aWdhdGVcIik7XHJcblxyXG4gICAgICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRpbWVvdXQgPSBwYXJhbXMuc2lsZW50UmVxdWVzdFRpbWVvdXQgfHwgRGVmYXVsdFRpbWVvdXQ7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzaW5nIHRpbWVvdXQgb2Y6XCIsIHRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX3RpbWVvdXQuYmluZCh0aGlzKSwgdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLnNyYyA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX3N1Y2Nlc3MoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU3VjY2Vzc2Z1bCByZXNwb25zZSBmcm9tIGZyYW1lIHdpbmRvd1wiKTtcclxuICAgICAgICB0aGlzLl9yZXNvbHZlKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgX2Vycm9yKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLl9yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NsZWFudXAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdy5fY2xlYW51cFwiKTtcclxuXHJcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcclxuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5fZnJhbWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3RpbWVvdXQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Ll90aW1lb3V0XCIpO1xyXG4gICAgICAgIHRoaXMuX2Vycm9yKFwiRnJhbWUgd2luZG93IHRpbWVkIG91dFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBfbWVzc2FnZShlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Ll9tZXNzYWdlXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGltZXIgJiZcclxuICAgICAgICAgICAgZS5vcmlnaW4gPT09IHRoaXMuX29yaWdpbiAmJlxyXG4gICAgICAgICAgICBlLnNvdXJjZSA9PT0gdGhpcy5fZnJhbWUuY29udGVudFdpbmRvd1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBsZXQgdXJsID0gZS5kYXRhO1xyXG4gICAgICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiB1cmwgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihcIkludmFsaWQgcmVzcG9uc2UgZnJvbSBmcmFtZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgX29yaWdpbigpIHtcclxuICAgICAgICByZXR1cm4gbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBub3RpZnlQYXJlbnQodXJsKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Lm5vdGlmeVBhcmVudFwiKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5wYXJlbnQgJiYgd2luZG93ICE9PSB3aW5kb3cucGFyZW50KSB7XHJcbiAgICAgICAgICAgIHVybCA9IHVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicG9zdGluZyB1cmwgbWVzc2FnZSB0byBwYXJlbnRcIik7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHVybCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvSUZyYW1lV2luZG93LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKHtpZF90b2tlbiwgc2Vzc2lvbl9zdGF0ZSwgYWNjZXNzX3Rva2VuLCB0b2tlbl90eXBlLCBzY29wZSwgcHJvZmlsZSwgZXhwaXJlc19hdCwgc3RhdGV9KSB7XHJcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IGlkX3Rva2VuO1xyXG4gICAgICAgIHRoaXMuc2Vzc2lvbl9zdGF0ZSA9IHNlc3Npb25fc3RhdGU7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NfdG9rZW4gPSBhY2Nlc3NfdG9rZW47XHJcbiAgICAgICAgdGhpcy50b2tlbl90eXBlID0gdG9rZW5fdHlwZTtcclxuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XHJcbiAgICAgICAgdGhpcy5wcm9maWxlID0gcHJvZmlsZTtcclxuICAgICAgICB0aGlzLmV4cGlyZXNfYXQgPSBleHBpcmVzX2F0O1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZXhwaXJlc19pbigpIHtcclxuICAgICAgICBpZiAodGhpcy5leHBpcmVzX2F0KSB7XHJcbiAgICAgICAgICAgIGxldCBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGlyZXNfYXQgLSBub3c7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV4cGlyZWQoKSB7XHJcbiAgICAgICAgbGV0IGV4cGlyZXNfaW4gPSB0aGlzLmV4cGlyZXNfaW47XHJcbiAgICAgICAgaWYgKGV4cGlyZXNfaW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZXhwaXJlc19pbiA8PSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzY29wZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3BlIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlci50b1N0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgaWRfdG9rZW46IHRoaXMuaWRfdG9rZW4sXHJcbiAgICAgICAgICAgIHNlc3Npb25fc3RhdGU6IHRoaXMuc2Vzc2lvbl9zdGF0ZSxcclxuICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiB0aGlzLmFjY2Vzc190b2tlbixcclxuICAgICAgICAgICAgdG9rZW5fdHlwZTogdGhpcy50b2tlbl90eXBlLFxyXG4gICAgICAgICAgICBzY29wZTogdGhpcy5zY29wZSxcclxuICAgICAgICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxyXG4gICAgICAgICAgICBleHBpcmVzX2F0OiB0aGlzLmV4cGlyZXNfYXRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXIuZnJvbVN0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKEpTT04ucGFyc2Uoc3RvcmFnZVN0cmluZykpO1xyXG4gICAgfVxyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1VzZXIuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEFjY2Vzc1Rva2VuRXZlbnRzIGZyb20gJy4vQWNjZXNzVG9rZW5FdmVudHMnO1xyXG5pbXBvcnQgRXZlbnQgZnJvbSAnLi9FdmVudCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyTWFuYWdlckV2ZW50cyBleHRlbmRzIEFjY2Vzc1Rva2VuRXZlbnRzIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xyXG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcclxuICAgICAgICB0aGlzLl91c2VyTG9hZGVkID0gbmV3IEV2ZW50KFwiVXNlciBsb2FkZWRcIik7XHJcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkID0gbmV3IEV2ZW50KFwiVXNlciB1bmxvYWRlZFwiKTtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yID0gbmV3IEV2ZW50KFwiU2lsZW50IHJlbmV3IGVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTaWduZWRPdXQgPSBuZXcgRXZlbnQoXCJVc2VyIHNpZ25lZCBvdXRcIik7XHJcbiAgICAgICAgdGhpcy5fdXNlclNlc3Npb25DaGFuZ2VkID0gbmV3IEV2ZW50KFwiVXNlciBzZXNzaW9uIGNoYW5nZWRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZCh1c2VyLCByYWlzZUV2ZW50PXRydWUpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlckV2ZW50cy5sb2FkXCIpO1xyXG4gICAgICAgIHN1cGVyLmxvYWQodXNlcik7XHJcbiAgICAgICAgaWYgKHJhaXNlRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlckxvYWRlZC5yYWlzZSh1c2VyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB1bmxvYWQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMudW5sb2FkXCIpO1xyXG4gICAgICAgIHN1cGVyLnVubG9hZCgpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yYWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFVzZXJMb2FkZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLmFkZEhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlVXNlckxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2FkZWQucmVtb3ZlSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGFkZFVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRTaWxlbnRSZW5ld0Vycm9yKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVNpbGVudFJlbmV3RXJyb3IoY2IpIHtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgX3JhaXNlU2lsZW50UmVuZXdFcnJvcihlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMuX3JhaXNlU2lsZW50UmVuZXdFcnJvclwiLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3RXJyb3IucmFpc2UoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkVXNlclNpZ25lZE91dChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJTaWduZWRPdXQuYWRkSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVVc2VyU2lnbmVkT3V0KGNiKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIF9yYWlzZVVzZXJTaWduZWRPdXQoZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXRcIik7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5yYWlzZShlKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQuYWRkSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQucmVtb3ZlSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICBfcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWQoZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLl9yYWlzZVVzZXJTZXNzaW9uQ2hhbmdlZFwiKTtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQucmFpc2UoZSk7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1VzZXJNYW5hZ2VyRXZlbnRzLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBUaW1lciBmcm9tICcuL1RpbWVyJztcclxuXHJcbmNvbnN0IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IDYwOyAvLyBzZWNvbmRzXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2Nlc3NUb2tlbkV2ZW50cyB7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lLFxyXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmluZ1wiKSxcclxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyZWRUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmVkXCIpXHJcbiAgICB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xyXG5cclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nID0gYWNjZXNzVG9rZW5FeHBpcmluZ1RpbWVyO1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZCA9IGFjY2Vzc1Rva2VuRXhwaXJlZFRpbWVyO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWQoY29udGFpbmVyKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQWNjZXNzVG9rZW5FdmVudHMubG9hZFwiKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9jYW5jZWxUaW1lcnMoKTtcclxuXHJcbiAgICAgICAgLy8gb25seSByZWdpc3RlciBldmVudHMgaWYgdGhlcmUncyBhbiBhY2Nlc3MgdG9rZW4gd2hlcmUgd2UgY2FyZSBhYm91dCBleHBpcmF0aW9uXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lci5hY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgICAgbGV0IGR1cmF0aW9uID0gY29udGFpbmVyLmV4cGlyZXNfaW47XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImFjY2VzcyB0b2tlbiBwcmVzZW50LCByZW1haW5pbmcgZHVyYXRpb246XCIsIGR1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZXhwaXJpbmcgaWYgd2Ugc3RpbGwgaGF2ZSB0aW1lXHJcbiAgICAgICAgICAgICAgICBsZXQgZXhwaXJpbmcgPSBkdXJhdGlvbiAtIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV4cGlyaW5nIDw9IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGV4cGlyaW5nID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlZ2lzdGVyaW5nIGV4cGlyaW5nIHRpbWVyIGluOlwiLCBleHBpcmluZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmluaXQoZXhwaXJpbmcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhbHdheXMgcmVnaXN0ZXIgZXhwaXJlZC4gaWYgaXQncyBuZWdhdGl2ZSwgaXQgd2lsbCBzdGlsbCBmaXJlXHJcbiAgICAgICAgICAgIGxldCBleHBpcmVkID0gZHVyYXRpb24gKyAxO1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJyZWdpc3RlcmluZyBleHBpcmVkIHRpbWVyIGluOlwiLCBleHBpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkLmluaXQoZXhwaXJlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVubG9hZCgpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJBY2Nlc3NUb2tlbkV2ZW50cy51bmxvYWRcIik7XHJcbiAgICAgICAgdGhpcy5fY2FuY2VsVGltZXJzKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9jYW5jZWxUaW1lcnMoKXtcclxuICAgICAgICBMb2cuZGVidWcoXCJjYW5jZWxpbmcgZXhpc3RpbmcgYWNjZXNzIHRva2VuIHRpbWVyc1wiKTtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmNhbmNlbCgpO1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5jYW5jZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBY2Nlc3NUb2tlbkV4cGlyaW5nKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJpbmcoY2IpIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvQWNjZXNzVG9rZW5FdmVudHMuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcbmltcG9ydCBFdmVudCBmcm9tICcuL0V2ZW50JztcclxuXHJcbmNvbnN0IFRpbWVyRHVyYXRpb24gPSA1OyAvLyBzZWNvbmRzXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lciBleHRlbmRzIEV2ZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB0aW1lciA9IEdsb2JhbC50aW1lcikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgICAgIHRoaXMuX3RpbWVyID0gdGltZXI7XHJcbiAgICAgICAgdGhpcy5fbm93RnVuYyA9ICgpID0+IERhdGUubm93KCkgLyAxMDAwO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBub3coKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuX25vd0Z1bmMoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChkdXJhdGlvbikge1xyXG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XHJcblxyXG4gICAgICAgIGlmIChkdXJhdGlvbiA8PSAwKSB7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZHVyYXRpb24gPSBwYXJzZUludChkdXJhdGlvbik7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlRpbWVyLmluaXQgdGltZXIgXCIgKyB0aGlzLl9uYW1lICsgXCIgZm9yIGR1cmF0aW9uOlwiLCBkdXJhdGlvbik7XHJcbiAgICAgICAgdGhpcy5fZXhwaXJhdGlvbiA9IHRoaXMubm93ICsgZHVyYXRpb247XHJcblxyXG4gICAgICAgIC8vIHdlJ3JlIHVzaW5nIGEgZmFpcmx5IHNob3J0IHRpbWVyIGFuZCB0aGVuIGNoZWNraW5nIHRoZSBleHBpcmF0aW9uIGluIHRoZSBcclxuICAgICAgICAvLyBjYWxsYmFjayB0byBoYW5kbGUgc2NlbmFyaW9zIHdoZXJlIHRoZSBicm93c2VyIGRldmljZSBzbGVlcHMsIGFuZCB0aGVuIFxyXG4gICAgICAgIC8vIHRoZSB0aW1lcnMgZW5kIHVwIGdldHRpbmcgZGVsYXllZC5cclxuICAgICAgICB2YXIgdGltZXJEdXJhdGlvbiA9IFRpbWVyRHVyYXRpb247XHJcbiAgICAgICAgaWYgKGR1cmF0aW9uIDwgdGltZXJEdXJhdGlvbikge1xyXG4gICAgICAgICAgICB0aW1lckR1cmF0aW9uID0gZHVyYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gdGhpcy5fdGltZXIuc2V0SW50ZXJ2YWwodGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSwgdGltZXJEdXJhdGlvbiAqIDEwMDApO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbmNlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGltZXJIYW5kbGUpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVGltZXIuY2FuY2VsOiBcIiwgdGhpcy5fbmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyLmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXJIYW5kbGUpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lckhhbmRsZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9jYWxsYmFjaygpIHtcclxuICAgICAgICB2YXIgZGlmZiA9IHRoaXMuX2V4cGlyYXRpb24gLSB0aGlzLm5vdztcclxuICAgICAgICBMb2cuZGVidWcoXCJUaW1lci5fY2FsbGJhY2s7IFwiICsgdGhpcy5fbmFtZSArIFwiIHRpbWVyIGV4cGlyZXMgaW46XCIsIGRpZmYpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZXhwaXJhdGlvbiA8PSB0aGlzLm5vdykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICBzdXBlci5yYWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVGltZXIuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XHJcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSGFuZGxlcihjYikge1xyXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVIYW5kbGVyKGNiKSB7XHJcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2NhbGxiYWNrcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSBjYik7XHJcbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmFpc2UoLi4ucGFyYW1zKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmFpc2luZyBldmVudDogXCIgKyB0aGlzLl9uYW1lKTtcclxuICAgICAgICBmb3IgKHZhciBjYiBvZiB0aGlzLl9jYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgY2IoLi4ucGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0V2ZW50LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWxlbnRSZW5ld1NlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHVzZXJNYW5hZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIgPSB1c2VyTWFuYWdlcjtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdGhpcy5fdG9rZW5FeHBpcmluZy5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuYWRkQWNjZXNzVG9rZW5FeHBpcmluZyh0aGlzLl9jYWxsYmFjayk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgdHJpZ2dlciBsb2FkaW5nIG9mIHRoZSB1c2VyIHNvIHRoZSBleHBpcmluZyBldmVudHMgY2FuIGJlIGluaXRpYWxpemVkXHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmdldFVzZXIoKS50aGVuKHVzZXI9PntcclxuICAgICAgICAgICAgICAgIC8vIGRlbGliZXJhdGUgbm9wXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVycj0+e1xyXG4gICAgICAgICAgICAgICAgLy8gY2F0Y2ggdG8gc3VwcHJlc3MgZXJyb3JzIHNpbmNlIHdlJ3JlIGluIGEgY3RvclxyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiRXJyb3IgZnJvbSBnZXRVc2VyOlwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMucmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmluZyh0aGlzLl9jYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFjaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3Rva2VuRXhwaXJpbmcoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU2lsZW50UmVuZXdTZXJ2aWNlIGF1dG9tYXRpY2FsbHkgcmVuZXdpbmcgYWNjZXNzIHRva2VuXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLnNpZ25pblNpbGVudCgpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNpbGVudCB0b2tlbiByZW5ld2FsIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiRXJyb3IgZnJvbSBzaWduaW5TaWxlbnQ6XCIsIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVNpbGVudFJlbmV3RXJyb3IoZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lsZW50UmVuZXdTZXJ2aWNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBDaGVja1Nlc3Npb25JRnJhbWUgZnJvbSAnLi9DaGVja1Nlc3Npb25JRnJhbWUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Vzc2lvbk1vbml0b3Ige1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHVzZXJNYW5hZ2VyLCBDaGVja1Nlc3Npb25JRnJhbWVDdG9yID0gQ2hlY2tTZXNzaW9uSUZyYW1lKSB7XHJcbiAgICAgICAgaWYgKCF1c2VyTWFuYWdlcikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB1c2VyIG1hbmFnZXIgcGFzc2VkIHRvIFNlc3Npb25Nb25pdG9yXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VyTWFuYWdlclwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyID0gdXNlck1hbmFnZXI7XHJcbiAgICAgICAgdGhpcy5fQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciA9IENoZWNrU2Vzc2lvbklGcmFtZUN0b3I7XHJcblxyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5hZGRVc2VyTG9hZGVkKHRoaXMuX3N0YXJ0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5hZGRVc2VyVW5sb2FkZWQodGhpcy5fc3RvcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZ2V0VXNlcigpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydCh1c2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGN0b3JcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU2Vzc2lvbk1vbml0b3IgY3RvcjsgZXJyb3IgZnJvbSBnZXRVc2VyOlwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF9zZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIuc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgICBnZXQgX21ldGFkYXRhU2VydmljZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIubWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9jbGllbnRfaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcclxuICAgIH1cclxuICAgIGdldCBfY2hlY2tTZXNzaW9uSW50ZXJ2YWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNoZWNrU2Vzc2lvbkludGVydmFsO1xyXG4gICAgfVxyXG5cclxuICAgIF9zdGFydCh1c2VyKSB7XHJcbiAgICAgICAgbGV0IHNlc3Npb25fc3RhdGUgPSB1c2VyLnNlc3Npb25fc3RhdGU7XHJcblxyXG4gICAgICAgIGlmIChzZXNzaW9uX3N0YXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1YiA9IHVzZXIucHJvZmlsZS5zdWI7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpZCA9IHVzZXIucHJvZmlsZS5zaWQ7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9zdGFydDsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbl9zdGF0ZSwgXCIsIHN1YjpcIiwgdGhpcy5fc3ViKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lKCkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSW5pdGlhbGl6aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2xpZW50X2lkID0gdGhpcy5fY2xpZW50X2lkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW50ZXJ2YWwgPSB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZSA9IG5ldyB0aGlzLl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yKHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyksIGNsaWVudF9pZCwgdXJsLCBpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZS5sb2FkKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJObyBjaGVjayBzZXNzaW9uIGlmcmFtZSBmb3VuZCBpbiB0aGUgbWV0YWRhdGFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCB0byBzdXBwcmVzcyBlcnJvcnMgc2luY2Ugd2UncmUgaW4gbm9uLXByb21pc2UgY2FsbGJhY2tcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIGdldENoZWNrU2Vzc2lvbklmcmFtZTpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3N0b3AoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX3N0b3BcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3N1YiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc2lkID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfY2FsbGJhY2soKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX2NhbGxiYWNrXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5xdWVyeVNlc3Npb25TdGF0dXMoKS50aGVuKHNlc3Npb24gPT4ge1xyXG4gICAgICAgICAgICB2YXIgcmFpc2VVc2VyU2lnbmVkT3V0RXZlbnQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLnN1YiA9PT0gdGhpcy5fc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFpc2VVc2VyU2lnbmVkT3V0RXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbi5zZXNzaW9uX3N0YXRlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uc2lkID09PSB0aGlzLl9zaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2FtZSBzdWIgc3RpbGwgbG9nZ2VkIGluIGF0IE9QLCByZXN0YXJ0aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lOyBzZXNzaW9uX3N0YXRlOlwiLCBzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2FtZSBzdWIgc3RpbGwgbG9nZ2VkIGluIGF0IE9QLCBzZXNzaW9uIHN0YXRlIGhhcyBjaGFuZ2VkLCByZXN0YXJ0aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lOyBzZXNzaW9uX3N0YXRlOlwiLCBzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuX3JhaXNlVXNlclNlc3Npb25DaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiRGlmZmVyZW50IHN1YmplY3Qgc2lnbmVkIGludG8gT1A6XCIsIHNlc3Npb24uc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlN1YmplY3Qgbm8gbG9uZ2VyIHNpZ25lZCBpbnRvIE9QXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmFpc2VVc2VyU2lnbmVkT3V0RXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9jYWxsYmFjazsgcmFpc2luZyBzaWduZWQgb3V0IGV2ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkVycm9yIGNhbGxpbmcgcXVlcnlDdXJyZW50U2lnbmluU2Vzc2lvbjsgcmFpc2luZyBzaWduZWQgb3V0IGV2ZW50XCIsIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2Vzc2lvbk1vbml0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmNvbnN0IERlZmF1bHRJbnRlcnZhbCA9IDIwMDA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGVja1Nlc3Npb25JRnJhbWUge1xyXG4gICAgY29uc3RydWN0b3IoY2FsbGJhY2ssIGNsaWVudF9pZCwgdXJsLCBpbnRlcnZhbCkge1xyXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gY2xpZW50X2lkO1xyXG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcclxuICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IGludGVydmFsIHx8IERlZmF1bHRJbnRlcnZhbDtcclxuXHJcbiAgICAgICAgdmFyIGlkeCA9IHVybC5pbmRleE9mKFwiL1wiLCB1cmwuaW5kZXhPZihcIi8vXCIpICsgMik7XHJcbiAgICAgICAgdGhpcy5fZnJhbWVfb3JpZ2luID0gdXJsLnN1YnN0cigwLCBpZHgpO1xyXG5cclxuICAgICAgICB0aGlzLl9mcmFtZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG5cclxuICAgICAgICAvLyBzaG90Z3VuIGFwcHJvYWNoXHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLndpZHRoID0gMDtcclxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5oZWlnaHQgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl9mcmFtZS5zcmMgPSB1cmw7XHJcbiAgICB9XHJcbiAgICBsb2FkKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9mcmFtZS5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2ZyYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQgPSB0aGlzLl9tZXNzYWdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX21lc3NhZ2UoZSkge1xyXG4gICAgICAgIGlmIChlLm9yaWdpbiA9PT0gdGhpcy5fZnJhbWVfb3JpZ2luICYmXHJcbiAgICAgICAgICAgIGUuc291cmNlID09PSB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmRhdGEgPT09IFwiZXJyb3JcIikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiZXJyb3IgbWVzc2FnZSBmcm9tIGNoZWNrIHNlc3Npb24gb3AgaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZS5kYXRhID09PSBcImNoYW5nZWRcIikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiY2hhbmdlZCBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoZS5kYXRhICsgXCIgbWVzc2FnZSBmcm9tIGNoZWNrIHNlc3Npb24gb3AgaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhcnQoc2Vzc2lvbl9zdGF0ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zZXNzaW9uX3N0YXRlICE9PSBzZXNzaW9uX3N0YXRlKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkNoZWNrU2Vzc2lvbklGcmFtZS5zdGFydFwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbl9zdGF0ZSA9IHNlc3Npb25fc3RhdGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHRoaXMuX2NsaWVudF9pZCArIFwiIFwiICsgdGhpcy5fc2Vzc2lvbl9zdGF0ZSwgdGhpcy5fZnJhbWVfb3JpZ2luKTtcclxuICAgICAgICAgICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkNoZWNrU2Vzc2lvbklGcmFtZS5zdG9wXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zZXNzaW9uX3N0YXRlID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX3RpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvQ2hlY2tTZXNzaW9uSUZyYW1lLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xyXG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcclxuXHJcbmNvbnN0IEFjY2Vzc1Rva2VuVHlwZUhpbnQgPSBcImFjY2Vzc190b2tlblwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5SZXZvY2F0aW9uQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBYTUxIdHRwUmVxdWVzdEN0b3IgPSBHbG9iYWwuWE1MSHR0cFJlcXVlc3QsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzZXR0aW5ncyBwcm92aWRlZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5fWE1MSHR0cFJlcXVlc3RDdG9yID0gWE1MSHR0cFJlcXVlc3RDdG9yO1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXZva2UoYWNjZXNzVG9rZW4sIHJlcXVpcmVkKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhY2Nlc3NUb2tlbiBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYWNjZXNzVG9rZW4gcHJvdmlkZWQuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRSZXZvY2F0aW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXZvY2F0aW9uIG5vdCBzdXBwb3J0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmV2b2NhdGlvbiBub3Qgc3VwcG9ydGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIG5vdCByZXF1aXJlZCwgc28gZG9uJ3QgZXJyb3IgYW5kIGp1c3QgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnRfc2VjcmV0ID0gdGhpcy5fc2V0dGluZ3MuY2xpZW50X3NlY3JldDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jldm9rZSh1cmwsIGNsaWVudF9pZCwgY2xpZW50X3NlY3JldCwgYWNjZXNzVG9rZW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9yZXZva2UodXJsLCBjbGllbnRfaWQsIGNsaWVudF9zZWNyZXQsIGFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQ2FsbGluZyByZXZvY2F0aW9uIGVuZHBvaW50XCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgdmFyIHhociA9IG5ldyB0aGlzLl9YTUxIdHRwUmVxdWVzdEN0b3IoKTtcclxuICAgICAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIHVybCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSFRUUCByZXNwb25zZSByZWNlaXZlZCwgc3RhdHVzXCIsIHhoci5zdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHhoci5zdGF0dXNUZXh0ICsgXCIgKFwiICsgeGhyLnN0YXR1cyArIFwiKVwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB2YXIgYm9keSA9IFwiY2xpZW50X2lkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNsaWVudF9pZCk7IFxyXG4gICAgICAgICAgICBpZiAoY2xpZW50X3NlY3JldCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSArPSBcIiZjbGllbnRfc2VjcmV0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNsaWVudF9zZWNyZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJvZHkgKz0gXCImdG9rZW5fdHlwZV9oaW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KEFjY2Vzc1Rva2VuVHlwZUhpbnQpO1xyXG4gICAgICAgICAgICBib2R5ICs9IFwiJnRva2VuPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGFjY2Vzc1Rva2VuKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xyXG4gICAgICAgICAgICB4aHIuc2VuZChib2R5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVG9rZW5SZXZvY2F0aW9uQ2xpZW50LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBDb3Jkb3ZhUG9wdXBXaW5kb3cgZnJvbSAnLi9Db3Jkb3ZhUG9wdXBXaW5kb3cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZG92YVBvcHVwTmF2aWdhdG9yIHtcclxuICAgIFxyXG4gICAgcHJlcGFyZShwYXJhbXMpIHtcclxuICAgICAgICBsZXQgcG9wdXAgPSBuZXcgQ29yZG92YVBvcHVwV2luZG93KHBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb3B1cCk7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvcmRvdmFQb3B1cE5hdmlnYXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5cclxuY29uc3QgRGVmYXVsdFBvcHVwRmVhdHVyZXMgPSAnbG9jYXRpb249bm8sdG9vbGJhcj1ubyx6b29tPW5vJztcclxuY29uc3QgRGVmYXVsdFBvcHVwVGFyZ2V0ID0gXCJfYmxhbmtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvcmRvdmFQb3B1cFdpbmRvdyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93LmN0b3JcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmVhdHVyZXMgPSBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCBEZWZhdWx0UG9wdXBGZWF0dXJlcztcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHBhcmFtcy5wb3B1cFdpbmRvd1RhcmdldCB8fCBEZWZhdWx0UG9wdXBUYXJnZXQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5yZWRpcmVjdF91cmkgPSBwYXJhbXMuc3RhcnRVcmw7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwicmVkaXJlY3RfdXJpOiBcIiArIHRoaXMucmVkaXJlY3RfdXJpKTtcclxuICAgIH1cclxuXHJcbiAgICBfaXNJbkFwcEJyb3dzZXJJbnN0YWxsZWQoY29yZG92YU1ldGFkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3NlclwiLCBcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3Nlci5pbmFwcGJyb3dzZXJcIiwgXCJvcmcuYXBhY2hlLmNvcmRvdmEuaW5hcHBicm93c2VyXCJdLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvcmRvdmFNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShuYW1lKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBcclxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkNvcmRvdmFQb3B1cFdpbmRvdy5uYXZpZ2F0ZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29yZG92YSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKFwiY29yZG92YSBpcyB1bmRlZmluZWRcIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdmFyIGNvcmRvdmFNZXRhZGF0YSA9IHdpbmRvdy5jb3Jkb3ZhLnJlcXVpcmUoXCJjb3Jkb3ZhL3BsdWdpbl9saXN0XCIpLm1ldGFkYXRhO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNJbkFwcEJyb3dzZXJJbnN0YWxsZWQoY29yZG92YU1ldGFkYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcihcIkluQXBwQnJvd3NlciBwbHVnaW4gbm90IGZvdW5kXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBjb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKHBhcmFtcy51cmwsIHRoaXMudGFyZ2V0LCB0aGlzLmZlYXR1cmVzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJwb3B1cCBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXhpdENhbGxiYWNrRXZlbnQgPSB0aGlzLl9leGl0Q2FsbGJhY2suYmluZCh0aGlzKTsgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50ID0gdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2suYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihcImV4aXRcIiwgdGhpcy5fZXhpdENhbGxiYWNrRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2Fkc3RhcnRcIiwgdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJFcnJvciBvcGVuaW5nIHBvcHVwIHdpbmRvd1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcm9taXNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkU3RhcnRDYWxsYmFjayhldmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC51cmwuaW5kZXhPZih0aGlzLnJlZGlyZWN0X3VyaSkgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fc3VjY2Vzcyh7IHVybDogZXZlbnQudXJsIH0pO1xyXG4gICAgICAgIH0gICAgXHJcbiAgICB9XHJcbiAgICBfZXhpdENhbGxiYWNrKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9lcnJvcihtZXNzYWdlKTsgICAgXHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9zdWNjZXNzKGRhdGEpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBjb3Jkb3ZhIHBvcHVwIHdpbmRvd1wiKTtcclxuICAgICAgICB0aGlzLl9yZXNvbHZlKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgX2Vycm9yKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLl9yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NsZWFudXAoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93Ll9jbGVhbnVwXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcG9wdXApe1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZHN0YXJ0XCIsIHRoaXMuX2xvYWRTdGFydENhbGxiYWNrRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IENvcmRvdmFQb3B1cFdpbmRvdyBmcm9tICcuL0NvcmRvdmFQb3B1cFdpbmRvdyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yIHtcclxuICAgIFxyXG4gICAgcHJlcGFyZShwYXJhbXMpIHtcclxuICAgICAgICBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyA9ICdoaWRkZW49eWVzJztcclxuICAgICAgICBsZXQgcG9wdXAgPSBuZXcgQ29yZG92YVBvcHVwV2luZG93KHBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb3B1cCk7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYzFiMmVlZTVjOGI2YmMxMTNjM2QiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19oYXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19mYWlscy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19jdHguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX21ldGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLWV4dC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZW51bS1rZXlzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3RvLWlvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2lvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2NvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2VudW0tYnVnLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXNhcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc2FtZS12YWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYmluZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXdzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hLW51bWJlci12YWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXJlcGVhdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1sb2cxcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hc2luaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jYnJ0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLXNpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2x6MzIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5leHBtMS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1leHBtMS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtZnJvdW5kLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmh5cG90LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmltdWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaWduLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50cnVuYy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1jb250ZXh0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLWlzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5hbmNob3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1odG1sLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250Y29sb3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5saW5rLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdWIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUubm93LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2RhdGUtdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmpvaW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmljdC1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNsaWNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb3J0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm1hcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb21lLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWxsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1maWxsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19mbGFncy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2ZpeC1yZS13a3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fcHJvbWlzZS1yZXNvbHZlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi1zdHJvbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnNldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50OC1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1jbGFtcGVkLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQxNi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDMyLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX293bi1rZXlzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmZsYXQtbWFwLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19mbGF0dGVuLWludG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXBhZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1mb3JjZWQtcGFtLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLXNldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAudG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi10by1qc29uLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQudG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWFwLm9mLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc2V0Lm9mLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1zZXQub2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC5mcm9tLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1tYXAuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1zZXQuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zeXN0ZW0uZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5lcnJvci5pcy1lcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5jbGFtcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5kZWctcGVyLXJhZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5kZWdyZWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmZzY2FsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1zY2FsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pYWRkaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pc3ViaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pbXVsaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5yYWQtcGVyLWRlZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5yYWRpYW5zLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNjYWxlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnVtdWxoLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNpZ25iaXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lm1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5hc2FwLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2ZuL3JlZ2V4cC9lc2NhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9tb2R1bGVzL19yZXBsYWNlci5qcyIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvTG9nLmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50U2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9HbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Jlc3BvbnNlVmFsaWRhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9NZXRhZGF0YVNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pzb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VySW5mb1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Vycm9yUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pvc2VVdGlsLmpzIiwid2VicGFjazovLy8uL34vanNyc2FzaWduL2xpYi9qc3JzYXNpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VybFV0aWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblN0YXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9TdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmFuZG9tLmpzIiwid2VicGFjazovLy8uL3NyYy9TaWduaW5SZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbm91dFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25vdXRSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSW5NZW1vcnlXZWJTdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VyTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlck1hbmFnZXJTZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvUmVkaXJlY3ROYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1BvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Qb3B1cFdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSUZyYW1lTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9JRnJhbWVXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXJNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVGltZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0V2ZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9TaWxlbnRSZW5ld1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Nlc3Npb25Nb25pdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9DaGVja1Nlc3Npb25JRnJhbWUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Rva2VuUmV2b2NhdGlvbkNsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiXSwibmFtZXMiOlsiTG9nIiwicmVxdWlyZSIsIk9pZGNDbGllbnQiLCJPaWRjQ2xpZW50U2V0dGluZ3MiLCJXZWJTdG9yYWdlU3RhdGVTdG9yZSIsIkluTWVtb3J5V2ViU3RvcmFnZSIsIlVzZXJNYW5hZ2VyIiwiQWNjZXNzVG9rZW5FdmVudHMiLCJNZXRhZGF0YVNlcnZpY2UiLCJDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3IiLCJDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yIiwiQ2hlY2tTZXNzaW9uSUZyYW1lIiwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50IiwiU2Vzc2lvbk1vbml0b3IiLCJHbG9iYWwiLCJVc2VyIiwibm9wTG9nZ2VyIiwiZGVidWciLCJpbmZvIiwid2FybiIsImVycm9yIiwiTk9ORSIsIkVSUk9SIiwiV0FSTiIsIklORk8iLCJERUJVRyIsImxvZ2dlciIsImxldmVsIiwicmVzZXQiLCJhcmdzIiwiYXBwbHkiLCJBcnJheSIsImZyb20iLCJ2YWx1ZSIsIkVycm9yIiwic2V0dGluZ3MiLCJfc2V0dGluZ3MiLCJjcmVhdGVTaWduaW5SZXF1ZXN0IiwicmVzcG9uc2VfdHlwZSIsInNjb3BlIiwicmVkaXJlY3RfdXJpIiwiZGF0YSIsInN0YXRlIiwicHJvbXB0IiwiZGlzcGxheSIsIm1heF9hZ2UiLCJ1aV9sb2NhbGVzIiwiaWRfdG9rZW5faGludCIsImxvZ2luX2hpbnQiLCJhY3JfdmFsdWVzIiwicmVzb3VyY2UiLCJyZXF1ZXN0IiwicmVxdWVzdF91cmkiLCJleHRyYVF1ZXJ5UGFyYW1zIiwic3RhdGVTdG9yZSIsImNsaWVudF9pZCIsImF1dGhvcml0eSIsIl9tZXRhZGF0YVNlcnZpY2UiLCJnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQiLCJ0aGVuIiwidXJsIiwic2lnbmluUmVxdWVzdCIsInNpZ25pblN0YXRlIiwiX3N0YXRlU3RvcmUiLCJzZXQiLCJpZCIsInRvU3RvcmFnZVN0cmluZyIsInByb2Nlc3NTaWduaW5SZXNwb25zZSIsInJlc3BvbnNlIiwiUHJvbWlzZSIsInJlamVjdCIsInJlbW92ZSIsInN0b3JlZFN0YXRlU3RyaW5nIiwiZnJvbVN0b3JhZ2VTdHJpbmciLCJfdmFsaWRhdG9yIiwidmFsaWRhdGVTaWduaW5SZXNwb25zZSIsImNyZWF0ZVNpZ25vdXRSZXF1ZXN0IiwicG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiZ2V0RW5kU2Vzc2lvbkVuZHBvaW50Iiwic2lnbm91dFN0YXRlIiwicHJvY2Vzc1NpZ25vdXRSZXNwb25zZSIsInJlc29sdmUiLCJzdGF0ZUtleSIsInZhbGlkYXRlU2lnbm91dFJlc3BvbnNlIiwiY2xlYXJTdGFsZVN0YXRlIiwic3RhbGVTdGF0ZUFnZSIsInZhbGlkYXRvciIsIm1ldGFkYXRhU2VydmljZSIsIk9pZGNNZXRhZGF0YVVybFBhdGgiLCJEZWZhdWx0UmVzcG9uc2VUeXBlIiwiRGVmYXVsdFNjb3BlIiwiRGVmYXVsdFN0YWxlU3RhdGVBZ2UiLCJEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzIiwibWV0YWRhdGFVcmwiLCJtZXRhZGF0YSIsInNpZ25pbmdLZXlzIiwiY2xpZW50X3NlY3JldCIsImZpbHRlclByb3RvY29sQ2xhaW1zIiwibG9hZFVzZXJJbmZvIiwiY2xvY2tTa2V3IiwiUmVzcG9uc2VWYWxpZGF0b3JDdG9yIiwiTWV0YWRhdGFTZXJ2aWNlQ3RvciIsIl9hdXRob3JpdHkiLCJfbWV0YWRhdGFVcmwiLCJfbWV0YWRhdGEiLCJfc2lnbmluZ0tleXMiLCJfY2xpZW50X2lkIiwiX2NsaWVudF9zZWNyZXQiLCJfcmVzcG9uc2VfdHlwZSIsIl9zY29wZSIsIl9yZWRpcmVjdF91cmkiLCJfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX3Byb21wdCIsIl9kaXNwbGF5IiwiX21heF9hZ2UiLCJfdWlfbG9jYWxlcyIsIl9hY3JfdmFsdWVzIiwiX3Jlc291cmNlIiwiX2ZpbHRlclByb3RvY29sQ2xhaW1zIiwiX2xvYWRVc2VySW5mbyIsIl9zdGFsZVN0YXRlQWdlIiwiX2Nsb2NrU2tldyIsIl9leHRyYVF1ZXJ5UGFyYW1zIiwiaW5kZXhPZiIsImxlbmd0aCIsInByZWZpeCIsInN0b3JlIiwibG9jYWxTdG9yYWdlIiwiX3N0b3JlIiwiX3ByZWZpeCIsImtleSIsInNldEl0ZW0iLCJnZXQiLCJpdGVtIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJnZXRBbGxLZXlzIiwia2V5cyIsImluZGV4IiwicHVzaCIsInN1YnN0ciIsInRpbWVyIiwic2V0SW50ZXJ2YWwiLCJjYiIsImR1cmF0aW9uIiwiY2xlYXJJbnRlcnZhbCIsImhhbmRsZSIsInRlc3RpbmciLCJfdGVzdGluZyIsInNldFhNTEh0dHBSZXF1ZXN0IiwibmV3UmVxdWVzdCIsImxvY2F0aW9uIiwic2Vzc2lvblN0b3JhZ2UiLCJYTUxIdHRwUmVxdWVzdCIsIlByb3RvY29sQ2xhaW1zIiwiUmVzcG9uc2VWYWxpZGF0b3IiLCJVc2VySW5mb1NlcnZpY2VDdG9yIiwiam9zZVV0aWwiLCJfdXNlckluZm9TZXJ2aWNlIiwiX2pvc2VVdGlsIiwiX3Byb2Nlc3NTaWduaW5QYXJhbXMiLCJfdmFsaWRhdGVUb2tlbnMiLCJfcHJvY2Vzc0NsYWltcyIsIm5vbmNlIiwiaWRfdG9rZW4iLCJpc09wZW5JZENvbm5lY3QiLCJwcm9maWxlIiwiYWNjZXNzX3Rva2VuIiwiZ2V0Q2xhaW1zIiwiY2xhaW1zIiwic3ViIiwiX21lcmdlQ2xhaW1zIiwiY2xhaW1zMSIsImNsYWltczIiLCJyZXN1bHQiLCJPYmplY3QiLCJhc3NpZ24iLCJuYW1lIiwidmFsdWVzIiwiaXNBcnJheSIsImkiLCJmb3JFYWNoIiwidHlwZSIsIl92YWxpZGF0ZUlkVG9rZW5BbmRBY2Nlc3NUb2tlbiIsIl92YWxpZGF0ZUlkVG9rZW4iLCJfdmFsaWRhdGVBY2Nlc3NUb2tlbiIsImp3dCIsInBhcnNlSnd0IiwiaGVhZGVyIiwicGF5bG9hZCIsImtpZCIsImdldElzc3VlciIsImdldFNpZ25pbmdLZXlzIiwiX2ZpbHRlckJ5QWxnIiwiYWxnIiwiZmlsdGVyIiwiYXVkaWVuY2UiLCJjbG9ja1NrZXdJblNlY29uZHMiLCJ2YWxpZGF0ZUp3dCIsImlzc3VlciIsImt0eSIsInN0YXJ0c1dpdGgiLCJhdF9oYXNoIiwiaGFzaEFsZyIsImhhc2hCaXRzIiwicGFyc2VJbnQiLCJzaGEiLCJoYXNoIiwiaGFzaFN0cmluZyIsImxlZnQiLCJsZWZ0X2I2NHUiLCJoZXhUb0Jhc2U2NFVybCIsIkpzb25TZXJ2aWNlQ3RvciIsIl9qc29uU2VydmljZSIsImdldE1ldGFkYXRhIiwiZ2V0SnNvbiIsIl9nZXRNZXRhZGF0YVByb3BlcnR5IiwiZ2V0VXNlckluZm9FbmRwb2ludCIsImdldFRva2VuRW5kcG9pbnQiLCJnZXRDaGVja1Nlc3Npb25JZnJhbWUiLCJnZXRSZXZvY2F0aW9uRW5kcG9pbnQiLCJvcHRpb25hbCIsInVuZGVmaW5lZCIsImp3a3NfdXJpIiwia2V5U2V0IiwiSnNvblNlcnZpY2UiLCJYTUxIdHRwUmVxdWVzdEN0b3IiLCJfWE1MSHR0cFJlcXVlc3QiLCJ0b2tlbiIsInJlcSIsIm9wZW4iLCJvbmxvYWQiLCJzdGF0dXMiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJlIiwibWVzc2FnZSIsInN0YXR1c1RleHQiLCJvbmVycm9yIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJVc2VySW5mb1NlcnZpY2UiLCJFcnJvclJlc3BvbnNlIiwiZXJyb3JfZGVzY3JpcHRpb24iLCJlcnJvcl91cmkiLCJBbGxvd2VkU2lnbmluZ0FsZ3MiLCJKb3NlVXRpbCIsIkpXUyIsImhlYWRlck9iaiIsInBheWxvYWRPYmoiLCJub3ciLCJuIiwiZ2V0S2V5IiwieDVjIiwiZ2V0UHVibGljS2V5RnJvbUNlcnRQRU0iLCJjcnYiLCJ4IiwieSIsIl92YWxpZGF0ZUp3dCIsIkRhdGUiLCJpc3MiLCJhdWQiLCJ2YWxpZEF1ZGllbmNlIiwibG93ZXJOb3ciLCJ1cHBlck5vdyIsImlhdCIsIm5iZiIsImV4cCIsInZlcmlmeSIsIlV0aWwiLCJTaWduaW5SZXF1ZXN0Iiwib2lkYyIsImlzT2lkYyIsImFkZFF1ZXJ5UGFyYW0iLCJzcGxpdCIsImlzT0F1dGgiLCJVcmxVdGlsaXR5IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicGFyc2VVcmxGcmFnbWVudCIsImRlbGltaXRlciIsImdsb2JhbCIsImhyZWYiLCJpZHgiLCJsYXN0SW5kZXhPZiIsInBhcmFtcyIsInJlZ2V4IiwibSIsImNvdW50ZXIiLCJleGVjIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwicHJvcCIsIlNpZ25pblN0YXRlIiwiYXJndW1lbnRzIiwiX25vbmNlIiwic3RyaW5naWZ5IiwiY3JlYXRlZCIsInN0b3JhZ2VTdHJpbmciLCJTdGF0ZSIsIl9pZCIsIl9kYXRhIiwiX2NyZWF0ZWQiLCJzdG9yYWdlIiwiYWdlIiwiY3V0b2ZmIiwicHJvbWlzZXMiLCJwIiwiYWxsIiwicmFuZG9tIiwiZ3VpZEhvbGRlciIsImhleCIsInIiLCJndWlkUmVzcG9uc2UiLCJNYXRoIiwiT2lkY1Njb3BlIiwiU2lnbmluUmVzcG9uc2UiLCJzZXNzaW9uX3N0YXRlIiwidG9rZW5fdHlwZSIsImV4cGlyZXNfaW4iLCJleHBpcmVzX2F0Iiwic2NvcGVzIiwiU2lnbm91dFJlcXVlc3QiLCJTaWdub3V0UmVzcG9uc2UiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciIsIlNlc3Npb25Nb25pdG9yQ3RvciIsIlRva2VuUmV2b2NhdGlvbkNsaWVudEN0b3IiLCJfZXZlbnRzIiwiX3NpbGVudFJlbmV3U2VydmljZSIsImF1dG9tYXRpY1NpbGVudFJlbmV3Iiwic3RhcnRTaWxlbnRSZW5ldyIsIm1vbml0b3JTZXNzaW9uIiwiX3Nlc3Npb25Nb25pdG9yIiwiX3Rva2VuUmV2b2NhdGlvbkNsaWVudCIsImdldFVzZXIiLCJfbG9hZFVzZXIiLCJ1c2VyIiwibG9hZCIsInJlbW92ZVVzZXIiLCJzdG9yZVVzZXIiLCJ1bmxvYWQiLCJzaWduaW5SZWRpcmVjdCIsIl9zaWduaW5TdGFydCIsIl9yZWRpcmVjdE5hdmlnYXRvciIsInNpZ25pblJlZGlyZWN0Q2FsbGJhY2siLCJfc2lnbmluRW5kIiwic2lnbmluUG9wdXAiLCJwb3B1cF9yZWRpcmVjdF91cmkiLCJfc2lnbmluIiwiX3BvcHVwTmF2aWdhdG9yIiwic3RhcnRVcmwiLCJwb3B1cFdpbmRvd0ZlYXR1cmVzIiwicG9wdXBXaW5kb3dUYXJnZXQiLCJzaWduaW5Qb3B1cENhbGxiYWNrIiwiX3NpZ25pbkNhbGxiYWNrIiwic2lnbmluU2lsZW50Iiwic2lsZW50X3JlZGlyZWN0X3VyaSIsInNldElkVG9rZW4iLCJpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXciLCJfaWZyYW1lTmF2aWdhdG9yIiwic2lsZW50UmVxdWVzdFRpbWVvdXQiLCJzaWduaW5TaWxlbnRDYWxsYmFjayIsInF1ZXJ5U2Vzc2lvblN0YXR1cyIsIm5hdlJlc3BvbnNlIiwic2lnbmluUmVzcG9uc2UiLCJzaWQiLCJuYXZpZ2F0b3IiLCJuYXZpZ2F0b3JQYXJhbXMiLCJwcmVwYXJlIiwibmF2aWdhdGUiLCJjYXRjaCIsImNsb3NlIiwiZXJyIiwiY2FsbGJhY2siLCJzaWdub3V0UmVkaXJlY3QiLCJwb3N0TG9nb3V0UmVkaXJlY3RVcmkiLCJfc2lnbm91dFN0YXJ0Iiwic2lnbm91dFJlZGlyZWN0Q2FsbGJhY2siLCJfc2lnbm91dEVuZCIsInNpZ25vdXRQb3B1cCIsInBvcHVwX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSIsIl9zaWdub3V0Iiwic2lnbm91dFBvcHVwQ2FsbGJhY2siLCJrZWVwT3BlbiIsInJldm9rZVByb21pc2UiLCJyZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCIsIl9yZXZva2VJbnRlcm5hbCIsInNpZ25vdXRSZXF1ZXN0Iiwic2lnbm91dFJlc3BvbnNlIiwicmV2b2tlQWNjZXNzVG9rZW4iLCJzdWNjZXNzIiwicmVxdWlyZWQiLCJyZXZva2UiLCJzdGFydCIsInN0b3BTaWxlbnRSZW5ldyIsInN0b3AiLCJfdXNlclN0b3JlIiwiX3VzZXJTdG9yZUtleSIsInJlZGlyZWN0TmF2aWdhdG9yIiwicG9wdXBOYXZpZ2F0b3IiLCJpZnJhbWVOYXZpZ2F0b3IiLCJ1c2VyU3RvcmUiLCJEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUiLCJEZWZhdWx0Q2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJVc2VyTWFuYWdlclNldHRpbmdzIiwiY2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSIsIl9wb3B1cF9yZWRpcmVjdF91cmkiLCJfcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX3BvcHVwV2luZG93RmVhdHVyZXMiLCJfcG9wdXBXaW5kb3dUYXJnZXQiLCJfc2lsZW50X3JlZGlyZWN0X3VyaSIsIl9zaWxlbnRSZXF1ZXN0VGltZW91dCIsIl9hdXRvbWF0aWNTaWxlbnRSZW5ldyIsIl9pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXciLCJfYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUiLCJfbW9uaXRvclNlc3Npb24iLCJfY2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJfcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQiLCJSZWRpcmVjdE5hdmlnYXRvciIsIndpbmRvdyIsIlBvcHVwTmF2aWdhdG9yIiwicG9wdXAiLCJub3RpZnlPcGVuZXIiLCJDaGVja0ZvclBvcHVwQ2xvc2VkSW50ZXJ2YWwiLCJEZWZhdWx0UG9wdXBGZWF0dXJlcyIsIkRlZmF1bHRQb3B1cFRhcmdldCIsIlBvcHVwV2luZG93IiwiX3Byb21pc2UiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJ0YXJnZXQiLCJmZWF0dXJlcyIsIl9wb3B1cCIsIl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIiLCJfY2hlY2tGb3JQb3B1cENsb3NlZCIsImJpbmQiLCJfZXJyb3IiLCJfY2FsbGJhY2siLCJmb2N1cyIsInByb21pc2UiLCJfc3VjY2VzcyIsIl9jbGVhbnVwIiwiY2xvc2VkIiwib3BlbmVyIiwiSUZyYW1lTmF2aWdhdG9yIiwiZnJhbWUiLCJub3RpZnlQYXJlbnQiLCJEZWZhdWx0VGltZW91dCIsIklGcmFtZVdpbmRvdyIsIl9ib3VuZE1lc3NhZ2VFdmVudCIsIl9tZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9mcmFtZSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwidmlzaWJpbGl0eSIsInBvc2l0aW9uIiwid2lkdGgiLCJoZWlnaHQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJ0aW1lb3V0IiwiX3RpbWVyIiwic2V0VGltZW91dCIsIl90aW1lb3V0Iiwic3JjIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNsZWFyVGltZW91dCIsInJlbW92ZUNoaWxkIiwib3JpZ2luIiwiX29yaWdpbiIsInNvdXJjZSIsImNvbnRlbnRXaW5kb3ciLCJwYXJlbnQiLCJwb3N0TWVzc2FnZSIsInByb3RvY29sIiwiaG9zdCIsIlVzZXJNYW5hZ2VyRXZlbnRzIiwiX3VzZXJMb2FkZWQiLCJfdXNlclVubG9hZGVkIiwiX3NpbGVudFJlbmV3RXJyb3IiLCJfdXNlclNpZ25lZE91dCIsIl91c2VyU2Vzc2lvbkNoYW5nZWQiLCJyYWlzZUV2ZW50IiwicmFpc2UiLCJhZGRVc2VyTG9hZGVkIiwiYWRkSGFuZGxlciIsInJlbW92ZVVzZXJMb2FkZWQiLCJyZW1vdmVIYW5kbGVyIiwiYWRkVXNlclVubG9hZGVkIiwicmVtb3ZlVXNlclVubG9hZGVkIiwiYWRkU2lsZW50UmVuZXdFcnJvciIsInJlbW92ZVNpbGVudFJlbmV3RXJyb3IiLCJfcmFpc2VTaWxlbnRSZW5ld0Vycm9yIiwiYWRkVXNlclNpZ25lZE91dCIsInJlbW92ZVVzZXJTaWduZWRPdXQiLCJfcmFpc2VVc2VyU2lnbmVkT3V0IiwiYWRkVXNlclNlc3Npb25DaGFuZ2VkIiwicmVtb3ZlVXNlclNlc3Npb25DaGFuZ2VkIiwiX3JhaXNlVXNlclNlc3Npb25DaGFuZ2VkIiwiYWNjZXNzVG9rZW5FeHBpcmluZ1RpbWVyIiwiYWNjZXNzVG9rZW5FeHBpcmVkVGltZXIiLCJfYWNjZXNzVG9rZW5FeHBpcmluZyIsIl9hY2Nlc3NUb2tlbkV4cGlyZWQiLCJjb250YWluZXIiLCJfY2FuY2VsVGltZXJzIiwiZXhwaXJpbmciLCJpbml0IiwiZXhwaXJlZCIsImNhbmNlbCIsImFkZEFjY2Vzc1Rva2VuRXhwaXJpbmciLCJyZW1vdmVBY2Nlc3NUb2tlbkV4cGlyaW5nIiwiYWRkQWNjZXNzVG9rZW5FeHBpcmVkIiwicmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmVkIiwiVGltZXJEdXJhdGlvbiIsIlRpbWVyIiwiX25vd0Z1bmMiLCJfbmFtZSIsIl9leHBpcmF0aW9uIiwidGltZXJEdXJhdGlvbiIsIl90aW1lckhhbmRsZSIsImRpZmYiLCJFdmVudCIsIl9jYWxsYmFja3MiLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJTaWxlbnRSZW5ld1NlcnZpY2UiLCJ1c2VyTWFuYWdlciIsIl91c2VyTWFuYWdlciIsIl90b2tlbkV4cGlyaW5nIiwiZXZlbnRzIiwiQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciIsIl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yIiwiX3N0YXJ0IiwiX3N0b3AiLCJfc3ViIiwiX3NpZCIsIl9jaGVja1Nlc3Npb25JRnJhbWUiLCJpbnRlcnZhbCIsInJhaXNlVXNlclNpZ25lZE91dEV2ZW50Iiwic2Vzc2lvbiIsIkRlZmF1bHRJbnRlcnZhbCIsIl91cmwiLCJfaW50ZXJ2YWwiLCJfZnJhbWVfb3JpZ2luIiwiX3Nlc3Npb25fc3RhdGUiLCJBY2Nlc3NUb2tlblR5cGVIaW50IiwiX1hNTEh0dHBSZXF1ZXN0Q3RvciIsImFjY2Vzc1Rva2VuIiwiX3Jldm9rZSIsInhociIsIkNvcmRvdmFQb3B1cFdpbmRvdyIsIl9pc0luQXBwQnJvd3Nlckluc3RhbGxlZCIsImNvcmRvdmFNZXRhZGF0YSIsInNvbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImNvcmRvdmEiLCJJbkFwcEJyb3dzZXIiLCJfZXhpdENhbGxiYWNrRXZlbnQiLCJfZXhpdENhbGxiYWNrIiwiX2xvYWRTdGFydENhbGxiYWNrRXZlbnQiLCJfbG9hZFN0YXJ0Q2FsbGJhY2siLCJldmVudCJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN0Q0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7OztBQzNCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDcE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXNCO0FBQ3RCLHVCQUFzQix1QkFBdUIsV0FBVyxJQUFJO0FBQzVELElBQUc7QUFDSCxFQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTJEO0FBQzNEO0FBQ0EsTUFBSztBQUNMO0FBQ0EsdUJBQXNCLG1DQUFtQztBQUN6RCxNQUFLO0FBQ0wsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBLEVBQUM7QUFDRDtBQUNBO0FBQ0EsOEZBQTZGO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLEVBQUM7O0FBRUQ7Ozs7Ozs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFRLFdBQVc7QUFDbkI7QUFDQTtBQUNBLFNBQVEsVUFBVTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVEsV0FBVztBQUNuQjtBQUNBO0FBQ0E7QUFDQSxTQUFRLFdBQVc7QUFDbkI7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUF5QixtQkFBbUIsdUJBQXVCLEVBQUUsRUFBRTtBQUN2RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixXQUFXO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNILEVBQUM7QUFDRDtBQUNBO0FBQ0EsSUFBRztBQUNILDBCQUF5QjtBQUN6QixJQUFHO0FBQ0gsd0JBQXVCO0FBQ3ZCLDJCQUEwQjtBQUMxQiwyQkFBMEI7QUFDMUI7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFpRCxpQkFBaUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNuUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDSEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDSkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBLDZCQUE0QjtBQUM1QixJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFpQixtQkFBbUIsMEJBQTBCLEVBQUUsRUFBRTtBQUNsRTs7QUFFQTtBQUNBO0FBQ0E7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Q1ZEO0FBQ0E7O0FBRUEsZ0NBQStCLG9DQUFrQzs7Ozs7OztBQ0hqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ1RBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDZkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUErQixXQUFXOzs7Ozs7O0FDOUIxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNkRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7Ozs7Ozs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDs7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7Ozs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDVEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ1hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNmQTtBQUNBOztBQUVBOzs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ1hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVTtBQUNWLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDN0JEOzs7Ozs7O0FDQUE7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7Ozs7Ozs7QUNyQkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7Ozs7OztBQ1JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7Ozs7Ozs7QUNmQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOzs7Ozs7O0FDUkQ7QUFDQTtB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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQSxZQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHlDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxVQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FB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TCxHQUFjLElBQWQ7QUFDSCxNOzs7OzZCQXZDYTtBQUNWLG9CQUFPLEtBQUtMLFFBQVo7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1REw7Ozs7QUFDQTs7Ozs7OzJKQUpBO0FBQ0E7O0tBS2FsYSxzQixXQUFBQSxzQjs7Ozs7c0NBRVRzVyxPLG9CQUFRbkYsTSxFQUFRO0FBQ1pBLGdCQUFPa0UsbUJBQVAsR0FBNkIsWUFBN0I7QUFDQSxhQUFJdUUsUUFBUSxpQ0FBdUJ6SSxNQUF2QixDQUFaO0FBQ0EsZ0JBQU94TixRQUFRWSxPQUFSLENBQWdCcVYsS0FBaEIsQ0FBUDtBQUNILE0iLCJmaWxlIjoib2lkYy1jbGllbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBjMWIyZWVlNWM4YjZiYzExM2MzZCIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9zaGltXCIpO1xuXG5yZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9mbi9yZWdleHAvZXNjYXBlXCIpO1xuXG5pZiAoZ2xvYmFsLl9iYWJlbFBvbHlmaWxsKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIm9ubHkgb25lIGluc3RhbmNlIG9mIGJhYmVsLXBvbHlmaWxsIGlzIGFsbG93ZWRcIik7XG59XG5nbG9iYWwuX2JhYmVsUG9seWZpbGwgPSB0cnVlO1xuXG52YXIgREVGSU5FX1BST1BFUlRZID0gXCJkZWZpbmVQcm9wZXJ0eVwiO1xuZnVuY3Rpb24gZGVmaW5lKE8sIGtleSwgdmFsdWUpIHtcbiAgT1trZXldIHx8IE9iamVjdFtERUZJTkVfUFJPUEVSVFldKE8sIGtleSwge1xuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSk7XG59XG5cbmRlZmluZShTdHJpbmcucHJvdG90eXBlLCBcInBhZExlZnRcIiwgXCJcIi5wYWRTdGFydCk7XG5kZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgXCJwYWRSaWdodFwiLCBcIlwiLnBhZEVuZCk7XG5cblwicG9wLHJldmVyc2Usc2hpZnQsa2V5cyx2YWx1ZXMsZW50cmllcyxpbmRleE9mLGV2ZXJ5LHNvbWUsZm9yRWFjaCxtYXAsZmlsdGVyLGZpbmQsZmluZEluZGV4LGluY2x1ZGVzLGpvaW4sc2xpY2UsY29uY2F0LHB1c2gsc3BsaWNlLHVuc2hpZnQsc29ydCxsYXN0SW5kZXhPZixyZWR1Y2UscmVkdWNlUmlnaHQsY29weVdpdGhpbixmaWxsXCIuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBbXVtrZXldICYmIGRlZmluZShBcnJheSwga2V5LCBGdW5jdGlvbi5jYWxsLmJpbmQoW11ba2V5XSkpO1xufSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JhYmVsLXBvbHlmaWxsL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1mcm96ZW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucGFyc2UtaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWluLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hdGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNicnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jbHozMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNvc2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5leHBtMScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmh5cG90Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguaW11bCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguc2lnbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC50YW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmF3Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy50cmltJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdGFydHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5iaWcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJsaW5rJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5maXhlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udGNvbG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcubGluaycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3ViJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS5ub3cnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmpvaW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc29ydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNvbWUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZXZlcnknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pbmRleC1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5sYXN0LWluZGV4LW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAucmVwbGFjZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuYXJyYXktYnVmZmVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQzMi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0NjQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5oYXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmZsYXQtbWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmZsYXR0ZW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLmF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtc3RhcnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tbGVmdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zZXQub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1tYXAub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1zZXQub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWFwLmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc2V0LmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1tYXAuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy53ZWFrLXNldC5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lmdsb2JhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zeXN0ZW0uZ2xvYmFsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmVycm9yLmlzLWVycm9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguY2xhbXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5kZWctcGVyLXJhZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmRlZ3JlZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5mc2NhbGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pYWRkaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaW11bGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5yYWQtcGVyLWRlZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnJhZGlhbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5zY2FsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnVtdWxoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguc2lnbmJpdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucHJvbWlzZS50cnknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5kZWZpbmUtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QubWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXNhcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYnNlcnZhYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLnRpbWVycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi5pbW1lZGlhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbW9kdWxlcy9fY29yZScpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvc2hpbS5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgTUVUQSA9IHJlcXVpcmUoJy4vX21ldGEnKS5LRVk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIHdrc0RlZmluZSA9IHJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKTtcbnZhciBlbnVtS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0ta2V5cycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIF9jcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZ09QTkV4dCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpO1xudmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkRFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QRCA9ICRHT1BELmY7XG52YXIgZFAgPSAkRFAuZjtcbnZhciBnT1BOID0gZ09QTkV4dC5mO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRKU09OID0gZ2xvYmFsLkpTT047XG52YXIgX3N0cmluZ2lmeSA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBISURERU4gPSB3a3MoJ19oaWRkZW4nKTtcbnZhciBUT19QUklNSVRJVkUgPSB3a3MoJ3RvUHJpbWl0aXZlJyk7XG52YXIgaXNFbnVtID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPUFN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyIFVTRV9OQVRJVkUgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkUCh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoaXQsIGtleSwgRCkge1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYgKHByb3RvRGVzYykgZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZiAocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bykgZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKSB7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8pICRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghRC5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhpdCwgSElEREVOKSkgZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwgeyBlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApIHtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpIHtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIGl0ID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmIChEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgdmFyIG5hbWVzID0gZ09QTih0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90bztcbiAgdmFyIG5hbWVzID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmICghVVNFX05BVElWRSkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzID09PSBPYmplY3RQcm90bykgJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYgKERFU0NSSVBUT1JTICYmIHNldHRlcikgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0IH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKSB7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoeyBhOiBTIH0pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkge1xuICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgICRyZXBsYWNlciA9IHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3ltYm9sLmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9faGFzLmpzXG4vLyBtb2R1bGUgaWQgPSA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gfHwgKGdsb2JhbFtuYW1lXSA9IHt9KSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV07XG4gIHZhciBleHBvcnRzID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSk7XG4gIHZhciBleHBQcm90byA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pO1xuICB2YXIga2V5LCBvd24sIG91dCwgZXhwO1xuICBpZiAoSVNfR0xPQkFMKSBzb3VyY2UgPSBuYW1lO1xuICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZiAodGFyZ2V0KSByZWRlZmluZSh0YXJnZXQsIGtleSwgb3V0LCB0eXBlICYgJGV4cG9ydC5VKTtcbiAgICAvLyBleHBvcnRcbiAgICBpZiAoZXhwb3J0c1trZXldICE9IG91dCkgaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYgKElTX1BST1RPICYmIGV4cFByb3RvW2tleV0gIT0gb3V0KSBleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzXG4vLyBtb2R1bGUgaWQgPSA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjUuMycgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzXG4vLyBtb2R1bGUgaWQgPSA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2hpZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanNcbi8vIG1vZHVsZSBpZCA9IDExXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gMTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanNcbi8vIG1vZHVsZSBpZCA9IDE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzXG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBTUkMgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSBGdW5jdGlvbltUT19TVFJJTkddO1xudmFyIFRQTCA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuICR0b1N0cmluZy5jYWxsKGl0KTtcbn07XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbCwgc2FmZSkge1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYgKE9ba2V5XSA9PT0gdmFsKSByZXR1cm47XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIGlmICghc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH0gZWxzZSBpZiAoT1trZXldKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlkID0gMDtcbnZhciBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL191aWQuanNcbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2N0eC5qc1xuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIE1FVEEgPSByZXF1aXJlKCcuL191aWQnKSgnbWV0YScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgc2V0RGVzYyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaWQgPSAwO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBzZXREZXNjKGl0LCBNRVRBLCB7IHZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBXS5pO1xufTtcbnZhciBnZXRXZWFrID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQSkpIHNldE1ldGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgS0VZOiBNRVRBLFxuICBORUVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2VhazogZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fbWV0YS5qc1xuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qc1xuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCB0YWcsIHN0YXQpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpIGRlZihpdCwgVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZyB9KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qc1xuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHN0b3JlID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbDtcbnZhciBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnRzLmYgPSByZXF1aXJlKCcuL193a3MnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3drcy1leHQuanNcbi8vIG1vZHVsZSBpZCA9IDI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyICRTeW1ib2wgPSBjb3JlLlN5bWJvbCB8fCAoY29yZS5TeW1ib2wgPSBMSUJSQVJZID8ge30gOiBnbG9iYWwuU3ltYm9sIHx8IHt9KTtcbiAgaWYgKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpIGRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHsgdmFsdWU6IHdrc0V4dC5mKG5hbWUpIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3drcy1kZWZpbmUuanNcbi8vIG1vZHVsZSBpZCA9IDI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSBnZXRLZXlzKGl0KTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmIChnZXRTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KTtcbiAgICB2YXIgaXNFbnVtID0gcElFLmY7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKHN5bWJvbHMubGVuZ3RoID4gaSkgaWYgKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZW51bS1rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSAyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanNcbi8vIG1vZHVsZSBpZCA9IDMwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanNcbi8vIG1vZHVsZSBpZCA9IDMxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fY29mLmpzXG4vLyBtb2R1bGUgaWQgPSAzNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZGVmaW5lZC5qc1xuLy8gbW9kdWxlIGlkID0gMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qc1xuLy8gbW9kdWxlIGlkID0gMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanNcbi8vIG1vZHVsZSBpZCA9IDM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qc1xuLy8gbW9kdWxlIGlkID0gMzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzXG4vLyBtb2R1bGUgaWQgPSA0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2VudW0tYnVnLWtleXMuanNcbi8vIG1vZHVsZSBpZCA9IDQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qc1xuLy8gbW9kdWxlIGlkID0gNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzXG4vLyBtb2R1bGUgaWQgPSA0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSA0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGRQcyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpO1xuICB2YXIgaSA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgZ3QgPSAnPic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAoaS0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSA0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzXG4vLyBtb2R1bGUgaWQgPSA0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbm1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9faHRtbC5qc1xuLy8gbW9kdWxlIGlkID0gNDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ09QTihpdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanNcbi8vIG1vZHVsZSBpZCA9IDQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qc1xuLy8gbW9kdWxlIGlkID0gNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qc1xuLy8gbW9kdWxlIGlkID0gNTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IGNyZWF0ZTogcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gNTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZiB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDUyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMyAvIDE1LjIuMy43IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0aWVzOiByZXF1aXJlKCcuL19vYmplY3QtZHBzJykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDUzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDU0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIG1vc3QgT2JqZWN0IG1ldGhvZHMgYnkgRVM2IHNob3VsZCBhY2NlcHQgcHJpbWl0aXZlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgZXhlYykge1xuICB2YXIgZm4gPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV07XG4gIHZhciBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXNhcC5qc1xuLy8gbW9kdWxlIGlkID0gNTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAkZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiAkZ2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanNcbi8vIG1vZHVsZSBpZCA9IDU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi4xNCBPYmplY3Qua2V5cyhPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2tleXMnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSA1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JykuZjtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMuanNcbi8vIG1vZHVsZSBpZCA9IDYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi41IE9iamVjdC5mcmVlemUoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZnJlZXplJywgZnVuY3Rpb24gKCRmcmVlemUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShpdCkge1xuICAgIHJldHVybiAkZnJlZXplICYmIGlzT2JqZWN0KGl0KSA/ICRmcmVlemUobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanNcbi8vIG1vZHVsZSBpZCA9IDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi4xNyBPYmplY3Quc2VhbChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdzZWFsJywgZnVuY3Rpb24gKCRzZWFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzZWFsKGl0KSB7XG4gICAgcmV0dXJuICRzZWFsICYmIGlzT2JqZWN0KGl0KSA/ICRzZWFsKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbC5qc1xuLy8gbW9kdWxlIGlkID0gNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjE1IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdwcmV2ZW50RXh0ZW5zaW9ucycsIGZ1bmN0aW9uICgkcHJldmVudEV4dGVuc2lvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKGl0KSB7XG4gICAgcmV0dXJuICRwcmV2ZW50RXh0ZW5zaW9ucyAmJiBpc09iamVjdChpdCkgPyAkcHJldmVudEV4dGVuc2lvbnMobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanNcbi8vIG1vZHVsZSBpZCA9IDYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi4xMiBPYmplY3QuaXNGcm96ZW4oTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzRnJvemVuJywgZnVuY3Rpb24gKCRpc0Zyb3plbikge1xuICByZXR1cm4gZnVuY3Rpb24gaXNGcm96ZW4oaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzRnJvemVuID8gJGlzRnJvemVuKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qc1xuLy8gbW9kdWxlIGlkID0gNjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjEzIE9iamVjdC5pc1NlYWxlZChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNTZWFsZWQnLCBmdW5jdGlvbiAoJGlzU2VhbGVkKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpc1NlYWxlZChpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNTZWFsZWQgPyAkaXNTZWFsZWQoaXQpIDogZmFsc2UgOiB0cnVlO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkLmpzXG4vLyBtb2R1bGUgaWQgPSA2NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuMTEgT2JqZWN0LmlzRXh0ZW5zaWJsZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNFeHRlbnNpYmxlJywgZnVuY3Rpb24gKCRpc0V4dGVuc2libGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1leHRlbnNpYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA2NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYsICdPYmplY3QnLCB7IGFzc2lnbjogcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qc1xuLy8gbW9kdWxlIGlkID0gNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSBpZiAoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSkgVFtrZXldID0gU1trZXldO1xuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzXG4vLyBtb2R1bGUgaWQgPSA2OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjMuMTAgT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBpczogcmVxdWlyZSgnLi9fc2FtZS12YWx1ZScpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLmpzXG4vLyBtb2R1bGUgaWQgPSA2OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuOSBTYW1lVmFsdWUoeCwgeSlcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmlzIHx8IGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4geCA9PT0geSA/IHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5IDogeCAhPSB4ICYmIHkgIT0geTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zYW1lLXZhbHVlLmpzXG4vLyBtb2R1bGUgaWQgPSA3MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDcxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbiAodGVzdCwgYnVnZ3ksIHNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgYnVnZ3kgPSB0cnVlOyB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZiAoYnVnZ3kpIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgICAgIGVsc2Ugc2V0KE8sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIE87XG4gICAgICB9O1xuICAgIH0oe30sIGZhbHNlKSA6IHVuZGVmaW5lZCksXG4gIGNoZWNrOiBjaGVja1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qc1xuLy8gbW9kdWxlIGlkID0gNzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciB0ZXN0ID0ge307XG50ZXN0W3JlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmICh0ZXN0ICsgJycgIT0gJ1tvYmplY3Qgel0nKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xuICB9LCB0cnVlKTtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDczXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIEFSRyA9IGNvZihmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanNcbi8vIG1vZHVsZSBpZCA9IDc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjIuMy4yIC8gMTUuMy40LjUgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQodGhpc0FyZywgYXJncy4uLilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnRnVuY3Rpb24nLCB7IGJpbmQ6IHJlcXVpcmUoJy4vX2JpbmQnKSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQuanNcbi8vIG1vZHVsZSBpZCA9IDc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBhcnJheVNsaWNlID0gW10uc2xpY2U7XG52YXIgZmFjdG9yaWVzID0ge307XG5cbnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoRiwgbGVuLCBhcmdzKSB7XG4gIGlmICghKGxlbiBpbiBmYWN0b3JpZXMpKSB7XG4gICAgZm9yICh2YXIgbiA9IFtdLCBpID0gMDsgaSA8IGxlbjsgaSsrKSBuW2ldID0gJ2FbJyArIGkgKyAnXSc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgZmFjdG9yaWVzW2xlbl0gPSBGdW5jdGlvbignRixhJywgJ3JldHVybiBuZXcgRignICsgbi5qb2luKCcsJykgKyAnKScpO1xuICB9IHJldHVybiBmYWN0b3JpZXNbbGVuXShGLCBhcmdzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uYmluZCB8fCBmdW5jdGlvbiBiaW5kKHRoYXQgLyogLCAuLi5hcmdzICovKSB7XG4gIHZhciBmbiA9IGFGdW5jdGlvbih0aGlzKTtcbiAgdmFyIHBhcnRBcmdzID0gYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZCA9IGZ1bmN0aW9uICgvKiBhcmdzLi4uICovKSB7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmQgPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG4gIGlmIChpc09iamVjdChmbi5wcm90b3R5cGUpKSBib3VuZC5wcm90b3R5cGUgPSBmbi5wcm90b3R5cGU7XG4gIHJldHVybiBib3VuZDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19iaW5kLmpzXG4vLyBtb2R1bGUgaWQgPSA3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanNcbi8vIG1vZHVsZSBpZCA9IDc3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgRlByb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIG5hbWVSRSA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopLztcbnZhciBOQU1FID0gJ25hbWUnO1xuXG4vLyAxOS4yLjQuMiBuYW1lXG5OQU1FIGluIEZQcm90byB8fCByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIGRQKEZQcm90bywgTkFNRSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKCcnICsgdGhpcykubWF0Y2gobmFtZVJFKVsxXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUuanNcbi8vIG1vZHVsZSBpZCA9IDc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIEhBU19JTlNUQU5DRSA9IHJlcXVpcmUoJy4vX3drcycpKCdoYXNJbnN0YW5jZScpO1xudmFyIEZ1bmN0aW9uUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyAxOS4yLjMuNiBGdW5jdGlvbi5wcm90b3R5cGVbQEBoYXNJbnN0YW5jZV0oVilcbmlmICghKEhBU19JTlNUQU5DRSBpbiBGdW5jdGlvblByb3RvKSkgcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZihGdW5jdGlvblByb3RvLCBIQVNfSU5TVEFOQ0UsIHsgdmFsdWU6IGZ1bmN0aW9uIChPKSB7XG4gIGlmICh0eXBlb2YgdGhpcyAhPSAnZnVuY3Rpb24nIHx8ICFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzT2JqZWN0KHRoaXMucHJvdG90eXBlKSkgcmV0dXJuIE8gaW5zdGFuY2VvZiB0aGlzO1xuICAvLyBmb3IgZW52aXJvbm1lbnQgdy9vIG5hdGl2ZSBgQEBoYXNJbnN0YW5jZWAgbG9naWMgZW5vdWdoIGBpbnN0YW5jZW9mYCwgYnV0IGFkZCB0aGlzOlxuICB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKSBpZiAodGhpcy5wcm90b3R5cGUgPT09IE8pIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlLmpzXG4vLyBtb2R1bGUgaWQgPSA3OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUludCA9IHJlcXVpcmUoJy4vX3BhcnNlLWludCcpO1xuLy8gMTguMi41IHBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuRiAqIChwYXJzZUludCAhPSAkcGFyc2VJbnQpLCB7IHBhcnNlSW50OiAkcGFyc2VJbnQgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1pbnQuanNcbi8vIG1vZHVsZSBpZCA9IDgwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5wYXJzZUludDtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciB3cyA9IHJlcXVpcmUoJy4vX3N0cmluZy13cycpO1xudmFyIGhleCA9IC9eWy0rXT8wW3hYXS87XG5cbm1vZHVsZS5leHBvcnRzID0gJHBhcnNlSW50KHdzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdzICsgJzB4MTYnKSAhPT0gMjIgPyBmdW5jdGlvbiBwYXJzZUludChzdHIsIHJhZGl4KSB7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHJldHVybiAkcGFyc2VJbnQoc3RyaW5nLCAocmFkaXggPj4+IDApIHx8IChoZXgudGVzdChzdHJpbmcpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWludC5qc1xuLy8gbW9kdWxlIGlkID0gODFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzcGFjZXMgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKTtcbnZhciBzcGFjZSA9ICdbJyArIHNwYWNlcyArICddJztcbnZhciBub24gPSAnXFx1MjAwYlxcdTAwODUnO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHNwYWNlICsgc3BhY2UgKyAnKicpO1xudmFyIHJ0cmltID0gUmVnRXhwKHNwYWNlICsgc3BhY2UgKyAnKiQnKTtcblxudmFyIGV4cG9ydGVyID0gZnVuY3Rpb24gKEtFWSwgZXhlYywgQUxJQVMpIHtcbiAgdmFyIGV4cCA9IHt9O1xuICB2YXIgRk9SQ0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhc3BhY2VzW0tFWV0oKSB8fCBub25bS0VZXSgpICE9IG5vbjtcbiAgfSk7XG4gIHZhciBmbiA9IGV4cFtLRVldID0gRk9SQ0UgPyBleGVjKHRyaW0pIDogc3BhY2VzW0tFWV07XG4gIGlmIChBTElBUykgZXhwW0FMSUFTXSA9IGZuO1xuICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFLCAnU3RyaW5nJywgZXhwKTtcbn07XG5cbi8vIDEgLT4gU3RyaW5nI3RyaW1MZWZ0XG4vLyAyIC0+IFN0cmluZyN0cmltUmlnaHRcbi8vIDMgLT4gU3RyaW5nI3RyaW1cbnZhciB0cmltID0gZXhwb3J0ZXIudHJpbSA9IGZ1bmN0aW9uIChzdHJpbmcsIFRZUEUpIHtcbiAgc3RyaW5nID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIGlmIChUWVBFICYgMSkgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpO1xuICByZXR1cm4gc3RyaW5nO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy10cmltLmpzXG4vLyBtb2R1bGUgaWQgPSA4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanNcbi8vIG1vZHVsZSBpZCA9IDgzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuL19wYXJzZS1mbG9hdCcpO1xuLy8gMTguMi40IHBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkYgKiAocGFyc2VGbG9hdCAhPSAkcGFyc2VGbG9hdCksIHsgcGFyc2VGbG9hdDogJHBhcnNlRmxvYXQgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdC5qc1xuLy8gbW9kdWxlIGlkID0gODRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VGbG9hdDtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcblxubW9kdWxlLmV4cG9ydHMgPSAxIC8gJHBhcnNlRmxvYXQocmVxdWlyZSgnLi9fc3RyaW5nLXdzJykgKyAnLTAnKSAhPT0gLUluZmluaXR5ID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHIpIHtcbiAgdmFyIHN0cmluZyA9ICR0cmltKFN0cmluZyhzdHIpLCAzKTtcbiAgdmFyIHJlc3VsdCA9ICRwYXJzZUZsb2F0KHN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgc3RyaW5nLmNoYXJBdCgwKSA9PSAnLScgPyAtMCA6IHJlc3VsdDtcbn0gOiAkcGFyc2VGbG9hdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWZsb2F0LmpzXG4vLyBtb2R1bGUgaWQgPSA4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciBOVU1CRVIgPSAnTnVtYmVyJztcbnZhciAkTnVtYmVyID0gZ2xvYmFsW05VTUJFUl07XG52YXIgQmFzZSA9ICROdW1iZXI7XG52YXIgcHJvdG8gPSAkTnVtYmVyLnByb3RvdHlwZTtcbi8vIE9wZXJhIH4xMiBoYXMgYnJva2VuIE9iamVjdCN0b1N0cmluZ1xudmFyIEJST0tFTl9DT0YgPSBjb2YocmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpKHByb3RvKSkgPT0gTlVNQkVSO1xudmFyIFRSSU0gPSAndHJpbScgaW4gU3RyaW5nLnByb3RvdHlwZTtcblxuLy8gNy4xLjMgVG9OdW1iZXIoYXJndW1lbnQpXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTtcbiAgaWYgKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyAmJiBpdC5sZW5ndGggPiAyKSB7XG4gICAgaXQgPSBUUklNID8gaXQudHJpbSgpIDogJHRyaW0oaXQsIDMpO1xuICAgIHZhciBmaXJzdCA9IGl0LmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHRoaXJkLCByYWRpeCwgbWF4Q29kZTtcbiAgICBpZiAoZmlyc3QgPT09IDQzIHx8IGZpcnN0ID09PSA0NSkge1xuICAgICAgdGhpcmQgPSBpdC5jaGFyQ29kZUF0KDIpO1xuICAgICAgaWYgKHRoaXJkID09PSA4OCB8fCB0aGlyZCA9PT0gMTIwKSByZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4XG4gICAgfSBlbHNlIGlmIChmaXJzdCA9PT0gNDgpIHtcbiAgICAgIHN3aXRjaCAoaXQuY2hhckNvZGVBdCgxKSkge1xuICAgICAgICBjYXNlIDY2OiBjYXNlIDk4OiByYWRpeCA9IDI7IG1heENvZGUgPSA0OTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wYlswMV0rJC9pXG4gICAgICAgIGNhc2UgNzk6IGNhc2UgMTExOiByYWRpeCA9IDg7IG1heENvZGUgPSA1NTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wb1swLTddKyQvaVxuICAgICAgICBkZWZhdWx0OiByZXR1cm4gK2l0O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgZGlnaXRzID0gaXQuc2xpY2UoMiksIGkgPSAwLCBsID0gZGlnaXRzLmxlbmd0aCwgY29kZTsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIHBhcnNlSW50IHBhcnNlcyBhIHN0cmluZyB0byBhIGZpcnN0IHVuYXZhaWxhYmxlIHN5bWJvbFxuICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9sc1xuICAgICAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiBtYXhDb2RlKSByZXR1cm4gTmFOO1xuICAgICAgfSByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCByYWRpeCk7XG4gICAgfVxuICB9IHJldHVybiAraXQ7XG59O1xuXG5pZiAoISROdW1iZXIoJyAwbzEnKSB8fCAhJE51bWJlcignMGIxJykgfHwgJE51bWJlcignKzB4MScpKSB7XG4gICROdW1iZXIgPSBmdW5jdGlvbiBOdW1iZXIodmFsdWUpIHtcbiAgICB2YXIgaXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMSA/IDAgOiB2YWx1ZTtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIHRoYXQgaW5zdGFuY2VvZiAkTnVtYmVyXG4gICAgICAvLyBjaGVjayBvbiAxLi5jb25zdHJ1Y3Rvcihmb28pIGNhc2VcbiAgICAgICYmIChCUk9LRU5fQ09GID8gZmFpbHMoZnVuY3Rpb24gKCkgeyBwcm90by52YWx1ZU9mLmNhbGwodGhhdCk7IH0pIDogY29mKHRoYXQpICE9IE5VTUJFUilcbiAgICAgICAgPyBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSh0b051bWJlcihpdCkpLCB0aGF0LCAkTnVtYmVyKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BOKEJhc2UpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVM2IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVM2IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKykge1xuICAgIGlmIChoYXMoQmFzZSwga2V5ID0ga2V5c1tqXSkgJiYgIWhhcygkTnVtYmVyLCBrZXkpKSB7XG4gICAgICBkUCgkTnVtYmVyLCBrZXksIGdPUEQoQmFzZSwga2V5KSk7XG4gICAgfVxuICB9XG4gICROdW1iZXIucHJvdG90eXBlID0gcHJvdG87XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJE51bWJlcjtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsIE5VTUJFUiwgJE51bWJlcik7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgdGFyZ2V0LCBDKSB7XG4gIHZhciBTID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICB2YXIgUDtcbiAgaWYgKFMgIT09IEMgJiYgdHlwZW9mIFMgPT0gJ2Z1bmN0aW9uJyAmJiAoUCA9IFMucHJvdG90eXBlKSAhPT0gQy5wcm90b3R5cGUgJiYgaXNPYmplY3QoUCkgJiYgc2V0UHJvdG90eXBlT2YpIHtcbiAgICBzZXRQcm90b3R5cGVPZih0aGF0LCBQKTtcbiAgfSByZXR1cm4gdGhhdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pbmhlcml0LWlmLXJlcXVpcmVkLmpzXG4vLyBtb2R1bGUgaWQgPSA4N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBhTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuL19hLW51bWJlci12YWx1ZScpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKTtcbnZhciAkdG9GaXhlZCA9IDEuMC50b0ZpeGVkO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBkYXRhID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xudmFyIEVSUk9SID0gJ051bWJlci50b0ZpeGVkOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnO1xudmFyIFpFUk8gPSAnMCc7XG5cbnZhciBtdWx0aXBseSA9IGZ1bmN0aW9uIChuLCBjKSB7XG4gIHZhciBpID0gLTE7XG4gIHZhciBjMiA9IGM7XG4gIHdoaWxlICgrK2kgPCA2KSB7XG4gICAgYzIgKz0gbiAqIGRhdGFbaV07XG4gICAgZGF0YVtpXSA9IGMyICUgMWU3O1xuICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpO1xuICB9XG59O1xudmFyIGRpdmlkZSA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciBpID0gNjtcbiAgdmFyIGMgPSAwO1xuICB3aGlsZSAoLS1pID49IDApIHtcbiAgICBjICs9IGRhdGFbaV07XG4gICAgZGF0YVtpXSA9IGZsb29yKGMgLyBuKTtcbiAgICBjID0gKGMgJSBuKSAqIDFlNztcbiAgfVxufTtcbnZhciBudW1Ub1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGkgPSA2O1xuICB2YXIgcyA9ICcnO1xuICB3aGlsZSAoLS1pID49IDApIHtcbiAgICBpZiAocyAhPT0gJycgfHwgaSA9PT0gMCB8fCBkYXRhW2ldICE9PSAwKSB7XG4gICAgICB2YXIgdCA9IFN0cmluZyhkYXRhW2ldKTtcbiAgICAgIHMgPSBzID09PSAnJyA/IHQgOiBzICsgcmVwZWF0LmNhbGwoWkVSTywgNyAtIHQubGVuZ3RoKSArIHQ7XG4gICAgfVxuICB9IHJldHVybiBzO1xufTtcbnZhciBwb3cgPSBmdW5jdGlvbiAoeCwgbiwgYWNjKSB7XG4gIHJldHVybiBuID09PSAwID8gYWNjIDogbiAlIDIgPT09IDEgPyBwb3coeCwgbiAtIDEsIGFjYyAqIHgpIDogcG93KHggKiB4LCBuIC8gMiwgYWNjKTtcbn07XG52YXIgbG9nID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIG4gPSAwO1xuICB2YXIgeDIgPSB4O1xuICB3aGlsZSAoeDIgPj0gNDA5Nikge1xuICAgIG4gKz0gMTI7XG4gICAgeDIgLz0gNDA5NjtcbiAgfVxuICB3aGlsZSAoeDIgPj0gMikge1xuICAgIG4gKz0gMTtcbiAgICB4MiAvPSAyO1xuICB9IHJldHVybiBuO1xufTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoISEkdG9GaXhlZCAmJiAoXG4gIDAuMDAwMDgudG9GaXhlZCgzKSAhPT0gJzAuMDAwJyB8fFxuICAwLjkudG9GaXhlZCgwKSAhPT0gJzEnIHx8XG4gIDEuMjU1LnRvRml4ZWQoMikgIT09ICcxLjI1JyB8fFxuICAxMDAwMDAwMDAwMDAwMDAwMTI4LjAudG9GaXhlZCgwKSAhPT0gJzEwMDAwMDAwMDAwMDAwMDAxMjgnXG4pIHx8ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgLy8gVjggfiBBbmRyb2lkIDQuMy1cbiAgJHRvRml4ZWQuY2FsbCh7fSk7XG59KSksICdOdW1iZXInLCB7XG4gIHRvRml4ZWQ6IGZ1bmN0aW9uIHRvRml4ZWQoZnJhY3Rpb25EaWdpdHMpIHtcbiAgICB2YXIgeCA9IGFOdW1iZXJWYWx1ZSh0aGlzLCBFUlJPUik7XG4gICAgdmFyIGYgPSB0b0ludGVnZXIoZnJhY3Rpb25EaWdpdHMpO1xuICAgIHZhciBzID0gJyc7XG4gICAgdmFyIG0gPSBaRVJPO1xuICAgIHZhciBlLCB6LCBqLCBrO1xuICAgIGlmIChmIDwgMCB8fCBmID4gMjApIHRocm93IFJhbmdlRXJyb3IoRVJST1IpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoeCAhPSB4KSByZXR1cm4gJ05hTic7XG4gICAgaWYgKHggPD0gLTFlMjEgfHwgeCA+PSAxZTIxKSByZXR1cm4gU3RyaW5nKHgpO1xuICAgIGlmICh4IDwgMCkge1xuICAgICAgcyA9ICctJztcbiAgICAgIHggPSAteDtcbiAgICB9XG4gICAgaWYgKHggPiAxZS0yMSkge1xuICAgICAgZSA9IGxvZyh4ICogcG93KDIsIDY5LCAxKSkgLSA2OTtcbiAgICAgIHogPSBlIDwgMCA/IHggKiBwb3coMiwgLWUsIDEpIDogeCAvIHBvdygyLCBlLCAxKTtcbiAgICAgIHogKj0gMHgxMDAwMDAwMDAwMDAwMDtcbiAgICAgIGUgPSA1MiAtIGU7XG4gICAgICBpZiAoZSA+IDApIHtcbiAgICAgICAgbXVsdGlwbHkoMCwgeik7XG4gICAgICAgIGogPSBmO1xuICAgICAgICB3aGlsZSAoaiA+PSA3KSB7XG4gICAgICAgICAgbXVsdGlwbHkoMWU3LCAwKTtcbiAgICAgICAgICBqIC09IDc7XG4gICAgICAgIH1cbiAgICAgICAgbXVsdGlwbHkocG93KDEwLCBqLCAxKSwgMCk7XG4gICAgICAgIGogPSBlIC0gMTtcbiAgICAgICAgd2hpbGUgKGogPj0gMjMpIHtcbiAgICAgICAgICBkaXZpZGUoMSA8PCAyMyk7XG4gICAgICAgICAgaiAtPSAyMztcbiAgICAgICAgfVxuICAgICAgICBkaXZpZGUoMSA8PCBqKTtcbiAgICAgICAgbXVsdGlwbHkoMSwgMSk7XG4gICAgICAgIGRpdmlkZSgyKTtcbiAgICAgICAgbSA9IG51bVRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdWx0aXBseSgwLCB6KTtcbiAgICAgICAgbXVsdGlwbHkoMSA8PCAtZSwgMCk7XG4gICAgICAgIG0gPSBudW1Ub1N0cmluZygpICsgcmVwZWF0LmNhbGwoWkVSTywgZik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmID4gMCkge1xuICAgICAgayA9IG0ubGVuZ3RoO1xuICAgICAgbSA9IHMgKyAoayA8PSBmID8gJzAuJyArIHJlcGVhdC5jYWxsKFpFUk8sIGYgLSBrKSArIG0gOiBtLnNsaWNlKDAsIGsgLSBmKSArICcuJyArIG0uc2xpY2UoayAtIGYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHMgKyBtO1xuICAgIH0gcmV0dXJuIG07XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzXG4vLyBtb2R1bGUgaWQgPSA4OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgbXNnKSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ251bWJlcicgJiYgY29mKGl0KSAhPSAnTnVtYmVyJykgdGhyb3cgVHlwZUVycm9yKG1zZyk7XG4gIHJldHVybiAraXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYS1udW1iZXItdmFsdWUuanNcbi8vIG1vZHVsZSBpZCA9IDg5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXBlYXQoY291bnQpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyhkZWZpbmVkKHRoaXMpKTtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7XG4gIGlmIChuIDwgMCB8fCBuID09IEluZmluaXR5KSB0aHJvdyBSYW5nZUVycm9yKFwiQ291bnQgY2FuJ3QgYmUgbmVnYXRpdmVcIik7XG4gIGZvciAoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSkgaWYgKG4gJiAxKSByZXMgKz0gc3RyO1xuICByZXR1cm4gcmVzO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1yZXBlYXQuanNcbi8vIG1vZHVsZSBpZCA9IDkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBhTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuL19hLW51bWJlci12YWx1ZScpO1xudmFyICR0b1ByZWNpc2lvbiA9IDEuMC50b1ByZWNpc2lvbjtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gSUU3LVxuICByZXR1cm4gJHRvUHJlY2lzaW9uLmNhbGwoMSwgdW5kZWZpbmVkKSAhPT0gJzEnO1xufSkgfHwgISRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXG4gICR0b1ByZWNpc2lvbi5jYWxsKHt9KTtcbn0pKSwgJ051bWJlcicsIHtcbiAgdG9QcmVjaXNpb246IGZ1bmN0aW9uIHRvUHJlY2lzaW9uKHByZWNpc2lvbikge1xuICAgIHZhciB0aGF0ID0gYU51bWJlclZhbHVlKHRoaXMsICdOdW1iZXIjdG9QcmVjaXNpb246IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICAgIHJldHVybiBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQpIDogJHRvUHJlY2lzaW9uLmNhbGwodGhhdCwgcHJlY2lzaW9uKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4xLjIuMSBOdW1iZXIuRVBTSUxPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IEVQU0lMT046IE1hdGgucG93KDIsIC01MikgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbi5qc1xuLy8gbW9kdWxlIGlkID0gOTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMS4yLjIgTnVtYmVyLmlzRmluaXRlKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgX2lzRmluaXRlID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuaXNGaW5pdGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc0Zpbml0ZTogZnVuY3Rpb24gaXNGaW5pdGUoaXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGl0ID09ICdudW1iZXInICYmIF9pc0Zpbml0ZShpdCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZS5qc1xuLy8gbW9kdWxlIGlkID0gOTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgaXNJbnRlZ2VyOiByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlci5qc1xuLy8gbW9kdWxlIGlkID0gOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4xLjIuNCBOdW1iZXIuaXNOYU4obnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qc1xuLy8gbW9kdWxlIGlkID0gOTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMS4yLjUgTnVtYmVyLmlzU2FmZUludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc0ludGVnZXIgPSByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJyk7XG52YXIgYWJzID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc1NhZmVJbnRlZ2VyOiBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKG51bWJlcikge1xuICAgIHJldHVybiBpc0ludGVnZXIobnVtYmVyKSAmJiBhYnMobnVtYmVyKSA8PSAweDFmZmZmZmZmZmZmZmZmO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXIuanNcbi8vIG1vZHVsZSBpZCA9IDk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjEuMi42IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgTUFYX1NBRkVfSU5URUdFUjogMHgxZmZmZmZmZmZmZmZmZiB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA5OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4xLjIuMTAgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBNSU5fU0FGRV9JTlRFR0VSOiAtMHgxZmZmZmZmZmZmZmZmZiB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA5OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fcGFyc2UtZmxvYXQnKTtcbi8vIDIwLjEuMi4xMiBOdW1iZXIucGFyc2VGbG9hdChzdHJpbmcpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VGbG9hdCAhPSAkcGFyc2VGbG9hdCksICdOdW1iZXInLCB7IHBhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19wYXJzZS1pbnQnKTtcbi8vIDIwLjEuMi4xMyBOdW1iZXIucGFyc2VJbnQoc3RyaW5nLCByYWRpeClcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKE51bWJlci5wYXJzZUludCAhPSAkcGFyc2VJbnQpLCAnTnVtYmVyJywgeyBwYXJzZUludDogJHBhcnNlSW50IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludC5qc1xuLy8gbW9kdWxlIGlkID0gMTAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbG9nMXAgPSByZXF1aXJlKCcuL19tYXRoLWxvZzFwJyk7XG52YXIgc3FydCA9IE1hdGguc3FydDtcbnZhciAkYWNvc2ggPSBNYXRoLmFjb3NoO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoXG4gIC8vIFY4IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiAgJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTlxuICAmJiAkYWNvc2goSW5maW5pdHkpID09IEluZmluaXR5XG4pLCAnTWF0aCcsIHtcbiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5sb2cxcCB8fCBmdW5jdGlvbiBsb2cxcCh4KSB7XG4gIHJldHVybiAoeCA9ICt4KSA+IC0xZS04ICYmIHggPCAxZS04ID8geCAtIHggKiB4IC8gMiA6IE1hdGgubG9nKDEgKyB4KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLWxvZzFwLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjUgTWF0aC5hc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXNpbmggPSBNYXRoLmFzaW5oO1xuXG5mdW5jdGlvbiBhc2luaCh4KSB7XG4gIHJldHVybiAhaXNGaW5pdGUoeCA9ICt4KSB8fCB4ID09IDAgPyB4IDogeCA8IDAgPyAtYXNpbmgoLXgpIDogTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCArIDEpKTtcbn1cblxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmFzaW5oKDApIC0+IC0wXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFzaW5oICYmIDEgLyAkYXNpbmgoMCkgPiAwKSwgJ01hdGgnLCB7IGFzaW5oOiBhc2luaCB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXNpbmguanNcbi8vIG1vZHVsZSBpZCA9IDEwNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuNyBNYXRoLmF0YW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhdGFuaCA9IE1hdGguYXRhbmg7XG5cbi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hdGFuaCgtMCkgLT4gMFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhdGFuaCAmJiAxIC8gJGF0YW5oKC0wKSA8IDApLCAnTWF0aCcsIHtcbiAgYXRhbmg6IGZ1bmN0aW9uIGF0YW5oKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiBNYXRoLmxvZygoMSArIHgpIC8gKDEgLSB4KSkgLyAyO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXRhbmguanNcbi8vIG1vZHVsZSBpZCA9IDEwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuOSBNYXRoLmNicnQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCkge1xuICAgIHJldHVybiBzaWduKHggPSAreCkgKiBNYXRoLnBvdyhNYXRoLmFicyh4KSwgMSAvIDMpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2JydC5qc1xuLy8gbW9kdWxlIGlkID0gMTA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zaWduIHx8IGZ1bmN0aW9uIHNpZ24oeCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiAoeCA9ICt4KSA9PSAwIHx8IHggIT0geCA/IHggOiB4IDwgMCA/IC0xIDogMTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLXNpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDEwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTEgTWF0aC5jbHozMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjbHozMjogZnVuY3Rpb24gY2x6MzIoeCkge1xuICAgIHJldHVybiAoeCA+Pj49IDApID8gMzEgLSBNYXRoLmZsb29yKE1hdGgubG9nKHggKyAwLjUpICogTWF0aC5MT0cyRSkgOiAzMjtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNsejMyLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjEyIE1hdGguY29zaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjb3NoOiBmdW5jdGlvbiBjb3NoKHgpIHtcbiAgICByZXR1cm4gKGV4cCh4ID0gK3gpICsgZXhwKC14KSkgLyAyO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY29zaC5qc1xuLy8gbW9kdWxlIGlkID0gMTA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjIuMi4xNCBNYXRoLmV4cG0xKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoJGV4cG0xICE9IE1hdGguZXhwbTEpLCAnTWF0aCcsIHsgZXhwbTE6ICRleHBtMSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEuanNcbi8vIG1vZHVsZSBpZCA9IDExMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBtMSA9IE1hdGguZXhwbTE7XG5tb2R1bGUuZXhwb3J0cyA9ICghJGV4cG0xXG4gIC8vIE9sZCBGRiBidWdcbiAgfHwgJGV4cG0xKDEwKSA+IDIyMDI1LjQ2NTc5NDgwNjcxOSB8fCAkZXhwbTEoMTApIDwgMjIwMjUuNDY1Nzk0ODA2NzE2NTE2OFxuICAvLyBUb3IgQnJvd3NlciBidWdcbiAgfHwgJGV4cG0xKC0yZS0xNykgIT0gLTJlLTE3XG4pID8gZnVuY3Rpb24gZXhwbTEoeCkge1xuICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiB4ID4gLTFlLTYgJiYgeCA8IDFlLTYgPyB4ICsgeCAqIHggLyAyIDogTWF0aC5leHAoeCkgLSAxO1xufSA6ICRleHBtMTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtZXhwbTEuanNcbi8vIG1vZHVsZSBpZCA9IDExMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgZnJvdW5kOiByZXF1aXJlKCcuL19tYXRoLWZyb3VuZCcpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanNcbi8vIG1vZHVsZSBpZCA9IDExMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciBzaWduID0gcmVxdWlyZSgnLi9fbWF0aC1zaWduJyk7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgRVBTSUxPTiA9IHBvdygyLCAtNTIpO1xudmFyIEVQU0lMT04zMiA9IHBvdygyLCAtMjMpO1xudmFyIE1BWDMyID0gcG93KDIsIDEyNykgKiAoMiAtIEVQU0lMT04zMik7XG52YXIgTUlOMzIgPSBwb3coMiwgLTEyNik7XG5cbnZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguZnJvdW5kIHx8IGZ1bmN0aW9uIGZyb3VuZCh4KSB7XG4gIHZhciAkYWJzID0gTWF0aC5hYnMoeCk7XG4gIHZhciAkc2lnbiA9IHNpZ24oeCk7XG4gIHZhciBhLCByZXN1bHQ7XG4gIGlmICgkYWJzIDwgTUlOMzIpIHJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7XG4gIGEgPSAoMSArIEVQU0lMT04zMiAvIEVQU0lMT04pICogJGFicztcbiAgcmVzdWx0ID0gYSAtIChhIC0gJGFicyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKHJlc3VsdCA+IE1BWDMyIHx8IHJlc3VsdCAhPSByZXN1bHQpIHJldHVybiAkc2lnbiAqIEluZmluaXR5O1xuICByZXR1cm4gJHNpZ24gKiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1mcm91bmQuanNcbi8vIG1vZHVsZSBpZCA9IDExM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTcgTWF0aC5oeXBvdChbdmFsdWUxWywgdmFsdWUyWywg4oCmIF1dXSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYWJzID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgaHlwb3Q6IGZ1bmN0aW9uIGh5cG90KHZhbHVlMSwgdmFsdWUyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBsYXJnID0gMDtcbiAgICB2YXIgYXJnLCBkaXY7XG4gICAgd2hpbGUgKGkgPCBhTGVuKSB7XG4gICAgICBhcmcgPSBhYnMoYXJndW1lbnRzW2krK10pO1xuICAgICAgaWYgKGxhcmcgPCBhcmcpIHtcbiAgICAgICAgZGl2ID0gbGFyZyAvIGFyZztcbiAgICAgICAgc3VtID0gc3VtICogZGl2ICogZGl2ICsgMTtcbiAgICAgICAgbGFyZyA9IGFyZztcbiAgICAgIH0gZWxzZSBpZiAoYXJnID4gMCkge1xuICAgICAgICBkaXYgPSBhcmcgLyBsYXJnO1xuICAgICAgICBzdW0gKz0gZGl2ICogZGl2O1xuICAgICAgfSBlbHNlIHN1bSArPSBhcmc7XG4gICAgfVxuICAgIHJldHVybiBsYXJnID09PSBJbmZpbml0eSA/IEluZmluaXR5IDogbGFyZyAqIE1hdGguc3FydChzdW0pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QuanNcbi8vIG1vZHVsZSBpZCA9IDExNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMTggTWF0aC5pbXVsKHgsIHkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbXVsID0gTWF0aC5pbXVsO1xuXG4vLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICRpbXVsKDB4ZmZmZmZmZmYsIDUpICE9IC01IHx8ICRpbXVsLmxlbmd0aCAhPSAyO1xufSksICdNYXRoJywge1xuICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmO1xuICAgIHZhciB4biA9ICt4O1xuICAgIHZhciB5biA9ICt5O1xuICAgIHZhciB4bCA9IFVJTlQxNiAmIHhuO1xuICAgIHZhciB5bCA9IFVJTlQxNiAmIHluO1xuICAgIHJldHVybiAwIHwgeGwgKiB5bCArICgoVUlOVDE2ICYgeG4gPj4+IDE2KSAqIHlsICsgeGwgKiAoVUlOVDE2ICYgeW4gPj4+IDE2KSA8PCAxNiA+Pj4gMCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5pbXVsLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjIxIE1hdGgubG9nMTAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMTA6IGZ1bmN0aW9uIGxvZzEwKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgKiBNYXRoLkxPRzEwRTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgbG9nMXA6IHJlcXVpcmUoJy4vX21hdGgtbG9nMXAnKSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanNcbi8vIG1vZHVsZSBpZCA9IDExN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMjIgTWF0aC5sb2cyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCkge1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4yO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qc1xuLy8gbW9kdWxlIGlkID0gMTE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgc2lnbjogcmVxdWlyZSgnLi9fbWF0aC1zaWduJykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDExOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMzAgTWF0aC5zaW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGV4cG0xID0gcmVxdWlyZSgnLi9fbWF0aC1leHBtMScpO1xudmFyIGV4cCA9IE1hdGguZXhwO1xuXG4vLyBWOCBuZWFyIENocm9taXVtIDM4IGhhcyBhIHByb2JsZW0gd2l0aCB2ZXJ5IHNtYWxsIG51bWJlcnNcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhTWF0aC5zaW5oKC0yZS0xNykgIT0gLTJlLTE3O1xufSksICdNYXRoJywge1xuICBzaW5oOiBmdW5jdGlvbiBzaW5oKHgpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoeCA9ICt4KSA8IDFcbiAgICAgID8gKGV4cG0xKHgpIC0gZXhwbTEoLXgpKSAvIDJcbiAgICAgIDogKGV4cCh4IC0gMSkgLSBleHAoLXggLSAxKSkgKiAoTWF0aC5FIC8gMik7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaW5oLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMi4yLjMzIE1hdGgudGFuaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB0YW5oOiBmdW5jdGlvbiB0YW5oKHgpIHtcbiAgICB2YXIgYSA9IGV4cG0xKHggPSAreCk7XG4gICAgdmFyIGIgPSBleHBtMSgteCk7XG4gICAgcmV0dXJuIGEgPT0gSW5maW5pdHkgPyAxIDogYiA9PSBJbmZpbml0eSA/IC0xIDogKGEgLSBiKSAvIChleHAoeCkgKyBleHAoLXgpKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnRhbmguanNcbi8vIG1vZHVsZSBpZCA9IDEyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMzQgTWF0aC50cnVuYyh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB0cnVuYzogZnVuY3Rpb24gdHJ1bmMoaXQpIHtcbiAgICByZXR1cm4gKGl0ID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWwpKGl0KTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnRydW5jLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgJGZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDtcblxuLy8gbGVuZ3RoIHNob3VsZCBiZSAxLCBvbGQgRkYgcHJvYmxlbVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoISEkZnJvbUNvZGVQb2ludCAmJiAkZnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMSksICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi4yIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpXG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGNvZGU7XG4gICAgd2hpbGUgKGFMZW4gPiBpKSB7XG4gICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdO1xuICAgICAgaWYgKHRvQWJzb2x1dGVJbmRleChjb2RlLCAweDEwZmZmZikgIT09IGNvZGUpIHRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgcmVzLnB1c2goY29kZSA8IDB4MTAwMDBcbiAgICAgICAgPyBmcm9tQ2hhckNvZGUoY29kZSlcbiAgICAgICAgOiBmcm9tQ2hhckNvZGUoKChjb2RlIC09IDB4MTAwMDApID4+IDEwKSArIDB4ZDgwMCwgY29kZSAlIDB4NDAwICsgMHhkYzAwKVxuICAgICAgKTtcbiAgICB9IHJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qc1xuLy8gbW9kdWxlIGlkID0gMTIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuNCBTdHJpbmcucmF3KGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKVxuICByYXc6IGZ1bmN0aW9uIHJhdyhjYWxsU2l0ZSkge1xuICAgIHZhciB0cGwgPSB0b0lPYmplY3QoY2FsbFNpdGUucmF3KTtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodHBsLmxlbmd0aCk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGxlbiA+IGkpIHtcbiAgICAgIHJlcy5wdXNoKFN0cmluZyh0cGxbaSsrXSkpO1xuICAgICAgaWYgKGkgPCBhTGVuKSByZXMucHVzaChTdHJpbmcoYXJndW1lbnRzW2ldKSk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yYXcuanNcbi8vIG1vZHVsZSBpZCA9IDEyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAyMS4xLjMuMjUgU3RyaW5nLnByb3RvdHlwZS50cmltKClcbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW0nLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDMpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbS5qc1xuLy8gbW9kdWxlIGlkID0gMTI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBpbmRleCA9IHRoaXMuX2k7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IE8ubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIHBvcykge1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICAgIHZhciBpID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSBsKSByZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qc1xuLy8gbW9kdWxlIGlkID0gMTI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gKCFCVUdHWSAmJiAkbmF0aXZlKSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gMTI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0ge307XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanNcbi8vIG1vZHVsZSBpZCA9IDEyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKShmYWxzZSk7XG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjMgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdChwb3MpXG4gIGNvZGVQb2ludEF0OiBmdW5jdGlvbiBjb2RlUG9pbnRBdChwb3MpIHtcbiAgICByZXR1cm4gJGF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanNcbi8vIG1vZHVsZSBpZCA9IDEzMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMS4xLjMuNiBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKHNlYXJjaFN0cmluZyBbLCBlbmRQb3NpdGlvbl0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgRU5EU19XSVRIID0gJ2VuZHNXaXRoJztcbnZhciAkZW5kc1dpdGggPSAnJ1tFTkRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKEVORFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBlbmRQb3NpdGlvbiA9IEBsZW5ndGggKi8pIHtcbiAgICB2YXIgdGhhdCA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBFTkRTX1dJVEgpO1xuICAgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aCh0aGF0Lmxlbmd0aCk7XG4gICAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBNYXRoLm1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbik7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkZW5kc1dpdGhcbiAgICAgID8gJGVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpXG4gICAgICA6IHRoYXQuc2xpY2UoZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGguanNcbi8vIG1vZHVsZSBpZCA9IDEzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBoZWxwZXIgZm9yIFN0cmluZyN7c3RhcnRzV2l0aCwgZW5kc1dpdGgsIGluY2x1ZGVzfVxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgc2VhcmNoU3RyaW5nLCBOQU1FKSB7XG4gIGlmIChpc1JlZ0V4cChzZWFyY2hTdHJpbmcpKSB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZyMnICsgTkFNRSArIFwiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4IVwiKTtcbiAgcmV0dXJuIFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctY29udGV4dC5qc1xuLy8gbW9kdWxlIGlkID0gMTMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qc1xuLy8gbW9kdWxlIGlkID0gMTM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBNQVRDSCA9IHJlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciByZSA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tLRVldKHJlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRyeSB7XG4gICAgICByZVtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAhJy8uLydbS0VZXShyZSk7XG4gICAgfSBjYXRjaCAoZikgeyAvKiBlbXB0eSAqLyB9XG4gIH0gcmV0dXJuIHRydWU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZmFpbHMtaXMtcmVnZXhwLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjEuMS4zLjcgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyhzZWFyY2hTdHJpbmcsIHBvc2l0aW9uID0gMClcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgSU5DTFVERVMgPSAnaW5jbHVkZXMnO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKElOQ0xVREVTKSwgJ1N0cmluZycsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5jb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgSU5DTFVERVMpXG4gICAgICAuaW5kZXhPZihzZWFyY2hTdHJpbmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanNcbi8vIG1vZHVsZSBpZCA9IDEzNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjEzIFN0cmluZy5wcm90b3R5cGUucmVwZWF0KGNvdW50KVxuICByZXBlYXQ6IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjEuMS4zLjE4IFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgWywgcG9zaXRpb24gXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJztcbnZhciAkc3RhcnRzV2l0aCA9ICcnW1NUQVJUU19XSVRIXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShTVEFSVFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgU1RBUlRTX1dJVEgpO1xuICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gJHN0YXJ0c1dpdGhcbiAgICAgID8gJHN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMiBTdHJpbmcucHJvdG90eXBlLmFuY2hvcihuYW1lKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYW5jaG9yJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFuY2hvcihuYW1lKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnbmFtZScsIG5hbWUpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBxdW90ID0gL1wiL2c7XG4vLyBCLjIuMy4yLjEgQ3JlYXRlSFRNTChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSlcbnZhciBjcmVhdGVIVE1MID0gZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIHZhciBTID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIHZhciBwMSA9ICc8JyArIHRhZztcbiAgaWYgKGF0dHJpYnV0ZSAhPT0gJycpIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9XCInICsgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKHF1b3QsICcmcXVvdDsnKSArICdcIic7XG4gIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nO1xufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUsIGV4ZWMpIHtcbiAgdmFyIE8gPSB7fTtcbiAgT1tOQU1FXSA9IGV4ZWMoY3JlYXRlSFRNTCk7XG4gICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0ZXN0ID0gJydbTkFNRV0oJ1wiJyk7XG4gICAgcmV0dXJuIHRlc3QgIT09IHRlc3QudG9Mb3dlckNhc2UoKSB8fCB0ZXN0LnNwbGl0KCdcIicpLmxlbmd0aCA+IDM7XG4gIH0pLCAnU3RyaW5nJywgTyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWh0bWwuanNcbi8vIG1vZHVsZSBpZCA9IDE0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4zIFN0cmluZy5wcm90b3R5cGUuYmlnKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JpZycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBiaWcoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JpZycsICcnLCAnJyk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5iaWcuanNcbi8vIG1vZHVsZSBpZCA9IDE0MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy40IFN0cmluZy5wcm90b3R5cGUuYmxpbmsoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYmxpbmsnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gYmxpbmsoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JsaW5rJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJsaW5rLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNSBTdHJpbmcucHJvdG90eXBlLmJvbGQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYm9sZCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBib2xkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJvbGQuanNcbi8vIG1vZHVsZSBpZCA9IDE0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy42IFN0cmluZy5wcm90b3R5cGUuZml4ZWQoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZml4ZWQnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZml4ZWQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3R0JywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNyBTdHJpbmcucHJvdG90eXBlLmZvbnRjb2xvcihjb2xvcilcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZvbnRjb2xvcicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb250Y29sb3IoY29sb3IpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdjb2xvcicsIGNvbG9yKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qc1xuLy8gbW9kdWxlIGlkID0gMTQ1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjggU3RyaW5nLnByb3RvdHlwZS5mb250c2l6ZShzaXplKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZm9udHNpemUnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9udHNpemUoc2l6ZSkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ3NpemUnLCBzaXplKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRzaXplLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuOSBTdHJpbmcucHJvdG90eXBlLml0YWxpY3MoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnaXRhbGljcycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpdGFsaWNzKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdpJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MuanNcbi8vIG1vZHVsZSBpZCA9IDE0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMCBTdHJpbmcucHJvdG90eXBlLmxpbmsodXJsKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnbGluaycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBsaW5rKHVybCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ2hyZWYnLCB1cmwpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcubGluay5qc1xuLy8gbW9kdWxlIGlkID0gMTQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjExIFN0cmluZy5wcm90b3R5cGUuc21hbGwoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc21hbGwnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc21hbGwoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3NtYWxsJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnNtYWxsLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTIgU3RyaW5nLnByb3RvdHlwZS5zdHJpa2UoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc3RyaWtlJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHN0cmlrZSgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3RyaWtlJywgJycsICcnKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZS5qc1xuLy8gbW9kdWxlIGlkID0gMTUwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEzIFN0cmluZy5wcm90b3R5cGUuc3ViKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1YicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdWIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1YicsICcnLCAnJyk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdWIuanNcbi8vIG1vZHVsZSBpZCA9IDE1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xNCBTdHJpbmcucHJvdG90eXBlLnN1cCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdXAnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc3VwKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdXAnLCAnJywgJycpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3VwLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMy4zLjEgLyAxNS45LjQuNCBEYXRlLm5vdygpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ0RhdGUnLCB7IG5vdzogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7IH0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLm5vdy5qc1xuLy8gbW9kdWxlIGlkID0gMTUzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbFxuICAgIHx8IERhdGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKHsgdG9JU09TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0gfSkgIT09IDE7XG59KSwgJ0RhdGUnLCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBwdiA9IHRvUHJpbWl0aXZlKE8pO1xuICAgIHJldHVybiB0eXBlb2YgcHYgPT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHB2KSA/IG51bGwgOiBPLnRvSVNPU3RyaW5nKCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1qc29uLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuL19kYXRlLXRvLWlzby1zdHJpbmcnKTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyAhPT0gdG9JU09TdHJpbmcpLCAnRGF0ZScsIHtcbiAgdG9JU09TdHJpbmc6IHRvSVNPU3RyaW5nXG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZy5qc1xuLy8gbW9kdWxlIGlkID0gMTU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIDIwLjMuNC4zNiAvIDE1LjkuNS40MyBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZygpXG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGdldFRpbWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lO1xudmFyICR0b0lTT1N0cmluZyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgbHogPSBmdW5jdGlvbiAobnVtKSB7XG4gIHJldHVybiBudW0gPiA5ID8gbnVtIDogJzAnICsgbnVtO1xufTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG5tb2R1bGUuZXhwb3J0cyA9IChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkdG9JU09TdHJpbmcuY2FsbChuZXcgRGF0ZSgtNWUxMyAtIDEpKSAhPSAnMDM4NS0wNy0yNVQwNzowNjozOS45OTlaJztcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICR0b0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKE5hTikpO1xufSkpID8gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7XG4gIGlmICghaXNGaW5pdGUoZ2V0VGltZS5jYWxsKHRoaXMpKSkgdGhyb3cgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gIHZhciBkID0gdGhpcztcbiAgdmFyIHkgPSBkLmdldFVUQ0Z1bGxZZWFyKCk7XG4gIHZhciBtID0gZC5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgdmFyIHMgPSB5IDwgMCA/ICctJyA6IHkgPiA5OTk5ID8gJysnIDogJyc7XG4gIHJldHVybiBzICsgKCcwMDAwMCcgKyBNYXRoLmFicyh5KSkuc2xpY2UocyA/IC02IDogLTQpICtcbiAgICAnLScgKyBseihkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIGx6KGQuZ2V0VVRDRGF0ZSgpKSArXG4gICAgJ1QnICsgbHooZC5nZXRVVENIb3VycygpKSArICc6JyArIGx6KGQuZ2V0VVRDTWludXRlcygpKSArXG4gICAgJzonICsgbHooZC5nZXRVVENTZWNvbmRzKCkpICsgJy4nICsgKG0gPiA5OSA/IG0gOiAnMCcgKyBseihtKSkgKyAnWic7XG59IDogJHRvSVNPU3RyaW5nO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIERhdGVQcm90byA9IERhdGUucHJvdG90eXBlO1xudmFyIElOVkFMSURfREFURSA9ICdJbnZhbGlkIERhdGUnO1xudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgJHRvU3RyaW5nID0gRGF0ZVByb3RvW1RPX1NUUklOR107XG52YXIgZ2V0VGltZSA9IERhdGVQcm90by5nZXRUaW1lO1xuaWYgKG5ldyBEYXRlKE5hTikgKyAnJyAhPSBJTlZBTElEX0RBVEUpIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShEYXRlUHJvdG8sIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgdmFyIHZhbHVlID0gZ2V0VGltZS5jYWxsKHRoaXMpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gJHRvU3RyaW5nLmNhbGwodGhpcykgOiBJTlZBTElEX0RBVEU7XG4gIH0pO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDE1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgVE9fUFJJTUlUSVZFID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvUHJpbWl0aXZlJyk7XG52YXIgcHJvdG8gPSBEYXRlLnByb3RvdHlwZTtcblxuaWYgKCEoVE9fUFJJTUlUSVZFIGluIHByb3RvKSkgcmVxdWlyZSgnLi9faGlkZScpKHByb3RvLCBUT19QUklNSVRJVkUsIHJlcXVpcmUoJy4vX2RhdGUtdG8tcHJpbWl0aXZlJykpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanNcbi8vIG1vZHVsZSBpZCA9IDE1OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIE5VTUJFUiA9ICdudW1iZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoaW50KSB7XG4gIGlmIChoaW50ICE9PSAnc3RyaW5nJyAmJiBoaW50ICE9PSBOVU1CRVIgJiYgaGludCAhPT0gJ2RlZmF1bHQnKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7XG4gIHJldHVybiB0b1ByaW1pdGl2ZShhbk9iamVjdCh0aGlzKSwgaGludCAhPSBOVU1CRVIpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2RhdGUtdG8tcHJpbWl0aXZlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjIuMS4yLjIgLyAxNS40LjMuMiBBcnJheS5pc0FycmF5KGFyZylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnQXJyYXknLCB7IGlzQXJyYXk6IHJlcXVpcmUoJy4vX2lzLWFycmF5JykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMTYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChtYXBwaW5nKSBtYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQygpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IgKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5mcm9tLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanNcbi8vIG1vZHVsZSBpZCA9IDE2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgaWYgKGluZGV4IGluIG9iamVjdCkgJGRlZmluZVByb3BlcnR5LmYob2JqZWN0LCBpbmRleCwgY3JlYXRlRGVzYygwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtpbmRleF0gPSB2YWx1ZTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDE2NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG4vLyBXZWJLaXQgQXJyYXkub2YgaXNuJ3QgZ2VuZXJpY1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShBcnJheS5vZi5jYWxsKEYpIGluc3RhbmNlb2YgRik7XG59KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMyBBcnJheS5vZiggLi4uaXRlbXMpXG4gIG9mOiBmdW5jdGlvbiBvZigvKiAuLi5hcmdzICovKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyAodHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheSkoYUxlbik7XG4gICAgd2hpbGUgKGFMZW4gPiBpbmRleCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gYUxlbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm9mLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5qb2luKHNlcGFyYXRvcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5Sm9pbiA9IFtdLmpvaW47XG5cbi8vIGZhbGxiYWNrIGZvciBub3QgYXJyYXktbGlrZSBzdHJpbmdzXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChyZXF1aXJlKCcuL19pb2JqZWN0JykgIT0gT2JqZWN0IHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoYXJyYXlKb2luKSksICdBcnJheScsIHtcbiAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodG9JT2JqZWN0KHRoaXMpLCBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IHNlcGFyYXRvcik7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuam9pbi5qc1xuLy8gbW9kdWxlIGlkID0gMTY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7XG4gIHJldHVybiAhIW1ldGhvZCAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY2FsbFxuICAgIGFyZyA/IG1ldGhvZC5jYWxsKG51bGwsIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgMSkgOiBtZXRob2QuY2FsbChudWxsKTtcbiAgfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaWN0LW1ldGhvZC5qc1xuLy8gbW9kdWxlIGlkID0gMTY5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xuXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2UgRVMzIHN0cmluZ3MgYW5kIERPTSBvYmplY3RzXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICBpZiAoaHRtbCkgYXJyYXlTbGljZS5jYWxsKGh0bWwpO1xufSksICdBcnJheScsIHtcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKGJlZ2luLCBlbmQpIHtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodGhpcy5sZW5ndGgpO1xuICAgIHZhciBrbGFzcyA9IGNvZih0aGlzKTtcbiAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZDtcbiAgICBpZiAoa2xhc3MgPT0gJ0FycmF5JykgcmV0dXJuIGFycmF5U2xpY2UuY2FsbCh0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB2YXIgc3RhcnQgPSB0b0Fic29sdXRlSW5kZXgoYmVnaW4sIGxlbik7XG4gICAgdmFyIHVwVG8gPSB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW4pO1xuICAgIHZhciBzaXplID0gdG9MZW5ndGgodXBUbyAtIHN0YXJ0KTtcbiAgICB2YXIgY2xvbmVkID0gbmV3IEFycmF5KHNpemUpO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykgY2xvbmVkW2ldID0ga2xhc3MgPT0gJ1N0cmluZydcbiAgICAgID8gdGhpcy5jaGFyQXQoc3RhcnQgKyBpKVxuICAgICAgOiB0aGlzW3N0YXJ0ICsgaV07XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zbGljZS5qc1xuLy8gbW9kdWxlIGlkID0gMTcwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyICRzb3J0ID0gW10uc29ydDtcbnZhciB0ZXN0ID0gWzEsIDIsIDNdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIElFOC1cbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCBidWdcbiAgdGVzdC5zb3J0KG51bGwpO1xuICAvLyBPbGQgV2ViS2l0XG59KSB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRzb3J0KSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjI1IEFycmF5LnByb3RvdHlwZS5zb3J0KGNvbXBhcmVmbilcbiAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWRcbiAgICAgID8gJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSlcbiAgICAgIDogJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSwgYUZ1bmN0aW9uKGNvbXBhcmVmbikpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvcnQuanNcbi8vIG1vZHVsZSBpZCA9IDE3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmb3JFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIFNUUklDVCA9IHJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5mb3JFYWNoLCB0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhU1RSSUNULCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xMCAvIDE1LjQuNC4xOCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZm9yLWVhY2guanNcbi8vIG1vZHVsZSBpZCA9IDE3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXNjID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsICRjcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWwsIHJlcztcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHJlc3VsdFtpbmRleF0gPSByZXM7ICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlcykgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdC5wdXNoKHZhbCk7ICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanNcbi8vIG1vZHVsZSBpZCA9IDE3M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDE3NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsKSkge1xuICAgIEMgPSBvcmlnaW5hbC5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDE3NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRtYXAgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5tYXAsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xNSAvIDE1LjQuNC4xOSBBcnJheS5wcm90b3R5cGUubWFwKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIG1hcDogZnVuY3Rpb24gbWFwKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRtYXAodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDE3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMik7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5maWx0ZXIsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy43IC8gMTUuNC40LjIwIEFycmF5LnByb3RvdHlwZS5maWx0ZXIoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGZpbHRlcih0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbHRlci5qc1xuLy8gbW9kdWxlIGlkID0gMTc3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHNvbWUgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5zb21lLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMjMgLyAxNS40LjQuMTcgQXJyYXkucHJvdG90eXBlLnNvbWUoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkc29tZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvbWUuanNcbi8vIG1vZHVsZSBpZCA9IDE3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRldmVyeSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg0KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmV2ZXJ5LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNSAvIDE1LjQuNC4xNiBBcnJheS5wcm90b3R5cGUuZXZlcnkoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmV2ZXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxNzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5yZWR1Y2UsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xOCAvIDE1LjQuNC4yMSBBcnJheS5wcm90b3R5cGUucmVkdWNlKGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgZmFsc2UpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS5qc1xuLy8gbW9kdWxlIGlkID0gMTgwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIGNhbGxiYWNrZm4sIGFMZW4sIG1lbW8sIGlzUmlnaHQpIHtcbiAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpO1xuICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBpbmRleCA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMDtcbiAgdmFyIGkgPSBpc1JpZ2h0ID8gLTEgOiAxO1xuICBpZiAoYUxlbiA8IDIpIGZvciAoOzspIHtcbiAgICBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xuICAgICAgaW5kZXggKz0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpbmRleCArPSBpO1xuICAgIGlmIChpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICB9XG4gIH1cbiAgZm9yICg7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSkgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICB9XG4gIHJldHVybiBtZW1vO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXJlZHVjZS5qc1xuLy8gbW9kdWxlIGlkID0gMTgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ucmVkdWNlUmlnaHQsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xOSAvIDE1LjQuNC4yMiBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQoY2FsbGJhY2tmbiBbLCBpbml0aWFsVmFsdWVdKVxuICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgdHJ1ZSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0LmpzXG4vLyBtb2R1bGUgaWQgPSAxODJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkaW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyICRuYXRpdmUgPSBbXS5pbmRleE9mO1xudmFyIE5FR0FUSVZFX1pFUk8gPSAhISRuYXRpdmUgJiYgMSAvIFsxXS5pbmRleE9mKDEsIC0wKSA8IDA7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjExIC8gMTUuNC40LjE0IEFycmF5LnByb3RvdHlwZS5pbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcbiAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiBORUdBVElWRV9aRVJPXG4gICAgICAvLyBjb252ZXJ0IC0wIHRvICswXG4gICAgICA/ICRuYXRpdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCAwXG4gICAgICA6ICRpbmRleE9mKHRoaXMsIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDE4M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciAkbmF0aXZlID0gW10ubGFzdEluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmxhc3RJbmRleE9mKDEsIC0wKSA8IDA7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE0IC8gMTUuNC40LjE1IEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IFssIGZyb21JbmRleF0pXG4gIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gQFsqLTFdICovKSB7XG4gICAgLy8gY29udmVydCAtMCB0byArMFxuICAgIGlmIChORUdBVElWRV9aRVJPKSByZXR1cm4gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDA7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgaW5kZXggPSBNYXRoLm1pbihpbmRleCwgdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSkpO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gbGVuZ3RoICsgaW5kZXg7XG4gICAgZm9yICg7aW5kZXggPj0gMDsgaW5kZXgtLSkgaWYgKGluZGV4IGluIE8pIGlmIChPW2luZGV4XSA9PT0gc2VhcmNoRWxlbWVudCkgcmV0dXJuIGluZGV4IHx8IDA7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDE4NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7IGNvcHlXaXRoaW46IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdjb3B5V2l0aGluJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbi5qc1xuLy8gbW9kdWxlIGlkID0gMTg1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFtdLmNvcHlXaXRoaW4gfHwgZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQgLyogPSAwICovLCBzdGFydCAvKiA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIHRvID0gdG9BYnNvbHV0ZUluZGV4KHRhcmdldCwgbGVuKTtcbiAgdmFyIGZyb20gPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGNvdW50ID0gTWF0aC5taW4oKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKSkgLSBmcm9tLCBsZW4gLSB0byk7XG4gIHZhciBpbmMgPSAxO1xuICBpZiAoZnJvbSA8IHRvICYmIHRvIDwgZnJvbSArIGNvdW50KSB7XG4gICAgaW5jID0gLTE7XG4gICAgZnJvbSArPSBjb3VudCAtIDE7XG4gICAgdG8gKz0gY291bnQgLSAxO1xuICB9XG4gIHdoaWxlIChjb3VudC0tID4gMCkge1xuICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICB0byArPSBpbmM7XG4gICAgZnJvbSArPSBpbmM7XG4gIH0gcmV0dXJuIE87XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktY29weS13aXRoaW4uanNcbi8vIG1vZHVsZSBpZCA9IDE4NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5JywgeyBmaWxsOiByZXF1aXJlKCcuL19hcnJheS1maWxsJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmaWxsJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWxsLmpzXG4vLyBtb2R1bGUgaWQgPSAxODhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKTtcbiAgd2hpbGUgKGVuZFBvcyA+IGluZGV4KSBPW2luZGV4KytdID0gdmFsdWU7XG4gIHJldHVybiBPO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWZpbGwuanNcbi8vIG1vZHVsZSBpZCA9IDE4OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDUpO1xudmFyIEtFWSA9ICdmaW5kJztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qc1xuLy8gbW9kdWxlIGlkID0gMTkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy45IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgocHJlZGljYXRlLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg2KTtcbnZhciBLRVkgPSAnZmluZEluZGV4JztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoS0VZKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDE5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKCdBcnJheScpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcy5qc1xuLy8gbW9kdWxlIGlkID0gMTkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanNcbi8vIG1vZHVsZSBpZCA9IDE5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciAkZmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyICRSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIEJhc2UgPSAkUmVnRXhwO1xudmFyIHByb3RvID0gJFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgcmUxID0gL2EvZztcbnZhciByZTIgPSAvYS9nO1xuLy8gXCJuZXdcIiBjcmVhdGVzIGEgbmV3IG9iamVjdCwgb2xkIHdlYmtpdCBidWdneSBoZXJlXG52YXIgQ09SUkVDVF9ORVcgPSBuZXcgJFJlZ0V4cChyZTEpICE9PSByZTE7XG5cbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICghQ09SUkVDVF9ORVcgfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJlMltyZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKV0gPSBmYWxzZTtcbiAgLy8gUmVnRXhwIGNvbnN0cnVjdG9yIGNhbiBhbHRlciBmbGFncyBhbmQgSXNSZWdFeHAgd29ya3MgY29ycmVjdCB3aXRoIEBAbWF0Y2hcbiAgcmV0dXJuICRSZWdFeHAocmUxKSAhPSByZTEgfHwgJFJlZ0V4cChyZTIpID09IHJlMiB8fCAkUmVnRXhwKHJlMSwgJ2knKSAhPSAnL2EvaSc7XG59KSkpIHtcbiAgJFJlZ0V4cCA9IGZ1bmN0aW9uIFJlZ0V4cChwLCBmKSB7XG4gICAgdmFyIHRpUkUgPSB0aGlzIGluc3RhbmNlb2YgJFJlZ0V4cDtcbiAgICB2YXIgcGlSRSA9IGlzUmVnRXhwKHApO1xuICAgIHZhciBmaVUgPSBmID09PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuICF0aVJFICYmIHBpUkUgJiYgcC5jb25zdHJ1Y3RvciA9PT0gJFJlZ0V4cCAmJiBmaVUgPyBwXG4gICAgICA6IGluaGVyaXRJZlJlcXVpcmVkKENPUlJFQ1RfTkVXXG4gICAgICAgID8gbmV3IEJhc2UocGlSRSAmJiAhZmlVID8gcC5zb3VyY2UgOiBwLCBmKVxuICAgICAgICA6IEJhc2UoKHBpUkUgPSBwIGluc3RhbmNlb2YgJFJlZ0V4cCkgPyBwLnNvdXJjZSA6IHAsIHBpUkUgJiYgZmlVID8gJGZsYWdzLmNhbGwocCkgOiBmKVxuICAgICAgLCB0aVJFID8gdGhpcyA6IHByb3RvLCAkUmVnRXhwKTtcbiAgfTtcbiAgdmFyIHByb3h5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIGtleSBpbiAkUmVnRXhwIHx8IGRQKCRSZWdFeHAsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBCYXNlW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBCYXNlW2tleV0gPSBpdDsgfVxuICAgIH0pO1xuICB9O1xuICBmb3IgKHZhciBrZXlzID0gZ09QTihCYXNlKSwgaSA9IDA7IGtleXMubGVuZ3RoID4gaTspIHByb3h5KGtleXNbaSsrXSk7XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJFJlZ0V4cDtcbiAgJFJlZ0V4cC5wcm90b3R5cGUgPSBwcm90bztcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsICdSZWdFeHAnLCAkUmVnRXhwKTtcbn1cblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnUmVnRXhwJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDE5NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFnc1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBpZiAodGhhdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmICh0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG4gIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JztcbiAgaWYgKHRoYXQuc3RpY2t5KSByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2ZsYWdzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmZsYWdzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciAkZmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IC8uL1tUT19TVFJJTkddO1xuXG52YXIgZGVmaW5lID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoUmVnRXhwLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmbiwgdHJ1ZSk7XG59O1xuXG4vLyAyMS4yLjUuMTQgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZygpXG5pZiAocmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7IHJldHVybiAkdG9TdHJpbmcuY2FsbCh7IHNvdXJjZTogJ2EnLCBmbGFnczogJ2InIH0pICE9ICcvYS9iJzsgfSkpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgcmV0dXJuICcvJy5jb25jYXQoUi5zb3VyY2UsICcvJyxcbiAgICAgICdmbGFncycgaW4gUiA/IFIuZmxhZ3MgOiAhREVTQ1JJUFRPUlMgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCA/ICRmbGFncy5jYWxsKFIpIDogdW5kZWZpbmVkKTtcbiAgfSk7XG4vLyBGRjQ0LSBSZWdFeHAjdG9TdHJpbmcgaGFzIGEgd3JvbmcgbmFtZVxufSBlbHNlIGlmICgkdG9TdHJpbmcubmFtZSAhPSBUT19TVFJJTkcpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbiAgfSk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAudG8tc3RyaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAxOThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3MoKVxuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgLy4vZy5mbGFncyAhPSAnZycpIHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogcmVxdWlyZSgnLi9fZmxhZ3MnKVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MuanNcbi8vIG1vZHVsZSBpZCA9IDE5OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBAQG1hdGNoIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ21hdGNoJywgMSwgZnVuY3Rpb24gKGRlZmluZWQsIE1BVENILCAkbWF0Y2gpIHtcbiAgLy8gMjEuMS4zLjExIFN0cmluZy5wcm90b3R5cGUubWF0Y2gocmVnZXhwKVxuICByZXR1cm4gW2Z1bmN0aW9uIG1hdGNoKHJlZ2V4cCkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgdmFyIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbTUFUQ0hdKFN0cmluZyhPKSk7XG4gIH0sICRtYXRjaF07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qc1xuLy8gbW9kdWxlIGlkID0gMjAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBsZW5ndGgsIGV4ZWMpIHtcbiAgdmFyIFNZTUJPTCA9IHdrcyhLRVkpO1xuICB2YXIgZm5zID0gZXhlYyhkZWZpbmVkLCBTWU1CT0wsICcnW0tFWV0pO1xuICB2YXIgc3RyZm4gPSBmbnNbMF07XG4gIHZhciByeGZuID0gZm5zWzFdO1xuICBpZiAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPSA3O1xuICB9KSkge1xuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgc3RyZm4pO1xuICAgIGhpZGUoUmVnRXhwLnByb3RvdHlwZSwgU1lNQk9MLCBsZW5ndGggPT0gMlxuICAgICAgLy8gMjEuMi41LjggUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdKHN0cmluZywgcmVwbGFjZVZhbHVlKVxuICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdClcbiAgICAgID8gZnVuY3Rpb24gKHN0cmluZywgYXJnKSB7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcyk7IH1cbiAgICApO1xuICB9XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qc1xuLy8gbW9kdWxlIGlkID0gMjAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIEBAcmVwbGFjZSBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFJFUExBQ0UsICRyZXBsYWNlKSB7XG4gIC8vIDIxLjEuMy4xNCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSlcbiAgcmV0dXJuIFtmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgIHZhciBmbiA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZuLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgIDogJHJlcGxhY2UuY2FsbChTdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICB9LCAkcmVwbGFjZV07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gQEBzZWFyY2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc2VhcmNoJywgMSwgZnVuY3Rpb24gKGRlZmluZWQsIFNFQVJDSCwgJHNlYXJjaCkge1xuICAvLyAyMS4xLjMuMTUgU3RyaW5nLnByb3RvdHlwZS5zZWFyY2gocmVnZXhwKVxuICByZXR1cm4gW2Z1bmN0aW9uIHNlYXJjaChyZWdleHApIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgIHZhciBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbU0VBUkNIXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gIH0sICRzZWFyY2hdO1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gQEBzcGxpdCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdzcGxpdCcsIDIsIGZ1bmN0aW9uIChkZWZpbmVkLCBTUExJVCwgJHNwbGl0KSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG4gIHZhciBfc3BsaXQgPSAkc3BsaXQ7XG4gIHZhciAkcHVzaCA9IFtdLnB1c2g7XG4gIHZhciAkU1BMSVQgPSAnc3BsaXQnO1xuICB2YXIgTEVOR1RIID0gJ2xlbmd0aCc7XG4gIHZhciBMQVNUX0lOREVYID0gJ2xhc3RJbmRleCc7XG4gIGlmIChcbiAgICAnYWJiYydbJFNQTElUXSgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0J1skU1BMSVRdKC8oPzopLywgLTEpW0xFTkdUSF0gIT0gNCB8fFxuICAgICdhYidbJFNQTElUXSgvKD86YWIpKi8pW0xFTkdUSF0gIT0gMiB8fFxuICAgICcuJ1skU1BMSVRdKC8oLj8pKC4/KS8pW0xFTkdUSF0gIT0gNCB8fFxuICAgICcuJ1skU1BMSVRdKC8oKSgpLylbTEVOR1RIXSA+IDEgfHxcbiAgICAnJ1skU1BMSVRdKC8uPy8pW0xFTkdUSF1cbiAgKSB7XG4gICAgdmFyIE5QQ0cgPSAvKCk/Py8uZXhlYygnJylbMV0gPT09IHVuZGVmaW5lZDsgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBcbiAgICAvLyBiYXNlZCBvbiBlczUtc2hpbSBpbXBsZW1lbnRhdGlvbiwgbmVlZCB0byByZXdvcmsgaXRcbiAgICAkc3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkgcmV0dXJuIF9zcGxpdC5jYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHNwbGl0TGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gNDI5NDk2NzI5NSA6IGxpbWl0ID4+PiAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgc2VwYXJhdG9yMiwgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aCwgaTtcbiAgICAgIC8vIERvZXNuJ3QgbmVlZCBmbGFncyBneSwgYnV0IHRoZXkgZG9uJ3QgaHVydFxuICAgICAgaWYgKCFOUENHKSBzZXBhcmF0b3IyID0gbmV3IFJlZ0V4cCgnXicgKyBzZXBhcmF0b3JDb3B5LnNvdXJjZSArICckKD8hXFxcXHMpJywgZmxhZ3MpO1xuICAgICAgd2hpbGUgKG1hdGNoID0gc2VwYXJhdG9yQ29weS5leGVjKHN0cmluZykpIHtcbiAgICAgICAgLy8gYHNlcGFyYXRvckNvcHkubGFzdEluZGV4YCBpcyBub3QgcmVsaWFibGUgY3Jvc3MtYnJvd3NlclxuICAgICAgICBsYXN0SW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAgZm9yIE5QQ0dcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICAgICAgaWYgKCFOUENHICYmIG1hdGNoW0xFTkdUSF0gPiAxKSBtYXRjaFswXS5yZXBsYWNlKHNlcGFyYXRvcjIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHNbTEVOR1RIXSAtIDI7IGkrKykgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAobWF0Y2hbTEVOR1RIXSA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHJpbmdbTEVOR1RIXSkgJHB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0W0xFTkdUSF0gPj0gc3BsaXRMaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0gPT09IG1hdGNoLmluZGV4KSBzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdKys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmdbTEVOR1RIXSkge1xuICAgICAgICBpZiAobGFzdExlbmd0aCB8fCAhc2VwYXJhdG9yQ29weS50ZXN0KCcnKSkgb3V0cHV0LnB1c2goJycpO1xuICAgICAgfSBlbHNlIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4KSk7XG4gICAgICByZXR1cm4gb3V0cHV0W0xFTkdUSF0gPiBzcGxpdExpbWl0ID8gb3V0cHV0LnNsaWNlKDAsIHNwbGl0TGltaXQpIDogb3V0cHV0O1xuICAgIH07XG4gIC8vIENoYWtyYSwgVjhcbiAgfSBlbHNlIGlmICgnMCdbJFNQTElUXSh1bmRlZmluZWQsIDApW0xFTkdUSF0pIHtcbiAgICAkc3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiBfc3BsaXQuY2FsbCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xuICB9XG4gIC8vIDIxLjEuMy4xNyBTdHJpbmcucHJvdG90eXBlLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpXG4gIHJldHVybiBbZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICB2YXIgZm4gPSBzZXBhcmF0b3IgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VwYXJhdG9yW1NQTElUXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdCkgOiAkc3BsaXQuY2FsbChTdHJpbmcoTyksIHNlcGFyYXRvciwgbGltaXQpO1xuICB9LCAkc3BsaXRdO1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQuanNcbi8vIG1vZHVsZSBpZCA9IDIwNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuL19wZXJmb3JtJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyICRQcm9taXNlID0gZ2xvYmFsW1BST01JU0VdO1xudmFyIGlzTm9kZSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIGVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIEludGVybmFsLCBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIE93blByb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSA9ICRQcm9taXNlLnJlc29sdmUoMSk7XG4gICAgdmFyIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbiAoZXhlYykge1xuICAgICAgZXhlYyhlbXB0eSwgZW1wdHkpO1xuICAgIH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJykgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHByb21pc2UsIGlzUmVqZWN0KSB7XG4gIGlmIChwcm9taXNlLl9uKSByZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIG9rID0gcHJvbWlzZS5fcyA9PSAxO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24gKHJlYWN0aW9uKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpKSBydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpIG9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgdW5oYW5kbGVkID0gaXNVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgdmFyIHJlc3VsdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZiAodW5oYW5kbGVkKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pIHtcbiAgICAgICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgoY29uc29sZSA9IGdsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmICh1bmhhbmRsZWQgJiYgcmVzdWx0LmUpIHRocm93IHJlc3VsdC52O1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICByZXR1cm4gcHJvbWlzZS5faCAhPT0gMSAmJiAocHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jKS5sZW5ndGggPT09IDA7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpIHtcbiAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3YgfSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYgKCFwcm9taXNlLl9hKSBwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgdmFyIHRoZW47XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmICh0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgJHJlamVjdC5jYWxsKHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9hKSB0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX3MpIG5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gJFByb21pc2UgfHwgQyA9PT0gV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFByb21pc2U6ICRQcm9taXNlIH0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB2YXIgJCRyZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoTElCUkFSWSAmJiB0aGlzID09PSBXcmFwcGVyID8gJFByb21pc2UgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uIChpdGVyKSB7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyICRpbmRleCA9IGluZGV4Kys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IDIwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBCUkVBSyA9IHt9O1xudmFyIFJFVFVSTiA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKSB7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKTtcbiAgdmFyIGYgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYgKGlzQXJyYXlJdGVyKGl0ZXJGbikpIGZvciAobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2Zvci1vZi5qc1xuLy8gbW9kdWxlIGlkID0gMjA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDIwOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190YXNrLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChpc05vZGUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgU2FmYXJpIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE9ic2VydmVyICYmICEoZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpKSB7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5cbmZ1bmN0aW9uIFByb21pc2VDYXBhYmlsaXR5KEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qc1xuLy8gbW9kdWxlIGlkID0gMjExXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19wZXJmb3JtLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qc1xuLy8gbW9kdWxlIGlkID0gMjEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qc1xuLy8gbW9kdWxlIGlkID0gMjE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIE1BUCA9ICdNYXAnO1xuXG4vLyAyMy4xIE1hcCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShNQVAsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjEuMy42IE1hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gc3Ryb25nLmdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnY7XG4gIH0sXG4gIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih2YWxpZGF0ZSh0aGlzLCBNQVApLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZywgdHJ1ZSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDIxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgJGl0ZXJEZWZpbmUgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5O1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNJWkUgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgdmFyIGVudHJ5O1xuICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yIChlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICBpZiAoZW50cnkuayA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBmb3IgKHZhciB0aGF0ID0gdmFsaWRhdGUodGhpcywgTkFNRSksIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucCkgZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm47XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmICh0aGF0Ll9mID09IGVudHJ5KSB0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZiAodGhhdC5fbCA9PSBlbnRyeSkgdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZikge1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCBOQU1FKVtTSVpFXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgdmFyIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGF0Ll9mKSB0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZiAocHJldikgcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSB0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQywgTkFNRSwgSVNfTUFQKSB7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgdGhpcy5fdCA9IHZhbGlkYXRlKGl0ZXJhdGVkLCBOQU1FKTsgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBraW5kID0gdGhhdC5faztcbiAgICAgIHZhciBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qc1xuLy8gbW9kdWxlIGlkID0gMjE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRZUEUpIHtcbiAgaWYgKCFpc09iamVjdChpdCkgfHwgaXQuX3QgIT09IFRZUEUpIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQhJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL192YWxpZGF0ZS1jb2xsZWN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJGl0ZXJEZXRlY3QgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgZm4gPSBwcm90b1tLRVldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBLRVksXG4gICAgICBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyB1bmRlZmluZWQgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpIHsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpOyByZXR1cm4gdGhpczsgfVxuICAgICAgICA6IGZ1bmN0aW9uIHNldChhLCBiKSB7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhLCBiKTsgcmV0dXJuIHRoaXM7IH1cbiAgICApO1xuICB9O1xuICBpZiAodHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgICBtZXRhLk5FRUQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiAgQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9ICRpdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7IG5ldyBDKGl0ZXIpOyB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UoKSwgdGFyZ2V0LCBDKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQy5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQztcbiAgICB9XG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuICAgIGlmIChCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKSBmaXhNZXRob2QoQURERVIpO1xuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgcHJvdG8uY2xlYXIpIGRlbGV0ZSBwcm90by5jbGVhcjtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChDICE9IEJhc2UpLCBPKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgU0VUID0gJ1NldCc7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFNFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodmFsaWRhdGUodGhpcywgU0VUKSwgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAyMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGVhY2ggPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMCk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpO1xudmFyIHdlYWsgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXdlYWsnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBXRUFLX01BUCA9ICdXZWFrTWFwJztcbnZhciBnZXRXZWFrID0gbWV0YS5nZXRXZWFrO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IHdlYWsudWZzdG9yZTtcbnZhciB0bXAgPSB7fTtcbnZhciBJbnRlcm5hbE1hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICB9O1xufTtcblxudmFyIG1ldGhvZHMgPSB7XG4gIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBXRUFLX01BUCkpLmdldChrZXkpO1xuICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhW3RoaXMuX2ldIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSxcbiAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd2Vhay5kZWYodmFsaWRhdGUodGhpcywgV0VBS19NQVApLCBrZXksIHZhbHVlKTtcbiAgfVxufTtcblxuLy8gMjMuMyBXZWFrTWFwIE9iamVjdHNcbnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfTUFQLCB3cmFwcGVyLCBtZXRob2RzLCB3ZWFrLCB0cnVlLCB0cnVlKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuaWYgKGZhaWxzKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyAkV2Vha01hcCgpLnNldCgoT2JqZWN0LmZyZWV6ZSB8fCBPYmplY3QpKHRtcCksIDcpLmdldCh0bXApICE9IDc7IH0pKSB7XG4gIEludGVybmFsTWFwID0gd2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBXRUFLX01BUCk7XG4gIGFzc2lnbihJbnRlcm5hbE1hcC5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICBtZXRhLk5FRUQgPSB0cnVlO1xuICBlYWNoKFsnZGVsZXRlJywgJ2hhcycsICdnZXQnLCAnc2V0J10sIGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcHJvdG8gPSAkV2Vha01hcC5wcm90b3R5cGU7XG4gICAgdmFyIG1ldGhvZCA9IHByb3RvW2tleV07XG4gICAgcmVkZWZpbmUocHJvdG8sIGtleSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIC8vIHN0b3JlIGZyb3plbiBvYmplY3RzIG9uIGludGVybmFsIHdlYWttYXAgc2hpbVxuICAgICAgaWYgKGlzT2JqZWN0KGEpICYmICFpc0V4dGVuc2libGUoYSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mKSB0aGlzLl9mID0gbmV3IEludGVybmFsTWFwKCk7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9mW2tleV0oYSwgYik7XG4gICAgICAgIHJldHVybiBrZXkgPT0gJ3NldCcgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgLy8gc3RvcmUgYWxsIHRoZSByZXN0IG9uIG5hdGl2ZSB3ZWFrbWFwXG4gICAgICB9IHJldHVybiBtZXRob2QuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLW1hcC5qc1xuLy8gbW9kdWxlIGlkID0gMjIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGdldFdlYWsgPSByZXF1aXJlKCcuL19tZXRhJykuZ2V0V2VhaztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKTtcbnZhciAkaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgYXJyYXlGaW5kID0gY3JlYXRlQXJyYXlNZXRob2QoNSk7XG52YXIgYXJyYXlGaW5kSW5kZXggPSBjcmVhdGVBcnJheU1ldGhvZCg2KTtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAodGhhdCkge1xuICByZXR1cm4gdGhhdC5fbCB8fCAodGhhdC5fbCA9IG5ldyBVbmNhdWdodEZyb3plblN0b3JlKCkpO1xufTtcbnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmEgPSBbXTtcbn07XG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGFycmF5RmluZChzdG9yZS5hLCBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgfSk7XG59O1xuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuYS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gYXJyYXlGaW5kSW5kZXgodGhpcy5hLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICAgIH0pO1xuICAgIGlmICh+aW5kZXgpIHRoaXMuYS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiAhIX5pbmRleDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBpZCsrOyAgICAgIC8vIGNvbGxlY3Rpb24gaWRcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7IC8vIGxlYWsgc3RvcmUgZm9yIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RzXG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgfSk7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjMuMy4yIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy40LjMuMyBXZWFrU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSkgJiYgZGVsZXRlIGRhdGFbdGhpcy5faV07XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjQuMy40IFdlYWtTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSkuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZGF0YSA9IGdldFdlYWsoYW5PYmplY3Qoa2V5KSwgdHJ1ZSk7XG4gICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUodGhhdCkuc2V0KGtleSwgdmFsdWUpO1xuICAgIGVsc2UgZGF0YVt0aGF0Ll9pXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGF0O1xuICB9LFxuICB1ZnN0b3JlOiB1bmNhdWdodEZyb3plblN0b3JlXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi13ZWFrLmpzXG4vLyBtb2R1bGUgaWQgPSAyMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlYWsgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXdlYWsnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBXRUFLX1NFVCA9ICdXZWFrU2V0JztcblxuLy8gMjMuNCBXZWFrU2V0IE9iamVjdHNcbnJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShXRUFLX1NFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjQuMy4xIFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICByZXR1cm4gd2Vhay5kZWYodmFsaWRhdGUodGhpcywgV0VBS19TRVQpLCB2YWx1ZSwgdHJ1ZSk7XG4gIH1cbn0sIHdlYWssIGZhbHNlLCB0cnVlKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAyMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5BcnJheUJ1ZmZlcjtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgJEFycmF5QnVmZmVyID0gYnVmZmVyLkFycmF5QnVmZmVyO1xudmFyICREYXRhVmlldyA9IGJ1ZmZlci5EYXRhVmlldztcbnZhciAkaXNWaWV3ID0gJHR5cGVkLkFCViAmJiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG52YXIgJHNsaWNlID0gJEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZTtcbnZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoQXJyYXlCdWZmZXIgIT09ICRBcnJheUJ1ZmZlciksIHsgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlciB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhJHR5cGVkLkNPTlNUUiwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuMy4xIEFycmF5QnVmZmVyLmlzVmlldyhhcmcpXG4gIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gICAgcmV0dXJuICRpc1ZpZXcgJiYgJGlzVmlldyhpdCkgfHwgaXNPYmplY3QoaXQpICYmIFZJRVcgaW4gaXQ7XG4gIH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuVSArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIW5ldyAkQXJyYXlCdWZmZXIoMikuc2xpY2UoMSwgdW5kZWZpbmVkKS5ieXRlTGVuZ3RoO1xufSksIEFSUkFZX0JVRkZFUiwge1xuICAvLyAyNC4xLjQuMyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoJHNsaWNlICE9PSB1bmRlZmluZWQgJiYgZW5kID09PSB1bmRlZmluZWQpIHJldHVybiAkc2xpY2UuY2FsbChhbk9iamVjdCh0aGlzKSwgc3RhcnQpOyAvLyBGRiBmaXhcbiAgICB2YXIgbGVuID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gICAgdmFyIGZpbmFsID0gdG9BYnNvbHV0ZUluZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogZW5kLCBsZW4pO1xuICAgIHZhciByZXN1bHQgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkQXJyYXlCdWZmZXIpKSh0b0xlbmd0aChmaW5hbCAtIGZpcnN0KSk7XG4gICAgdmFyIHZpZXdTID0gbmV3ICREYXRhVmlldyh0aGlzKTtcbiAgICB2YXIgdmlld1QgPSBuZXcgJERhdGFWaWV3KHJlc3VsdCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoZmlyc3QgPCBmaW5hbCkge1xuICAgICAgdmlld1Quc2V0VWludDgoaW5kZXgrKywgdmlld1MuZ2V0VWludDgoZmlyc3QrKykpO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoQVJSQVlfQlVGRkVSKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qc1xuLy8gbW9kdWxlIGlkID0gMjIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFRZUEVEID0gdWlkKCd0eXBlZF9hcnJheScpO1xudmFyIFZJRVcgPSB1aWQoJ3ZpZXcnKTtcbnZhciBBQlYgPSAhIShnbG9iYWwuQXJyYXlCdWZmZXIgJiYgZ2xvYmFsLkRhdGFWaWV3KTtcbnZhciBDT05TVFIgPSBBQlY7XG52YXIgaSA9IDA7XG52YXIgbCA9IDk7XG52YXIgVHlwZWQ7XG5cbnZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzID0gKFxuICAnSW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXknXG4pLnNwbGl0KCcsJyk7XG5cbndoaWxlIChpIDwgbCkge1xuICBpZiAoVHlwZWQgPSBnbG9iYWxbVHlwZWRBcnJheUNvbnN0cnVjdG9yc1tpKytdXSkge1xuICAgIGhpZGUoVHlwZWQucHJvdG90eXBlLCBUWVBFRCwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICB9IGVsc2UgQ09OU1RSID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBQlY6IEFCVixcbiAgQ09OU1RSOiBDT05TVFIsXG4gIFRZUEVEOiBUWVBFRCxcbiAgVklFVzogVklFV1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAyMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICR0eXBlZCA9IHJlcXVpcmUoJy4vX3R5cGVkJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0luZGV4ID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBhcnJheUZpbGwgPSByZXF1aXJlKCcuL19hcnJheS1maWxsJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgREFUQV9WSUVXID0gJ0RhdGFWaWV3JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoISc7XG52YXIgV1JPTkdfSU5ERVggPSAnV3JvbmcgaW5kZXghJztcbnZhciAkQXJyYXlCdWZmZXIgPSBnbG9iYWxbQVJSQVlfQlVGRkVSXTtcbnZhciAkRGF0YVZpZXcgPSBnbG9iYWxbREFUQV9WSUVXXTtcbnZhciBNYXRoID0gZ2xvYmFsLk1hdGg7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdy1yZXN0cmljdGVkLW5hbWVzXG52YXIgSW5maW5pdHkgPSBnbG9iYWwuSW5maW5pdHk7XG52YXIgQmFzZUJ1ZmZlciA9ICRBcnJheUJ1ZmZlcjtcbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBwb3cgPSBNYXRoLnBvdztcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgTE4yID0gTWF0aC5MTjI7XG52YXIgQlVGRkVSID0gJ2J1ZmZlcic7XG52YXIgQllURV9MRU5HVEggPSAnYnl0ZUxlbmd0aCc7XG52YXIgQllURV9PRkZTRVQgPSAnYnl0ZU9mZnNldCc7XG52YXIgJEJVRkZFUiA9IERFU0NSSVBUT1JTID8gJ19iJyA6IEJVRkZFUjtcbnZhciAkTEVOR1RIID0gREVTQ1JJUFRPUlMgPyAnX2wnIDogQllURV9MRU5HVEg7XG52YXIgJE9GRlNFVCA9IERFU0NSSVBUT1JTID8gJ19vJyA6IEJZVEVfT0ZGU0VUO1xuXG4vLyBJRUVFNzU0IGNvbnZlcnNpb25zIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaWVlZTc1NFxuZnVuY3Rpb24gcGFja0lFRUU3NTQodmFsdWUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KG5CeXRlcyk7XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgcnQgPSBtTGVuID09PSAyMyA/IHBvdygyLCAtMjQpIC0gcG93KDIsIC03NykgOiAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciBzID0gdmFsdWUgPCAwIHx8IHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDAgPyAxIDogMDtcbiAgdmFyIGUsIG0sIGM7XG4gIHZhbHVlID0gYWJzKHZhbHVlKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICBpZiAodmFsdWUgIT0gdmFsdWUgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIG0gPSB2YWx1ZSAhPSB2YWx1ZSA/IDEgOiAwO1xuICAgIGUgPSBlTWF4O1xuICB9IGVsc2Uge1xuICAgIGUgPSBmbG9vcihsb2codmFsdWUpIC8gTE4yKTtcbiAgICBpZiAodmFsdWUgKiAoYyA9IHBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tO1xuICAgICAgYyAqPSAyO1xuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBwb3coMiwgMSAtIGVCaWFzKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDA7XG4gICAgICBlID0gZU1heDtcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogcG93KDIsIG1MZW4pO1xuICAgICAgZSA9IGUgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogcG93KDIsIGVCaWFzIC0gMSkgKiBwb3coMiwgbUxlbik7XG4gICAgICBlID0gMDtcbiAgICB9XG4gIH1cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW2krK10gPSBtICYgMjU1LCBtIC89IDI1NiwgbUxlbiAtPSA4KTtcbiAgZSA9IGUgPDwgbUxlbiB8IG07XG4gIGVMZW4gKz0gbUxlbjtcbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbaSsrXSA9IGUgJiAyNTUsIGUgLz0gMjU2LCBlTGVuIC09IDgpO1xuICBidWZmZXJbLS1pXSB8PSBzICogMTI4O1xuICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gdW5wYWNrSUVFRTc1NChidWZmZXIsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIG5CaXRzID0gZUxlbiAtIDc7XG4gIHZhciBpID0gbkJ5dGVzIC0gMTtcbiAgdmFyIHMgPSBidWZmZXJbaS0tXTtcbiAgdmFyIGUgPSBzICYgMTI3O1xuICB2YXIgbTtcbiAgcyA+Pj0gNztcbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbaV0sIGktLSwgbkJpdHMgLT0gOCk7XG4gIG0gPSBlICYgKDEgPDwgLW5CaXRzKSAtIDE7XG4gIGUgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbUxlbjtcbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbaV0sIGktLSwgbkJpdHMgLT0gOCk7XG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhcztcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiBzID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBwb3coMiwgbUxlbik7XG4gICAgZSA9IGUgLSBlQmlhcztcbiAgfSByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIHBvdygyLCBlIC0gbUxlbik7XG59XG5cbmZ1bmN0aW9uIHVucGFja0kzMihieXRlcykge1xuICByZXR1cm4gYnl0ZXNbM10gPDwgMjQgfCBieXRlc1syXSA8PCAxNiB8IGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXTtcbn1cbmZ1bmN0aW9uIHBhY2tJOChpdCkge1xuICByZXR1cm4gW2l0ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrSTE2KGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmLCBpdCA+PiA4ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrSTMyKGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmLCBpdCA+PiA4ICYgMHhmZiwgaXQgPj4gMTYgJiAweGZmLCBpdCA+PiAyNCAmIDB4ZmZdO1xufVxuZnVuY3Rpb24gcGFja0Y2NChpdCkge1xuICByZXR1cm4gcGFja0lFRUU3NTQoaXQsIDUyLCA4KTtcbn1cbmZ1bmN0aW9uIHBhY2tGMzIoaXQpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KGl0LCAyMywgNCk7XG59XG5cbmZ1bmN0aW9uIGFkZEdldHRlcihDLCBrZXksIGludGVybmFsKSB7XG4gIGRQKENbUFJPVE9UWVBFXSwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpc1tpbnRlcm5hbF07IH0gfSk7XG59XG5cbmZ1bmN0aW9uIGdldCh2aWV3LCBieXRlcywgaW5kZXgsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBudW1JbmRleCA9ICtpbmRleDtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChudW1JbmRleCk7XG4gIGlmIChpbnRJbmRleCArIGJ5dGVzID4gdmlld1skTEVOR1RIXSkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBzdG9yZSA9IHZpZXdbJEJVRkZFUl0uX2I7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgdmlld1skT0ZGU0VUXTtcbiAgdmFyIHBhY2sgPSBzdG9yZS5zbGljZShzdGFydCwgc3RhcnQgKyBieXRlcyk7XG4gIHJldHVybiBpc0xpdHRsZUVuZGlhbiA/IHBhY2sgOiBwYWNrLnJldmVyc2UoKTtcbn1cbmZ1bmN0aW9uIHNldCh2aWV3LCBieXRlcywgaW5kZXgsIGNvbnZlcnNpb24sIHZhbHVlLCBpc0xpdHRsZUVuZGlhbikge1xuICB2YXIgbnVtSW5kZXggPSAraW5kZXg7XG4gIHZhciBpbnRJbmRleCA9IHRvSW5kZXgobnVtSW5kZXgpO1xuICBpZiAoaW50SW5kZXggKyBieXRlcyA+IHZpZXdbJExFTkdUSF0pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgc3RvcmUgPSB2aWV3WyRCVUZGRVJdLl9iO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHZpZXdbJE9GRlNFVF07XG4gIHZhciBwYWNrID0gY29udmVyc2lvbigrdmFsdWUpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHN0b3JlW3N0YXJ0ICsgaV0gPSBwYWNrW2lzTGl0dGxlRW5kaWFuID8gaSA6IGJ5dGVzIC0gaSAtIDFdO1xufVxuXG5pZiAoISR0eXBlZC5BQlYpIHtcbiAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0b0luZGV4KGxlbmd0aCk7XG4gICAgdGhpcy5fYiA9IGFycmF5RmlsbC5jYWxsKG5ldyBBcnJheShieXRlTGVuZ3RoKSwgMCk7XG4gICAgdGhpc1skTEVOR1RIXSA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgJERhdGFWaWV3ID0gZnVuY3Rpb24gRGF0YVZpZXcoYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkRGF0YVZpZXcsIERBVEFfVklFVyk7XG4gICAgYW5JbnN0YW5jZShidWZmZXIsICRBcnJheUJ1ZmZlciwgREFUQV9WSUVXKTtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gYnVmZmVyWyRMRU5HVEhdO1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoYnl0ZU9mZnNldCk7XG4gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQhJyk7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ1ZmZlckxlbmd0aCAtIG9mZnNldCA6IHRvTGVuZ3RoKGJ5dGVMZW5ndGgpO1xuICAgIGlmIChvZmZzZXQgKyBieXRlTGVuZ3RoID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgdGhpc1skQlVGRkVSXSA9IGJ1ZmZlcjtcbiAgICB0aGlzWyRPRkZTRVRdID0gb2Zmc2V0O1xuICAgIHRoaXNbJExFTkdUSF0gPSBieXRlTGVuZ3RoO1xuICB9O1xuXG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIGFkZEdldHRlcigkQXJyYXlCdWZmZXIsIEJZVEVfTEVOR1RILCAnX2wnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCVUZGRVIsICdfYicpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJZVEVfTEVOR1RILCAnX2wnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCWVRFX09GRlNFVCwgJ19vJyk7XG4gIH1cblxuICByZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSwge1xuICAgIGdldEludDg6IGZ1bmN0aW9uIGdldEludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDtcbiAgICB9LFxuICAgIGdldFVpbnQ4OiBmdW5jdGlvbiBnZXRVaW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MTY6IGZ1bmN0aW9uIGdldEludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pO1xuICAgICAgcmV0dXJuIChieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF0pIDw8IDE2ID4+IDE2O1xuICAgIH0sXG4gICAgZ2V0VWludDE2OiBmdW5jdGlvbiBnZXRVaW50MTYoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSk7XG4gICAgICByZXR1cm4gYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MzI6IGZ1bmN0aW9uIGdldEludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJMzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSkpO1xuICAgIH0sXG4gICAgZ2V0VWludDMyOiBmdW5jdGlvbiBnZXRVaW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0kzMihnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSkgPj4+IDA7XG4gICAgfSxcbiAgICBnZXRGbG9hdDMyOiBmdW5jdGlvbiBnZXRGbG9hdDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pLCAyMywgNCk7XG4gICAgfSxcbiAgICBnZXRGbG9hdDY0OiBmdW5jdGlvbiBnZXRGbG9hdDY0KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pLCA1MiwgOCk7XG4gICAgfSxcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0k4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSTgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldEludDE2OiBmdW5jdGlvbiBzZXRJbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJMTYsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0VWludDE2OiBmdW5jdGlvbiBzZXRVaW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBwYWNrSTE2LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEludDMyOiBmdW5jdGlvbiBzZXRJbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0VWludDMyOiBmdW5jdGlvbiBzZXRVaW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSTMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEZsb2F0MzI6IGZ1bmN0aW9uIHNldEZsb2F0MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrRjMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEZsb2F0NjQ6IGZ1bmN0aW9uIHNldEZsb2F0NjQoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBwYWNrRjY0LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgaWYgKCFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgJEFycmF5QnVmZmVyKDEpO1xuICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoLTEpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICB9KSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoMS41KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBuZXcgJEFycmF5QnVmZmVyKE5hTik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgcmV0dXJuICRBcnJheUJ1ZmZlci5uYW1lICE9IEFSUkFZX0JVRkZFUjtcbiAgfSkpIHtcbiAgICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhpcywgJEFycmF5QnVmZmVyKTtcbiAgICAgIHJldHVybiBuZXcgQmFzZUJ1ZmZlcih0b0luZGV4KGxlbmd0aCkpO1xuICAgIH07XG4gICAgdmFyIEFycmF5QnVmZmVyUHJvdG8gPSAkQXJyYXlCdWZmZXJbUFJPVE9UWVBFXSA9IEJhc2VCdWZmZXJbUFJPVE9UWVBFXTtcbiAgICBmb3IgKHZhciBrZXlzID0gZ09QTihCYXNlQnVmZmVyKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOykge1xuICAgICAgaWYgKCEoKGtleSA9IGtleXNbaisrXSkgaW4gJEFycmF5QnVmZmVyKSkgaGlkZSgkQXJyYXlCdWZmZXIsIGtleSwgQmFzZUJ1ZmZlcltrZXldKTtcbiAgICB9XG4gICAgaWYgKCFMSUJSQVJZKSBBcnJheUJ1ZmZlclByb3RvLmNvbnN0cnVjdG9yID0gJEFycmF5QnVmZmVyO1xuICB9XG4gIC8vIGlPUyBTYWZhcmkgNy54IGJ1Z1xuICB2YXIgdmlldyA9IG5ldyAkRGF0YVZpZXcobmV3ICRBcnJheUJ1ZmZlcigyKSk7XG4gIHZhciAkc2V0SW50OCA9ICREYXRhVmlld1tQUk9UT1RZUEVdLnNldEludDg7XG4gIHZpZXcuc2V0SW50OCgwLCAyMTQ3NDgzNjQ4KTtcbiAgdmlldy5zZXRJbnQ4KDEsIDIxNDc0ODM2NDkpO1xuICBpZiAodmlldy5nZXRJbnQ4KDApIHx8ICF2aWV3LmdldEludDgoMSkpIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7XG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgICRzZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG59XG5zZXRUb1N0cmluZ1RhZygkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG5zZXRUb1N0cmluZ1RhZygkRGF0YVZpZXcsIERBVEFfVklFVyk7XG5oaWRlKCREYXRhVmlld1tQUk9UT1RZUEVdLCAkdHlwZWQuVklFVywgdHJ1ZSk7XG5leHBvcnRzW0FSUkFZX0JVRkZFUl0gPSAkQXJyYXlCdWZmZXI7XG5leHBvcnRzW0RBVEFfVklFV10gPSAkRGF0YVZpZXc7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL190eXBlZC1idWZmZXIuanNcbi8vIG1vZHVsZSBpZCA9IDIyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2luZGV4XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXIoaXQpO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTtcbiAgaWYgKG51bWJlciAhPT0gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBsZW5ndGghJyk7XG4gIHJldHVybiBsZW5ndGg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDIyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fdHlwZWQnKS5BQlYsIHtcbiAgRGF0YVZpZXc6IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpLkRhdGFWaWV3XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qc1xuLy8gbW9kdWxlIGlkID0gMjI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDIyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5pZiAocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSkge1xuICB2YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbiAgdmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xuICB2YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xuICB2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuICB2YXIgJHR5cGVkID0gcmVxdWlyZSgnLi9fdHlwZWQnKTtcbiAgdmFyICRidWZmZXIgPSByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKTtcbiAgdmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xuICB2YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG4gIHZhciBwcm9wZXJ0eURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG4gIHZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xuICB2YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbiAgdmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbiAgdmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG4gIHZhciB0b0luZGV4ID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbiAgdmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG4gIHZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuICB2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG4gIHZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xuICB2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbiAgdmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG4gIHZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbiAgdmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbiAgdmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xuICB2YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbiAgdmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG4gIHZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbiAgdmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xuICB2YXIgY3JlYXRlQXJyYXlNZXRob2QgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJyk7XG4gIHZhciBjcmVhdGVBcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKTtcbiAgdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbiAgdmFyIEFycmF5SXRlcmF0b3JzID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbiAgdmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xuICB2YXIgJGl0ZXJEZXRlY3QgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpO1xuICB2YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJyk7XG4gIHZhciBhcnJheUZpbGwgPSByZXF1aXJlKCcuL19hcnJheS1maWxsJyk7XG4gIHZhciBhcnJheUNvcHlXaXRoaW4gPSByZXF1aXJlKCcuL19hcnJheS1jb3B5LXdpdGhpbicpO1xuICB2YXIgJERQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG4gIHZhciAkR09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG4gIHZhciBkUCA9ICREUC5mO1xuICB2YXIgZ09QRCA9ICRHT1BELmY7XG4gIHZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG4gIHZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuICB2YXIgVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5O1xuICB2YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcbiAgdmFyIFNIQVJFRF9CVUZGRVIgPSAnU2hhcmVkJyArIEFSUkFZX0JVRkZFUjtcbiAgdmFyIEJZVEVTX1BFUl9FTEVNRU5UID0gJ0JZVEVTX1BFUl9FTEVNRU5UJztcbiAgdmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuICB2YXIgQXJyYXlQcm90byA9IEFycmF5W1BST1RPVFlQRV07XG4gIHZhciAkQXJyYXlCdWZmZXIgPSAkYnVmZmVyLkFycmF5QnVmZmVyO1xuICB2YXIgJERhdGFWaWV3ID0gJGJ1ZmZlci5EYXRhVmlldztcbiAgdmFyIGFycmF5Rm9yRWFjaCA9IGNyZWF0ZUFycmF5TWV0aG9kKDApO1xuICB2YXIgYXJyYXlGaWx0ZXIgPSBjcmVhdGVBcnJheU1ldGhvZCgyKTtcbiAgdmFyIGFycmF5U29tZSA9IGNyZWF0ZUFycmF5TWV0aG9kKDMpO1xuICB2YXIgYXJyYXlFdmVyeSA9IGNyZWF0ZUFycmF5TWV0aG9kKDQpO1xuICB2YXIgYXJyYXlGaW5kID0gY3JlYXRlQXJyYXlNZXRob2QoNSk7XG4gIHZhciBhcnJheUZpbmRJbmRleCA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpO1xuICB2YXIgYXJyYXlJbmNsdWRlcyA9IGNyZWF0ZUFycmF5SW5jbHVkZXModHJ1ZSk7XG4gIHZhciBhcnJheUluZGV4T2YgPSBjcmVhdGVBcnJheUluY2x1ZGVzKGZhbHNlKTtcbiAgdmFyIGFycmF5VmFsdWVzID0gQXJyYXlJdGVyYXRvcnMudmFsdWVzO1xuICB2YXIgYXJyYXlLZXlzID0gQXJyYXlJdGVyYXRvcnMua2V5cztcbiAgdmFyIGFycmF5RW50cmllcyA9IEFycmF5SXRlcmF0b3JzLmVudHJpZXM7XG4gIHZhciBhcnJheUxhc3RJbmRleE9mID0gQXJyYXlQcm90by5sYXN0SW5kZXhPZjtcbiAgdmFyIGFycmF5UmVkdWNlID0gQXJyYXlQcm90by5yZWR1Y2U7XG4gIHZhciBhcnJheVJlZHVjZVJpZ2h0ID0gQXJyYXlQcm90by5yZWR1Y2VSaWdodDtcbiAgdmFyIGFycmF5Sm9pbiA9IEFycmF5UHJvdG8uam9pbjtcbiAgdmFyIGFycmF5U29ydCA9IEFycmF5UHJvdG8uc29ydDtcbiAgdmFyIGFycmF5U2xpY2UgPSBBcnJheVByb3RvLnNsaWNlO1xuICB2YXIgYXJyYXlUb1N0cmluZyA9IEFycmF5UHJvdG8udG9TdHJpbmc7XG4gIHZhciBhcnJheVRvTG9jYWxlU3RyaW5nID0gQXJyYXlQcm90by50b0xvY2FsZVN0cmluZztcbiAgdmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xuICB2YXIgVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpO1xuICB2YXIgVFlQRURfQ09OU1RSVUNUT1IgPSB1aWQoJ3R5cGVkX2NvbnN0cnVjdG9yJyk7XG4gIHZhciBERUZfQ09OU1RSVUNUT1IgPSB1aWQoJ2RlZl9jb25zdHJ1Y3RvcicpO1xuICB2YXIgQUxMX0NPTlNUUlVDVE9SUyA9ICR0eXBlZC5DT05TVFI7XG4gIHZhciBUWVBFRF9BUlJBWSA9ICR0eXBlZC5UWVBFRDtcbiAgdmFyIFZJRVcgPSAkdHlwZWQuVklFVztcbiAgdmFyIFdST05HX0xFTkdUSCA9ICdXcm9uZyBsZW5ndGghJztcblxuICB2YXIgJG1hcCA9IGNyZWF0ZUFycmF5TWV0aG9kKDEsIGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYWxsb2NhdGUoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSksIGxlbmd0aCk7XG4gIH0pO1xuXG4gIHZhciBMSVRUTEVfRU5ESUFOID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgVWludDE2QXJyYXkoWzFdKS5idWZmZXIpWzBdID09PSAxO1xuICB9KTtcblxuICB2YXIgRk9SQ0VEX1NFVCA9ICEhVWludDhBcnJheSAmJiAhIVVpbnQ4QXJyYXlbUFJPVE9UWVBFXS5zZXQgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBVaW50OEFycmF5KDEpLnNldCh7fSk7XG4gIH0pO1xuXG4gIHZhciB0b09mZnNldCA9IGZ1bmN0aW9uIChpdCwgQllURVMpIHtcbiAgICB2YXIgb2Zmc2V0ID0gdG9JbnRlZ2VyKGl0KTtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgJSBCWVRFUykgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0IScpO1xuICAgIHJldHVybiBvZmZzZXQ7XG4gIH07XG5cbiAgdmFyIHZhbGlkYXRlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgaWYgKGlzT2JqZWN0KGl0KSAmJiBUWVBFRF9BUlJBWSBpbiBpdCkgcmV0dXJuIGl0O1xuICAgIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgdHlwZWQgYXJyYXkhJyk7XG4gIH07XG5cbiAgdmFyIGFsbG9jYXRlID0gZnVuY3Rpb24gKEMsIGxlbmd0aCkge1xuICAgIGlmICghKGlzT2JqZWN0KEMpICYmIFRZUEVEX0NPTlNUUlVDVE9SIGluIEMpKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0l0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIScpO1xuICAgIH0gcmV0dXJuIG5ldyBDKGxlbmd0aCk7XG4gIH07XG5cbiAgdmFyIHNwZWNpZXNGcm9tTGlzdCA9IGZ1bmN0aW9uIChPLCBsaXN0KSB7XG4gICAgcmV0dXJuIGZyb21MaXN0KHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pLCBsaXN0KTtcbiAgfTtcblxuICB2YXIgZnJvbUxpc3QgPSBmdW5jdGlvbiAoQywgbGlzdCkge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBhbGxvY2F0ZShDLCBsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgYWRkR2V0dGVyID0gZnVuY3Rpb24gKGl0LCBrZXksIGludGVybmFsKSB7XG4gICAgZFAoaXQsIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RbaW50ZXJuYWxdOyB9IH0pO1xuICB9O1xuXG4gIHZhciAkZnJvbSA9IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwZm4sIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHNvdXJjZSk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBtYXBmbiA9IGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXRlckZuID0gZ2V0SXRlckZuKE8pO1xuICAgIHZhciBpLCBsZW5ndGgsIHZhbHVlcywgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZiAoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhaXNBcnJheUl0ZXIoaXRlckZuKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCB2YWx1ZXMgPSBbXSwgaSA9IDA7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaSsrKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHN0ZXAudmFsdWUpO1xuICAgICAgfSBPID0gdmFsdWVzO1xuICAgIH1cbiAgICBpZiAobWFwcGluZyAmJiBhTGVuID4gMikgbWFwZm4gPSBjdHgobWFwZm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgZm9yIChpID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpLCByZXN1bHQgPSBhbGxvY2F0ZSh0aGlzLCBsZW5ndGgpOyBsZW5ndGggPiBpOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IG1hcHBpbmcgPyBtYXBmbihPW2ldLCBpKSA6IE9baV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyICRvZiA9IGZ1bmN0aW9uIG9mKC8qIC4uLml0ZW1zICovKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gYWxsb2NhdGUodGhpcywgbGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBpT1MgU2FmYXJpIDYueCBmYWlscyBoZXJlXG4gIHZhciBUT19MT0NBTEVfQlVHID0gISFVaW50OEFycmF5ICYmIGZhaWxzKGZ1bmN0aW9uICgpIHsgYXJyYXlUb0xvY2FsZVN0cmluZy5jYWxsKG5ldyBVaW50OEFycmF5KDEpKTsgfSk7XG5cbiAgdmFyICR0b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKCkge1xuICAgIHJldHVybiBhcnJheVRvTG9jYWxlU3RyaW5nLmFwcGx5KFRPX0xPQ0FMRV9CVUcgPyBhcnJheVNsaWNlLmNhbGwodmFsaWRhdGUodGhpcykpIDogdmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgdmFyIHByb3RvID0ge1xuICAgIGNvcHlXaXRoaW46IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCAvKiAsIGVuZCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5Q29weVdpdGhpbi5jYWxsKHZhbGlkYXRlKHRoaXMpLCB0YXJnZXQsIHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUV2ZXJ5KHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmaWxsOiBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQsIGVuZCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlGaWxsLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlGaWx0ZXIodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKSk7XG4gICAgfSxcbiAgICBmaW5kOiBmdW5jdGlvbiBmaW5kKHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUZpbmQodmFsaWRhdGUodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RmluZEluZGV4KHZhbGlkYXRlKHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIGFycmF5Rm9yRWFjaCh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlJbmRleE9mKHZhbGlkYXRlKHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5SW5jbHVkZXModmFsaWRhdGUodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUpvaW4uYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlMYXN0SW5kZXhPZi5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG1hcDogZnVuY3Rpb24gbWFwKG1hcGZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuICRtYXAodmFsaWRhdGUodGhpcyksIG1hcGZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZS5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZVJpZ2h0LmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBsZW5ndGggPSB2YWxpZGF0ZSh0aGF0KS5sZW5ndGg7XG4gICAgICB2YXIgbWlkZGxlID0gTWF0aC5mbG9vcihsZW5ndGggLyAyKTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICB3aGlsZSAoaW5kZXggPCBtaWRkbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0aGF0W2luZGV4XTtcbiAgICAgICAgdGhhdFtpbmRleCsrXSA9IHRoYXRbLS1sZW5ndGhdO1xuICAgICAgICB0aGF0W2xlbmd0aF0gPSB2YWx1ZTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfSxcbiAgICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlTb21lKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgICAgcmV0dXJuIGFycmF5U29ydC5jYWxsKHZhbGlkYXRlKHRoaXMpLCBjb21wYXJlZm4pO1xuICAgIH0sXG4gICAgc3ViYXJyYXk6IGZ1bmN0aW9uIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICAgIHZhciBPID0gdmFsaWRhdGUodGhpcyk7XG4gICAgICB2YXIgbGVuZ3RoID0gTy5sZW5ndGg7XG4gICAgICB2YXIgJGJlZ2luID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW5ndGgpO1xuICAgICAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSkpKFxuICAgICAgICBPLmJ1ZmZlcixcbiAgICAgICAgTy5ieXRlT2Zmc2V0ICsgJGJlZ2luICogTy5CWVRFU19QRVJfRUxFTUVOVCxcbiAgICAgICAgdG9MZW5ndGgoKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKSkgLSAkYmVnaW4pXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICB2YXIgJHNsaWNlID0gZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlTbGljZS5jYWxsKHZhbGlkYXRlKHRoaXMpLCBzdGFydCwgZW5kKSk7XG4gIH07XG5cbiAgdmFyICRzZXQgPSBmdW5jdGlvbiBzZXQoYXJyYXlMaWtlIC8qICwgb2Zmc2V0ICovKSB7XG4gICAgdmFsaWRhdGUodGhpcyk7XG4gICAgdmFyIG9mZnNldCA9IHRvT2Zmc2V0KGFyZ3VtZW50c1sxXSwgMSk7XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIHZhciBzcmMgPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aChzcmMubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB3aGlsZSAoaW5kZXggPCBsZW4pIHRoaXNbb2Zmc2V0ICsgaW5kZXhdID0gc3JjW2luZGV4KytdO1xuICB9O1xuXG4gIHZhciAkaXRlcmF0b3JzID0ge1xuICAgIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlFbnRyaWVzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH0sXG4gICAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgIHJldHVybiBhcnJheUtleXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfSxcbiAgICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgICAgIHJldHVybiBhcnJheVZhbHVlcy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGlzVEFJbmRleCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIHJldHVybiBpc09iamVjdCh0YXJnZXQpXG4gICAgICAmJiB0YXJnZXRbVFlQRURfQVJSQVldXG4gICAgICAmJiB0eXBlb2Yga2V5ICE9ICdzeW1ib2wnXG4gICAgICAmJiBrZXkgaW4gdGFyZ2V0XG4gICAgICAmJiBTdHJpbmcoK2tleSkgPT0gU3RyaW5nKGtleSk7XG4gIH07XG4gIHZhciAkZ2V0RGVzYyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkge1xuICAgIHJldHVybiBpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgPyBwcm9wZXJ0eURlc2MoMiwgdGFyZ2V0W2tleV0pXG4gICAgICA6IGdPUEQodGFyZ2V0LCBrZXkpO1xuICB9O1xuICB2YXIgJHNldERlc2MgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzYykge1xuICAgIGlmIChpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgJiYgaXNPYmplY3QoZGVzYylcbiAgICAgICYmIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgICAgJiYgIWhhcyhkZXNjLCAnZ2V0JylcbiAgICAgICYmICFoYXMoZGVzYywgJ3NldCcpXG4gICAgICAvLyBUT0RPOiBhZGQgdmFsaWRhdGlvbiBkZXNjcmlwdG9yIHcvbyBjYWxsaW5nIGFjY2Vzc29yc1xuICAgICAgJiYgIWRlc2MuY29uZmlndXJhYmxlXG4gICAgICAmJiAoIWhhcyhkZXNjLCAnd3JpdGFibGUnKSB8fCBkZXNjLndyaXRhYmxlKVxuICAgICAgJiYgKCFoYXMoZGVzYywgJ2VudW1lcmFibGUnKSB8fCBkZXNjLmVudW1lcmFibGUpXG4gICAgKSB7XG4gICAgICB0YXJnZXRba2V5XSA9IGRlc2MudmFsdWU7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gcmV0dXJuIGRQKHRhcmdldCwga2V5LCBkZXNjKTtcbiAgfTtcblxuICBpZiAoIUFMTF9DT05TVFJVQ1RPUlMpIHtcbiAgICAkR09QRC5mID0gJGdldERlc2M7XG4gICAgJERQLmYgPSAkc2V0RGVzYztcbiAgfVxuXG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIUFMTF9DT05TVFJVQ1RPUlMsICdPYmplY3QnLCB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0RGVzYyxcbiAgICBkZWZpbmVQcm9wZXJ0eTogJHNldERlc2NcbiAgfSk7XG5cbiAgaWYgKGZhaWxzKGZ1bmN0aW9uICgpIHsgYXJyYXlUb1N0cmluZy5jYWxsKHt9KTsgfSkpIHtcbiAgICBhcnJheVRvU3RyaW5nID0gYXJyYXlUb0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRoaXMpO1xuICAgIH07XG4gIH1cblxuICB2YXIgJFR5cGVkQXJyYXlQcm90b3R5cGUkID0gcmVkZWZpbmVBbGwoe30sIHByb3RvKTtcbiAgcmVkZWZpbmVBbGwoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAkaXRlcmF0b3JzKTtcbiAgaGlkZSgkVHlwZWRBcnJheVByb3RvdHlwZSQsIElURVJBVE9SLCAkaXRlcmF0b3JzLnZhbHVlcyk7XG4gIHJlZGVmaW5lQWxsKCRUeXBlZEFycmF5UHJvdG90eXBlJCwge1xuICAgIHNsaWNlOiAkc2xpY2UsXG4gICAgc2V0OiAkc2V0LFxuICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7IC8qIG5vb3AgKi8gfSxcbiAgICB0b1N0cmluZzogYXJyYXlUb1N0cmluZyxcbiAgICB0b0xvY2FsZVN0cmluZzogJHRvTG9jYWxlU3RyaW5nXG4gIH0pO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnVmZmVyJywgJ2InKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J5dGVPZmZzZXQnLCAnbycpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnl0ZUxlbmd0aCcsICdsJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdsZW5ndGgnLCAnZScpO1xuICBkUCgkVHlwZWRBcnJheVByb3RvdHlwZSQsIFRBRywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpc1tUWVBFRF9BUlJBWV07IH1cbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgQllURVMsIHdyYXBwZXIsIENMQU1QRUQpIHtcbiAgICBDTEFNUEVEID0gISFDTEFNUEVEO1xuICAgIHZhciBOQU1FID0gS0VZICsgKENMQU1QRUQgPyAnQ2xhbXBlZCcgOiAnJykgKyAnQXJyYXknO1xuICAgIHZhciBHRVRURVIgPSAnZ2V0JyArIEtFWTtcbiAgICB2YXIgU0VUVEVSID0gJ3NldCcgKyBLRVk7XG4gICAgdmFyIFR5cGVkQXJyYXkgPSBnbG9iYWxbTkFNRV07XG4gICAgdmFyIEJhc2UgPSBUeXBlZEFycmF5IHx8IHt9O1xuICAgIHZhciBUQUMgPSBUeXBlZEFycmF5ICYmIGdldFByb3RvdHlwZU9mKFR5cGVkQXJyYXkpO1xuICAgIHZhciBGT1JDRUQgPSAhVHlwZWRBcnJheSB8fCAhJHR5cGVkLkFCVjtcbiAgICB2YXIgTyA9IHt9O1xuICAgIHZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheSAmJiBUeXBlZEFycmF5W1BST1RPVFlQRV07XG4gICAgdmFyIGdldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkge1xuICAgICAgdmFyIGRhdGEgPSB0aGF0Ll9kO1xuICAgICAgcmV0dXJuIGRhdGEudltHRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIExJVFRMRV9FTkRJQU4pO1xuICAgIH07XG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhhdC5fZDtcbiAgICAgIGlmIChDTEFNUEVEKSB2YWx1ZSA9ICh2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUpKSA8IDAgPyAwIDogdmFsdWUgPiAweGZmID8gMHhmZiA6IHZhbHVlICYgMHhmZjtcbiAgICAgIGRhdGEudltTRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIHZhbHVlLCBMSVRUTEVfRU5ESUFOKTtcbiAgICB9O1xuICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICBkUCh0aGF0LCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKEZPUkNFRCkge1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FLCAnX2QnKTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciBidWZmZXIsIGJ5dGVMZW5ndGgsIGxlbmd0aCwga2xhc3M7XG4gICAgICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICBsZW5ndGggPSB0b0luZGV4KGRhdGEpO1xuICAgICAgICAgIGJ5dGVMZW5ndGggPSBsZW5ndGggKiBCWVRFUztcbiAgICAgICAgICBidWZmZXIgPSBuZXcgJEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiAkQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihkYXRhKSkgPT0gQVJSQVlfQlVGRkVSIHx8IGtsYXNzID09IFNIQVJFRF9CVUZGRVIpIHtcbiAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgIG9mZnNldCA9IHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKTtcbiAgICAgICAgICB2YXIgJGxlbiA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICBpZiAoJGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gJGxlbiAtIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoIDwgMCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gdG9MZW5ndGgoJGxlbmd0aCkgKiBCWVRFUztcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoICsgb2Zmc2V0ID4gJGxlbikgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW5ndGggPSBieXRlTGVuZ3RoIC8gQllURVM7XG4gICAgICAgIH0gZWxzZSBpZiAoVFlQRURfQVJSQVkgaW4gZGF0YSkge1xuICAgICAgICAgIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBoaWRlKHRoYXQsICdfZCcsIHtcbiAgICAgICAgICBiOiBidWZmZXIsXG4gICAgICAgICAgbzogb2Zmc2V0LFxuICAgICAgICAgIGw6IGJ5dGVMZW5ndGgsXG4gICAgICAgICAgZTogbGVuZ3RoLFxuICAgICAgICAgIHY6IG5ldyAkRGF0YVZpZXcoYnVmZmVyKVxuICAgICAgICB9KTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSBhZGRFbGVtZW50KHRoYXQsIGluZGV4KyspO1xuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gY3JlYXRlKCRUeXBlZEFycmF5UHJvdG90eXBlJCk7XG4gICAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIFR5cGVkQXJyYXkpO1xuICAgIH0gZWxzZSBpZiAoIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIFR5cGVkQXJyYXkoMSk7XG4gICAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9KSB8fCAhJGl0ZXJEZXRlY3QoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheShudWxsKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KDEuNSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheShpdGVyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9LCB0cnVlKSkge1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FKTtcbiAgICAgICAgdmFyIGtsYXNzO1xuICAgICAgICAvLyBgd3NgIG1vZHVsZSBidWcsIHRlbXBvcmFyaWx5IHJlbW92ZSB2YWxpZGF0aW9uIGxlbmd0aCBmb3IgVWludDhBcnJheVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9wdWxsLzY0NVxuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSByZXR1cm4gbmV3IEJhc2UodG9JbmRleChkYXRhKSk7XG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgJEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoZGF0YSkpID09IEFSUkFZX0JVRkZFUiB8fCBrbGFzcyA9PSBTSEFSRURfQlVGRkVSKSB7XG4gICAgICAgICAgcmV0dXJuICRsZW5ndGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBuZXcgQmFzZShkYXRhLCB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUyksICRsZW5ndGgpXG4gICAgICAgICAgICA6ICRvZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG5ldyBCYXNlKGRhdGEsIHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKSlcbiAgICAgICAgICAgICAgOiBuZXcgQmFzZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVFlQRURfQVJSQVkgaW4gZGF0YSkgcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgIH0pO1xuICAgICAgYXJyYXlGb3JFYWNoKFRBQyAhPT0gRnVuY3Rpb24ucHJvdG90eXBlID8gZ09QTihCYXNlKS5jb25jYXQoZ09QTihUQUMpKSA6IGdPUE4oQmFzZSksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIFR5cGVkQXJyYXkpKSBoaWRlKFR5cGVkQXJyYXksIGtleSwgQmFzZVtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gVHlwZWRBcnJheVByb3RvdHlwZTtcbiAgICAgIGlmICghTElCUkFSWSkgVHlwZWRBcnJheVByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR5cGVkQXJyYXk7XG4gICAgfVxuICAgIHZhciAkbmF0aXZlSXRlcmF0b3IgPSBUeXBlZEFycmF5UHJvdG90eXBlW0lURVJBVE9SXTtcbiAgICB2YXIgQ09SUkVDVF9JVEVSX05BTUUgPSAhISRuYXRpdmVJdGVyYXRvclxuICAgICAgJiYgKCRuYXRpdmVJdGVyYXRvci5uYW1lID09ICd2YWx1ZXMnIHx8ICRuYXRpdmVJdGVyYXRvci5uYW1lID09IHVuZGVmaW5lZCk7XG4gICAgdmFyICRpdGVyYXRvciA9ICRpdGVyYXRvcnMudmFsdWVzO1xuICAgIGhpZGUoVHlwZWRBcnJheSwgVFlQRURfQ09OU1RSVUNUT1IsIHRydWUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVFlQRURfQVJSQVksIE5BTUUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBERUZfQ09OU1RSVUNUT1IsIFR5cGVkQXJyYXkpO1xuXG4gICAgaWYgKENMQU1QRUQgPyBuZXcgVHlwZWRBcnJheSgxKVtUQUddICE9IE5BTUUgOiAhKFRBRyBpbiBUeXBlZEFycmF5UHJvdG90eXBlKSkge1xuICAgICAgZFAoVHlwZWRBcnJheVByb3RvdHlwZSwgVEFHLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTkFNRTsgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgT1tOQU1FXSA9IFR5cGVkQXJyYXk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChUeXBlZEFycmF5ICE9IEJhc2UpLCBPKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5TLCBOQU1FLCB7XG4gICAgICBCWVRFU19QRVJfRUxFTUVOVDogQllURVNcbiAgICB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBCYXNlLm9mLmNhbGwoVHlwZWRBcnJheSwgMSk7IH0pLCBOQU1FLCB7XG4gICAgICBmcm9tOiAkZnJvbSxcbiAgICAgIG9mOiAkb2ZcbiAgICB9KTtcblxuICAgIGlmICghKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlQcm90b3R5cGUpKSBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCwgTkFNRSwgcHJvdG8pO1xuXG4gICAgc2V0U3BlY2llcyhOQU1FKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogRk9SQ0VEX1NFVCwgTkFNRSwgeyBzZXQ6ICRzZXQgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFDT1JSRUNUX0lURVJfTkFNRSwgTkFNRSwgJGl0ZXJhdG9ycyk7XG5cbiAgICBpZiAoIUxJQlJBUlkgJiYgVHlwZWRBcnJheVByb3RvdHlwZS50b1N0cmluZyAhPSBhcnJheVRvU3RyaW5nKSBUeXBlZEFycmF5UHJvdG90eXBlLnRvU3RyaW5nID0gYXJyYXlUb1N0cmluZztcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoMSkuc2xpY2UoKTtcbiAgICB9KSwgTkFNRSwgeyBzbGljZTogJHNsaWNlIH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFsxLCAyXS50b0xvY2FsZVN0cmluZygpICE9IG5ldyBUeXBlZEFycmF5KFsxLCAyXSkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgVHlwZWRBcnJheVByb3RvdHlwZS50b0xvY2FsZVN0cmluZy5jYWxsKFsxLCAyXSk7XG4gICAgfSkpLCBOQU1FLCB7IHRvTG9jYWxlU3RyaW5nOiAkdG9Mb2NhbGVTdHJpbmcgfSk7XG5cbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBDT1JSRUNUX0lURVJfTkFNRSA/ICRuYXRpdmVJdGVyYXRvciA6ICRpdGVyYXRvcjtcbiAgICBpZiAoIUxJQlJBUlkgJiYgIUNPUlJFQ1RfSVRFUl9OQU1FKSBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIElURVJBVE9SLCAkaXRlcmF0b3IpO1xuICB9O1xufSBlbHNlIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDIyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAyMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDhDbGFtcGVkQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0sIHRydWUpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjMxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDE2JywgMiwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDE2QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDIzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50MTYnLCAyLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDE2QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAyMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50MzInLCA0LCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDIzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdGbG9hdDMyJywgNCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEZsb2F0MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAyMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQ2NCcsIDgsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDY0QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDI2LjEuMSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciByQXBwbHkgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuYXBwbHk7XG52YXIgZkFwcGx5ID0gRnVuY3Rpb24uYXBwbHk7XG4vLyBNUyBFZGdlIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByQXBwbHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KSB7XG4gICAgdmFyIFQgPSBhRnVuY3Rpb24odGFyZ2V0KTtcbiAgICB2YXIgTCA9IGFuT2JqZWN0KGFyZ3VtZW50c0xpc3QpO1xuICAgIHJldHVybiByQXBwbHkgPyByQXBwbHkoVCwgdGhpc0FyZ3VtZW50LCBMKSA6IGZBcHBseS5jYWxsKFQsIHRoaXNBcmd1bWVudCwgTCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qc1xuLy8gbW9kdWxlIGlkID0gMjM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDI2LjEuMiBSZWZsZWN0LmNvbnN0cnVjdCh0YXJnZXQsIGFyZ3VtZW50c0xpc3QgWywgbmV3VGFyZ2V0XSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuL19iaW5kJyk7XG52YXIgckNvbnN0cnVjdCA9IChyZXF1aXJlKCcuL19nbG9iYWwnKS5SZWZsZWN0IHx8IHt9KS5jb25zdHJ1Y3Q7XG5cbi8vIE1TIEVkZ2Ugc3VwcG9ydHMgb25seSAyIGFyZ3VtZW50cyBhbmQgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxuLy8gRkYgTmlnaHRseSBzZXRzIHRoaXJkIGFyZ3VtZW50IGFzIGBuZXcudGFyZ2V0YCwgYnV0IGRvZXMgbm90IGNyZWF0ZSBgdGhpc2AgZnJvbSBpdFxudmFyIE5FV19UQVJHRVRfQlVHID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiAhKHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBbXSwgRikgaW5zdGFuY2VvZiBGKTtcbn0pO1xudmFyIEFSR1NfQlVHID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgckNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKE5FV19UQVJHRVRfQlVHIHx8IEFSR1NfQlVHKSwgJ1JlZmxlY3QnLCB7XG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gY29uc3RydWN0KFRhcmdldCwgYXJncyAvKiAsIG5ld1RhcmdldCAqLykge1xuICAgIGFGdW5jdGlvbihUYXJnZXQpO1xuICAgIGFuT2JqZWN0KGFyZ3MpO1xuICAgIHZhciBuZXdUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IFRhcmdldCA6IGFGdW5jdGlvbihhcmd1bWVudHNbMl0pO1xuICAgIGlmIChBUkdTX0JVRyAmJiAhTkVXX1RBUkdFVF9CVUcpIHJldHVybiByQ29uc3RydWN0KFRhcmdldCwgYXJncywgbmV3VGFyZ2V0KTtcbiAgICBpZiAoVGFyZ2V0ID09IG5ld1RhcmdldCkge1xuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHNcbiAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IFRhcmdldCgpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgfVxuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBsb3Qgb2YgYXJndW1lbnRzIGNhc2VcbiAgICAgIHZhciAkYXJncyA9IFtudWxsXTtcbiAgICAgICRhcmdzLnB1c2guYXBwbHkoJGFyZ3MsIGFyZ3MpO1xuICAgICAgcmV0dXJuIG5ldyAoYmluZC5hcHBseShUYXJnZXQsICRhcmdzKSkoKTtcbiAgICB9XG4gICAgLy8gd2l0aCBhbHRlcmVkIG5ld1RhcmdldCwgbm90IHN1cHBvcnQgYnVpbHQtaW4gY29uc3RydWN0b3JzXG4gICAgdmFyIHByb3RvID0gbmV3VGFyZ2V0LnByb3RvdHlwZTtcbiAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGUoaXNPYmplY3QocHJvdG8pID8gcHJvdG8gOiBPYmplY3QucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gRnVuY3Rpb24uYXBwbHkuY2FsbChUYXJnZXQsIGluc3RhbmNlLCBhcmdzKTtcbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IGluc3RhbmNlO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAyMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMjYuMS4zIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcylcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG5cbi8vIE1TIEVkZ2UgaGFzIGJyb2tlbiBSZWZsZWN0LmRlZmluZVByb3BlcnR5IC0gdGhyb3dpbmcgaW5zdGVhZCBvZiByZXR1cm5pbmcgZmFsc2VcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KGRQLmYoe30sIDEsIHsgdmFsdWU6IDEgfSksIDEsIHsgdmFsdWU6IDIgfSk7XG59KSwgJ1JlZmxlY3QnLCB7XG4gIGRlZmluZVByb3BlcnR5OiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKHByb3BlcnR5S2V5LCB0cnVlKTtcbiAgICBhbk9iamVjdChhdHRyaWJ1dGVzKTtcbiAgICB0cnkge1xuICAgICAgZFAuZih0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDI0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICB2YXIgZGVzYyA9IGdPUEQoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICAgIHJldHVybiBkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSA/IGZhbHNlIDogZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanNcbi8vIG1vZHVsZSBpZCA9IDI0MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAyNi4xLjUgUmVmbGVjdC5lbnVtZXJhdGUodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIEVudW1lcmF0ZSA9IGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gYW5PYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB2YXIga2V5cyA9IHRoaXMuX2sgPSBbXTsgICAgICAvLyBrZXlzXG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIGl0ZXJhdGVkKSBrZXlzLnB1c2goa2V5KTtcbn07XG5yZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpKEVudW1lcmF0ZSwgJ09iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSB0aGlzO1xuICB2YXIga2V5cyA9IHRoYXQuX2s7XG4gIHZhciBrZXk7XG4gIGRvIHtcbiAgICBpZiAodGhhdC5faSA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9IHdoaWxlICghKChrZXkgPSBrZXlzW3RoYXQuX2krK10pIGluIHRoYXQuX3QpKTtcbiAgcmV0dXJuIHsgdmFsdWU6IGtleSwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGVudW1lcmF0ZTogZnVuY3Rpb24gZW51bWVyYXRlKHRhcmdldCkge1xuICAgIHJldHVybiBuZXcgRW51bWVyYXRlKHRhcmdldCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDI0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTtcbiAgdmFyIGRlc2MsIHByb3RvO1xuICBpZiAoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpIHJldHVybiB0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZiAoZGVzYyA9IGdPUEQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSByZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IGdldDogZ2V0IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanNcbi8vIG1vZHVsZSBpZCA9IDI0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjcgUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgcmV0dXJuIGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDI0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjggUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGdldFByb3RvID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKHRhcmdldCkge1xuICAgIHJldHVybiBnZXRQcm90byhhbk9iamVjdCh0YXJnZXQpKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanNcbi8vIG1vZHVsZSBpZCA9IDI0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjkgUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaGFzOiBmdW5jdGlvbiBoYXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5oYXMuanNcbi8vIG1vZHVsZSBpZCA9IDI0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjEwIFJlZmxlY3QuaXNFeHRlbnNpYmxlKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciAkaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBpc0V4dGVuc2libGU6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZSh0YXJnZXQpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHJldHVybiAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUuanNcbi8vIG1vZHVsZSBpZCA9IDI0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjExIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IG93bktleXM6IHJlcXVpcmUoJy4vX293bi1rZXlzJykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgUmVmbGVjdCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnT1BOLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIHJldHVybiBnZXRTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19vd24ta2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMjQ5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDI2LjEuMTIgUmVmbGVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJHByZXZlbnRFeHRlbnNpb25zID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHByZXZlbnRFeHRlbnNpb25zOiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoJHByZXZlbnRFeHRlbnNpb25zKSAkcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanNcbi8vIG1vZHVsZSBpZCA9IDI1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjEzIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcGVydHlLZXksIFYgWywgcmVjZWl2ZXJdKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViAvKiAsIHJlY2VpdmVyICovKSB7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCA0ID8gdGFyZ2V0IDogYXJndW1lbnRzWzNdO1xuICB2YXIgb3duRGVzYyA9IGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIHZhciBleGlzdGluZ0Rlc2NyaXB0b3IsIHByb3RvO1xuICBpZiAoIW93bkRlc2MpIHtcbiAgICBpZiAoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkge1xuICAgICAgcmV0dXJuIHNldChwcm90bywgcHJvcGVydHlLZXksIFYsIHJlY2VpdmVyKTtcbiAgICB9XG4gICAgb3duRGVzYyA9IGNyZWF0ZURlc2MoMCk7XG4gIH1cbiAgaWYgKGhhcyhvd25EZXNjLCAndmFsdWUnKSkge1xuICAgIGlmIChvd25EZXNjLndyaXRhYmxlID09PSBmYWxzZSB8fCAhaXNPYmplY3QocmVjZWl2ZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgZXhpc3RpbmdEZXNjcmlwdG9yID0gZ09QRC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSkgfHwgY3JlYXRlRGVzYygwKTtcbiAgICBleGlzdGluZ0Rlc2NyaXB0b3IudmFsdWUgPSBWO1xuICAgIGRQLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBleGlzdGluZ0Rlc2NyaXB0b3IpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvd25EZXNjLnNldCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAob3duRGVzYy5zZXQuY2FsbChyZWNlaXZlciwgViksIHRydWUpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IHNldDogc2V0IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanNcbi8vIG1vZHVsZSBpZCA9IDI1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyNi4xLjE0IFJlZmxlY3Quc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2V0UHJvdG8gPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKTtcblxuaWYgKHNldFByb3RvKSAkZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHNldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKSB7XG4gICAgc2V0UHJvdG8uY2hlY2sodGFyZ2V0LCBwcm90byk7XG4gICAgdHJ5IHtcbiAgICAgIHNldFByb3RvLnNldCh0YXJnZXQsIHByb3RvKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzXG4vLyBtb2R1bGUgaWQgPSAyNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gJGluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnaW5jbHVkZXMnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtQXJyYXkucHJvdG90eXBlLmZsYXRNYXBcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmxhdHRlbkludG9BcnJheSA9IHJlcXVpcmUoJy4vX2ZsYXR0ZW4taW50by1hcnJheScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiwgQTtcbiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gICAgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIDEsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmxhdE1hcCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuZmxhdC1tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDI1NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLWZsYXRNYXAvI3NlYy1GbGF0dGVuSW50b0FycmF5XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFID0gcmVxdWlyZSgnLi9fd2tzJykoJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xuXG5mdW5jdGlvbiBmbGF0dGVuSW50b0FycmF5KHRhcmdldCwgb3JpZ2luYWwsIHNvdXJjZSwgc291cmNlTGVuLCBzdGFydCwgZGVwdGgsIG1hcHBlciwgdGhpc0FyZykge1xuICB2YXIgdGFyZ2V0SW5kZXggPSBzdGFydDtcbiAgdmFyIHNvdXJjZUluZGV4ID0gMDtcbiAgdmFyIG1hcEZuID0gbWFwcGVyID8gY3R4KG1hcHBlciwgdGhpc0FyZywgMykgOiBmYWxzZTtcbiAgdmFyIGVsZW1lbnQsIHNwcmVhZGFibGU7XG5cbiAgd2hpbGUgKHNvdXJjZUluZGV4IDwgc291cmNlTGVuKSB7XG4gICAgaWYgKHNvdXJjZUluZGV4IGluIHNvdXJjZSkge1xuICAgICAgZWxlbWVudCA9IG1hcEZuID8gbWFwRm4oc291cmNlW3NvdXJjZUluZGV4XSwgc291cmNlSW5kZXgsIG9yaWdpbmFsKSA6IHNvdXJjZVtzb3VyY2VJbmRleF07XG5cbiAgICAgIHNwcmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIGlmIChpc09iamVjdChlbGVtZW50KSkge1xuICAgICAgICBzcHJlYWRhYmxlID0gZWxlbWVudFtJU19DT05DQVRfU1BSRUFEQUJMRV07XG4gICAgICAgIHNwcmVhZGFibGUgPSBzcHJlYWRhYmxlICE9PSB1bmRlZmluZWQgPyAhIXNwcmVhZGFibGUgOiBpc0FycmF5KGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3ByZWFkYWJsZSAmJiBkZXB0aCA+IDApIHtcbiAgICAgICAgdGFyZ2V0SW5kZXggPSBmbGF0dGVuSW50b0FycmF5KHRhcmdldCwgb3JpZ2luYWwsIGVsZW1lbnQsIHRvTGVuZ3RoKGVsZW1lbnQubGVuZ3RoKSwgdGFyZ2V0SW5kZXgsIGRlcHRoIC0gMSkgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IDB4MWZmZmZmZmZmZmZmZmYpIHRocm93IFR5cGVFcnJvcigpO1xuICAgICAgICB0YXJnZXRbdGFyZ2V0SW5kZXhdID0gZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0SW5kZXgrKztcbiAgICB9XG4gICAgc291cmNlSW5kZXgrKztcbiAgfVxuICByZXR1cm4gdGFyZ2V0SW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbkludG9BcnJheTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX2ZsYXR0ZW4taW50by1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUFycmF5LnByb3RvdHlwZS5mbGF0dGVuXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSByZXF1aXJlKCcuL19mbGF0dGVuLWludG8tYXJyYXknKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIGZsYXR0ZW46IGZ1bmN0aW9uIGZsYXR0ZW4oLyogZGVwdGhBcmcgPSAxICovKSB7XG4gICAgdmFyIGRlcHRoQXJnID0gYXJndW1lbnRzWzBdO1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICBmbGF0dGVuSW50b0FycmF5KEEsIE8sIE8sIHNvdXJjZUxlbiwgMCwgZGVwdGhBcmcgPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGhBcmcpKTtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmbGF0dGVuJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5mbGF0dGVuLmpzXG4vLyBtb2R1bGUgaWQgPSAyNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIGF0OiBmdW5jdGlvbiBhdChwb3MpIHtcbiAgICByZXR1cm4gJGF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLmF0LmpzXG4vLyBtb2R1bGUgaWQgPSAyNTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhZCA9IHJlcXVpcmUoJy4vX3N0cmluZy1wYWQnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8yODBcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogL1ZlcnNpb25cXC8xMFxcLlxcZCsoXFwuXFxkKyk/IFNhZmFyaVxcLy8udGVzdCh1c2VyQWdlbnQpLCAnU3RyaW5nJywge1xuICBwYWRTdGFydDogZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRydWUpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtc3RhcnQuanNcbi8vIG1vZHVsZSBpZCA9IDI1OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIG1heExlbmd0aCwgZmlsbFN0cmluZywgbGVmdCkge1xuICB2YXIgUyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgdmFyIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoO1xuICB2YXIgZmlsbFN0ciA9IGZpbGxTdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcgJyA6IFN0cmluZyhmaWxsU3RyaW5nKTtcbiAgdmFyIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7XG4gIGlmIChpbnRNYXhMZW5ndGggPD0gc3RyaW5nTGVuZ3RoIHx8IGZpbGxTdHIgPT0gJycpIHJldHVybiBTO1xuICB2YXIgZmlsbExlbiA9IGludE1heExlbmd0aCAtIHN0cmluZ0xlbmd0aDtcbiAgdmFyIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIE1hdGguY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTtcbiAgaWYgKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKSBzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7XG4gIHJldHVybiBsZWZ0ID8gc3RyaW5nRmlsbGVyICsgUyA6IFMgKyBzdHJpbmdGaWxsZXI7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXBhZC5qc1xuLy8gbW9kdWxlIGlkID0gMjU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fdXNlci1hZ2VudC5qc1xuLy8gbW9kdWxlIGlkID0gMjYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYWQgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMjgwXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIC9WZXJzaW9uXFwvMTBcXC5cXGQrKFxcLlxcZCspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KSwgJ1N0cmluZycsIHtcbiAgcGFkRW5kOiBmdW5jdGlvbiBwYWRFbmQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLWVuZC5qc1xuLy8gbW9kdWxlIGlkID0gMjYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWJtYXJrYmFnZS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW1MZWZ0JywgZnVuY3Rpb24gKCR0cmltKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltTGVmdCgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMSk7XG4gIH07XG59LCAndHJpbVN0YXJ0Jyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1sZWZ0LmpzXG4vLyBtb2R1bGUgaWQgPSAyNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlYm1hcmtiYWdlL2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxucmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKSgndHJpbVJpZ2h0JywgZnVuY3Rpb24gKCR0cmltKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltUmlnaHQoKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDIpO1xuICB9O1xufSwgJ3RyaW1FbmQnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0LmpzXG4vLyBtb2R1bGUgaWQgPSAyNjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9TdHJpbmcucHJvdG90eXBlLm1hdGNoQWxsL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBnZXRGbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG52YXIgUmVnRXhwUHJvdG8gPSBSZWdFeHAucHJvdG90eXBlO1xuXG52YXIgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yID0gZnVuY3Rpb24gKHJlZ2V4cCwgc3RyaW5nKSB7XG4gIHRoaXMuX3IgPSByZWdleHA7XG4gIHRoaXMuX3MgPSBzdHJpbmc7XG59O1xuXG5yZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpKCRSZWdFeHBTdHJpbmdJdGVyYXRvciwgJ1JlZ0V4cCBTdHJpbmcnLCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgbWF0Y2ggPSB0aGlzLl9yLmV4ZWModGhpcy5fcyk7XG4gIHJldHVybiB7IHZhbHVlOiBtYXRjaCwgZG9uZTogbWF0Y2ggPT09IG51bGwgfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgbWF0Y2hBbGw6IGZ1bmN0aW9uIG1hdGNoQWxsKHJlZ2V4cCkge1xuICAgIGRlZmluZWQodGhpcyk7XG4gICAgaWYgKCFpc1JlZ0V4cChyZWdleHApKSB0aHJvdyBUeXBlRXJyb3IocmVnZXhwICsgJyBpcyBub3QgYSByZWdleHAhJyk7XG4gICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgdmFyIGZsYWdzID0gJ2ZsYWdzJyBpbiBSZWdFeHBQcm90byA/IFN0cmluZyhyZWdleHAuZmxhZ3MpIDogZ2V0RmxhZ3MuY2FsbChyZWdleHApO1xuICAgIHZhciByeCA9IG5ldyBSZWdFeHAocmVnZXhwLnNvdXJjZSwgfmZsYWdzLmluZGV4T2YoJ2cnKSA/IGZsYWdzIDogJ2cnICsgZmxhZ3MpO1xuICAgIHJ4Lmxhc3RJbmRleCA9IHRvTGVuZ3RoKHJlZ2V4cC5sYXN0SW5kZXgpO1xuICAgIHJldHVybiBuZXcgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKHJ4LCBTKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDI2NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4vX293bi1rZXlzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gICAgdmFyIGdldERlc2MgPSBnT1BELmY7XG4gICAgdmFyIGtleXMgPSBvd25LZXlzKE8pO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleSwgZGVzYztcbiAgICB3aGlsZSAoa2V5cy5sZW5ndGggPiBpKSB7XG4gICAgICBkZXNjID0gZ2V0RGVzYyhPLCBrZXkgPSBrZXlzW2krK10pO1xuICAgICAgaWYgKGRlc2MgIT09IHVuZGVmaW5lZCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBrZXksIGRlc2MpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LXZhbHVlcy1lbnRyaWVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICR2YWx1ZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKShmYWxzZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcyhpdCkge1xuICAgIHJldHVybiAkdmFsdWVzKGl0KTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAyNjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBpc0VudW0gPSByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlzRW50cmllcykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gZ2V0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoTywga2V5ID0ga2V5c1tpKytdKSkge1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC10by1hcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gMjY5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IHJlcXVpcmUoJy4vX29iamVjdC10by1hcnJheScpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhpdCkge1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDI3MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuXG4vLyBCLjIuMi4yIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19kZWZpbmVHZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpIHtcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwgeyBnZXQ6IGFGdW5jdGlvbihnZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1nZXR0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDI3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBGb3JjZWQgcmVwbGFjZW1lbnQgcHJvdG90eXBlIGFjY2Vzc29ycyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKSB8fCAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBLID0gTWF0aC5yYW5kb20oKTtcbiAgLy8gSW4gRkYgdGhyb3dzIG9ubHkgZGVmaW5lIG1ldGhvZHNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmLCBuby11c2VsZXNzLWNhbGxcbiAgX19kZWZpbmVTZXR0ZXJfXy5jYWxsKG51bGwsIEssIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG4gIGRlbGV0ZSByZXF1aXJlKCcuL19nbG9iYWwnKVtLXTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWZvcmNlZC1wYW0uanNcbi8vIG1vZHVsZSBpZCA9IDI3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuXG4vLyBCLjIuMi4zIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXyhQLCBzZXR0ZXIpXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19kZWZpbmVTZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVTZXR0ZXJfXyhQLCBzZXR0ZXIpIHtcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwgeyBzZXQ6IGFGdW5jdGlvbihzZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1zZXR0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDI3M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XG5cbi8vIEIuMi4yLjQgT2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cEdldHRlcl9fKFApXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19sb29rdXBHZXR0ZXJfXzogZnVuY3Rpb24gX19sb29rdXBHZXR0ZXJfXyhQKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgSyA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICAgIHZhciBEO1xuICAgIGRvIHtcbiAgICAgIGlmIChEID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIEspKSByZXR1cm4gRC5nZXQ7XG4gICAgfSB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLWdldHRlci5qc1xuLy8gbW9kdWxlIGlkID0gMjc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxuLy8gQi4yLjIuNSBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwU2V0dGVyX18oUClcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2xvb2t1cFNldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cFNldHRlcl9fKFApIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gICAgdmFyIEQ7XG4gICAgZG8ge1xuICAgICAgaWYgKEQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgSykpIHJldHVybiBELnNldDtcbiAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdNYXAnLCB7IHRvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ01hcCcpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWFwLnRvLWpzb24uanNcbi8vIG1vZHVsZSBpZCA9IDI3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIGlmIChjbGFzc29mKHRoaXMpICE9IE5BTUUpIHRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgcmV0dXJuIGZyb20odGhpcyk7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi10by1qc29uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXIsIElURVJBVE9SKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yT2YoaXRlciwgZmFsc2UsIHJlc3VsdC5wdXNoLCByZXN1bHQsIElURVJBVE9SKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAyNzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdTZXQnLCB7IHRvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ1NldCcpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc2V0LnRvLWpzb24uanNcbi8vIG1vZHVsZSBpZCA9IDI3OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ01hcCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWFwLm9mLmpzXG4vLyBtb2R1bGUgaWQgPSAyODBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09MTEVDVElPTikge1xuICAkZXhwb3J0KCRleHBvcnQuUywgQ09MTEVDVElPTiwgeyBvZjogZnVuY3Rpb24gb2YoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIEEgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIEFbbGVuZ3RoXSA9IGFyZ3VtZW50c1tsZW5ndGhdO1xuICAgIHJldHVybiBuZXcgdGhpcyhBKTtcbiAgfSB9KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1vZi5qc1xuLy8gbW9kdWxlIGlkID0gMjgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5vZlxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tb2YnKSgnU2V0Jyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQub2YuanNcbi8vIG1vZHVsZSBpZCA9IDI4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdXZWFrTWFwJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZi5qc1xuLy8gbW9kdWxlIGlkID0gMjgzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWtzZXQub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ1dlYWtTZXQnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstc2V0Lm9mLmpzXG4vLyBtb2R1bGUgaWQgPSAyODRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnTWFwJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAuZnJvbS5qc1xuLy8gbW9kdWxlIGlkID0gMjg1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgZnJvbTogZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50c1sxXTtcbiAgICB2YXIgbWFwcGluZywgQSwgbiwgY2I7XG4gICAgYUZ1bmN0aW9uKHRoaXMpO1xuICAgIG1hcHBpbmcgPSBtYXBGbiAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChtYXBwaW5nKSBhRnVuY3Rpb24obWFwRm4pO1xuICAgIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IHRoaXMoKTtcbiAgICBBID0gW107XG4gICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgIG4gPSAwO1xuICAgICAgY2IgPSBjdHgobWFwRm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbiAobmV4dEl0ZW0pIHtcbiAgICAgICAgQS5wdXNoKGNiKG5leHRJdGVtLCBuKyspKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBBLnB1c2gsIEEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tZnJvbS5qc1xuLy8gbW9kdWxlIGlkID0gMjg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ1NldCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc2V0LmZyb20uanNcbi8vIG1vZHVsZSBpZCA9IDI4N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnV2Vha01hcCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1tYXAuZnJvbS5qc1xuLy8gbW9kdWxlIGlkID0gMjg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWtzZXQuZnJvbVxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tZnJvbScpKCdXZWFrU2V0Jyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLXNldC5mcm9tLmpzXG4vLyBtb2R1bGUgaWQgPSAyODlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuRywgeyBnbG9iYWw6IHJlcXVpcmUoJy4vX2dsb2JhbCcpIH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSAyOTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N5c3RlbScsIHsgZ2xvYmFsOiByZXF1aXJlKCcuL19nbG9iYWwnKSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDI5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL3Byb3Bvc2FsLWlzLWVycm9yXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ0Vycm9yJywge1xuICBpc0Vycm9yOiBmdW5jdGlvbiBpc0Vycm9yKGl0KSB7XG4gICAgcmV0dXJuIGNvZihpdCkgPT09ICdFcnJvcic7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3IuanNcbi8vIG1vZHVsZSBpZCA9IDI5MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNsYW1wOiBmdW5jdGlvbiBjbGFtcCh4LCBsb3dlciwgdXBwZXIpIHtcbiAgICByZXR1cm4gTWF0aC5taW4odXBwZXIsIE1hdGgubWF4KGxvd2VyLCB4KSk7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5jbGFtcC5qc1xuLy8gbW9kdWxlIGlkID0gMjkzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgREVHX1BFUl9SQUQ6IE1hdGguUEkgLyAxODAgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmRlZy1wZXItcmFkLmpzXG4vLyBtb2R1bGUgaWQgPSAyOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBSQURfUEVSX0RFRyA9IDE4MCAvIE1hdGguUEk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZGVncmVlczogZnVuY3Rpb24gZGVncmVlcyhyYWRpYW5zKSB7XG4gICAgcmV0dXJuIHJhZGlhbnMgKiBSQURfUEVSX0RFRztcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmRlZ3JlZXMuanNcbi8vIG1vZHVsZSBpZCA9IDI5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNjYWxlID0gcmVxdWlyZSgnLi9fbWF0aC1zY2FsZScpO1xudmFyIGZyb3VuZCA9IHJlcXVpcmUoJy4vX21hdGgtZnJvdW5kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZnNjYWxlOiBmdW5jdGlvbiBmc2NhbGUoeCwgaW5Mb3csIGluSGlnaCwgb3V0TG93LCBvdXRIaWdoKSB7XG4gICAgcmV0dXJuIGZyb3VuZChzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpKTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmZzY2FsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjk2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zY2FsZSB8fCBmdW5jdGlvbiBzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpIHtcbiAgaWYgKFxuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IHggIT0geFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgaW5Mb3cgIT0gaW5Mb3dcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IGluSGlnaCAhPSBpbkhpZ2hcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IG91dExvdyAhPSBvdXRMb3dcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IG91dEhpZ2ggIT0gb3V0SGlnaFxuICApIHJldHVybiBOYU47XG4gIGlmICh4ID09PSBJbmZpbml0eSB8fCB4ID09PSAtSW5maW5pdHkpIHJldHVybiB4O1xuICByZXR1cm4gKHggLSBpbkxvdykgKiAob3V0SGlnaCAtIG91dExvdykgLyAoaW5IaWdoIC0gaW5Mb3cpICsgb3V0TG93O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2NhbGUuanNcbi8vIG1vZHVsZSBpZCA9IDI5N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpYWRkaDogZnVuY3Rpb24gaWFkZGgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxICsgKHkxID4+PiAwKSArICgoJHgwICYgJHkwIHwgKCR4MCB8ICR5MCkgJiB+KCR4MCArICR5MCA+Pj4gMCkpID4+PiAzMSkgfCAwO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaWFkZGguanNcbi8vIG1vZHVsZSBpZCA9IDI5OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpc3ViaDogZnVuY3Rpb24gaXN1YmgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxIC0gKHkxID4+PiAwKSAtICgofiR4MCAmICR5MCB8IH4oJHgwIF4gJHkwKSAmICR4MCAtICR5MCA+Pj4gMCkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pc3ViaC5qc1xuLy8gbW9kdWxlIGlkID0gMjk5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGltdWxoOiBmdW5jdGlvbiBpbXVsaCh1LCB2KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZjtcbiAgICB2YXIgJHUgPSArdTtcbiAgICB2YXIgJHYgPSArdjtcbiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjtcbiAgICB2YXIgdjAgPSAkdiAmIFVJTlQxNjtcbiAgICB2YXIgdTEgPSAkdSA+PiAxNjtcbiAgICB2YXIgdjEgPSAkdiA+PiAxNjtcbiAgICB2YXIgdCA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+IDE2KTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmltdWxoLmpzXG4vLyBtb2R1bGUgaWQgPSAzMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBSQURfUEVSX0RFRzogMTgwIC8gTWF0aC5QSSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgucmFkLXBlci1kZWcuanNcbi8vIG1vZHVsZSBpZCA9IDMwMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIERFR19QRVJfUkFEID0gTWF0aC5QSSAvIDE4MDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICByYWRpYW5zOiBmdW5jdGlvbiByYWRpYW5zKGRlZ3JlZXMpIHtcbiAgICByZXR1cm4gZGVncmVlcyAqIERFR19QRVJfUkFEO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgucmFkaWFucy5qc1xuLy8gbW9kdWxlIGlkID0gMzAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgc2NhbGU6IHJlcXVpcmUoJy4vX21hdGgtc2NhbGUnKSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguc2NhbGUuanNcbi8vIG1vZHVsZSBpZCA9IDMwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB1bXVsaDogZnVuY3Rpb24gdW11bGgodSwgdikge1xuICAgIHZhciBVSU5UMTYgPSAweGZmZmY7XG4gICAgdmFyICR1ID0gK3U7XG4gICAgdmFyICR2ID0gK3Y7XG4gICAgdmFyIHUwID0gJHUgJiBVSU5UMTY7XG4gICAgdmFyIHYwID0gJHYgJiBVSU5UMTY7XG4gICAgdmFyIHUxID0gJHUgPj4+IDE2O1xuICAgIHZhciB2MSA9ICR2ID4+PiAxNjtcbiAgICB2YXIgdCA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+Pj4gMTYpICsgKCh1MCAqIHYxID4+PiAwKSArICh0ICYgVUlOVDE2KSA+Pj4gMTYpO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgudW11bGguanNcbi8vIG1vZHVsZSBpZCA9IDMwNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwOi8vamZiYXN0aWVuLmdpdGh1Yi5pby9wYXBlcnMvTWF0aC5zaWduYml0Lmh0bWxcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgc2lnbmJpdDogZnVuY3Rpb24gc2lnbmJpdCh4KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuICh4ID0gK3gpICE9IHggPyB4IDogeCA9PSAwID8gMSAvIHggPT0gSW5maW5pdHkgOiB4ID4gMDtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNpZ25iaXQuanNcbi8vIG1vZHVsZSBpZCA9IDMwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWZpbmFsbHlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdQcm9taXNlJywgeyAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgY29yZS5Qcm9taXNlIHx8IGdsb2JhbC5Qcm9taXNlKTtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gIHJldHVybiB0aGlzLnRoZW4oXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgfSA6IG9uRmluYWxseSxcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHlcbiAgKTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHkuanNcbi8vIG1vZHVsZSBpZCA9IDMwNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXRyeVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1Byb21pc2UnLCB7ICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTtcbiAgKHJlc3VsdC5lID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnYpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeS5qc1xuLy8gbW9kdWxlIGlkID0gMzA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IG1ldGFkYXRhLnNldDtcblxubWV0YWRhdGEuZXhwKHsgZGVmaW5lTWV0YWRhdGE6IGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHRhcmdldEtleSkge1xuICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCBhbk9iamVjdCh0YXJnZXQpLCB0b01ldGFLZXkodGFyZ2V0S2V5KSk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5kZWZpbmUtbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMwOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgTWFwID0gcmVxdWlyZSgnLi9lczYubWFwJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdtZXRhZGF0YScpO1xudmFyIHN0b3JlID0gc2hhcmVkLnN0b3JlIHx8IChzaGFyZWQuc3RvcmUgPSBuZXcgKHJlcXVpcmUoJy4vZXM2LndlYWstbWFwJykpKCkpO1xuXG52YXIgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IGZ1bmN0aW9uICh0YXJnZXQsIHRhcmdldEtleSwgY3JlYXRlKSB7XG4gIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICBpZiAoIXRhcmdldE1ldGFkYXRhKSB7XG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgc3RvcmUuc2V0KHRhcmdldCwgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9XG4gIHZhciBrZXlNZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhLmdldCh0YXJnZXRLZXkpO1xuICBpZiAoIWtleU1ldGFkYXRhKSB7XG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdGFyZ2V0TWV0YWRhdGEuc2V0KHRhcmdldEtleSwga2V5TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9IHJldHVybiBrZXlNZXRhZGF0YTtcbn07XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTtcbiAgcmV0dXJuIG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IG1ldGFkYXRhTWFwLmhhcyhNZXRhZGF0YUtleSk7XG59O1xudmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbn07XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIHRydWUpLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG59O1xudmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAodGFyZ2V0LCB0YXJnZXRLZXksIGZhbHNlKTtcbiAgdmFyIGtleXMgPSBbXTtcbiAgaWYgKG1ldGFkYXRhTWFwKSBtZXRhZGF0YU1hcC5mb3JFYWNoKGZ1bmN0aW9uIChfLCBrZXkpIHsga2V5cy5wdXNoKGtleSk7IH0pO1xuICByZXR1cm4ga2V5cztcbn07XG52YXIgdG9NZXRhS2V5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG52YXIgZXhwID0gZnVuY3Rpb24gKE8pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgTyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc3RvcmU6IHN0b3JlLFxuICBtYXA6IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAsXG4gIGhhczogb3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgZ2V0OiBvcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICBzZXQ6IG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gIGtleXM6IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICBrZXk6IHRvTWV0YUtleSxcbiAgZXhwOiBleHBcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL19tZXRhZGF0YS5qc1xuLy8gbW9kdWxlIGlkID0gMzA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG52YXIgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IG1ldGFkYXRhLm1hcDtcbnZhciBzdG9yZSA9IG1ldGFkYXRhLnN0b3JlO1xuXG5tZXRhZGF0YS5leHAoeyBkZWxldGVNZXRhZGF0YTogZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKTtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXksIGZhbHNlKTtcbiAgaWYgKG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgfHwgIW1ldGFkYXRhTWFwWydkZWxldGUnXShtZXRhZGF0YUtleSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKG1ldGFkYXRhTWFwLnNpemUpIHJldHVybiB0cnVlO1xuICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBzdG9yZS5nZXQodGFyZ2V0KTtcbiAgdGFyZ2V0TWV0YWRhdGFbJ2RlbGV0ZSddKHRhcmdldEtleSk7XG4gIHJldHVybiAhIXRhcmdldE1ldGFkYXRhLnNpemUgfHwgc3RvcmVbJ2RlbGV0ZSddKHRhcmdldCk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhcztcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0O1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5R2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZiAoaGFzT3duKSByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIHZhciBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTtcbiAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCA/IG9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCkgOiB1bmRlZmluZWQ7XG59O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRNZXRhZGF0YTogZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9lczYuc2V0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbnZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlNZXRhZGF0YUtleXMgPSBmdW5jdGlvbiAoTywgUCkge1xuICB2YXIgb0tleXMgPSBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICBpZiAocGFyZW50ID09PSBudWxsKSByZXR1cm4gb0tleXM7XG4gIHZhciBwS2V5cyA9IG9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gIHJldHVybiBwS2V5cy5sZW5ndGggPyBvS2V5cy5sZW5ndGggPyBmcm9tKG5ldyBTZXQob0tleXMuY29uY2F0KHBLZXlzKSkpIDogcEtleXMgOiBvS2V5cztcbn07XG5cbm1ldGFkYXRhLmV4cCh7IGdldE1ldGFkYXRhS2V5czogZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlNZXRhZGF0YUtleXMoYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzFdKSk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMzEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0O1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0T3duTWV0YWRhdGE6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qc1xuLy8gbW9kdWxlIGlkID0gMzEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1sxXSkpO1xufSB9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSAzMTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5oYXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlIYXNNZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgaGFzT3duID0gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIGlmIChoYXNPd24pIHJldHVybiB0cnVlO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogZmFsc2U7XG59O1xuXG5tZXRhZGF0YS5leHAoeyBoYXNNZXRhZGF0YTogZnVuY3Rpb24gaGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhcztcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbm1ldGFkYXRhLmV4cCh7IGhhc093bk1ldGFkYXRhOiBmdW5jdGlvbiBoYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHJldHVybiBvcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpXG4gICAgLCBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pKTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEuanNcbi8vIG1vZHVsZSBpZCA9IDMxNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciB0b01ldGFLZXkgPSAkbWV0YWRhdGEua2V5O1xudmFyIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEgPSAkbWV0YWRhdGEuc2V0O1xuXG4kbWV0YWRhdGEuZXhwKHsgbWV0YWRhdGE6IGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKFxuICAgICAgbWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsXG4gICAgICAodGFyZ2V0S2V5ICE9PSB1bmRlZmluZWQgPyBhbk9iamVjdCA6IGFGdW5jdGlvbikodGFyZ2V0KSxcbiAgICAgIHRvTWV0YUtleSh0YXJnZXRLZXkpXG4gICAgKTtcbiAgfTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lm1ldGFkYXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAzMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3J3YWxkcm9uL3RjMzktbm90ZXMvYmxvYi9tYXN0ZXIvZXM2LzIwMTQtMDkvc2VwdC0yNS5tZCM1MTAtZ2xvYmFsYXNhcC1mb3ItZW5xdWV1aW5nLWEtbWljcm90YXNrXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgcHJvY2VzcyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnByb2Nlc3M7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG4kZXhwb3J0KCRleHBvcnQuRywge1xuICBhc2FwOiBmdW5jdGlvbiBhc2FwKGZuKSB7XG4gICAgdmFyIGRvbWFpbiA9IGlzTm9kZSAmJiBwcm9jZXNzLmRvbWFpbjtcbiAgICBtaWNyb3Rhc2soZG9tYWluID8gZG9tYWluLmJpbmQoZm4pIDogZm4pO1xuICB9XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFzYXAuanNcbi8vIG1vZHVsZSBpZCA9IDMxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemVucGFyc2luZy9lcy1vYnNlcnZhYmxlXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBPQlNFUlZBQkxFID0gcmVxdWlyZSgnLi9fd2tzJykoJ29ic2VydmFibGUnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBSRVRVUk4gPSBmb3JPZi5SRVRVUk47XG5cbnZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZuID09IG51bGwgPyB1bmRlZmluZWQgOiBhRnVuY3Rpb24oZm4pO1xufTtcblxudmFyIGNsZWFudXBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHZhciBjbGVhbnVwID0gc3Vic2NyaXB0aW9uLl9jO1xuICBpZiAoY2xlYW51cCkge1xuICAgIHN1YnNjcmlwdGlvbi5fYyA9IHVuZGVmaW5lZDtcbiAgICBjbGVhbnVwKCk7XG4gIH1cbn07XG5cbnZhciBzdWJzY3JpcHRpb25DbG9zZWQgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHJldHVybiBzdWJzY3JpcHRpb24uX28gPT09IHVuZGVmaW5lZDtcbn07XG5cbnZhciBjbG9zZVN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkge1xuICAgIHN1YnNjcmlwdGlvbi5fbyA9IHVuZGVmaW5lZDtcbiAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gIH1cbn07XG5cbnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAob2JzZXJ2ZXIsIHN1YnNjcmliZXIpIHtcbiAgYW5PYmplY3Qob2JzZXJ2ZXIpO1xuICB0aGlzLl9jID0gdW5kZWZpbmVkO1xuICB0aGlzLl9vID0gb2JzZXJ2ZXI7XG4gIG9ic2VydmVyID0gbmV3IFN1YnNjcmlwdGlvbk9ic2VydmVyKHRoaXMpO1xuICB0cnkge1xuICAgIHZhciBjbGVhbnVwID0gc3Vic2NyaWJlcihvYnNlcnZlcik7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IGNsZWFudXA7XG4gICAgaWYgKGNsZWFudXAgIT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwLnVuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSBjbGVhbnVwID0gZnVuY3Rpb24gKCkgeyBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgfTtcbiAgICAgIGVsc2UgYUZ1bmN0aW9uKGNsZWFudXApO1xuICAgICAgdGhpcy5fYyA9IGNsZWFudXA7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuO1xuICB9IGlmIChzdWJzY3JpcHRpb25DbG9zZWQodGhpcykpIGNsZWFudXBTdWJzY3JpcHRpb24odGhpcyk7XG59O1xuXG5TdWJzY3JpcHRpb24ucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoe30sIHtcbiAgdW5zdWJzY3JpYmU6IGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkgeyBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTsgfVxufSk7XG5cbnZhciBTdWJzY3JpcHRpb25PYnNlcnZlciA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgdGhpcy5fcyA9IHN1YnNjcmlwdGlvbjtcbn07XG5cblN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7XG4gIG5leHQ6IGZ1bmN0aW9uIG5leHQodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcbiAgICBpZiAoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKSB7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX287XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbSA9IGdldE1ldGhvZChvYnNlcnZlci5uZXh0KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGVycm9yOiBmdW5jdGlvbiBlcnJvcih2YWx1ZSkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zO1xuICAgIGlmIChzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkgdGhyb3cgdmFsdWU7XG4gICAgdmFyIG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vO1xuICAgIHN1YnNjcmlwdGlvbi5fbyA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgdmFyIG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIuZXJyb3IpO1xuICAgICAgaWYgKCFtKSB0aHJvdyB2YWx1ZTtcbiAgICAgIHZhbHVlID0gbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG4gIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh2YWx1ZSkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zO1xuICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHtcbiAgICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fbztcbiAgICAgIHN1YnNjcmlwdGlvbi5fbyA9IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLmNvbXBsZXRlKTtcbiAgICAgICAgdmFsdWUgPSBtID8gbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxufSk7XG5cbnZhciAkT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIE9ic2VydmFibGUoc3Vic2NyaWJlcikge1xuICBhbkluc3RhbmNlKHRoaXMsICRPYnNlcnZhYmxlLCAnT2JzZXJ2YWJsZScsICdfZicpLl9mID0gYUZ1bmN0aW9uKHN1YnNjcmliZXIpO1xufTtcblxucmVkZWZpbmVBbGwoJE9ic2VydmFibGUucHJvdG90eXBlLCB7XG4gIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24ob2JzZXJ2ZXIsIHRoaXMuX2YpO1xuICB9LFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgKGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgYUZ1bmN0aW9uKGZuKTtcbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGF0LnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59KTtcblxucmVkZWZpbmVBbGwoJE9ic2VydmFibGUsIHtcbiAgZnJvbTogZnVuY3Rpb24gZnJvbSh4KSB7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiAkT2JzZXJ2YWJsZTtcbiAgICB2YXIgbWV0aG9kID0gZ2V0TWV0aG9kKGFuT2JqZWN0KHgpW09CU0VSVkFCTEVdKTtcbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICB2YXIgb2JzZXJ2YWJsZSA9IGFuT2JqZWN0KG1ldGhvZC5jYWxsKHgpKTtcbiAgICAgIHJldHVybiBvYnNlcnZhYmxlLmNvbnN0cnVjdG9yID09PSBDID8gb2JzZXJ2YWJsZSA6IG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZS5zdWJzY3JpYmUob2JzZXJ2ZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGZvck9mKHgsIGZhbHNlLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdCk7XG4gICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm4gUkVUVVJOO1xuICAgICAgICAgICAgfSkgPT09IFJFVFVSTikgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChkb25lKSB0aHJvdyBlO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IGRvbmUgPSB0cnVlOyB9O1xuICAgIH0pO1xuICB9LFxuICBvZjogZnVuY3Rpb24gb2YoKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoLCBpdGVtcyA9IG5ldyBBcnJheShsKTsgaSA8IGw7KSBpdGVtc1tpXSA9IGFyZ3VtZW50c1tpKytdO1xuICAgIHJldHVybiBuZXcgKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6ICRPYnNlcnZhYmxlKShmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW1zW2pdKTtcbiAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgfSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IGRvbmUgPSB0cnVlOyB9O1xuICAgIH0pO1xuICB9XG59KTtcblxuaGlkZSgkT2JzZXJ2YWJsZS5wcm90b3R5cGUsIE9CU0VSVkFCTEUsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG4kZXhwb3J0KCRleHBvcnQuRywgeyBPYnNlcnZhYmxlOiAkT2JzZXJ2YWJsZSB9KTtcblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnT2JzZXJ2YWJsZScpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JzZXJ2YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gMzE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGllOS0gc2V0VGltZW91dCAmIHNldEludGVydmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xudmFyIHNsaWNlID0gW10uc2xpY2U7XG52YXIgTVNJRSA9IC9NU0lFIC5cXC4vLnRlc3QodXNlckFnZW50KTsgLy8gPC0gZGlydHkgaWU5LSBjaGVja1xudmFyIHdyYXAgPSBmdW5jdGlvbiAoc2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZm4sIHRpbWUgLyogLCAuLi5hcmdzICovKSB7XG4gICAgdmFyIGJvdW5kQXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIHZhciBhcmdzID0gYm91bmRBcmdzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpIDogZmFsc2U7XG4gICAgcmV0dXJuIHNldChib3VuZEFyZ3MgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pKS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IDogZm4sIHRpbWUpO1xuICB9O1xufTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CICsgJGV4cG9ydC5GICogTVNJRSwge1xuICBzZXRUaW1lb3V0OiB3cmFwKGdsb2JhbC5zZXRUaW1lb3V0KSxcbiAgc2V0SW50ZXJ2YWw6IHdyYXAoZ2xvYmFsLnNldEludGVydmFsKVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanNcbi8vIG1vZHVsZSBpZCA9IDMyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICR0YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpO1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkIsIHtcbiAgc2V0SW1tZWRpYXRlOiAkdGFzay5zZXQsXG4gIGNsZWFySW1tZWRpYXRlOiAkdGFzay5jbGVhclxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDMyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgJGl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5BcnJheTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiBmYWxzZSxcbiAgQ1NTVmFsdWVMaXN0OiBmYWxzZSxcbiAgQ2xpZW50UmVjdExpc3Q6IGZhbHNlLFxuICBET01SZWN0TGlzdDogZmFsc2UsXG4gIERPTVN0cmluZ0xpc3Q6IGZhbHNlLFxuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiBmYWxzZSxcbiAgRmlsZUxpc3Q6IGZhbHNlLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTEZvcm1FbGVtZW50OiBmYWxzZSxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IGZhbHNlLFxuICBNZWRpYUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBNaW1lVHlwZUFycmF5OiBmYWxzZSxcbiAgTmFtZWROb2RlTWFwOiBmYWxzZSxcbiAgTm9kZUxpc3Q6IHRydWUsXG4gIFBhaW50UmVxdWVzdExpc3Q6IGZhbHNlLFxuICBQbHVnaW46IGZhbHNlLFxuICBQbHVnaW5BcnJheTogZmFsc2UsXG4gIFNWR0xlbmd0aExpc3Q6IGZhbHNlLFxuICBTVkdOdW1iZXJMaXN0OiBmYWxzZSxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IGZhbHNlLFxuICBTVkdQb2ludExpc3Q6IGZhbHNlLFxuICBTVkdTdHJpbmdMaXN0OiBmYWxzZSxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogZmFsc2UsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IGZhbHNlLFxuICBTdHlsZVNoZWV0TGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIFRleHRUcmFja0N1ZUxpc3Q6IGZhbHNlLFxuICBUZXh0VHJhY2tMaXN0OiBmYWxzZSxcbiAgVG91Y2hMaXN0OiBmYWxzZVxufTtcblxuZm9yICh2YXIgY29sbGVjdGlvbnMgPSBnZXRLZXlzKERPTUl0ZXJhYmxlcyksIGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBjb2xsZWN0aW9uc1tpXTtcbiAgdmFyIGV4cGxpY2l0ID0gRE9NSXRlcmFibGVzW05BTUVdO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGtleTtcbiAgaWYgKHByb3RvKSB7XG4gICAgaWYgKCFwcm90b1tJVEVSQVRPUl0pIGhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYgKCFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgaWYgKGV4cGxpY2l0KSBmb3IgKGtleSBpbiAkaXRlcmF0b3JzKSBpZiAoIXByb3RvW2tleV0pIHJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gMzIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvbWFzdGVyL0xJQ0VOU0UgZmlsZS4gQW5cbiAqIGFkZGl0aW9uYWwgZ3JhbnQgb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpblxuICogdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZ2xvYmFsLnByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgZ2xvYmFsLnByb2Nlc3MuZG9tYWluKSB7XG4gICAgICBpbnZva2UgPSBnbG9iYWwucHJvY2Vzcy5kb21haW4uYmluZChpbnZva2UpO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gQW1vbmcgdGhlIHZhcmlvdXMgdHJpY2tzIGZvciBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbFxuICAvLyBvYmplY3QsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIG1vc3QgcmVsaWFibGUgdGVjaG5pcXVlIHRoYXQgZG9lcyBub3RcbiAgLy8gdXNlIGluZGlyZWN0IGV2YWwgKHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5KS5cbiAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gIHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgPyB3aW5kb3cgOlxuICB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0aGlzXG4pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JhYmVsLXBvbHlmaWxsL34vcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzXG4vLyBtb2R1bGUgaWQgPSAzMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9jb3JlLnJlZ2V4cC5lc2NhcGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlJlZ0V4cC5lc2NhcGU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9mbi9yZWdleHAvZXNjYXBlLmpzXG4vLyBtb2R1bGUgaWQgPSAzMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmV4RXhwLmVzY2FwZVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmUgPSByZXF1aXJlKCcuL19yZXBsYWNlcicpKC9bXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZ0V4cCcsIHsgZXNjYXBlOiBmdW5jdGlvbiBlc2NhcGUoaXQpIHsgcmV0dXJuICRyZShpdCk7IH0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9tb2R1bGVzL2NvcmUucmVnZXhwLmVzY2FwZS5qc1xuLy8gbW9kdWxlIGlkID0gMzI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJlZ0V4cCwgcmVwbGFjZSkge1xuICB2YXIgcmVwbGFjZXIgPSByZXBsYWNlID09PSBPYmplY3QocmVwbGFjZSkgPyBmdW5jdGlvbiAocGFydCkge1xuICAgIHJldHVybiByZXBsYWNlW3BhcnRdO1xuICB9IDogcmVwbGFjZTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBTdHJpbmcoaXQpLnJlcGxhY2UocmVnRXhwLCByZXBsYWNlcik7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbW9kdWxlcy9fcmVwbGFjZXIuanNcbi8vIG1vZHVsZSBpZCA9IDMyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5leHBvcnQgY29uc3QgTG9nID0gcmVxdWlyZSgnLi9zcmMvTG9nJykuTG9nO1xuZXhwb3J0IGNvbnN0IE9pZGNDbGllbnQgPSByZXF1aXJlKCcuL3NyYy9PaWRjQ2xpZW50JykuT2lkY0NsaWVudDtcbmV4cG9ydCBjb25zdCBPaWRjQ2xpZW50U2V0dGluZ3MgPSByZXF1aXJlKCcuL3NyYy9PaWRjQ2xpZW50U2V0dGluZ3MnKS5PaWRjQ2xpZW50U2V0dGluZ3M7XG5leHBvcnQgY29uc3QgV2ViU3RvcmFnZVN0YXRlU3RvcmUgPSByZXF1aXJlKCcuL3NyYy9XZWJTdG9yYWdlU3RhdGVTdG9yZScpLldlYlN0b3JhZ2VTdGF0ZVN0b3JlO1xuZXhwb3J0IGNvbnN0IEluTWVtb3J5V2ViU3RvcmFnZSA9IHJlcXVpcmUoJy4vc3JjL0luTWVtb3J5V2ViU3RvcmFnZScpLkluTWVtb3J5V2ViU3RvcmFnZTtcbmV4cG9ydCBjb25zdCBVc2VyTWFuYWdlciA9IHJlcXVpcmUoJy4vc3JjL1VzZXJNYW5hZ2VyJykuVXNlck1hbmFnZXI7XG5leHBvcnQgY29uc3QgQWNjZXNzVG9rZW5FdmVudHMgPSByZXF1aXJlKCcuL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cycpLkFjY2Vzc1Rva2VuRXZlbnRzO1xuZXhwb3J0IGNvbnN0IE1ldGFkYXRhU2VydmljZSA9IHJlcXVpcmUoJy4vc3JjL01ldGFkYXRhU2VydmljZScpLk1ldGFkYXRhU2VydmljZTtcbmV4cG9ydCBjb25zdCBDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3IgPSByZXF1aXJlKCcuL3NyYy9Db3Jkb3ZhUG9wdXBOYXZpZ2F0b3InKS5Db3Jkb3ZhUG9wdXBOYXZpZ2F0b3I7XG5leHBvcnQgY29uc3QgQ29yZG92YUlGcmFtZU5hdmlnYXRvciA9IHJlcXVpcmUoJy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3InKS5Db3Jkb3ZhSUZyYW1lTmF2aWdhdG9yO1xuZXhwb3J0IGNvbnN0IENoZWNrU2Vzc2lvbklGcmFtZSA9IHJlcXVpcmUoJy4vc3JjL0NoZWNrU2Vzc2lvbklGcmFtZScpLkNoZWNrU2Vzc2lvbklGcmFtZTtcbmV4cG9ydCBjb25zdCBUb2tlblJldm9jYXRpb25DbGllbnQgPSByZXF1aXJlKCcuL3NyYy9Ub2tlblJldm9jYXRpb25DbGllbnQnKS5Ub2tlblJldm9jYXRpb25DbGllbnQ7XG5leHBvcnQgY29uc3QgU2Vzc2lvbk1vbml0b3IgPSByZXF1aXJlKCcuL3NyYy9TZXNzaW9uTW9uaXRvcicpLlNlc3Npb25Nb25pdG9yO1xuZXhwb3J0IGNvbnN0IEdsb2JhbCA9IHJlcXVpcmUoJy4vc3JjL0dsb2JhbCcpLkdsb2JhbDtcbmV4cG9ydCBjb25zdCBVc2VyID0gcmVxdWlyZSgnLi9zcmMvVXNlcicpLlVzZXI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBMb2csXG4gICAgT2lkY0NsaWVudCxcbiAgICBPaWRjQ2xpZW50U2V0dGluZ3MsXG4gICAgV2ViU3RvcmFnZVN0YXRlU3RvcmUsXG4gICAgSW5NZW1vcnlXZWJTdG9yYWdlLFxuICAgIFVzZXJNYW5hZ2VyLFxuICAgIEFjY2Vzc1Rva2VuRXZlbnRzLFxuICAgIE1ldGFkYXRhU2VydmljZSxcbiAgICBDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3IsXG4gICAgQ29yZG92YUlGcmFtZU5hdmlnYXRvcixcbiAgICBDaGVja1Nlc3Npb25JRnJhbWUsXG4gICAgVG9rZW5SZXZvY2F0aW9uQ2xpZW50LFxuICAgIFNlc3Npb25Nb25pdG9yLFxuICAgIEdsb2JhbCxcbiAgICBVc2VyXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vaW5kZXguanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5sZXQgbm9wTG9nZ2VyID0ge1xuICAgIGRlYnVnKCl7fSxcbiAgICBpbmZvKCl7fSxcbiAgICB3YXJuKCl7fSxcbiAgICBlcnJvcigpe31cbn07XG5cbmNvbnN0IE5PTkUgPSAwO1xuY29uc3QgRVJST1IgPSAxO1xuY29uc3QgV0FSTiA9IDI7XG5jb25zdCBJTkZPID0gMztcbmNvbnN0IERFQlVHID0gNDtcblxubGV0IGxvZ2dlcjtcbmxldCBsZXZlbDtcblxuZXhwb3J0IGNsYXNzIExvZyB7XG4gICAgc3RhdGljIGdldCBOT05FKCkge3JldHVybiBOT05FfTtcbiAgICBzdGF0aWMgZ2V0IEVSUk9SKCkge3JldHVybiBFUlJPUn07XG4gICAgc3RhdGljIGdldCBXQVJOKCkge3JldHVybiBXQVJOfTtcbiAgICBzdGF0aWMgZ2V0IElORk8oKSB7cmV0dXJuIElORk99O1xuICAgIHN0YXRpYyBnZXQgREVCVUcoKSB7cmV0dXJuIERFQlVHfTtcbiAgICBcbiAgICBzdGF0aWMgcmVzZXQoKXtcbiAgICAgICAgbGV2ZWwgPSBJTkZPO1xuICAgICAgICBsb2dnZXIgPSBub3BMb2dnZXI7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBnZXQgbGV2ZWwoKXtcbiAgICAgICAgcmV0dXJuIGxldmVsO1xuICAgIH1cbiAgICBzdGF0aWMgc2V0IGxldmVsKHZhbHVlKXtcbiAgICAgICAgaWYgKE5PTkUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gREVCVUcpe1xuICAgICAgICAgICAgbGV2ZWwgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBnZXQgbG9nZ2VyKCl7XG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgbG9nZ2VyKHZhbHVlKXtcbiAgICAgICAgaWYgKCF2YWx1ZS5kZWJ1ZyAmJiB2YWx1ZS5pbmZvKSB7XG4gICAgICAgICAgICAvLyBqdXN0IHRvIHN0YXkgYmFja3dhcmRzIGNvbXBhdC4gY2FuIHJlbW92ZSBpbiAyLjBcbiAgICAgICAgICAgIHZhbHVlLmRlYnVnID0gdmFsdWUuaW5mbztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5kZWJ1ZyAmJiB2YWx1ZS5pbmZvICYmIHZhbHVlLndhcm4gJiYgdmFsdWUuZXJyb3Ipe1xuICAgICAgICAgICAgbG9nZ2VyID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZ2dlclwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZGVidWcoLi4uYXJncyl7XG4gICAgICAgIGlmIChsZXZlbCA+PSBERUJVRyl7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcuYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgaW5mbyguLi5hcmdzKXtcbiAgICAgICAgaWYgKGxldmVsID49IElORk8pe1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8uYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgd2FybiguLi5hcmdzKXtcbiAgICAgICAgaWYgKGxldmVsID49IFdBUk4pe1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4uYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZXJyb3IoLi4uYXJncyl7XG4gICAgICAgIGlmIChsZXZlbCA+PSBFUlJPUil7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IuYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuTG9nLnJlc2V0KCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvTG9nLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgT2lkY0NsaWVudFNldHRpbmdzIGZyb20gJy4vT2lkY0NsaWVudFNldHRpbmdzJztcbmltcG9ydCBFcnJvclJlc3BvbnNlIGZyb20gJy4vRXJyb3JSZXNwb25zZSc7XG5pbXBvcnQgU2lnbmluUmVxdWVzdCBmcm9tICcuL1NpZ25pblJlcXVlc3QnO1xuaW1wb3J0IFNpZ25pblJlc3BvbnNlIGZyb20gJy4vU2lnbmluUmVzcG9uc2UnO1xuaW1wb3J0IFNpZ25vdXRSZXF1ZXN0IGZyb20gJy4vU2lnbm91dFJlcXVlc3QnO1xuaW1wb3J0IFNpZ25vdXRSZXNwb25zZSBmcm9tICcuL1NpZ25vdXRSZXNwb25zZSc7XG5pbXBvcnQgU2lnbmluU3RhdGUgZnJvbSAnLi9TaWduaW5TdGF0ZSc7XG5pbXBvcnQgU3RhdGUgZnJvbSAnLi9TdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBPaWRjQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncyA9IHt9KSB7XG4gICAgICAgIGlmIChzZXR0aW5ncyBpbnN0YW5jZW9mIE9pZGNDbGllbnRTZXR0aW5ncykge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzID0gbmV3IE9pZGNDbGllbnRTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgX3N0YXRlU3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnN0YXRlU3RvcmU7XG4gICAgfVxuICAgIGdldCBfdmFsaWRhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy52YWxpZGF0b3I7XG4gICAgfVxuICAgIGdldCBfbWV0YWRhdGFTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tZXRhZGF0YVNlcnZpY2U7XG4gICAgfVxuXG4gICAgZ2V0IHNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBtZXRhZGF0YVNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2U7XG4gICAgfVxuXG4gICAgY3JlYXRlU2lnbmluUmVxdWVzdCh7XG4gICAgICAgIHJlc3BvbnNlX3R5cGUsIHNjb3BlLCByZWRpcmVjdF91cmksXG4gICAgICAgIC8vIGRhdGEgd2FzIG1lYW50IHRvIGJlIHRoZSBwbGFjZSBhIGNhbGxlciBjb3VsZCBpbmRpY2F0ZSB0aGUgZGF0YSB0b1xuICAgICAgICAvLyBoYXZlIHJvdW5kIHRyaXBwZWQsIGJ1dCBwZW9wbGUgd2VyZSBnZXR0aW5nIGNvbmZ1c2VkLCBzbyBpIGFkZGVkIHN0YXRlIChzaW5jZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWMpXG4gICAgICAgIC8vIGFuZCBzbyBub3cgaWYgZGF0YSBpcyBub3QgcGFzc2VkLCBidXQgc3RhdGUgaXMgdGhlbiBzdGF0ZSB3aWxsIGJlIHVzZWRcbiAgICAgICAgZGF0YSwgc3RhdGUsIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlcyxcbiAgICAgICAgcmVzb3VyY2UsIHJlcXVlc3QsIHJlcXVlc3RfdXJpLCBleHRyYVF1ZXJ5UGFyYW1zIH0gPSB7fSxcbiAgICAgICAgc3RhdGVTdG9yZVxuICAgICkge1xuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25pblJlcXVlc3RcIik7XG5cbiAgICAgICAgbGV0IGNsaWVudF9pZCA9IHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcbiAgICAgICAgcmVzcG9uc2VfdHlwZSA9IHJlc3BvbnNlX3R5cGUgfHwgdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfdHlwZTtcbiAgICAgICAgc2NvcGUgPSBzY29wZSB8fCB0aGlzLl9zZXR0aW5ncy5zY29wZTtcbiAgICAgICAgcmVkaXJlY3RfdXJpID0gcmVkaXJlY3RfdXJpIHx8IHRoaXMuX3NldHRpbmdzLnJlZGlyZWN0X3VyaTtcblxuICAgICAgICAvLyBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50IGFyZW4ndCBhbGxvd2VkIG9uIF9zZXR0aW5nc1xuICAgICAgICBwcm9tcHQgPSBwcm9tcHQgfHwgdGhpcy5fc2V0dGluZ3MucHJvbXB0O1xuICAgICAgICBkaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLl9zZXR0aW5ncy5kaXNwbGF5O1xuICAgICAgICBtYXhfYWdlID0gbWF4X2FnZSB8fCB0aGlzLl9zZXR0aW5ncy5tYXhfYWdlO1xuICAgICAgICB1aV9sb2NhbGVzID0gdWlfbG9jYWxlcyB8fCB0aGlzLl9zZXR0aW5ncy51aV9sb2NhbGVzO1xuICAgICAgICBhY3JfdmFsdWVzID0gYWNyX3ZhbHVlcyB8fCB0aGlzLl9zZXR0aW5ncy5hY3JfdmFsdWVzO1xuICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlIHx8IHRoaXMuX3NldHRpbmdzLnJlc291cmNlO1xuICAgICAgICBleHRyYVF1ZXJ5UGFyYW1zID0gZXh0cmFRdWVyeVBhcmFtcyB8fCB0aGlzLl9zZXR0aW5ncy5leHRyYVF1ZXJ5UGFyYW1zO1xuXG4gICAgICAgIGxldCBhdXRob3JpdHkgPSB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRBdXRob3JpemF0aW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZWNlaXZlZCBhdXRob3JpemF0aW9uIGVuZHBvaW50XCIsIHVybCk7XG5cbiAgICAgICAgICAgIGxldCBzaWduaW5SZXF1ZXN0ID0gbmV3IFNpZ25pblJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RfdXJpLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGUsXG4gICAgICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSB8fCBzdGF0ZSxcbiAgICAgICAgICAgICAgICBhdXRob3JpdHksXG4gICAgICAgICAgICAgICAgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50LCBhY3JfdmFsdWVzLFxuICAgICAgICAgICAgICAgIHJlc291cmNlLCByZXF1ZXN0LCByZXF1ZXN0X3VyaSwgZXh0cmFRdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgc2lnbmluU3RhdGUgPSBzaWduaW5SZXF1ZXN0LnN0YXRlO1xuICAgICAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcblxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUuc2V0KHNpZ25pblN0YXRlLmlkLCBzaWduaW5TdGF0ZS50b1N0b3JhZ2VTdHJpbmcoKSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25pblJlcXVlc3Q7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc1NpZ25pblJlc3BvbnNlKHVybCwgc3RhdGVTdG9yZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWduaW5SZXNwb25zZVwiKTtcblxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgU2lnbmluUmVzcG9uc2UodXJsKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLnN0YXRlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBzdGF0ZSBpbiByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzdGF0ZSBpbiByZXNwb25zZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZVN0b3JlLnJlbW92ZShyZXNwb25zZS5zdGF0ZSkudGhlbihzdG9yZWRTdGF0ZVN0cmluZyA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0b3JlZFN0YXRlU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBTaWduaW5TdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhzdG9yZWRTdGF0ZVN0cmluZyk7XG5cbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIHN0YXRlIGZyb20gc3RvcmFnZTsgdmFsaWRhdGluZyByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGVTaWduaW5SZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVTaWdub3V0UmVxdWVzdCh7aWRfdG9rZW5faGludCwgZGF0YSwgc3RhdGUsIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaX0gPSB7fSxcbiAgICAgICAgc3RhdGVTdG9yZVxuICAgICkge1xuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25vdXRSZXF1ZXN0XCIpO1xuXG4gICAgICAgIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSA9IHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRFbmRTZXNzaW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XG4gICAgICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGVuZCBzZXNzaW9uIGVuZHBvaW50IHVybCByZXR1cm5lZFwiKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJubyBlbmQgc2Vzc2lvbiBlbmRwb2ludFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgZW5kIHNlc3Npb24gZW5kcG9pbnRcIiwgdXJsKTtcblxuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgU2lnbm91dFJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBpZF90b2tlbl9oaW50LFxuICAgICAgICAgICAgICAgIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSxcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhIHx8IHN0YXRlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIHNpZ25vdXRTdGF0ZSA9IHJlcXVlc3Quc3RhdGU7XG4gICAgICAgICAgICBpZiAoc2lnbm91dFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2lnbm91dCByZXF1ZXN0IGhhcyBzdGF0ZSB0byBwZXJzaXN0XCIpO1xuXG4gICAgICAgICAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcbiAgICAgICAgICAgICAgICBzdGF0ZVN0b3JlLnNldChzaWdub3V0U3RhdGUuaWQsIHNpZ25vdXRTdGF0ZS50b1N0b3JhZ2VTdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm9jZXNzU2lnbm91dFJlc3BvbnNlKHVybCwgc3RhdGVTdG9yZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LnByb2Nlc3NTaWdub3V0UmVzcG9uc2VcIik7XG5cbiAgICAgICAgdmFyIHJlc3BvbnNlID0gbmV3IFNpZ25vdXRSZXNwb25zZSh1cmwpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLnN0YXRlKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJObyBzdGF0ZSBpbiByZXNwb25zZVwiKTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgTG9nLndhcm4oXCJSZXNwb25zZSB3YXMgZXJyb3JcIiwgcmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdGF0ZUtleSA9IHJlc3BvbnNlLnN0YXRlO1xuXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUucmVtb3ZlKHN0YXRlS2V5KS50aGVuKHN0b3JlZFN0YXRlU3RyaW5nID0+IHtcbiAgICAgICAgICAgIGlmICghc3RvcmVkU3RhdGVTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IFN0YXRlLmZyb21TdG9yYWdlU3RyaW5nKHN0b3JlZFN0YXRlU3RyaW5nKTtcblxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgc3RhdGUgZnJvbSBzdG9yYWdlOyB2YWxpZGF0aW5nIHJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZVNpZ25vdXRSZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjbGVhclN0YWxlU3RhdGUoc3RhdGVTdG9yZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LmNsZWFyU3RhbGVTdGF0ZVwiKTtcblxuICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xuXG4gICAgICAgIHJldHVybiBTdGF0ZS5jbGVhclN0YWxlU3RhdGUoc3RhdGVTdG9yZSwgdGhpcy5zZXR0aW5ncy5zdGFsZVN0YXRlQWdlKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvT2lkY0NsaWVudC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlIGZyb20gJy4vV2ViU3RvcmFnZVN0YXRlU3RvcmUnO1xuaW1wb3J0IFJlc3BvbnNlVmFsaWRhdG9yIGZyb20gJy4vUmVzcG9uc2VWYWxpZGF0b3InO1xuaW1wb3J0IE1ldGFkYXRhU2VydmljZSBmcm9tICcuL01ldGFkYXRhU2VydmljZSc7XG5cbmNvbnN0IE9pZGNNZXRhZGF0YVVybFBhdGggPSAnLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xuXG5jb25zdCBEZWZhdWx0UmVzcG9uc2VUeXBlID0gXCJpZF90b2tlblwiO1xuY29uc3QgRGVmYXVsdFNjb3BlID0gXCJvcGVuaWRcIjtcbmNvbnN0IERlZmF1bHRTdGFsZVN0YXRlQWdlID0gNjAgKiA1OyAvLyBzZWNvbmRzXG5jb25zdCBEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzID0gNjAgKiA1O1xuXG5leHBvcnQgY2xhc3MgT2lkY0NsaWVudFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcih7XG4gICAgICAgIC8vIG1ldGFkYXRhIHJlbGF0ZWRcbiAgICAgICAgYXV0aG9yaXR5LCBtZXRhZGF0YVVybCwgbWV0YWRhdGEsIHNpZ25pbmdLZXlzLFxuICAgICAgICAvLyBjbGllbnQgcmVsYXRlZFxuICAgICAgICBjbGllbnRfaWQsIGNsaWVudF9zZWNyZXQsIHJlc3BvbnNlX3R5cGUgPSBEZWZhdWx0UmVzcG9uc2VUeXBlLCBzY29wZSA9IERlZmF1bHRTY29wZSxcbiAgICAgICAgcmVkaXJlY3RfdXJpLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXG4gICAgICAgIC8vIG9wdGlvbmFsIHByb3RvY29sXG4gICAgICAgIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgYWNyX3ZhbHVlcywgcmVzb3VyY2UsXG4gICAgICAgIC8vIGJlaGF2aW9yIGZsYWdzXG4gICAgICAgIGZpbHRlclByb3RvY29sQ2xhaW1zID0gdHJ1ZSwgbG9hZFVzZXJJbmZvID0gdHJ1ZSxcbiAgICAgICAgc3RhbGVTdGF0ZUFnZSA9IERlZmF1bHRTdGFsZVN0YXRlQWdlLCBjbG9ja1NrZXcgPSBEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzLFxuICAgICAgICAvLyBvdGhlciBiZWhhdmlvclxuICAgICAgICBzdGF0ZVN0b3JlID0gbmV3IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlKCksXG4gICAgICAgIFJlc3BvbnNlVmFsaWRhdG9yQ3RvciA9IFJlc3BvbnNlVmFsaWRhdG9yLFxuICAgICAgICBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlLFxuICAgICAgICAvLyBleHRyYSBxdWVyeSBwYXJhbXNcbiAgICAgICAgZXh0cmFRdWVyeVBhcmFtcyA9IHt9XG4gICAgfSA9IHt9KSB7XG5cbiAgICAgICAgdGhpcy5fYXV0aG9yaXR5ID0gYXV0aG9yaXR5O1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCA9IG1ldGFkYXRhVXJsO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgICAgICB0aGlzLl9zaWduaW5nS2V5cyA9IHNpZ25pbmdLZXlzO1xuXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcbiAgICAgICAgdGhpcy5fY2xpZW50X3NlY3JldCA9IGNsaWVudF9zZWNyZXQ7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlX3R5cGUgPSByZXNwb25zZV90eXBlO1xuICAgICAgICB0aGlzLl9zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLl9yZWRpcmVjdF91cmkgPSByZWRpcmVjdF91cmk7XG4gICAgICAgIHRoaXMuX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSA9IHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcblxuICAgICAgICB0aGlzLl9wcm9tcHQgPSBwcm9tcHQ7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXkgPSBkaXNwbGF5O1xuICAgICAgICB0aGlzLl9tYXhfYWdlID0gbWF4X2FnZTtcbiAgICAgICAgdGhpcy5fdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXM7XG4gICAgICAgIHRoaXMuX2Fjcl92YWx1ZXMgPSBhY3JfdmFsdWVzO1xuICAgICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuXG4gICAgICAgIHRoaXMuX2ZpbHRlclByb3RvY29sQ2xhaW1zID0gISFmaWx0ZXJQcm90b2NvbENsYWltcztcbiAgICAgICAgdGhpcy5fbG9hZFVzZXJJbmZvID0gISFsb2FkVXNlckluZm87XG4gICAgICAgIHRoaXMuX3N0YWxlU3RhdGVBZ2UgPSBzdGFsZVN0YXRlQWdlO1xuICAgICAgICB0aGlzLl9jbG9ja1NrZXcgPSBjbG9ja1NrZXc7XG5cbiAgICAgICAgdGhpcy5fc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmU7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvciA9IG5ldyBSZXNwb25zZVZhbGlkYXRvckN0b3IodGhpcyk7XG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2V4dHJhUXVlcnlQYXJhbXMgPSB0eXBlb2YgZXh0cmFRdWVyeVBhcmFtcyA9PT0gJ29iamVjdCcgPyBleHRyYVF1ZXJ5UGFyYW1zIDoge307XG4gICAgfVxuXG4gICAgLy8gY2xpZW50IGNvbmZpZ1xuICAgIGdldCBjbGllbnRfaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRfaWQ7XG4gICAgfVxuICAgIHNldCBjbGllbnRfaWQodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldCBvbmx5XG4gICAgICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImNsaWVudF9pZCBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2xpZW50X2lkIGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGNsaWVudF9zZWNyZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRfc2VjcmV0O1xuICAgIH1cbiAgICBnZXQgcmVzcG9uc2VfdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlX3R5cGU7XG4gICAgfVxuICAgIGdldCBzY29wZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Njb3BlO1xuICAgIH1cbiAgICBnZXQgcmVkaXJlY3RfdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3RfdXJpO1xuICAgIH1cbiAgICBnZXQgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xuICAgIH1cblxuXG4gICAgLy8gb3B0aW9uYWwgcHJvdG9jb2wgcGFyYW1zXG4gICAgZ2V0IHByb21wdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21wdDtcbiAgICB9XG4gICAgZ2V0IGRpc3BsYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwbGF5O1xuICAgIH1cbiAgICBnZXQgbWF4X2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heF9hZ2U7XG4gICAgfVxuICAgIGdldCB1aV9sb2NhbGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdWlfbG9jYWxlcztcbiAgICB9XG4gICAgZ2V0IGFjcl92YWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3JfdmFsdWVzO1xuICAgIH1cbiAgICBnZXQgcmVzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZTtcbiAgICB9XG5cblxuICAgIC8vIG1ldGFkYXRhXG4gICAgZ2V0IGF1dGhvcml0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGhvcml0eTtcbiAgICB9XG4gICAgc2V0IGF1dGhvcml0eSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2F1dGhvcml0eSkge1xuICAgICAgICAgICAgLy8gb25lLXRpbWUgc2V0IG9ubHlcbiAgICAgICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiYXV0aG9yaXR5IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdXRob3JpdHkgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbWV0YWRhdGFVcmwoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWV0YWRhdGFVcmwpIHtcbiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gdGhpcy5hdXRob3JpdHk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybCAmJiB0aGlzLl9tZXRhZGF0YVVybC5pbmRleE9mKE9pZGNNZXRhZGF0YVVybFBhdGgpIDwgMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybFt0aGlzLl9tZXRhZGF0YVVybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsICs9ICcvJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gT2lkY01ldGFkYXRhVXJsUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVVybDtcbiAgICB9XG5cbiAgICAvLyBzZXR0YWJsZS9jYWNoYWJsZSBtZXRhZGF0YSB2YWx1ZXNcbiAgICBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YTtcbiAgICB9XG4gICAgc2V0IG1ldGFkYXRhKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX21ldGFkYXRhID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IHNpZ25pbmdLZXlzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluZ0tleXM7XG4gICAgfVxuICAgIHNldCBzaWduaW5nS2V5cyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zaWduaW5nS2V5cyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIGZsYWdzXG4gICAgZ2V0IGZpbHRlclByb3RvY29sQ2xhaW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXM7XG4gICAgfVxuICAgIGdldCBsb2FkVXNlckluZm8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkVXNlckluZm87XG4gICAgfVxuICAgIGdldCBzdGFsZVN0YXRlQWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhbGVTdGF0ZUFnZTtcbiAgICB9XG4gICAgZ2V0IGNsb2NrU2tldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb2NrU2tldztcbiAgICB9XG5cbiAgICBnZXQgc3RhdGVTdG9yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlU3RvcmU7XG4gICAgfVxuICAgIGdldCB2YWxpZGF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3I7XG4gICAgfVxuICAgIGdldCBtZXRhZGF0YVNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2U7XG4gICAgfVxuXG4gICAgLy8gZXh0cmEgcXVlcnkgcGFyYW1zXG4gICAgZ2V0IGV4dHJhUXVlcnlQYXJhbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHRyYVF1ZXJ5UGFyYW1zO1xuICAgIH1cbiAgICBzZXQgZXh0cmFRdWVyeVBhcmFtcyh2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jyl7XG4gICAgICAgICAgICB0aGlzLl9leHRyYVF1ZXJ5UGFyYW1zID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9leHRyYVF1ZXJ5UGFyYW1zID0ge307XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvT2lkY0NsaWVudFNldHRpbmdzLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuZXhwb3J0IGNsYXNzIFdlYlN0b3JhZ2VTdGF0ZVN0b3JlIHtcbiAgICBjb25zdHJ1Y3Rvcih7cHJlZml4ID0gXCJvaWRjLlwiLCBzdG9yZSA9IEdsb2JhbC5sb2NhbFN0b3JhZ2V9ID0ge30pIHtcbiAgICAgICAgdGhpcy5fc3RvcmUgPSBzdG9yZTtcbiAgICAgICAgdGhpcy5fcHJlZml4ID0gcHJlZml4O1xuICAgIH1cblxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLnNldFwiLCBrZXkpO1xuXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcblxuICAgICAgICB0aGlzLl9zdG9yZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLmdldFwiLCBrZXkpO1xuXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcblxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX3N0b3JlLmdldEl0ZW0oa2V5KTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGl0ZW0pO1xuICAgIH1cblxuICAgIHJlbW92ZShrZXkpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUucmVtb3ZlXCIsIGtleSk7XG5cbiAgICAgICAga2V5ID0gdGhpcy5fcHJlZml4ICsga2V5O1xuXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5fc3RvcmUuZ2V0SXRlbShrZXkpO1xuICAgICAgICB0aGlzLl9zdG9yZS5yZW1vdmVJdGVtKGtleSk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpdGVtKTtcbiAgICB9XG5cbiAgICBnZXRBbGxLZXlzKCkge1xuICAgICAgICBMb2cuZGVidWcoXCJXZWJTdG9yYWdlU3RhdGVTdG9yZS5nZXRBbGxLZXlzXCIpO1xuXG4gICAgICAgIHZhciBrZXlzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX3N0b3JlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuX3N0b3JlLmtleShpbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZih0aGlzLl9wcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleS5zdWJzdHIodGhpcy5fcHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShrZXlzKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvV2ViU3RvcmFnZVN0YXRlU3RvcmUuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5jb25zdCB0aW1lciA9IHtcbiAgICBzZXRJbnRlcnZhbDogZnVuY3Rpb24gKGNiLCBkdXJhdGlvbikge1xuICAgICAgICByZXR1cm4gc2V0SW50ZXJ2YWwoY2IsIGR1cmF0aW9uKTtcbiAgICB9LFxuICAgIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgICAgICAgcmV0dXJuIGNsZWFySW50ZXJ2YWwoaGFuZGxlKTtcbiAgICB9XG59O1xuXG5sZXQgdGVzdGluZyA9IGZhbHNlO1xubGV0IHJlcXVlc3QgPSBudWxsO1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsIHtcblxuICAgIHN0YXRpYyBfdGVzdGluZygpIHtcbiAgICAgICAgdGVzdGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBsb2NhdGlvbigpIHtcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGxvY2FsU3RvcmFnZSgpIHtcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBzZXNzaW9uU3RvcmFnZSgpIHtcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0WE1MSHR0cFJlcXVlc3QobmV3UmVxdWVzdCkge1xuICAgICAgICByZXF1ZXN0ID0gbmV3UmVxdWVzdDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IFhNTEh0dHBSZXF1ZXN0KCkge1xuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0IHx8IFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCB0aW1lcigpIHtcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0dsb2JhbC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IE1ldGFkYXRhU2VydmljZSBmcm9tICcuL01ldGFkYXRhU2VydmljZSc7XG5pbXBvcnQgVXNlckluZm9TZXJ2aWNlIGZyb20gJy4vVXNlckluZm9TZXJ2aWNlJztcbmltcG9ydCBFcnJvclJlc3BvbnNlIGZyb20gJy4vRXJyb3JSZXNwb25zZSc7XG5pbXBvcnQgSm9zZVV0aWwgZnJvbSAnLi9Kb3NlVXRpbCc7XG5cbmNvbnN0IFByb3RvY29sQ2xhaW1zID0gW1wibm9uY2VcIiwgXCJhdF9oYXNoXCIsIFwiaWF0XCIsIFwibmJmXCIsIFwiZXhwXCIsIFwiYXVkXCIsIFwiaXNzXCIsIFwiY19oYXNoXCJdO1xuXG5leHBvcnQgY2xhc3MgUmVzcG9uc2VWYWxpZGF0b3Ige1xuXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UsIFVzZXJJbmZvU2VydmljZUN0b3IgPSBVc2VySW5mb1NlcnZpY2UsIGpvc2VVdGlsID0gSm9zZVV0aWwpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2V0dGluZ3MgcGFzc2VkIHRvIFJlc3BvbnNlVmFsaWRhdG9yXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0dGluZ3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvU2VydmljZSA9IG5ldyBVc2VySW5mb1NlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fam9zZVV0aWwgPSBqb3NlVXRpbDtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZVNpZ25pblJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25pblJlc3BvbnNlXCIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzU2lnbmluUGFyYW1zKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJzdGF0ZSBwcm9jZXNzZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVUb2tlbnMoc3RhdGUsIHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ0b2tlbnMgdmFsaWRhdGVkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzQ2xhaW1zKHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiY2xhaW1zIHByb2Nlc3NlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhbGlkYXRlU2lnbm91dFJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25vdXRSZXNwb25zZVwiKTtcblxuICAgICAgICBpZiAoc3RhdGUuaWQgIT09IHJlc3BvbnNlLnN0YXRlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IHRoZSBzdGF0ZSBtYXRjaGVzLCB0YWtlIHRoZSBzdG9yZWQgZGF0YVxuICAgICAgICAvLyBhbmQgc2V0IGl0IGludG8gdGhlIHJlc3BvbnNlIHNvIGNhbGxlcnMgY2FuIGdldCB0aGVpciBzdGF0ZVxuICAgICAgICAvLyB0aGlzIGlzIGltcG9ydGFudCBmb3IgYm90aCBzdWNjZXNzICYgZXJyb3Igb3V0Y29tZXNcbiAgICAgICAgTG9nLmRlYnVnKFwic3RhdGUgdmFsaWRhdGVkXCIpO1xuICAgICAgICByZXNwb25zZS5zdGF0ZSA9IHN0YXRlLmRhdGE7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICBMb2cud2FybihcIlJlc3BvbnNlIHdhcyBlcnJvclwiLCByZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIF9wcm9jZXNzU2lnbmluUGFyYW1zKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtc1wiKTtcblxuICAgICAgICBpZiAoc3RhdGUuaWQgIT09IHJlc3BvbnNlLnN0YXRlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICghc3RhdGUuY2xpZW50X2lkKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBjbGllbnRfaWQgb24gc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gY2xpZW50X2lkIG9uIHN0YXRlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFzdGF0ZS5hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGF1dGhvcml0eSBvbiBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBhdXRob3JpdHkgb24gc3RhdGVcIikpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyB0aGlzIGFsbG93cyB0aGUgYXV0aG9yaXR5IHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBzaWduaW4gc3RhdGVcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSA9IHN0YXRlLmF1dGhvcml0eTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbnN1cmUgd2UncmUgdXNpbmcgdGhlIGNvcnJlY3QgYXV0aG9yaXR5IGlmIHRoZSBhdXRob3JpdHkgaXMgbm90IGxvYWRlZCBmcm9tIHNpZ25pbiBzdGF0ZVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkgJiYgdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5ICE9PSBzdGF0ZS5hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImF1dGhvcml0eSBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImF1dGhvcml0eSBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzIGFsbG93cyB0aGUgY2xpZW50X2lkIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBzaWduaW4gc3RhdGVcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCA9IHN0YXRlLmNsaWVudF9pZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbnN1cmUgd2UncmUgdXNpbmcgdGhlIGNvcnJlY3QgY2xpZW50X2lkIGlmIHRoZSBjbGllbnRfaWQgaXMgbm90IGxvYWRlZCBmcm9tIHNpZ25pbiBzdGF0ZVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQgJiYgdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkICE9PSBzdGF0ZS5jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImNsaWVudF9pZCBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImNsaWVudF9pZCBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgc3RhdGUgbWF0Y2hlcywgdGFrZSB0aGUgc3RvcmVkIGRhdGFcbiAgICAgICAgLy8gYW5kIHNldCBpdCBpbnRvIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBnZXQgdGhlaXIgc3RhdGVcbiAgICAgICAgLy8gdGhpcyBpcyBpbXBvcnRhbnQgZm9yIGJvdGggc3VjY2VzcyAmIGVycm9yIG91dGNvbWVzXG4gICAgICAgIExvZy5kZWJ1ZyhcInN0YXRlIHZhbGlkYXRlZFwiKTtcbiAgICAgICAgcmVzcG9uc2Uuc3RhdGUgPSBzdGF0ZS5kYXRhO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgTG9nLndhcm4oXCJSZXNwb25zZSB3YXMgZXJyb3JcIiwgcmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUubm9uY2UgJiYgIXJlc3BvbnNlLmlkX3Rva2VuKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJFeHBlY3RpbmcgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gaWRfdG9rZW4gaW4gcmVzcG9uc2VcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5ub25jZSAmJiByZXNwb25zZS5pZF90b2tlbikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm90IGV4cGVjdGluZyBpZF90b2tlbiBpbiByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIF9wcm9jZXNzQ2xhaW1zKHJlc3BvbnNlKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ2xhaW1zXCIpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5pc09wZW5JZENvbm5lY3QpIHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlc3BvbnNlIGlzIE9JREMsIHByb2Nlc3NpbmcgY2xhaW1zXCIpO1xuXG4gICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMocmVzcG9uc2UucHJvZmlsZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5sb2FkVXNlckluZm8gJiYgcmVzcG9uc2UuYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwibG9hZGluZyB1c2VyIGluZm9cIik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlckluZm9TZXJ2aWNlLmdldENsYWltcyhyZXNwb25zZS5hY2Nlc3NfdG9rZW4pLnRoZW4oY2xhaW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBpbmZvIGNsYWltcyByZWNlaXZlZCBmcm9tIHVzZXIgaW5mbyBlbmRwb2ludFwiKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhaW1zLnN1YiAhPT0gcmVzcG9uc2UucHJvZmlsZS5zdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcInN1YiBmcm9tIHVzZXIgaW5mbyBlbmRwb2ludCBkb2VzIG5vdCBtYXRjaCBzdWIgaW4gYWNjZXNzX3Rva2VuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInN1YiBmcm9tIHVzZXIgaW5mbyBlbmRwb2ludCBkb2VzIG5vdCBtYXRjaCBzdWIgaW4gYWNjZXNzX3Rva2VuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnByb2ZpbGUgPSB0aGlzLl9tZXJnZUNsYWltcyhyZXNwb25zZS5wcm9maWxlLCBjbGFpbXMpO1xuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ1c2VyIGluZm8gY2xhaW1zIHJlY2VpdmVkLCB1cGRhdGVkIHByb2ZpbGU6XCIsIHJlc3BvbnNlLnByb2ZpbGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm5vdCBsb2FkaW5nIHVzZXIgaW5mb1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlc3BvbnNlIGlzIG5vdCBPSURDLCBub3QgcHJvY2Vzc2luZyBjbGFpbXNcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBfbWVyZ2VDbGFpbXMoY2xhaW1zMSwgY2xhaW1zMikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgY2xhaW1zMSk7XG5cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBjbGFpbXMyKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gY2xhaW1zMltuYW1lXTtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtuYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFtuYW1lXS5pbmRleE9mKHZhbHVlKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRbbmFtZV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IFtyZXN1bHRbbmFtZV0sIHZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIF9maWx0ZXJQcm90b2NvbENsYWltcyhjbGFpbXMpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX2ZpbHRlclByb3RvY29sQ2xhaW1zLCBpbmNvbWluZyBjbGFpbXM6XCIsIGNsYWltcyk7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGNsYWltcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLl9maWx0ZXJQcm90b2NvbENsYWltcykge1xuICAgICAgICAgICAgUHJvdG9jb2xDbGFpbXMuZm9yRWFjaCh0eXBlID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVzdWx0W3R5cGVdO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInByb3RvY29sIGNsYWltcyBmaWx0ZXJlZFwiLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwicHJvdG9jb2wgY2xhaW1zIG5vdCBmaWx0ZXJlZFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVUb2tlbnMoc3RhdGUsIHJlc3BvbnNlKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZVRva2Vuc1wiKTtcblxuICAgICAgICBpZiAocmVzcG9uc2UuaWRfdG9rZW4pIHtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlZhbGlkYXRpbmcgaWRfdG9rZW4gYW5kIGFjY2Vzc190b2tlblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW4oc3RhdGUsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVmFsaWRhdGluZyBpZF90b2tlblwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIExvZy5kZWJ1ZyhcIk5vIGlkX3Rva2VuIHRvIHZhbGlkYXRlXCIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW4oc3RhdGUsIHJlc3BvbnNlKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW5BbmRBY2Nlc3NUb2tlblwiKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVBY2Nlc3NUb2tlbihyZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW5cIik7XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5ub25jZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbm9uY2Ugb24gc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gbm9uY2Ugb24gc3RhdGVcIikpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgand0ID0gdGhpcy5fam9zZVV0aWwucGFyc2VKd3QocmVzcG9uc2UuaWRfdG9rZW4pO1xuICAgICAgICBpZiAoIWp3dCB8fCAhand0LmhlYWRlciB8fCAhand0LnBheWxvYWQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUubm9uY2UgIT09IGp3dC5wYXlsb2FkLm5vbmNlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIG5vbmNlIGluIGlkX3Rva2VuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGtpZCA9IGp3dC5oZWFkZXIua2lkO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0SXNzdWVyKCkudGhlbihpc3N1ZXIgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgaXNzdWVyXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzKCkudGhlbihrZXlzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2lnbmluZyBrZXlzIGZyb20gbWV0YWRhdGFcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgc2lnbmluZyBrZXlzXCIpO1xuICAgICAgICAgICAgICAgIGxldCBrZXk7XG4gICAgICAgICAgICAgICAgaWYgKCFraWQpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5cyA9IHRoaXMuX2ZpbHRlckJ5QWxnKGtleXMsIGp3dC5oZWFkZXIuYWxnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBraWQgZm91bmQgaW4gaWRfdG9rZW4gYW5kIG1vcmUgdGhhbiBvbmUga2V5IGZvdW5kIGluIG1ldGFkYXRhXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGtpZCBmb3VuZCBpbiBpZF90b2tlbiBhbmQgbW9yZSB0aGFuIG9uZSBrZXkgZm91bmQgaW4gbWV0YWRhdGFcIikpO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpZCBpcyBtYW5kYXRvcnkgb25seSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBrZXlzIGluIHRoZSByZWZlcmVuY2VkIEpXSyBTZXQgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1NpZ25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXMuZmlsdGVyKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmtpZCA9PT0ga2lkO1xuICAgICAgICAgICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBrZXkgbWF0Y2hpbmcga2lkIG9yIGFsZyBmb3VuZCBpbiBzaWduaW5nIGtleXNcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBrZXkgbWF0Y2hpbmcga2lkIG9yIGFsZyBmb3VuZCBpbiBzaWduaW5nIGtleXNcIikpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhdWRpZW5jZSA9IHN0YXRlLmNsaWVudF9pZDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgY2xvY2tTa2V3SW5TZWNvbmRzID0gdGhpcy5fc2V0dGluZ3MuY2xvY2tTa2V3O1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlZhbGlkYWluZyBKV1Q7IHVzaW5nIGNsb2NrIHNrZXcgKGluIHNlY29uZHMpIG9mOiBcIiwgY2xvY2tTa2V3SW5TZWNvbmRzKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9qb3NlVXRpbC52YWxpZGF0ZUp3dChyZXNwb25zZS5pZF90b2tlbiwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXdJblNlY29uZHMpLnRoZW4oKCk9PntcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSldUIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bFwiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICghand0LnBheWxvYWQuc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBzdWIgcHJlc2VudCBpbiBpZF90b2tlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzdWIgcHJlc2VudCBpbiBpZF90b2tlblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gand0LnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2ZpbHRlckJ5QWxnKGtleXMsIGFsZyl7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9maWx0ZXJCeUFsZ1wiLCBhbGcpO1xuXG4gICAgICAgIHZhciBrdHkgPSBudWxsO1xuICAgICAgICBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJSU1wiKSkge1xuICAgICAgICAgICAga3R5ID0gXCJSU0FcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGcuc3RhcnRzV2l0aChcIlBTXCIpKSB7XG4gICAgICAgICAgICBrdHkgPSBcIlBTXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJFU1wiKSkge1xuICAgICAgICAgICAga3R5ID0gXCJFQ1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiYWxnIG5vdCBzdXBwb3J0ZWQ6IFwiLCBhbGcpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBMb2cuZGVidWcoXCJMb29raW5nIGZvciBrZXlzIHRoYXQgbWF0Y2gga3R5OiBcIiwga3R5KTtcblxuICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBrZXkua3R5ID09PSBrdHk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIExvZy5kZWJ1ZyhcIk51bWJlciBvZiBrZXlzIHRoYXQgbWF0Y2gga3R5OiBcIiwga3R5LCBrZXlzLmxlbmd0aCk7XG5cbiAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlQWNjZXNzVG9rZW5cIik7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5wcm9maWxlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBwcm9maWxlIGxvYWRlZCBmcm9tIGlkX3Rva2VuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHByb2ZpbGUgbG9hZGVkIGZyb20gaWRfdG9rZW5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5wcm9maWxlLmF0X2hhc2gpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGF0X2hhc2ggaW4gaWRfdG9rZW5cIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gYXRfaGFzaCBpbiBpZF90b2tlblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3BvbnNlLmlkX3Rva2VuKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBpZF90b2tlblwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBpZF90b2tlblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgand0ID0gdGhpcy5fam9zZVV0aWwucGFyc2VKd3QocmVzcG9uc2UuaWRfdG9rZW4pO1xuICAgICAgICBpZiAoIWp3dCB8fCAhand0LmhlYWRlcikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIsIGp3dCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoYXNoQWxnID0gand0LmhlYWRlci5hbGc7XG4gICAgICAgIGlmICghaGFzaEFsZyB8fCBoYXNoQWxnLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOlwiLCBoYXNoQWxnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhhc2hCaXRzID0gaGFzaEFsZy5zdWJzdHIoMiwgMyk7XG4gICAgICAgIGlmICghaGFzaEJpdHMpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGFsZzpcIiwgaGFzaEFsZywgaGFzaEJpdHMpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFsZzogXCIgKyBoYXNoQWxnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBoYXNoQml0cyA9IHBhcnNlSW50KGhhc2hCaXRzKTtcbiAgICAgICAgaWYgKGhhc2hCaXRzICE9PSAyNTYgJiYgaGFzaEJpdHMgIT09IDM4NCAmJiBoYXNoQml0cyAhPT0gNTEyKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6XCIsIGhhc2hBbGcsIGhhc2hCaXRzKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNoYSA9IFwic2hhXCIgKyBoYXNoQml0cztcbiAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9qb3NlVXRpbC5oYXNoU3RyaW5nKHJlc3BvbnNlLmFjY2Vzc190b2tlbiwgc2hhKTtcbiAgICAgICAgaWYgKCFoYXNoKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJhY2Nlc3NfdG9rZW4gaGFzaCBmYWlsZWQ6XCIsIHNoYSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHZhbGlkYXRlIGF0X2hhc2hcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxlZnQgPSBoYXNoLnN1YnN0cigwLCBoYXNoLmxlbmd0aCAvIDIpO1xuICAgICAgICB2YXIgbGVmdF9iNjR1ID0gdGhpcy5fam9zZVV0aWwuaGV4VG9CYXNlNjRVcmwobGVmdCk7XG4gICAgICAgIGlmIChsZWZ0X2I2NHUgIT09IHJlc3BvbnNlLnByb2ZpbGUuYXRfaGFzaCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiRmFpbGVkIHRvIHZhbGlkYXRlIGF0X2hhc2hcIiwgbGVmdF9iNjR1LCByZXNwb25zZS5wcm9maWxlLmF0X2hhc2gpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9SZXNwb25zZVZhbGlkYXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IEpzb25TZXJ2aWNlIGZyb20gJy4vSnNvblNlcnZpY2UnO1xuXG5jb25zdCBPaWRjTWV0YWRhdGFVcmxQYXRoID0gJy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIE1ldGFkYXRhU2VydmljZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIEpzb25TZXJ2aWNlQ3RvciA9IEpzb25TZXJ2aWNlKSB7XG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBNZXRhZGF0YVNlcnZpY2VcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXR0aW5nc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX2pzb25TZXJ2aWNlID0gbmV3IEpzb25TZXJ2aWNlQ3RvcigpO1xuICAgIH1cblxuICAgIGdldCBtZXRhZGF0YVVybCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tZXRhZGF0YVVybCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhVXJsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSB0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YVVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21ldGFkYXRhVXJsICYmIHRoaXMuX21ldGFkYXRhVXJsLmluZGV4T2YoT2lkY01ldGFkYXRhVXJsUGF0aCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybFt0aGlzLl9tZXRhZGF0YVVybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSAnLyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gT2lkY01ldGFkYXRhVXJsUGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFVcmw7XG4gICAgfVxuXG4gICAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRNZXRhZGF0YVwiKTtcblxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJldHVybmluZyBtZXRhZGF0YSBmcm9tIHNldHRpbmdzXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFVcmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGF1dGhvcml0eSBvciBtZXRhZGF0YVVybCBjb25maWd1cmVkIG9uIHNldHRpbmdzXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF1dGhvcml0eSBvciBtZXRhZGF0YVVybCBjb25maWd1cmVkIG9uIHNldHRpbmdzXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIExvZy5kZWJ1ZyhcImdldHRpbmcgbWV0YWRhdGEgZnJvbVwiLCB0aGlzLm1ldGFkYXRhVXJsKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbih0aGlzLm1ldGFkYXRhVXJsKVxuICAgICAgICAgICAgLnRoZW4obWV0YWRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImpzb24gcmVjZWl2ZWRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRJc3N1ZXIoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRJc3N1ZXJcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiaXNzdWVyXCIpO1xuICAgIH1cblxuICAgIGdldEF1dGhvcml6YXRpb25FbmRwb2ludCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldEF1dGhvcml6YXRpb25FbmRwb2ludFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJhdXRob3JpemF0aW9uX2VuZHBvaW50XCIpO1xuICAgIH1cblxuICAgIGdldFVzZXJJbmZvRW5kcG9pbnQoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRVc2VySW5mb0VuZHBvaW50XCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcInVzZXJpbmZvX2VuZHBvaW50XCIpO1xuICAgIH1cblxuICAgIGdldFRva2VuRW5kcG9pbnQoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRUb2tlbkVuZHBvaW50XCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcInRva2VuX2VuZHBvaW50XCIsIHRydWUpO1xuICAgIH1cblxuICAgIGdldENoZWNrU2Vzc2lvbklmcmFtZSgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldENoZWNrU2Vzc2lvbklmcmFtZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJjaGVja19zZXNzaW9uX2lmcmFtZVwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICBnZXRFbmRTZXNzaW9uRW5kcG9pbnQoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRFbmRTZXNzaW9uRW5kcG9pbnRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiZW5kX3Nlc3Npb25fZW5kcG9pbnRcIiwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0UmV2b2NhdGlvbkVuZHBvaW50KCkge1xuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0UmV2b2NhdGlvbkVuZHBvaW50XCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcInJldm9jYXRpb25fZW5kcG9pbnRcIiwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgX2dldE1ldGFkYXRhUHJvcGVydHkobmFtZSwgb3B0aW9uYWw9ZmFsc2UpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLl9nZXRNZXRhZGF0YVByb3BlcnR5XCIsIG5hbWUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGFkYXRhKCkudGhlbihtZXRhZGF0YSA9PiB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJtZXRhZGF0YSByZWNpZXZlZFwiKTtcblxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhW25hbWVdID09PSB1bmRlZmluZWQpIHtcblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25hbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBMb2cud2FybihcIk1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gb3B0aW9uYWwgcHJvcGVydHkgXCIgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVydHkgXCIgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0YWRhdGEgZG9lcyBub3QgY29udGFpbiBwcm9wZXJ0eSBcIiArIG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhW25hbWVdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRTaWduaW5nS2V5cygpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cykge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmV0dXJuaW5nIHNpZ25pbmdLZXlzIGZyb20gc2V0dGluZ3NcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiandrc191cmlcIikudGhlbihqd2tzX3VyaSA9PiB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJqd2tzX3VyaSByZWNlaXZlZFwiLCBqd2tzX3VyaSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKGp3a3NfdXJpKS50aGVuKGtleVNldCA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwia2V5IHNldCByZWNlaXZlZFwiLCBrZXlTZXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXlTZXQua2V5cykge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJNaXNzaW5nIGtleXMgb24ga2V5c2V0XCIpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGtleXMgb24ga2V5c2V0XCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzID0ga2V5U2V0LmtleXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9NZXRhZGF0YVNlcnZpY2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi9HbG9iYWwnO1xuXG5leHBvcnQgY2xhc3MgSnNvblNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKFhNTEh0dHBSZXF1ZXN0Q3RvciA9IEdsb2JhbC5YTUxIdHRwUmVxdWVzdCkge1xuICAgICAgICB0aGlzLl9YTUxIdHRwUmVxdWVzdCA9IFhNTEh0dHBSZXF1ZXN0Q3RvcjtcbiAgICB9XG5cbiAgICBnZXRKc29uKHVybCwgdG9rZW4pIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiSnNvblNlcnZpY2UuZ2V0SnNvblwiLCB1cmwpO1xuXG4gICAgICAgIGlmICghdXJsKXtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWRcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmxcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgICAgICB2YXIgcmVxID0gbmV3IHRoaXMuX1hNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICByZXEub3BlbignR0VUJywgdXJsKTtcblxuICAgICAgICAgICAgcmVxLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQsIHN0YXR1c1wiLCByZXEuc3RhdHVzKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXEuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkVycm9yIHBhcnNpbmcgSlNPTiByZXNwb25zZVwiLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IocmVxLnN0YXR1c1RleHQgKyBcIiAoXCIgKyByZXEuc3RhdHVzICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIm5ldHdvcmsgZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKFwiTmV0d29yayBFcnJvclwiKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ0b2tlbiBwYXNzZWQsIHNldHRpbmcgQXV0aG9yaXphdGlvbiBoZWFkZXJcIik7XG4gICAgICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgdG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXEuc2VuZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvSnNvblNlcnZpY2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgSnNvblNlcnZpY2UgZnJvbSAnLi9Kc29uU2VydmljZSc7XG5pbXBvcnQgTWV0YWRhdGFTZXJ2aWNlIGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlJztcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5leHBvcnQgY2xhc3MgVXNlckluZm9TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2V0dGluZ3MgcGFzc2VkIHRvIFVzZXJJbmZvU2VydmljZVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5fanNvblNlcnZpY2UgPSBuZXcgSnNvblNlcnZpY2VDdG9yKCk7XG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG5cbiAgICBnZXRDbGFpbXModG9rZW4pIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlckluZm9TZXJ2aWNlLmdldENsYWltc1wiKTtcblxuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB0b2tlbiBwYXNzZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQSB0b2tlbiBpcyByZXF1aXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldFVzZXJJbmZvRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJyZWNlaXZlZCB1c2VyaW5mbyB1cmxcIiwgdXJsKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pzb25TZXJ2aWNlLmdldEpzb24odXJsLCB0b2tlbikudGhlbihjbGFpbXMgPT4ge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImNsYWltcyByZWNlaXZlZFwiLCBjbGFpbXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFpbXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1VzZXJJbmZvU2VydmljZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5leHBvcnQgY2xhc3MgRXJyb3JSZXNwb25zZSBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7ZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uLCBlcnJvcl91cmksIHN0YXRlfT17fVxuICAgICkge1xuICAgICAgICAgaWYgKCFlcnJvcil7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBlcnJvciBwYXNzZWQgdG8gRXJyb3JSZXNwb25zZVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImVycm9yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIoZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyb3IpO1xuXG4gICAgICAgIHRoaXMubmFtZSA9IFwiRXJyb3JSZXNwb25zZVwiO1xuXG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IGVycm9yX2Rlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IGVycm9yX3VyaTtcblxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0Vycm9yUmVzcG9uc2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgeyBqd3MsIEtFWVVUSUwgYXMgS2V5VXRpbCwgWDUwOSwgY3J5cHRvLCBoZXh0b2I2NHUgfSBmcm9tICdqc3JzYXNpZ24nO1xuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmNvbnN0IEFsbG93ZWRTaWduaW5nQWxncyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLCAnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInLCAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXTtcblxuZXhwb3J0IGNsYXNzIEpvc2VVdGlsIHtcblxuICAgIHN0YXRpYyBwYXJzZUp3dChqd3QpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiSm9zZVV0aWwucGFyc2VKd3RcIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgdG9rZW4gPSBqd3MuSldTLnBhcnNlKGp3dCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhlYWRlcjogdG9rZW4uaGVhZGVyT2JqLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHRva2VuLnBheWxvYWRPYmpcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdykge1xuICAgICAgICBMb2cuZGVidWcoXCJKb3NlVXRpbC52YWxpZGF0ZUp3dFwiKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGtleS5rdHkgPT09IFwiUlNBXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmUgJiYga2V5Lm4pIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gS2V5VXRpbC5nZXRLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5Lng1YyAmJiBrZXkueDVjLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBLZXlVdGlsLmdldEtleShYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0UEVNKGtleS54NWNbMF0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlJTQSBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIiwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlJTQSBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleS5rdHkgPT09IFwiRUNcIikge1xuICAgICAgICAgICAgICAgIGlmIChrZXkuY3J2ICYmIGtleS54ICYmIGtleS55KSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFQyBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIiwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVDIGtleSBtaXNzaW5nIGtleSBtYXRlcmlhbFwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQga2V5IHR5cGVcIiwga2V5ICYmIGtleS5rdHkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBrZXkgdHlwZTogXCIgKyBrZXkgJiYga2V5Lmt0eSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gSm9zZVV0aWwuX3ZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihlICYmIGUubWVzc2FnZSB8fCBlKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkpXVCB2YWxpZGF0aW9uIGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBfdmFsaWRhdGVKd3Qoand0LCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dFwiKTtcblxuICAgICAgICBpZiAoIWNsb2NrU2tldykge1xuICAgICAgICAgICAgY2xvY2tTa2V3ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm93KSB7XG4gICAgICAgICAgICBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGF5bG9hZCA9IEpvc2VVdGlsLnBhcnNlSnd0KGp3dCkucGF5bG9hZDtcblxuICAgICAgICBpZiAoIXBheWxvYWQuaXNzKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJpc3N1ZXIgd2FzIG5vdCBwcm92aWRlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJpc3N1ZXIgd2FzIG5vdCBwcm92aWRlZFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQuaXNzICE9PSBpc3N1ZXIpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkludmFsaWQgaXNzdWVyIGluIHRva2VuXCIsIHBheWxvYWQuaXNzKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGlzc3VlciBpbiB0b2tlbjogXCIgKyBwYXlsb2FkLmlzcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXlsb2FkLmF1ZCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiYXVkIHdhcyBub3QgcHJvdmlkZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiYXVkIHdhcyBub3QgcHJvdmlkZWRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2YWxpZEF1ZGllbmNlID0gcGF5bG9hZC5hdWQgPT09IGF1ZGllbmNlIHx8IChBcnJheS5pc0FycmF5KHBheWxvYWQuYXVkKSAmJiBwYXlsb2FkLmF1ZC5pbmRleE9mKGF1ZGllbmNlKSA+PSAwKTsgXG4gICAgICAgIGlmICghdmFsaWRBdWRpZW5jZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiSW52YWxpZCBhdWRpZW5jZSBpbiB0b2tlblwiLCBwYXlsb2FkLmF1ZCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBhdWRpZW5jZSBpbiB0b2tlbjogXCIgKyBwYXlsb2FkLmF1ZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvd2VyTm93ID0gbm93ICsgY2xvY2tTa2V3O1xuICAgICAgICB2YXIgdXBwZXJOb3cgPSBub3cgLSBjbG9ja1NrZXc7XG5cbiAgICAgICAgaWYgKCFwYXlsb2FkLmlhdCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiaWF0IHdhcyBub3QgcHJvdmlkZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiaWF0IHdhcyBub3QgcHJvdmlkZWRcIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlck5vdyA8IHBheWxvYWQuaWF0KSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJpYXQgaXMgaW4gdGhlIGZ1dHVyZVwiLCBwYXlsb2FkLmlhdCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiaWF0IGlzIGluIHRoZSBmdXR1cmU6IFwiICsgcGF5bG9hZC5pYXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXlsb2FkLm5iZiAmJiBsb3dlck5vdyA8IHBheWxvYWQubmJmKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJuYmYgaXMgaW4gdGhlIGZ1dHVyZVwiLCBwYXlsb2FkLm5iZik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwibmJmIGlzIGluIHRoZSBmdXR1cmU6IFwiICsgcGF5bG9hZC5uYmYpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF5bG9hZC5leHApIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImV4cCB3YXMgbm90IHByb3ZpZGVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImV4cCB3YXMgbm90IHByb3ZpZGVkXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF5bG9hZC5leHAgPCB1cHBlck5vdykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiZXhwIGlzIGluIHRoZSBwYXN0XCIsIHBheWxvYWQuZXhwKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJleHAgaXMgaW4gdGhlIHBhc3Q6XCIgKyBwYXlsb2FkLmV4cCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghandzLkpXUy52ZXJpZnkoand0LCBrZXksIEFsbG93ZWRTaWduaW5nQWxncykpIHtcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInNpZ25hdHVyZSB2YWxpZGF0aW9uIGZhaWxlZFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihlICYmIGUubWVzc2FnZSB8fCBlKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBoYXNoU3RyaW5nKHZhbHVlLCBhbGcpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiSm9zZVV0aWwuaGFzaFN0cmluZ1wiLCB2YWx1ZSwgYWxnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBjcnlwdG8uVXRpbC5oYXNoU3RyaW5nKHZhbHVlLCBhbGcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaGV4VG9CYXNlNjRVcmwodmFsdWUpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiSm9zZVV0aWwuaGV4VG9CYXNlNjRVcmxcIiwgdmFsdWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGhleHRvYjY0dSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9Kb3NlVXRpbC5qcyIsIlxudmFyIG5hdmlnYXRvciA9IHt9O1xubmF2aWdhdG9yLnVzZXJBZ2VudCA9IGZhbHNlO1xuXG52YXIgd2luZG93ID0ge307XG4vKlxuICoganNyc2FzaWduIDUuMS4wICgyMDE2LTA5LTA4KSAoYykgMjAxMC0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cblxuLypcbnlhaG9vLW1pbi5qc1xuQ29weXJpZ2h0IChjKSAyMDExLCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuQ29kZSBsaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2U6XG5odHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS95dWkvbGljZW5zZS5odG1sXG52ZXJzaW9uOiAyLjkuMFxuKi9cbmlmKHR5cGVvZiBZQUhPTz09XCJ1bmRlZmluZWRcInx8IVlBSE9PKXt2YXIgWUFIT089e307fVlBSE9PLm5hbWVzcGFjZT1mdW5jdGlvbigpe3ZhciBiPWFyZ3VtZW50cyxnPW51bGwsZSxjLGY7Zm9yKGU9MDtlPGIubGVuZ3RoO2U9ZSsxKXtmPShcIlwiK2JbZV0pLnNwbGl0KFwiLlwiKTtnPVlBSE9PO2ZvcihjPShmWzBdPT1cIllBSE9PXCIpPzE6MDtjPGYubGVuZ3RoO2M9YysxKXtnW2ZbY11dPWdbZltjXV18fHt9O2c9Z1tmW2NdXTt9fXJldHVybiBnO307WUFIT08ubG9nPWZ1bmN0aW9uKGQsYSxjKXt2YXIgYj1ZQUhPTy53aWRnZXQuTG9nZ2VyO2lmKGImJmIubG9nKXtyZXR1cm4gYi5sb2coZCxhLGMpO31lbHNle3JldHVybiBmYWxzZTt9fTtZQUhPTy5yZWdpc3Rlcj1mdW5jdGlvbihhLGYsZSl7dmFyIGs9WUFIT08uZW52Lm1vZHVsZXMsYyxqLGgsZyxkO2lmKCFrW2FdKXtrW2FdPXt2ZXJzaW9uczpbXSxidWlsZHM6W119O31jPWtbYV07aj1lLnZlcnNpb247aD1lLmJ1aWxkO2c9WUFIT08uZW52Lmxpc3RlbmVycztjLm5hbWU9YTtjLnZlcnNpb249ajtjLmJ1aWxkPWg7Yy52ZXJzaW9ucy5wdXNoKGopO2MuYnVpbGRzLnB1c2goaCk7Yy5tYWluQ2xhc3M9Zjtmb3IoZD0wO2Q8Zy5sZW5ndGg7ZD1kKzEpe2dbZF0oYyk7fWlmKGYpe2YuVkVSU0lPTj1qO2YuQlVJTEQ9aDt9ZWxzZXtZQUhPTy5sb2coXCJtYWluQ2xhc3MgaXMgdW5kZWZpbmVkIGZvciBtb2R1bGUgXCIrYSxcIndhcm5cIik7fX07WUFIT08uZW52PVlBSE9PLmVudnx8e21vZHVsZXM6W10sbGlzdGVuZXJzOltdfTtZQUhPTy5lbnYuZ2V0VmVyc2lvbj1mdW5jdGlvbihhKXtyZXR1cm4gWUFIT08uZW52Lm1vZHVsZXNbYV18fG51bGw7fTtZQUhPTy5lbnYucGFyc2VVQT1mdW5jdGlvbihkKXt2YXIgZT1mdW5jdGlvbihpKXt2YXIgaj0wO3JldHVybiBwYXJzZUZsb2F0KGkucmVwbGFjZSgvXFwuL2csZnVuY3Rpb24oKXtyZXR1cm4oaisrPT0xKT9cIlwiOlwiLlwiO30pKTt9LGg9bmF2aWdhdG9yLGc9e2llOjAsb3BlcmE6MCxnZWNrbzowLHdlYmtpdDowLGNocm9tZTowLG1vYmlsZTpudWxsLGFpcjowLGlwYWQ6MCxpcGhvbmU6MCxpcG9kOjAsaW9zOm51bGwsYW5kcm9pZDowLHdlYm9zOjAsY2FqYTpoJiZoLmNhamFWZXJzaW9uLHNlY3VyZTpmYWxzZSxvczpudWxsfSxjPWR8fChuYXZpZ2F0b3ImJm5hdmlnYXRvci51c2VyQWdlbnQpLGY9d2luZG93JiZ3aW5kb3cubG9jYXRpb24sYj1mJiZmLmhyZWYsYTtnLnNlY3VyZT1iJiYoYi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJodHRwc1wiKT09PTApO2lmKGMpe2lmKCgvd2luZG93c3x3aW4zMi9pKS50ZXN0KGMpKXtnLm9zPVwid2luZG93c1wiO31lbHNle2lmKCgvbWFjaW50b3NoL2kpLnRlc3QoYykpe2cub3M9XCJtYWNpbnRvc2hcIjt9ZWxzZXtpZigoL3JoaW5vL2kpLnRlc3QoYykpe2cub3M9XCJyaGlub1wiO319fWlmKCgvS0hUTUwvKS50ZXN0KGMpKXtnLndlYmtpdD0xO31hPWMubWF0Y2goL0FwcGxlV2ViS2l0XFwvKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy53ZWJraXQ9ZShhWzFdKTtpZigvIE1vYmlsZVxcLy8udGVzdChjKSl7Zy5tb2JpbGU9XCJBcHBsZVwiO2E9Yy5tYXRjaCgvT1MgKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7YT1lKGFbMV0ucmVwbGFjZShcIl9cIixcIi5cIikpO31nLmlvcz1hO2cuaXBhZD1nLmlwb2Q9Zy5pcGhvbmU9MDthPWMubWF0Y2goL2lQYWR8aVBvZHxpUGhvbmUvKTtpZihhJiZhWzBdKXtnW2FbMF0udG9Mb3dlckNhc2UoKV09Zy5pb3M7fX1lbHNle2E9Yy5tYXRjaCgvTm9raWFOW15cXC9dKnxBbmRyb2lkIFxcZFxcLlxcZHx3ZWJPU1xcL1xcZFxcLlxcZC8pO2lmKGEpe2cubW9iaWxlPWFbMF07fWlmKC93ZWJPUy8udGVzdChjKSl7Zy5tb2JpbGU9XCJXZWJPU1wiO2E9Yy5tYXRjaCgvd2ViT1NcXC8oW15cXHNdKik7Lyk7aWYoYSYmYVsxXSl7Zy53ZWJvcz1lKGFbMV0pO319aWYoLyBBbmRyb2lkLy50ZXN0KGMpKXtnLm1vYmlsZT1cIkFuZHJvaWRcIjthPWMubWF0Y2goL0FuZHJvaWQgKFteXFxzXSopOy8pO2lmKGEmJmFbMV0pe2cuYW5kcm9pZD1lKGFbMV0pO319fWE9Yy5tYXRjaCgvQ2hyb21lXFwvKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy5jaHJvbWU9ZShhWzFdKTt9ZWxzZXthPWMubWF0Y2goL0Fkb2JlQUlSXFwvKFteXFxzXSopLyk7aWYoYSl7Zy5haXI9YVswXTt9fX1pZighZy53ZWJraXQpe2E9Yy5tYXRjaCgvT3BlcmFbXFxzXFwvXShbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2cub3BlcmE9ZShhWzFdKTthPWMubWF0Y2goL1ZlcnNpb25cXC8oW15cXHNdKikvKTtpZihhJiZhWzFdKXtnLm9wZXJhPWUoYVsxXSk7fWE9Yy5tYXRjaCgvT3BlcmEgTWluaVteO10qLyk7aWYoYSl7Zy5tb2JpbGU9YVswXTt9fWVsc2V7YT1jLm1hdGNoKC9NU0lFXFxzKFteO10qKS8pO2lmKGEmJmFbMV0pe2cuaWU9ZShhWzFdKTt9ZWxzZXthPWMubWF0Y2goL0dlY2tvXFwvKFteXFxzXSopLyk7aWYoYSl7Zy5nZWNrbz0xO2E9Yy5tYXRjaCgvcnY6KFteXFxzXFwpXSopLyk7aWYoYSYmYVsxXSl7Zy5nZWNrbz1lKGFbMV0pO319fX19fXJldHVybiBnO307WUFIT08uZW52LnVhPVlBSE9PLmVudi5wYXJzZVVBKCk7KGZ1bmN0aW9uKCl7WUFIT08ubmFtZXNwYWNlKFwidXRpbFwiLFwid2lkZ2V0XCIsXCJleGFtcGxlXCIpO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgWUFIT09fY29uZmlnKXt2YXIgYj1ZQUhPT19jb25maWcubGlzdGVuZXIsYT1ZQUhPTy5lbnYubGlzdGVuZXJzLGQ9dHJ1ZSxjO2lmKGIpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspe2lmKGFbY109PWIpe2Q9ZmFsc2U7YnJlYWs7fX1pZihkKXthLnB1c2goYik7fX19fSkoKTtZQUhPTy5sYW5nPVlBSE9PLmxhbmd8fHt9OyhmdW5jdGlvbigpe3ZhciBmPVlBSE9PLmxhbmcsYT1PYmplY3QucHJvdG90eXBlLGM9XCJbb2JqZWN0IEFycmF5XVwiLGg9XCJbb2JqZWN0IEZ1bmN0aW9uXVwiLGk9XCJbb2JqZWN0IE9iamVjdF1cIixiPVtdLGc9e1wiJlwiOlwiJmFtcDtcIixcIjxcIjpcIiZsdDtcIixcIj5cIjpcIiZndDtcIiwnXCInOlwiJnF1b3Q7XCIsXCInXCI6XCImI3gyNztcIixcIi9cIjpcIiYjeDJGO1wiLFwiYFwiOlwiJiN4NjA7XCJ9LGQ9W1widG9TdHJpbmdcIixcInZhbHVlT2ZcIl0sZT17aXNBcnJheTpmdW5jdGlvbihqKXtyZXR1cm4gYS50b1N0cmluZy5hcHBseShqKT09PWM7fSxpc0Jvb2xlYW46ZnVuY3Rpb24oail7cmV0dXJuIHR5cGVvZiBqPT09XCJib29sZWFuXCI7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGope3JldHVybih0eXBlb2Ygaj09PVwiZnVuY3Rpb25cIil8fGEudG9TdHJpbmcuYXBwbHkoaik9PT1oO30saXNOdWxsOmZ1bmN0aW9uKGope3JldHVybiBqPT09bnVsbDt9LGlzTnVtYmVyOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwibnVtYmVyXCImJmlzRmluaXRlKGopO30saXNPYmplY3Q6ZnVuY3Rpb24oail7cmV0dXJuKGomJih0eXBlb2Ygaj09PVwib2JqZWN0XCJ8fGYuaXNGdW5jdGlvbihqKSkpfHxmYWxzZTt9LGlzU3RyaW5nOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwic3RyaW5nXCI7fSxpc1VuZGVmaW5lZDpmdW5jdGlvbihqKXtyZXR1cm4gdHlwZW9mIGo9PT1cInVuZGVmaW5lZFwiO30sX0lFRW51bUZpeDooWUFIT08uZW52LnVhLmllKT9mdW5jdGlvbihsLGspe3ZhciBqLG4sbTtmb3Ioaj0wO2o8ZC5sZW5ndGg7aj1qKzEpe249ZFtqXTttPWtbbl07aWYoZi5pc0Z1bmN0aW9uKG0pJiZtIT1hW25dKXtsW25dPW07fX19OmZ1bmN0aW9uKCl7fSxlc2NhcGVIVE1MOmZ1bmN0aW9uKGope3JldHVybiBqLnJlcGxhY2UoL1smPD5cIidcXC9gXS9nLGZ1bmN0aW9uKGspe3JldHVybiBnW2tdO30pO30sZXh0ZW5kOmZ1bmN0aW9uKG0sbixsKXtpZighbnx8IW0pe3Rocm93IG5ldyBFcnJvcihcImV4dGVuZCBmYWlsZWQsIHBsZWFzZSBjaGVjayB0aGF0IFwiK1wiYWxsIGRlcGVuZGVuY2llcyBhcmUgaW5jbHVkZWQuXCIpO312YXIgaz1mdW5jdGlvbigpe30sajtrLnByb3RvdHlwZT1uLnByb3RvdHlwZTttLnByb3RvdHlwZT1uZXcgaygpO20ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW07bS5zdXBlcmNsYXNzPW4ucHJvdG90eXBlO2lmKG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPT1hLmNvbnN0cnVjdG9yKXtuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uO31pZihsKXtmb3IoaiBpbiBsKXtpZihmLmhhc093blByb3BlcnR5KGwsaikpe20ucHJvdG90eXBlW2pdPWxbal07fX1mLl9JRUVudW1GaXgobS5wcm90b3R5cGUsbCk7fX0sYXVnbWVudE9iamVjdDpmdW5jdGlvbihuLG0pe2lmKCFtfHwhbil7dGhyb3cgbmV3IEVycm9yKFwiQWJzb3JiIGZhaWxlZCwgdmVyaWZ5IGRlcGVuZGVuY2llcy5cIik7fXZhciBqPWFyZ3VtZW50cyxsLG8saz1qWzJdO2lmKGsmJmshPT10cnVlKXtmb3IobD0yO2w8ai5sZW5ndGg7bD1sKzEpe25baltsXV09bVtqW2xdXTt9fWVsc2V7Zm9yKG8gaW4gbSl7aWYoa3x8IShvIGluIG4pKXtuW29dPW1bb107fX1mLl9JRUVudW1GaXgobixtKTt9cmV0dXJuIG47fSxhdWdtZW50UHJvdG86ZnVuY3Rpb24obSxsKXtpZighbHx8IW0pe3Rocm93IG5ldyBFcnJvcihcIkF1Z21lbnQgZmFpbGVkLCB2ZXJpZnkgZGVwZW5kZW5jaWVzLlwiKTt9dmFyIGo9W20ucHJvdG90eXBlLGwucHJvdG90eXBlXSxrO2ZvcihrPTI7azxhcmd1bWVudHMubGVuZ3RoO2s9aysxKXtqLnB1c2goYXJndW1lbnRzW2tdKTt9Zi5hdWdtZW50T2JqZWN0LmFwcGx5KHRoaXMsaik7cmV0dXJuIG07fSxkdW1wOmZ1bmN0aW9uKGoscCl7dmFyIGwsbixyPVtdLHQ9XCJ7Li4ufVwiLGs9XCJmKCl7Li4ufVwiLHE9XCIsIFwiLG09XCIgPT4gXCI7aWYoIWYuaXNPYmplY3Qoaikpe3JldHVybiBqK1wiXCI7fWVsc2V7aWYoaiBpbnN0YW5jZW9mIERhdGV8fChcIm5vZGVUeXBlXCIgaW4gaiYmXCJ0YWdOYW1lXCIgaW4gaikpe3JldHVybiBqO31lbHNle2lmKGYuaXNGdW5jdGlvbihqKSl7cmV0dXJuIGs7fX19cD0oZi5pc051bWJlcihwKSk/cDozO2lmKGYuaXNBcnJheShqKSl7ci5wdXNoKFwiW1wiKTtmb3IobD0wLG49ai5sZW5ndGg7bDxuO2w9bCsxKXtpZihmLmlzT2JqZWN0KGpbbF0pKXtyLnB1c2goKHA+MCk/Zi5kdW1wKGpbbF0scC0xKTp0KTt9ZWxzZXtyLnB1c2goaltsXSk7fXIucHVzaChxKTt9aWYoci5sZW5ndGg+MSl7ci5wb3AoKTt9ci5wdXNoKFwiXVwiKTt9ZWxzZXtyLnB1c2goXCJ7XCIpO2ZvcihsIGluIGope2lmKGYuaGFzT3duUHJvcGVydHkoaixsKSl7ci5wdXNoKGwrbSk7aWYoZi5pc09iamVjdChqW2xdKSl7ci5wdXNoKChwPjApP2YuZHVtcChqW2xdLHAtMSk6dCk7fWVsc2V7ci5wdXNoKGpbbF0pO31yLnB1c2gocSk7fX1pZihyLmxlbmd0aD4xKXtyLnBvcCgpO31yLnB1c2goXCJ9XCIpO31yZXR1cm4gci5qb2luKFwiXCIpO30sc3Vic3RpdHV0ZTpmdW5jdGlvbih4LHksRSxsKXt2YXIgRCxDLEIsRyx0LHUsRj1bXSxwLHo9eC5sZW5ndGgsQT1cImR1bXBcIixyPVwiIFwiLHE9XCJ7XCIsbT1cIn1cIixuLHc7Zm9yKDs7KXtEPXgubGFzdEluZGV4T2YocSx6KTtpZihEPDApe2JyZWFrO31DPXguaW5kZXhPZihtLEQpO2lmKEQrMT5DKXticmVhazt9cD14LnN1YnN0cmluZyhEKzEsQyk7Rz1wO3U9bnVsbDtCPUcuaW5kZXhPZihyKTtpZihCPi0xKXt1PUcuc3Vic3RyaW5nKEIrMSk7Rz1HLnN1YnN0cmluZygwLEIpO310PXlbR107aWYoRSl7dD1FKEcsdCx1KTt9aWYoZi5pc09iamVjdCh0KSl7aWYoZi5pc0FycmF5KHQpKXt0PWYuZHVtcCh0LHBhcnNlSW50KHUsMTApKTt9ZWxzZXt1PXV8fFwiXCI7bj11LmluZGV4T2YoQSk7aWYobj4tMSl7dT11LnN1YnN0cmluZyg0KTt9dz10LnRvU3RyaW5nKCk7aWYodz09PWl8fG4+LTEpe3Q9Zi5kdW1wKHQscGFyc2VJbnQodSwxMCkpO31lbHNle3Q9dzt9fX1lbHNle2lmKCFmLmlzU3RyaW5nKHQpJiYhZi5pc051bWJlcih0KSl7dD1cIn4tXCIrRi5sZW5ndGgrXCItflwiO0ZbRi5sZW5ndGhdPXA7fX14PXguc3Vic3RyaW5nKDAsRCkrdCt4LnN1YnN0cmluZyhDKzEpO2lmKGw9PT1mYWxzZSl7ej1ELTE7fX1mb3IoRD1GLmxlbmd0aC0xO0Q+PTA7RD1ELTEpe3g9eC5yZXBsYWNlKG5ldyBSZWdFeHAoXCJ+LVwiK0QrXCItflwiKSxcIntcIitGW0RdK1wifVwiLFwiZ1wiKTt9cmV0dXJuIHg7fSx0cmltOmZ1bmN0aW9uKGope3RyeXtyZXR1cm4gai5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLFwiXCIpO31jYXRjaChrKXtyZXR1cm4gajtcbn19LG1lcmdlOmZ1bmN0aW9uKCl7dmFyIG49e30saz1hcmd1bWVudHMsaj1rLmxlbmd0aCxtO2ZvcihtPTA7bTxqO209bSsxKXtmLmF1Z21lbnRPYmplY3QobixrW21dLHRydWUpO31yZXR1cm4gbjt9LGxhdGVyOmZ1bmN0aW9uKHQsayx1LG4scCl7dD10fHwwO2s9a3x8e307dmFyIGw9dSxzPW4scSxqO2lmKGYuaXNTdHJpbmcodSkpe2w9a1t1XTt9aWYoIWwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJtZXRob2QgdW5kZWZpbmVkXCIpO31pZighZi5pc1VuZGVmaW5lZChuKSYmIWYuaXNBcnJheShzKSl7cz1bbl07fXE9ZnVuY3Rpb24oKXtsLmFwcGx5KGssc3x8Yik7fTtqPShwKT9zZXRJbnRlcnZhbChxLHQpOnNldFRpbWVvdXQocSx0KTtyZXR1cm57aW50ZXJ2YWw6cCxjYW5jZWw6ZnVuY3Rpb24oKXtpZih0aGlzLmludGVydmFsKXtjbGVhckludGVydmFsKGopO31lbHNle2NsZWFyVGltZW91dChqKTt9fX07fSxpc1ZhbHVlOmZ1bmN0aW9uKGope3JldHVybihmLmlzT2JqZWN0KGopfHxmLmlzU3RyaW5nKGopfHxmLmlzTnVtYmVyKGopfHxmLmlzQm9vbGVhbihqKSk7fX07Zi5oYXNPd25Qcm9wZXJ0eT0oYS5oYXNPd25Qcm9wZXJ0eSk/ZnVuY3Rpb24oaixrKXtyZXR1cm4gaiYmai5oYXNPd25Qcm9wZXJ0eSYmai5oYXNPd25Qcm9wZXJ0eShrKTt9OmZ1bmN0aW9uKGosayl7cmV0dXJuICFmLmlzVW5kZWZpbmVkKGpba10pJiZqLmNvbnN0cnVjdG9yLnByb3RvdHlwZVtrXSE9PWpba107fTtlLmF1Z21lbnRPYmplY3QoZixlLHRydWUpO1lBSE9PLnV0aWwuTGFuZz1mO2YuYXVnbWVudD1mLmF1Z21lbnRQcm90bztZQUhPTy5hdWdtZW50PWYuYXVnbWVudFByb3RvO1lBSE9PLmV4dGVuZD1mLmV4dGVuZDt9KSgpO1lBSE9PLnJlZ2lzdGVyKFwieWFob29cIixZQUhPTyx7dmVyc2lvbjpcIjIuOS4wXCIsYnVpbGQ6XCIyODAwXCJ9KTtcblxuLyohIENyeXB0b0pTIHYzLjEuMiBjb3JlLWZpeC5qc1xuICogY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4gKiAoYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIGNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiAqIFRISVMgSVMgRklYIG9mICdjb3JlLmpzJyB0byBmaXggSG1hYyBpc3N1ZS5cbiAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL2lzc3Vlcy9kZXRhaWw/aWQ9ODRcbiAqIGh0dHBzOi8vY3J5cHRvLWpzLmdvb2dsZWNvZGUuY29tL3N2bi1oaXN0b3J5L3I2NjcvYnJhbmNoZXMvMy54L3NyYy9jb3JlLmpzXG4gKi9cbnZhciBDcnlwdG9KUz1DcnlwdG9KU3x8KGZ1bmN0aW9uKGUsZyl7dmFyIGE9e307dmFyIGI9YS5saWI9e307dmFyIGo9Yi5CYXNlPShmdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt9cmV0dXJue2V4dGVuZDpmdW5jdGlvbihwKXtuLnByb3RvdHlwZT10aGlzO3ZhciBvPW5ldyBuKCk7aWYocCl7by5taXhJbihwKX1pZighby5oYXNPd25Qcm9wZXJ0eShcImluaXRcIikpe28uaW5pdD1mdW5jdGlvbigpe28uJHN1cGVyLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1vLmluaXQucHJvdG90eXBlPW87by4kc3VwZXI9dGhpcztyZXR1cm4gb30sY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIG89dGhpcy5leHRlbmQoKTtvLmluaXQuYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiBvfSxpbml0OmZ1bmN0aW9uKCl7fSxtaXhJbjpmdW5jdGlvbihwKXtmb3IodmFyIG8gaW4gcCl7aWYocC5oYXNPd25Qcm9wZXJ0eShvKSl7dGhpc1tvXT1wW29dfX1pZihwLmhhc093blByb3BlcnR5KFwidG9TdHJpbmdcIikpe3RoaXMudG9TdHJpbmc9cC50b1N0cmluZ319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5pdC5wcm90b3R5cGUuZXh0ZW5kKHRoaXMpfX19KCkpO3ZhciBsPWIuV29yZEFycmF5PWouZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKG8sbil7bz10aGlzLndvcmRzPW98fFtdO2lmKG4hPWcpe3RoaXMuc2lnQnl0ZXM9bn1lbHNle3RoaXMuc2lnQnl0ZXM9by5sZW5ndGgqNH19LHRvU3RyaW5nOmZ1bmN0aW9uKG4pe3JldHVybihufHxoKS5zdHJpbmdpZnkodGhpcyl9LGNvbmNhdDpmdW5jdGlvbih0KXt2YXIgcT10aGlzLndvcmRzO3ZhciBwPXQud29yZHM7dmFyIG49dGhpcy5zaWdCeXRlczt2YXIgcz10LnNpZ0J5dGVzO3RoaXMuY2xhbXAoKTtpZihuJTQpe2Zvcih2YXIgcj0wO3I8cztyKyspe3ZhciBvPShwW3I+Pj4yXT4+PigyNC0ociU0KSo4KSkmMjU1O3FbKG4rcik+Pj4yXXw9bzw8KDI0LSgobityKSU0KSo4KX19ZWxzZXtmb3IodmFyIHI9MDtyPHM7cis9NCl7cVsobityKT4+PjJdPXBbcj4+PjJdfX10aGlzLnNpZ0J5dGVzKz1zO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbigpe3ZhciBvPXRoaXMud29yZHM7dmFyIG49dGhpcy5zaWdCeXRlcztvW24+Pj4yXSY9NDI5NDk2NzI5NTw8KDMyLShuJTQpKjgpO28ubGVuZ3RoPWUuY2VpbChuLzQpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBuPWouY2xvbmUuY2FsbCh0aGlzKTtuLndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCk7cmV0dXJuIG59LHJhbmRvbTpmdW5jdGlvbihwKXt2YXIgbz1bXTtmb3IodmFyIG49MDtuPHA7bis9NCl7by5wdXNoKChlLnJhbmRvbSgpKjQyOTQ5NjcyOTYpfDApfXJldHVybiBuZXcgbC5pbml0KG8scCl9fSk7dmFyIG09YS5lbmM9e307dmFyIGg9bS5IZXg9e3N0cmluZ2lmeTpmdW5jdGlvbihwKXt2YXIgcj1wLndvcmRzO3ZhciBvPXAuc2lnQnl0ZXM7dmFyIHE9W107Zm9yKHZhciBuPTA7bjxvO24rKyl7dmFyIHM9KHJbbj4+PjJdPj4+KDI0LShuJTQpKjgpKSYyNTU7cS5wdXNoKChzPj4+NCkudG9TdHJpbmcoMTYpKTtxLnB1c2goKHMmMTUpLnRvU3RyaW5nKDE2KSl9cmV0dXJuIHEuam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24ocCl7dmFyIG49cC5sZW5ndGg7dmFyIHE9W107Zm9yKHZhciBvPTA7bzxuO28rPTIpe3Fbbz4+PjNdfD1wYXJzZUludChwLnN1YnN0cihvLDIpLDE2KTw8KDI0LShvJTgpKjQpfXJldHVybiBuZXcgbC5pbml0KHEsbi8yKX19O3ZhciBkPW0uTGF0aW4xPXtzdHJpbmdpZnk6ZnVuY3Rpb24ocSl7dmFyIHI9cS53b3Jkczt2YXIgcD1xLnNpZ0J5dGVzO3ZhciBuPVtdO2Zvcih2YXIgbz0wO288cDtvKyspe3ZhciBzPShyW28+Pj4yXT4+PigyNC0obyU0KSo4KSkmMjU1O24ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHMpKX1yZXR1cm4gbi5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihwKXt2YXIgbj1wLmxlbmd0aDt2YXIgcT1bXTtmb3IodmFyIG89MDtvPG47bysrKXtxW28+Pj4yXXw9KHAuY2hhckNvZGVBdChvKSYyNTUpPDwoMjQtKG8lNCkqOCl9cmV0dXJuIG5ldyBsLmluaXQocSxuKX19O3ZhciBjPW0uVXRmOD17c3RyaW5naWZ5OmZ1bmN0aW9uKG4pe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShkLnN0cmluZ2lmeShuKSkpfWNhdGNoKG8pe3Rocm93IG5ldyBFcnJvcihcIk1hbGZvcm1lZCBVVEYtOCBkYXRhXCIpfX0scGFyc2U6ZnVuY3Rpb24obil7cmV0dXJuIGQucGFyc2UodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KG4pKSl9fTt2YXIgaT1iLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG09ai5leHRlbmQoe3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fZGF0YT1uZXcgbC5pbml0KCk7dGhpcy5fbkRhdGFCeXRlcz0wfSxfYXBwZW5kOmZ1bmN0aW9uKG4pe2lmKHR5cGVvZiBuPT1cInN0cmluZ1wiKXtuPWMucGFyc2Uobil9dGhpcy5fZGF0YS5jb25jYXQobik7dGhpcy5fbkRhdGFCeXRlcys9bi5zaWdCeXRlc30sX3Byb2Nlc3M6ZnVuY3Rpb24odyl7dmFyIHE9dGhpcy5fZGF0YTt2YXIgeD1xLndvcmRzO3ZhciBuPXEuc2lnQnl0ZXM7dmFyIHQ9dGhpcy5ibG9ja1NpemU7dmFyIHY9dCo0O3ZhciB1PW4vdjtpZih3KXt1PWUuY2VpbCh1KX1lbHNle3U9ZS5tYXgoKHV8MCktdGhpcy5fbWluQnVmZmVyU2l6ZSwwKX12YXIgcz11KnQ7dmFyIHI9ZS5taW4ocyo0LG4pO2lmKHMpe2Zvcih2YXIgcD0wO3A8cztwKz10KXt0aGlzLl9kb1Byb2Nlc3NCbG9jayh4LHApfXZhciBvPXguc3BsaWNlKDAscyk7cS5zaWdCeXRlcy09cn1yZXR1cm4gbmV3IGwuaW5pdChvLHIpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBuPWouY2xvbmUuY2FsbCh0aGlzKTtuLl9kYXRhPXRoaXMuX2RhdGEuY2xvbmUoKTtyZXR1cm4gbn0sX21pbkJ1ZmZlclNpemU6MH0pO3ZhciBmPWIuSGFzaGVyPWkuZXh0ZW5kKHtjZmc6ai5leHRlbmQoKSxpbml0OmZ1bmN0aW9uKG4pe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChuKTt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7aS5yZXNldC5jYWxsKHRoaXMpO3RoaXMuX2RvUmVzZXQoKX0sdXBkYXRlOmZ1bmN0aW9uKG4pe3RoaXMuX2FwcGVuZChuKTt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKG4pe2lmKG4pe3RoaXMuX2FwcGVuZChuKX12YXIgbz10aGlzLl9kb0ZpbmFsaXplKCk7cmV0dXJuIG99LGJsb2NrU2l6ZTo1MTIvMzIsX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24ocCxvKXtyZXR1cm4gbmV3IG4uaW5pdChvKS5maW5hbGl6ZShwKX19LF9jcmVhdGVIbWFjSGVscGVyOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbihwLG8pe3JldHVybiBuZXcgay5ITUFDLmluaXQobixvKS5maW5hbGl6ZShwKX19fSk7dmFyIGs9YS5hbGdvPXt9O3JldHVybiBhfShNYXRoKSk7XG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHg2NC1jb3JlLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oZyl7dmFyIGE9Q3J5cHRvSlMsZj1hLmxpYixlPWYuQmFzZSxoPWYuV29yZEFycmF5LGE9YS54NjQ9e307YS5Xb3JkPWUuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGIsYyl7dGhpcy5oaWdoPWI7dGhpcy5sb3c9Y319KTthLldvcmRBcnJheT1lLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihiLGMpe2I9dGhpcy53b3Jkcz1ifHxbXTt0aGlzLnNpZ0J5dGVzPWMhPWc/Yzo4KmIubGVuZ3RofSx0b1gzMjpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLndvcmRzLGM9Yi5sZW5ndGgsYT1bXSxkPTA7ZDxjO2QrKyl7dmFyIGU9YltkXTthLnB1c2goZS5oaWdoKTthLnB1c2goZS5sb3cpfXJldHVybiBoLmNyZWF0ZShhLHRoaXMuc2lnQnl0ZXMpfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYj1lLmNsb25lLmNhbGwodGhpcyksYz1iLndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCksYT1jLmxlbmd0aCxkPTA7ZDxhO2QrKyljW2RdPWNbZF0uY2xvbmUoKTtyZXR1cm4gYn19KX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgY2lwaGVyLWNvcmUuanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuQ3J5cHRvSlMubGliLkNpcGhlcnx8ZnVuY3Rpb24odSl7dmFyIGc9Q3J5cHRvSlMsZj1nLmxpYixrPWYuQmFzZSxsPWYuV29yZEFycmF5LHE9Zi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtLHI9Zy5lbmMuQmFzZTY0LHY9Zy5hbGdvLkV2cEtERixuPWYuQ2lwaGVyPXEuZXh0ZW5kKHtjZmc6ay5leHRlbmQoKSxjcmVhdGVFbmNyeXB0b3I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fRU5DX1hGT1JNX01PREUsYSxiKX0sY3JlYXRlRGVjcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0RFQ19YRk9STV9NT0RFLGEsYil9LGluaXQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChjKTt0aGlzLl94Zm9ybU1vZGU9YTt0aGlzLl9rZXk9Yjt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7cS5yZXNldC5jYWxsKHRoaXMpO3RoaXMuX2RvUmVzZXQoKX0scHJvY2VzczpmdW5jdGlvbihhKXt0aGlzLl9hcHBlbmQoYSk7XG5yZXR1cm4gdGhpcy5fcHJvY2VzcygpfSxmaW5hbGl6ZTpmdW5jdGlvbihhKXthJiZ0aGlzLl9hcHBlbmQoYSk7cmV0dXJuIHRoaXMuX2RvRmluYWxpemUoKX0sa2V5U2l6ZTo0LGl2U2l6ZTo0LF9FTkNfWEZPUk1fTU9ERToxLF9ERUNfWEZPUk1fTU9ERToyLF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oYSl7cmV0dXJue2VuY3J5cHQ6ZnVuY3Rpb24oYixjLGQpe3JldHVybihcInN0cmluZ1wiPT10eXBlb2YgYz9zOmopLmVuY3J5cHQoYSxiLGMsZCl9LGRlY3J5cHQ6ZnVuY3Rpb24oYixjLGQpe3JldHVybihcInN0cmluZ1wiPT10eXBlb2YgYz9zOmopLmRlY3J5cHQoYSxiLGMsZCl9fX19KTtmLlN0cmVhbUNpcGhlcj1uLmV4dGVuZCh7X2RvRmluYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvY2VzcyghMCl9LGJsb2NrU2l6ZToxfSk7dmFyIG09Zy5tb2RlPXt9LHQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuX2l2O2Q/dGhpcy5faXY9dTpkPXRoaXMuX3ByZXZCbG9jaztmb3IodmFyIGU9XG4wO2U8YztlKyspYVtiK2VdXj1kW2VdfSxoPShmLkJsb2NrQ2lwaGVyTW9kZT1rLmV4dGVuZCh7Y3JlYXRlRW5jcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuRW5jcnlwdG9yLmNyZWF0ZShhLGIpfSxjcmVhdGVEZWNyeXB0b3I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5EZWNyeXB0b3IuY3JlYXRlKGEsYil9LGluaXQ6ZnVuY3Rpb24oYSxiKXt0aGlzLl9jaXBoZXI9YTt0aGlzLl9pdj1ifX0pKS5leHRlbmQoKTtoLkVuY3J5cHRvcj1oLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2lwaGVyLGQ9Yy5ibG9ja1NpemU7dC5jYWxsKHRoaXMsYSxiLGQpO2MuZW5jcnlwdEJsb2NrKGEsYik7dGhpcy5fcHJldkJsb2NrPWEuc2xpY2UoYixiK2QpfX0pO2guRGVjcnlwdG9yPWguZXh0ZW5kKHtwcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9jaXBoZXIsZD1jLmJsb2NrU2l6ZSxlPWEuc2xpY2UoYixiK2QpO2MuZGVjcnlwdEJsb2NrKGEsXG5iKTt0LmNhbGwodGhpcyxhLGIsZCk7dGhpcy5fcHJldkJsb2NrPWV9fSk7bT1tLkNCQz1oO2g9KGcucGFkPXt9KS5Qa2NzNz17cGFkOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTQqYixjPWMtYS5zaWdCeXRlcyVjLGQ9Yzw8MjR8Yzw8MTZ8Yzw8OHxjLGU9W10sZj0wO2Y8YztmKz00KWUucHVzaChkKTtjPWwuY3JlYXRlKGUsYyk7YS5jb25jYXQoYyl9LHVucGFkOmZ1bmN0aW9uKGEpe2Euc2lnQnl0ZXMtPWEud29yZHNbYS5zaWdCeXRlcy0xPj4+Ml0mMjU1fX07Zi5CbG9ja0NpcGhlcj1uLmV4dGVuZCh7Y2ZnOm4uY2ZnLmV4dGVuZCh7bW9kZTptLHBhZGRpbmc6aH0pLHJlc2V0OmZ1bmN0aW9uKCl7bi5yZXNldC5jYWxsKHRoaXMpO3ZhciBhPXRoaXMuY2ZnLGI9YS5pdixhPWEubW9kZTtpZih0aGlzLl94Zm9ybU1vZGU9PXRoaXMuX0VOQ19YRk9STV9NT0RFKXZhciBjPWEuY3JlYXRlRW5jcnlwdG9yO2Vsc2UgYz1hLmNyZWF0ZURlY3J5cHRvcix0aGlzLl9taW5CdWZmZXJTaXplPTE7XG50aGlzLl9tb2RlPWMuY2FsbChhLHRoaXMsYiYmYi53b3Jkcyl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGIpe3RoaXMuX21vZGUucHJvY2Vzc0Jsb2NrKGEsYil9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jZmcucGFkZGluZztpZih0aGlzLl94Zm9ybU1vZGU9PXRoaXMuX0VOQ19YRk9STV9NT0RFKXthLnBhZCh0aGlzLl9kYXRhLHRoaXMuYmxvY2tTaXplKTt2YXIgYj10aGlzLl9wcm9jZXNzKCEwKX1lbHNlIGI9dGhpcy5fcHJvY2VzcyghMCksYS51bnBhZChiKTtyZXR1cm4gYn0sYmxvY2tTaXplOjR9KTt2YXIgcD1mLkNpcGhlclBhcmFtcz1rLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihhKXt0aGlzLm1peEluKGEpfSx0b1N0cmluZzpmdW5jdGlvbihhKXtyZXR1cm4oYXx8dGhpcy5mb3JtYXR0ZXIpLnN0cmluZ2lmeSh0aGlzKX19KSxtPShnLmZvcm1hdD17fSkuT3BlblNTTD17c3RyaW5naWZ5OmZ1bmN0aW9uKGEpe3ZhciBiPWEuY2lwaGVydGV4dDthPWEuc2FsdDtcbnJldHVybihhP2wuY3JlYXRlKFsxMzk4ODkzNjg0LDE3MDEwNzY4MzFdKS5jb25jYXQoYSkuY29uY2F0KGIpOmIpLnRvU3RyaW5nKHIpfSxwYXJzZTpmdW5jdGlvbihhKXthPXIucGFyc2UoYSk7dmFyIGI9YS53b3JkcztpZigxMzk4ODkzNjg0PT1iWzBdJiYxNzAxMDc2ODMxPT1iWzFdKXt2YXIgYz1sLmNyZWF0ZShiLnNsaWNlKDIsNCkpO2Iuc3BsaWNlKDAsNCk7YS5zaWdCeXRlcy09MTZ9cmV0dXJuIHAuY3JlYXRlKHtjaXBoZXJ0ZXh0OmEsc2FsdDpjfSl9fSxqPWYuU2VyaWFsaXphYmxlQ2lwaGVyPWsuZXh0ZW5kKHtjZmc6ay5leHRlbmQoe2Zvcm1hdDptfSksZW5jcnlwdDpmdW5jdGlvbihhLGIsYyxkKXtkPXRoaXMuY2ZnLmV4dGVuZChkKTt2YXIgZT1hLmNyZWF0ZUVuY3J5cHRvcihjLGQpO2I9ZS5maW5hbGl6ZShiKTtlPWUuY2ZnO3JldHVybiBwLmNyZWF0ZSh7Y2lwaGVydGV4dDpiLGtleTpjLGl2OmUuaXYsYWxnb3JpdGhtOmEsbW9kZTplLm1vZGUscGFkZGluZzplLnBhZGRpbmcsXG5ibG9ja1NpemU6YS5ibG9ja1NpemUsZm9ybWF0dGVyOmQuZm9ybWF0fSl9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7Yj10aGlzLl9wYXJzZShiLGQuZm9ybWF0KTtyZXR1cm4gYS5jcmVhdGVEZWNyeXB0b3IoYyxkKS5maW5hbGl6ZShiLmNpcGhlcnRleHQpfSxfcGFyc2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgYT9iLnBhcnNlKGEsdGhpcyk6YX19KSxnPShnLmtkZj17fSkuT3BlblNTTD17ZXhlY3V0ZTpmdW5jdGlvbihhLGIsYyxkKXtkfHwoZD1sLnJhbmRvbSg4KSk7YT12LmNyZWF0ZSh7a2V5U2l6ZTpiK2N9KS5jb21wdXRlKGEsZCk7Yz1sLmNyZWF0ZShhLndvcmRzLnNsaWNlKGIpLDQqYyk7YS5zaWdCeXRlcz00KmI7cmV0dXJuIHAuY3JlYXRlKHtrZXk6YSxpdjpjLHNhbHQ6ZH0pfX0scz1mLlBhc3N3b3JkQmFzZWRDaXBoZXI9ai5leHRlbmQoe2NmZzpqLmNmZy5leHRlbmQoe2tkZjpnfSksZW5jcnlwdDpmdW5jdGlvbihhLFxuYixjLGQpe2Q9dGhpcy5jZmcuZXh0ZW5kKGQpO2M9ZC5rZGYuZXhlY3V0ZShjLGEua2V5U2l6ZSxhLml2U2l6ZSk7ZC5pdj1jLml2O2E9ai5lbmNyeXB0LmNhbGwodGhpcyxhLGIsYy5rZXksZCk7YS5taXhJbihjKTtyZXR1cm4gYX0sZGVjcnlwdDpmdW5jdGlvbihhLGIsYyxkKXtkPXRoaXMuY2ZnLmV4dGVuZChkKTtiPXRoaXMuX3BhcnNlKGIsZC5mb3JtYXQpO2M9ZC5rZGYuZXhlY3V0ZShjLGEua2V5U2l6ZSxhLml2U2l6ZSxiLnNhbHQpO2QuaXY9Yy5pdjtyZXR1cm4gai5kZWNyeXB0LmNhbGwodGhpcyxhLGIsYy5rZXksZCl9fSl9KCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgYWVzLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe2Zvcih2YXIgcT1DcnlwdG9KUyx4PXEubGliLkJsb2NrQ2lwaGVyLHI9cS5hbGdvLGo9W10seT1bXSx6PVtdLEE9W10sQj1bXSxDPVtdLHM9W10sdT1bXSx2PVtdLHc9W10sZz1bXSxrPTA7MjU2Pms7aysrKWdba109MTI4Pms/azw8MTprPDwxXjI4Mztmb3IodmFyIG49MCxsPTAsaz0wOzI1Nj5rO2srKyl7dmFyIGY9bF5sPDwxXmw8PDJebDw8M15sPDw0LGY9Zj4+PjheZiYyNTVeOTk7altuXT1mO3lbZl09bjt2YXIgdD1nW25dLEQ9Z1t0XSxFPWdbRF0sYj0yNTcqZ1tmXV4xNjg0MzAwOCpmO3pbbl09Yjw8MjR8Yj4+Pjg7QVtuXT1iPDwxNnxiPj4+MTY7QltuXT1iPDw4fGI+Pj4yNDtDW25dPWI7Yj0xNjg0MzAwOSpFXjY1NTM3KkReMjU3KnReMTY4NDMwMDgqbjtzW2ZdPWI8PDI0fGI+Pj44O3VbZl09Yjw8MTZ8Yj4+PjE2O3ZbZl09Yjw8OHxiPj4+MjQ7d1tmXT1iO24/KG49dF5nW2dbZ1tFXnRdXV0sbF49Z1tnW2xdXSk6bj1sPTF9dmFyIEY9WzAsMSwyLDQsOCxcbjE2LDMyLDY0LDEyOCwyNyw1NF0scj1yLkFFUz14LmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGM9dGhpcy5fa2V5LGU9Yy53b3JkcyxhPWMuc2lnQnl0ZXMvNCxjPTQqKCh0aGlzLl9uUm91bmRzPWErNikrMSksYj10aGlzLl9rZXlTY2hlZHVsZT1bXSxoPTA7aDxjO2grKylpZihoPGEpYltoXT1lW2hdO2Vsc2V7dmFyIGQ9YltoLTFdO2glYT82PGEmJjQ9PWglYSYmKGQ9altkPj4+MjRdPDwyNHxqW2Q+Pj4xNiYyNTVdPDwxNnxqW2Q+Pj44JjI1NV08PDh8altkJjI1NV0pOihkPWQ8PDh8ZD4+PjI0LGQ9altkPj4+MjRdPDwyNHxqW2Q+Pj4xNiYyNTVdPDwxNnxqW2Q+Pj44JjI1NV08PDh8altkJjI1NV0sZF49RltoL2F8MF08PDI0KTtiW2hdPWJbaC1hXV5kfWU9dGhpcy5faW52S2V5U2NoZWR1bGU9W107Zm9yKGE9MDthPGM7YSsrKWg9Yy1hLGQ9YSU0P2JbaF06YltoLTRdLGVbYV09ND5hfHw0Pj1oP2Q6c1tqW2Q+Pj4yNF1dXnVbaltkPj4+MTYmMjU1XV1edltqW2Q+Pj5cbjgmMjU1XV1ed1tqW2QmMjU1XV19LGVuY3J5cHRCbG9jazpmdW5jdGlvbihjLGUpe3RoaXMuX2RvQ3J5cHRCbG9jayhjLGUsdGhpcy5fa2V5U2NoZWR1bGUseixBLEIsQyxqKX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKGMsZSl7dmFyIGE9Y1tlKzFdO2NbZSsxXT1jW2UrM107Y1tlKzNdPWE7dGhpcy5fZG9DcnlwdEJsb2NrKGMsZSx0aGlzLl9pbnZLZXlTY2hlZHVsZSxzLHUsdix3LHkpO2E9Y1tlKzFdO2NbZSsxXT1jW2UrM107Y1tlKzNdPWF9LF9kb0NyeXB0QmxvY2s6ZnVuY3Rpb24oYyxlLGEsYixoLGQsaixtKXtmb3IodmFyIG49dGhpcy5fblJvdW5kcyxmPWNbZV1eYVswXSxnPWNbZSsxXV5hWzFdLGs9Y1tlKzJdXmFbMl0scD1jW2UrM11eYVszXSxsPTQsdD0xO3Q8bjt0KyspdmFyIHE9YltmPj4+MjRdXmhbZz4+PjE2JjI1NV1eZFtrPj4+OCYyNTVdXmpbcCYyNTVdXmFbbCsrXSxyPWJbZz4+PjI0XV5oW2s+Pj4xNiYyNTVdXmRbcD4+PjgmMjU1XV5qW2YmMjU1XV5hW2wrK10scz1cbmJbaz4+PjI0XV5oW3A+Pj4xNiYyNTVdXmRbZj4+PjgmMjU1XV5qW2cmMjU1XV5hW2wrK10scD1iW3A+Pj4yNF1eaFtmPj4+MTYmMjU1XV5kW2c+Pj44JjI1NV1ealtrJjI1NV1eYVtsKytdLGY9cSxnPXIsaz1zO3E9KG1bZj4+PjI0XTw8MjR8bVtnPj4+MTYmMjU1XTw8MTZ8bVtrPj4+OCYyNTVdPDw4fG1bcCYyNTVdKV5hW2wrK107cj0obVtnPj4+MjRdPDwyNHxtW2s+Pj4xNiYyNTVdPDwxNnxtW3A+Pj44JjI1NV08PDh8bVtmJjI1NV0pXmFbbCsrXTtzPShtW2s+Pj4yNF08PDI0fG1bcD4+PjE2JjI1NV08PDE2fG1bZj4+PjgmMjU1XTw8OHxtW2cmMjU1XSleYVtsKytdO3A9KG1bcD4+PjI0XTw8MjR8bVtmPj4+MTYmMjU1XTw8MTZ8bVtnPj4+OCYyNTVdPDw4fG1bayYyNTVdKV5hW2wrK107Y1tlXT1xO2NbZSsxXT1yO2NbZSsyXT1zO2NbZSszXT1wfSxrZXlTaXplOjh9KTtxLkFFUz14Ll9jcmVhdGVIZWxwZXIocil9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHRyaXBsZWRlcy1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaihiLGMpe3ZhciBhPSh0aGlzLl9sQmxvY2s+Pj5iXnRoaXMuX3JCbG9jaykmYzt0aGlzLl9yQmxvY2tePWE7dGhpcy5fbEJsb2NrXj1hPDxifWZ1bmN0aW9uIGwoYixjKXt2YXIgYT0odGhpcy5fckJsb2NrPj4+Yl50aGlzLl9sQmxvY2spJmM7dGhpcy5fbEJsb2NrXj1hO3RoaXMuX3JCbG9ja149YTw8Yn12YXIgaD1DcnlwdG9KUyxlPWgubGliLG49ZS5Xb3JkQXJyYXksZT1lLkJsb2NrQ2lwaGVyLGc9aC5hbGdvLHE9WzU3LDQ5LDQxLDMzLDI1LDE3LDksMSw1OCw1MCw0MiwzNCwyNiwxOCwxMCwyLDU5LDUxLDQzLDM1LDI3LDE5LDExLDMsNjAsNTIsNDQsMzYsNjMsNTUsNDcsMzksMzEsMjMsMTUsNyw2Miw1NCw0NiwzOCwzMCwyMiwxNCw2LDYxLDUzLDQ1LDM3LDI5LDIxLDEzLDUsMjgsMjAsMTIsNF0scD1bMTQsMTcsMTEsMjQsMSw1LDMsMjgsMTUsNiwyMSwxMCwyMywxOSwxMiw0LDI2LDgsMTYsNywyNywyMCwxMywyLDQxLDUyLDMxLDM3LDQ3LFxuNTUsMzAsNDAsNTEsNDUsMzMsNDgsNDQsNDksMzksNTYsMzQsNTMsNDYsNDIsNTAsMzYsMjksMzJdLHI9WzEsMiw0LDYsOCwxMCwxMiwxNCwxNSwxNywxOSwyMSwyMywyNSwyNywyOF0scz1be1wiMFwiOjg0MjE4ODgsMjY4NDM1NDU2OjMyNzY4LDUzNjg3MDkxMjo4NDIxMzc4LDgwNTMwNjM2ODoyLDEwNzM3NDE4MjQ6NTEyLDEzNDIxNzcyODA6ODQyMTg5MCwxNjEwNjEyNzM2OjgzODkxMjIsMTg3OTA0ODE5Mjo4Mzg4NjA4LDIxNDc0ODM2NDg6NTE0LDI0MTU5MTkxMDQ6ODM4OTEyMCwyNjg0MzU0NTYwOjMzMjgwLDI5NTI3OTAwMTY6ODQyMTM3NiwzMjIxMjI1NDcyOjMyNzcwLDM0ODk2NjA5Mjg6ODM4ODYxMCwzNzU4MDk2Mzg0OjAsNDAyNjUzMTg0MDozMzI4MiwxMzQyMTc3Mjg6MCw0MDI2NTMxODQ6ODQyMTg5MCw2NzEwODg2NDA6MzMyODIsOTM5NTI0MDk2OjMyNzY4LDEyMDc5NTk1NTI6ODQyMTg4OCwxNDc2Mzk1MDA4OjUxMiwxNzQ0ODMwNDY0Ojg0MjEzNzgsMjAxMzI2NTkyMDoyLFxuMjI4MTcwMTM3Njo4Mzg5MTIwLDI1NTAxMzY4MzI6MzMyODAsMjgxODU3MjI4ODo4NDIxMzc2LDMwODcwMDc3NDQ6ODM4OTEyMiwzMzU1NDQzMjAwOjgzODg2MTAsMzYyMzg3ODY1NjozMjc3MCwzODkyMzE0MTEyOjUxNCw0MTYwNzQ5NTY4OjgzODg2MDgsMTozMjc2OCwyNjg0MzU0NTc6Miw1MzY4NzA5MTM6ODQyMTg4OCw4MDUzMDYzNjk6ODM4ODYwOCwxMDczNzQxODI1Ojg0MjEzNzgsMTM0MjE3NzI4MTozMzI4MCwxNjEwNjEyNzM3OjUxMiwxODc5MDQ4MTkzOjgzODkxMjIsMjE0NzQ4MzY0OTo4NDIxODkwLDI0MTU5MTkxMDU6ODQyMTM3NiwyNjg0MzU0NTYxOjgzODg2MTAsMjk1Mjc5MDAxNzozMzI4MiwzMjIxMjI1NDczOjUxNCwzNDg5NjYwOTI5OjgzODkxMjAsMzc1ODA5NjM4NTozMjc3MCw0MDI2NTMxODQxOjAsMTM0MjE3NzI5Ojg0MjE4OTAsNDAyNjUzMTg1Ojg0MjEzNzYsNjcxMDg4NjQxOjgzODg2MDgsOTM5NTI0MDk3OjUxMiwxMjA3OTU5NTUzOjMyNzY4LDE0NzYzOTUwMDk6ODM4ODYxMCxcbjE3NDQ4MzA0NjU6MiwyMDEzMjY1OTIxOjMzMjgyLDIyODE3MDEzNzc6MzI3NzAsMjU1MDEzNjgzMzo4Mzg5MTIyLDI4MTg1NzIyODk6NTE0LDMwODcwMDc3NDU6ODQyMTg4OCwzMzU1NDQzMjAxOjgzODkxMjAsMzYyMzg3ODY1NzowLDM4OTIzMTQxMTM6MzMyODAsNDE2MDc0OTU2OTo4NDIxMzc4fSx7XCIwXCI6MTA3NDI4MjUxMiwxNjc3NzIxNjoxNjM4NCwzMzU1NDQzMjo1MjQyODgsNTAzMzE2NDg6MTA3NDI2NjEyOCw2NzEwODg2NDoxMDczNzQxODQwLDgzODg2MDgwOjEwNzQyODI0OTYsMTAwNjYzMjk2OjEwNzM3NTgyMDgsMTE3NDQwNTEyOjE2LDEzNDIxNzcyODo1NDA2NzIsMTUwOTk0OTQ0OjEwNzM3NTgyMjQsMTY3NzcyMTYwOjEwNzM3NDE4MjQsMTg0NTQ5Mzc2OjU0MDY4OCwyMDEzMjY1OTI6NTI0MzA0LDIxODEwMzgwODowLDIzNDg4MTAyNDoxNjQwMCwyNTE2NTgyNDA6MTA3NDI2NjExMiw4Mzg4NjA4OjEwNzM3NTgyMDgsMjUxNjU4MjQ6NTQwNjg4LDQxOTQzMDQwOjE2LDU4NzIwMjU2OjEwNzM3NTgyMjQsXG43NTQ5NzQ3MjoxMDc0MjgyNTEyLDkyMjc0Njg4OjEwNzM3NDE4MjQsMTA5MDUxOTA0OjUyNDI4OCwxMjU4MjkxMjA6MTA3NDI2NjEyOCwxNDI2MDYzMzY6NTI0MzA0LDE1OTM4MzU1MjowLDE3NjE2MDc2ODoxNjM4NCwxOTI5Mzc5ODQ6MTA3NDI2NjExMiwyMDk3MTUyMDA6MTA3Mzc0MTg0MCwyMjY0OTI0MTY6NTQwNjcyLDI0MzI2OTYzMjoxMDc0MjgyNDk2LDI2MDA0Njg0ODoxNjQwMCwyNjg0MzU0NTY6MCwyODUyMTI2NzI6MTA3NDI2NjEyOCwzMDE5ODk4ODg6MTA3Mzc1ODIyNCwzMTg3NjcxMDQ6MTA3NDI4MjQ5NiwzMzU1NDQzMjA6MTA3NDI2NjExMiwzNTIzMjE1MzY6MTYsMzY5MDk4NzUyOjU0MDY4OCwzODU4NzU5Njg6MTYzODQsNDAyNjUzMTg0OjE2NDAwLDQxOTQzMDQwMDo1MjQyODgsNDM2MjA3NjE2OjUyNDMwNCw0NTI5ODQ4MzI6MTA3Mzc0MTg0MCw0Njk3NjIwNDg6NTQwNjcyLDQ4NjUzOTI2NDoxMDczNzU4MjA4LDUwMzMxNjQ4MDoxMDczNzQxODI0LDUyMDA5MzY5NjoxMDc0MjgyNTEyLFxuMjc2ODI0MDY0OjU0MDY4OCwyOTM2MDEyODA6NTI0Mjg4LDMxMDM3ODQ5NjoxMDc0MjY2MTEyLDMyNzE1NTcxMjoxNjM4NCwzNDM5MzI5Mjg6MTA3Mzc1ODIwOCwzNjA3MTAxNDQ6MTA3NDI4MjUxMiwzNzc0ODczNjA6MTYsMzk0MjY0NTc2OjEwNzM3NDE4MjQsNDExMDQxNzkyOjEwNzQyODI0OTYsNDI3ODE5MDA4OjEwNzM3NDE4NDAsNDQ0NTk2MjI0OjEwNzM3NTgyMjQsNDYxMzczNDQwOjUyNDMwNCw0NzgxNTA2NTY6MCw0OTQ5Mjc4NzI6MTY0MDAsNTExNzA1MDg4OjEwNzQyNjYxMjgsNTI4NDgyMzA0OjU0MDY3Mn0se1wiMFwiOjI2MCwxMDQ4NTc2OjAsMjA5NzE1Mjo2NzEwOTEyMCwzMTQ1NzI4OjY1Nzk2LDQxOTQzMDQ6NjU1NDAsNTI0Mjg4MDo2NzEwODg2OCw2MjkxNDU2OjY3MTc0NjYwLDczNDAwMzI6NjcxNzQ0MDAsODM4ODYwODo2NzEwODg2NCw5NDM3MTg0OjY3MTc0NjU2LDEwNDg1NzYwOjY1NzkyLDExNTM0MzM2OjY3MTc0NDA0LDEyNTgyOTEyOjY3MTA5MTI0LDEzNjMxNDg4OjY1NTM2LFxuMTQ2ODAwNjQ6NCwxNTcyODY0MDoyNTYsNTI0Mjg4OjY3MTc0NjU2LDE1NzI4NjQ6NjcxNzQ0MDQsMjYyMTQ0MDowLDM2NzAwMTY6NjcxMDkxMjAsNDcxODU5Mjo2NzEwODg2OCw1NzY3MTY4OjY1NTM2LDY4MTU3NDQ6NjU1NDAsNzg2NDMyMDoyNjAsODkxMjg5Njo0LDk5NjE0NzI6MjU2LDExMDEwMDQ4OjY3MTc0NDAwLDEyMDU4NjI0OjY1Nzk2LDEzMTA3MjAwOjY1NzkyLDE0MTU1Nzc2OjY3MTA5MTI0LDE1MjA0MzUyOjY3MTc0NjYwLDE2MjUyOTI4OjY3MTA4ODY0LDE2Nzc3MjE2OjY3MTc0NjU2LDE3ODI1NzkyOjY1NTQwLDE4ODc0MzY4OjY1NTM2LDE5OTIyOTQ0OjY3MTA5MTIwLDIwOTcxNTIwOjI1NiwyMjAyMDA5Njo2NzE3NDY2MCwyMzA2ODY3Mjo2NzEwODg2OCwyNDExNzI0ODowLDI1MTY1ODI0OjY3MTA5MTI0LDI2MjE0NDAwOjY3MTA4ODY0LDI3MjYyOTc2OjQsMjgzMTE1NTI6NjU3OTIsMjkzNjAxMjg6NjcxNzQ0MDAsMzA0MDg3MDQ6MjYwLDMxNDU3MjgwOjY1Nzk2LDMyNTA1ODU2OjY3MTc0NDA0LFxuMTczMDE1MDQ6NjcxMDg4NjQsMTgzNTAwODA6MjYwLDE5Mzk4NjU2OjY3MTc0NjU2LDIwNDQ3MjMyOjAsMjE0OTU4MDg6NjU1NDAsMjI1NDQzODQ6NjcxMDkxMjAsMjM1OTI5NjA6MjU2LDI0NjQxNTM2OjY3MTc0NDA0LDI1NjkwMTEyOjY1NTM2LDI2NzM4Njg4OjY3MTc0NjYwLDI3Nzg3MjY0OjY1Nzk2LDI4ODM1ODQwOjY3MTA4ODY4LDI5ODg0NDE2OjY3MTA5MTI0LDMwOTMyOTkyOjY3MTc0NDAwLDMxOTgxNTY4OjQsMzMwMzAxNDQ6NjU3OTJ9LHtcIjBcIjoyMTUxNjgyMDQ4LDY1NTM2OjIxNDc0ODc4MDgsMTMxMDcyOjQxOTg0NjQsMTk2NjA4OjIxNTE2Nzc5NTIsMjYyMTQ0OjAsMzI3NjgwOjQxOTg0MDAsMzkzMjE2OjIxNDc0ODM3MTIsNDU4NzUyOjQxOTQzNjgsNTI0Mjg4OjIxNDc0ODM2NDgsNTg5ODI0OjQxOTQzMDQsNjU1MzYwOjY0LDcyMDg5NjoyMTQ3NDg3NzQ0LDc4NjQzMjoyMTUxNjc4MDE2LDg1MTk2ODo0MTYwLDkxNzUwNDo0MDk2LDk4MzA0MDoyMTUxNjgyMTEyLDMyNzY4OjIxNDc0ODc4MDgsXG45ODMwNDo2NCwxNjM4NDA6MjE1MTY3ODAxNiwyMjkzNzY6MjE0NzQ4Nzc0NCwyOTQ5MTI6NDE5ODQwMCwzNjA0NDg6MjE1MTY4MjExMiw0MjU5ODQ6MCw0OTE1MjA6MjE1MTY3Nzk1Miw1NTcwNTY6NDA5Niw2MjI1OTI6MjE1MTY4MjA0OCw2ODgxMjg6NDE5NDMwNCw3NTM2NjQ6NDE2MCw4MTkyMDA6MjE0NzQ4MzY0OCw4ODQ3MzY6NDE5NDM2OCw5NTAyNzI6NDE5ODQ2NCwxMDE1ODA4OjIxNDc0ODM3MTIsMTA0ODU3Njo0MTk0MzY4LDExMTQxMTI6NDE5ODQwMCwxMTc5NjQ4OjIxNDc0ODM3MTIsMTI0NTE4NDowLDEzMTA3MjA6NDE2MCwxMzc2MjU2OjIxNTE2NzgwMTYsMTQ0MTc5MjoyMTUxNjgyMDQ4LDE1MDczMjg6MjE0NzQ4NzgwOCwxNTcyODY0OjIxNTE2ODIxMTIsMTYzODQwMDoyMTQ3NDgzNjQ4LDE3MDM5MzY6MjE1MTY3Nzk1MiwxNzY5NDcyOjQxOTg0NjQsMTgzNTAwODoyMTQ3NDg3NzQ0LDE5MDA1NDQ6NDE5NDMwNCwxOTY2MDgwOjY0LDIwMzE2MTY6NDA5NiwxMDgxMzQ0OjIxNTE2Nzc5NTIsXG4xMTQ2ODgwOjIxNTE2ODIxMTIsMTIxMjQxNjowLDEyNzc5NTI6NDE5ODQwMCwxMzQzNDg4OjQxOTQzNjgsMTQwOTAyNDoyMTQ3NDgzNjQ4LDE0NzQ1NjA6MjE0NzQ4NzgwOCwxNTQwMDk2OjY0LDE2MDU2MzI6MjE0NzQ4MzcxMiwxNjcxMTY4OjQwOTYsMTczNjcwNDoyMTQ3NDg3NzQ0LDE4MDIyNDA6MjE1MTY3ODAxNiwxODY3Nzc2OjQxNjAsMTkzMzMxMjoyMTUxNjgyMDQ4LDE5OTg4NDg6NDE5NDMwNCwyMDY0Mzg0OjQxOTg0NjR9LHtcIjBcIjoxMjgsNDA5NjoxNzAzOTM2MCw4MTkyOjI2MjE0NCwxMjI4ODo1MzY4NzA5MTIsMTYzODQ6NTM3MTMzMTg0LDIwNDgwOjE2Nzc3MzQ0LDI0NTc2OjU1MzY0ODI1NiwyODY3MjoyNjIyNzIsMzI3Njg6MTY3NzcyMTYsMzY4NjQ6NTM3MTMzMDU2LDQwOTYwOjUzNjg3MTA0MCw0NTA1Njo1NTM5MTA0MDAsNDkxNTI6NTUzOTEwMjcyLDUzMjQ4OjAsNTczNDQ6MTcwMzk0ODgsNjE0NDA6NTUzNjQ4MTI4LDIwNDg6MTcwMzk0ODgsNjE0NDo1NTM2NDgyNTYsXG4xMDI0MDoxMjgsMTQzMzY6MTcwMzkzNjAsMTg0MzI6MjYyMTQ0LDIyNTI4OjUzNzEzMzE4NCwyNjYyNDo1NTM5MTAyNzIsMzA3MjA6NTM2ODcwOTEyLDM0ODE2OjUzNzEzMzA1NiwzODkxMjowLDQzMDA4OjU1MzkxMDQwMCw0NzEwNDoxNjc3NzM0NCw1MTIwMDo1MzY4NzEwNDAsNTUyOTY6NTUzNjQ4MTI4LDU5MzkyOjE2Nzc3MjE2LDYzNDg4OjI2MjI3Miw2NTUzNjoyNjIxNDQsNjk2MzI6MTI4LDczNzI4OjUzNjg3MDkxMiw3NzgyNDo1NTM2NDgyNTYsODE5MjA6MTY3NzczNDQsODYwMTY6NTUzOTEwMjcyLDkwMTEyOjUzNzEzMzE4NCw5NDIwODoxNjc3NzIxNiw5ODMwNDo1NTM5MTA0MDAsMTAyNDAwOjU1MzY0ODEyOCwxMDY0OTY6MTcwMzkzNjAsMTEwNTkyOjUzNzEzMzA1NiwxMTQ2ODg6MjYyMjcyLDExODc4NDo1MzY4NzEwNDAsMTIyODgwOjAsMTI2OTc2OjE3MDM5NDg4LDY3NTg0OjU1MzY0ODI1Niw3MTY4MDoxNjc3NzIxNiw3NTc3NjoxNzAzOTM2MCw3OTg3Mjo1MzcxMzMxODQsXG44Mzk2ODo1MzY4NzA5MTIsODgwNjQ6MTcwMzk0ODgsOTIxNjA6MTI4LDk2MjU2OjU1MzkxMDI3MiwxMDAzNTI6MjYyMjcyLDEwNDQ0ODo1NTM5MTA0MDAsMTA4NTQ0OjAsMTEyNjQwOjU1MzY0ODEyOCwxMTY3MzY6MTY3NzczNDQsMTIwODMyOjI2MjE0NCwxMjQ5Mjg6NTM3MTMzMDU2LDEyOTAyNDo1MzY4NzEwNDB9LHtcIjBcIjoyNjg0MzU0NjQsMjU2OjgxOTIsNTEyOjI3MDUzMjYwOCw3Njg6MjcwNTQwODA4LDEwMjQ6MjY4NDQzNjQ4LDEyODA6MjA5NzE1MiwxNTM2OjIwOTcxNjAsMTc5MjoyNjg0MzU0NTYsMjA0ODowLDIzMDQ6MjY4NDQzNjU2LDI1NjA6MjEwNTM0NCwyODE2OjgsMzA3MjoyNzA1MzI2MTYsMzMyODoyMTA1MzUyLDM1ODQ6ODIwMCwzODQwOjI3MDU0MDgwMCwxMjg6MjcwNTMyNjA4LDM4NDoyNzA1NDA4MDgsNjQwOjgsODk2OjIwOTcxNTIsMTE1MjoyMTA1MzUyLDE0MDg6MjY4NDM1NDY0LDE2NjQ6MjY4NDQzNjQ4LDE5MjA6ODIwMCwyMTc2OjIwOTcxNjAsMjQzMjo4MTkyLFxuMjY4ODoyNjg0NDM2NTYsMjk0NDoyNzA1MzI2MTYsMzIwMDowLDM0NTY6MjcwNTQwODAwLDM3MTI6MjEwNTM0NCwzOTY4OjI2ODQzNTQ1Niw0MDk2OjI2ODQ0MzY0OCw0MzUyOjI3MDUzMjYxNiw0NjA4OjI3MDU0MDgwOCw0ODY0OjgyMDAsNTEyMDoyMDk3MTUyLDUzNzY6MjY4NDM1NDU2LDU2MzI6MjY4NDM1NDY0LDU4ODg6MjEwNTM0NCw2MTQ0OjIxMDUzNTIsNjQwMDowLDY2NTY6OCw2OTEyOjI3MDUzMjYwOCw3MTY4OjgxOTIsNzQyNDoyNjg0NDM2NTYsNzY4MDoyNzA1NDA4MDAsNzkzNjoyMDk3MTYwLDQyMjQ6OCw0NDgwOjIxMDUzNDQsNDczNjoyMDk3MTUyLDQ5OTI6MjY4NDM1NDY0LDUyNDg6MjY4NDQzNjQ4LDU1MDQ6ODIwMCw1NzYwOjI3MDU0MDgwOCw2MDE2OjI3MDUzMjYwOCw2MjcyOjI3MDU0MDgwMCw2NTI4OjI3MDUzMjYxNiw2Nzg0OjgxOTIsNzA0MDoyMTA1MzUyLDcyOTY6MjA5NzE2MCw3NTUyOjAsNzgwODoyNjg0MzU0NTYsODA2NDoyNjg0NDM2NTZ9LHtcIjBcIjoxMDQ4NTc2LFxuMTY6MzM1NTU0NTcsMzI6MTAyNCw0ODoxMDQ5NjAxLDY0OjM0NjA0MDMzLDgwOjAsOTY6MSwxMTI6MzQ2MDMwMDksMTI4OjMzNTU1NDU2LDE0NDoxMDQ4NTc3LDE2MDozMzU1NDQzMywxNzY6MzQ2MDQwMzIsMTkyOjM0NjAzMDA4LDIwODoxMDI1LDIyNDoxMDQ5NjAwLDI0MDozMzU1NDQzMiw4OjM0NjAzMDA5LDI0OjAsNDA6MzM1NTU0NTcsNTY6MzQ2MDQwMzIsNzI6MTA0ODU3Niw4ODozMzU1NDQzMywxMDQ6MzM1NTQ0MzIsMTIwOjEwMjUsMTM2OjEwNDk2MDEsMTUyOjMzNTU1NDU2LDE2ODozNDYwMzAwOCwxODQ6MTA0ODU3NywyMDA6MTAyNCwyMTY6MzQ2MDQwMzMsMjMyOjEsMjQ4OjEwNDk2MDAsMjU2OjMzNTU0NDMyLDI3MjoxMDQ4NTc2LDI4ODozMzU1NTQ1NywzMDQ6MzQ2MDMwMDksMzIwOjEwNDg1NzcsMzM2OjMzNTU1NDU2LDM1MjozNDYwNDAzMiwzNjg6MTA0OTYwMSwzODQ6MTAyNSw0MDA6MzQ2MDQwMzMsNDE2OjEwNDk2MDAsNDMyOjEsNDQ4OjAsNDY0OjM0NjAzMDA4LDQ4MDozMzU1NDQzMyxcbjQ5NjoxMDI0LDI2NDoxMDQ5NjAwLDI4MDozMzU1NTQ1NywyOTY6MzQ2MDMwMDksMzEyOjEsMzI4OjMzNTU0NDMyLDM0NDoxMDQ4NTc2LDM2MDoxMDI1LDM3NjozNDYwNDAzMiwzOTI6MzM1NTQ0MzMsNDA4OjM0NjAzMDA4LDQyNDowLDQ0MDozNDYwNDAzMyw0NTY6MTA0OTYwMSw0NzI6MTAyNCw0ODg6MzM1NTU0NTYsNTA0OjEwNDg1Nzd9LHtcIjBcIjoxMzQyMTk4MDgsMToxMzEwNzIsMjoxMzQyMTc3MjgsMzozMiw0OjEzMTEwNCw1OjEzNDM1MDg4MCw2OjEzNDM1MDg0OCw3OjIwNDgsODoxMzQzNDg4MDAsOToxMzQyMTk3NzYsMTA6MTMzMTIwLDExOjEzNDM0ODgzMiwxMjoyMDgwLDEzOjAsMTQ6MTM0MjE3NzYwLDE1OjEzMzE1MiwyMTQ3NDgzNjQ4OjIwNDgsMjE0NzQ4MzY0OToxMzQzNTA4ODAsMjE0NzQ4MzY1MDoxMzQyMTk4MDgsMjE0NzQ4MzY1MToxMzQyMTc3MjgsMjE0NzQ4MzY1MjoxMzQzNDg4MDAsMjE0NzQ4MzY1MzoxMzMxMjAsMjE0NzQ4MzY1NDoxMzMxNTIsMjE0NzQ4MzY1NTozMixcbjIxNDc0ODM2NTY6MTM0MjE3NzYwLDIxNDc0ODM2NTc6MjA4MCwyMTQ3NDgzNjU4OjEzMTEwNCwyMTQ3NDgzNjU5OjEzNDM1MDg0OCwyMTQ3NDgzNjYwOjAsMjE0NzQ4MzY2MToxMzQzNDg4MzIsMjE0NzQ4MzY2MjoxMzQyMTk3NzYsMjE0NzQ4MzY2MzoxMzEwNzIsMTY6MTMzMTUyLDE3OjEzNDM1MDg0OCwxODozMiwxOToyMDQ4LDIwOjEzNDIxOTc3NiwyMToxMzQyMTc3NjAsMjI6MTM0MzQ4ODMyLDIzOjEzMTA3MiwyNDowLDI1OjEzMTEwNCwyNjoxMzQzNDg4MDAsMjc6MTM0MjE5ODA4LDI4OjEzNDM1MDg4MCwyOToxMzMxMjAsMzA6MjA4MCwzMToxMzQyMTc3MjgsMjE0NzQ4MzY2NDoxMzEwNzIsMjE0NzQ4MzY2NToyMDQ4LDIxNDc0ODM2NjY6MTM0MzQ4ODMyLDIxNDc0ODM2Njc6MTMzMTUyLDIxNDc0ODM2Njg6MzIsMjE0NzQ4MzY2OToxMzQzNDg4MDAsMjE0NzQ4MzY3MDoxMzQyMTc3MjgsMjE0NzQ4MzY3MToxMzQyMTk4MDgsMjE0NzQ4MzY3MjoxMzQzNTA4ODAsMjE0NzQ4MzY3MzoxMzQyMTc3NjAsXG4yMTQ3NDgzNjc0OjEzNDIxOTc3NiwyMTQ3NDgzNjc1OjAsMjE0NzQ4MzY3NjoxMzMxMjAsMjE0NzQ4MzY3NzoyMDgwLDIxNDc0ODM2Nzg6MTMxMTA0LDIxNDc0ODM2Nzk6MTM0MzUwODQ4fV0sdD1bNDE2MDc0OTU2OSw1Mjg0ODIzMDQsMzMwMzAxNDQsMjA2NDM4NCwxMjkwMjQsODA2NCw1MDQsMjE0NzQ4MzY3OV0sbT1nLkRFUz1lLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fa2V5LndvcmRzLGM9W10sYT0wOzU2PmE7YSsrKXt2YXIgZj1xW2FdLTE7Y1thXT1iW2Y+Pj41XT4+PjMxLWYlMzImMX1iPXRoaXMuX3N1YktleXM9W107Zm9yKGY9MDsxNj5mO2YrKyl7Zm9yKHZhciBkPWJbZl09W10sZT1yW2ZdLGE9MDsyND5hO2ErKylkW2EvNnwwXXw9Y1socFthXS0xK2UpJTI4XTw8MzEtYSU2LGRbNCsoYS82fDApXXw9Y1syOCsocFthKzI0XS0xK2UpJTI4XTw8MzEtYSU2O2RbMF09ZFswXTw8MXxkWzBdPj4+MzE7Zm9yKGE9MTs3PmE7YSsrKWRbYV0+Pj49XG40KihhLTEpKzM7ZFs3XT1kWzddPDw1fGRbN10+Pj4yN31jPXRoaXMuX2ludlN1YktleXM9W107Zm9yKGE9MDsxNj5hO2ErKyljW2FdPWJbMTUtYV19LGVuY3J5cHRCbG9jazpmdW5jdGlvbihiLGMpe3RoaXMuX2RvQ3J5cHRCbG9jayhiLGMsdGhpcy5fc3ViS2V5cyl9LGRlY3J5cHRCbG9jazpmdW5jdGlvbihiLGMpe3RoaXMuX2RvQ3J5cHRCbG9jayhiLGMsdGhpcy5faW52U3ViS2V5cyl9LF9kb0NyeXB0QmxvY2s6ZnVuY3Rpb24oYixjLGEpe3RoaXMuX2xCbG9jaz1iW2NdO3RoaXMuX3JCbG9jaz1iW2MrMV07ai5jYWxsKHRoaXMsNCwyNTI2NDUxMzUpO2ouY2FsbCh0aGlzLDE2LDY1NTM1KTtsLmNhbGwodGhpcywyLDg1ODk5MzQ1OSk7bC5jYWxsKHRoaXMsOCwxNjcxMTkzNSk7ai5jYWxsKHRoaXMsMSwxNDMxNjU1NzY1KTtmb3IodmFyIGY9MDsxNj5mO2YrKyl7Zm9yKHZhciBkPWFbZl0sZT10aGlzLl9sQmxvY2ssaD10aGlzLl9yQmxvY2ssZz0wLGs9MDs4Pms7aysrKWd8PXNba11bKChoXlxuZFtrXSkmdFtrXSk+Pj4wXTt0aGlzLl9sQmxvY2s9aDt0aGlzLl9yQmxvY2s9ZV5nfWE9dGhpcy5fbEJsb2NrO3RoaXMuX2xCbG9jaz10aGlzLl9yQmxvY2s7dGhpcy5fckJsb2NrPWE7ai5jYWxsKHRoaXMsMSwxNDMxNjU1NzY1KTtsLmNhbGwodGhpcyw4LDE2NzExOTM1KTtsLmNhbGwodGhpcywyLDg1ODk5MzQ1OSk7ai5jYWxsKHRoaXMsMTYsNjU1MzUpO2ouY2FsbCh0aGlzLDQsMjUyNjQ1MTM1KTtiW2NdPXRoaXMuX2xCbG9jaztiW2MrMV09dGhpcy5fckJsb2NrfSxrZXlTaXplOjIsaXZTaXplOjIsYmxvY2tTaXplOjJ9KTtoLkRFUz1lLl9jcmVhdGVIZWxwZXIobSk7Zz1nLlRyaXBsZURFUz1lLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9rZXkud29yZHM7dGhpcy5fZGVzMT1tLmNyZWF0ZUVuY3J5cHRvcihuLmNyZWF0ZShiLnNsaWNlKDAsMikpKTt0aGlzLl9kZXMyPW0uY3JlYXRlRW5jcnlwdG9yKG4uY3JlYXRlKGIuc2xpY2UoMiw0KSkpO3RoaXMuX2RlczM9XG5tLmNyZWF0ZUVuY3J5cHRvcihuLmNyZWF0ZShiLnNsaWNlKDQsNikpKX0sZW5jcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZGVzMS5lbmNyeXB0QmxvY2soYixjKTt0aGlzLl9kZXMyLmRlY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczMuZW5jcnlwdEJsb2NrKGIsYyl9LGRlY3J5cHRCbG9jazpmdW5jdGlvbihiLGMpe3RoaXMuX2RlczMuZGVjcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMi5lbmNyeXB0QmxvY2soYixjKTt0aGlzLl9kZXMxLmRlY3J5cHRCbG9jayhiLGMpfSxrZXlTaXplOjYsaXZTaXplOjIsYmxvY2tTaXplOjJ9KTtoLlRyaXBsZURFUz1lLl9jcmVhdGVIZWxwZXIoZyl9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIGVuYy1iYXNlNjQuanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGg9Q3J5cHRvSlMsaj1oLmxpYi5Xb3JkQXJyYXk7aC5lbmMuQmFzZTY0PXtzdHJpbmdpZnk6ZnVuY3Rpb24oYil7dmFyIGU9Yi53b3JkcyxmPWIuc2lnQnl0ZXMsYz10aGlzLl9tYXA7Yi5jbGFtcCgpO2I9W107Zm9yKHZhciBhPTA7YTxmO2ErPTMpZm9yKHZhciBkPShlW2E+Pj4yXT4+PjI0LTgqKGElNCkmMjU1KTw8MTZ8KGVbYSsxPj4+Ml0+Pj4yNC04KigoYSsxKSU0KSYyNTUpPDw4fGVbYSsyPj4+Ml0+Pj4yNC04KigoYSsyKSU0KSYyNTUsZz0wOzQ+ZyYmYSswLjc1Kmc8ZjtnKyspYi5wdXNoKGMuY2hhckF0KGQ+Pj42KigzLWcpJjYzKSk7aWYoZT1jLmNoYXJBdCg2NCkpZm9yKDtiLmxlbmd0aCU0OyliLnB1c2goZSk7cmV0dXJuIGIuam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24oYil7dmFyIGU9Yi5sZW5ndGgsZj10aGlzLl9tYXAsYz1mLmNoYXJBdCg2NCk7YyYmKGM9Yi5pbmRleE9mKGMpLC0xIT1jJiYoZT1jKSk7Zm9yKHZhciBjPVtdLGE9MCxkPTA7ZDxcbmU7ZCsrKWlmKGQlNCl7dmFyIGc9Zi5pbmRleE9mKGIuY2hhckF0KGQtMSkpPDwyKihkJTQpLGg9Zi5pbmRleE9mKGIuY2hhckF0KGQpKT4+PjYtMiooZCU0KTtjW2E+Pj4yXXw9KGd8aCk8PDI0LTgqKGElNCk7YSsrfXJldHVybiBqLmNyZWF0ZShjLGEpfSxfbWFwOlwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIn19KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIG1kNS5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oRSl7ZnVuY3Rpb24gaChhLGYsZyxqLHAsaCxrKXthPWErKGYmZ3x+ZiZqKStwK2s7cmV0dXJuKGE8PGh8YT4+PjMyLWgpK2Z9ZnVuY3Rpb24gayhhLGYsZyxqLHAsaCxrKXthPWErKGYmanxnJn5qKStwK2s7cmV0dXJuKGE8PGh8YT4+PjMyLWgpK2Z9ZnVuY3Rpb24gbChhLGYsZyxqLGgsayxsKXthPWErKGZeZ15qKStoK2w7cmV0dXJuKGE8PGt8YT4+PjMyLWspK2Z9ZnVuY3Rpb24gbihhLGYsZyxqLGgsayxsKXthPWErKGdeKGZ8fmopKStoK2w7cmV0dXJuKGE8PGt8YT4+PjMyLWspK2Z9Zm9yKHZhciByPUNyeXB0b0pTLHE9ci5saWIsRj1xLldvcmRBcnJheSxzPXEuSGFzaGVyLHE9ci5hbGdvLGE9W10sdD0wOzY0PnQ7dCsrKWFbdF09NDI5NDk2NzI5NipFLmFicyhFLnNpbih0KzEpKXwwO3E9cS5NRDU9cy5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgRi5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzhdKX0sXG5fZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24obSxmKXtmb3IodmFyIGc9MDsxNj5nO2crKyl7dmFyIGo9ZitnLHA9bVtqXTttW2pdPShwPDw4fHA+Pj4yNCkmMTY3MTE5MzV8KHA8PDI0fHA+Pj44KSY0Mjc4MjU1MzYwfXZhciBnPXRoaXMuX2hhc2gud29yZHMsaj1tW2YrMF0scD1tW2YrMV0scT1tW2YrMl0scj1tW2YrM10scz1tW2YrNF0sdD1tW2YrNV0sdT1tW2YrNl0sdj1tW2YrN10sdz1tW2YrOF0seD1tW2YrOV0seT1tW2YrMTBdLHo9bVtmKzExXSxBPW1bZisxMl0sQj1tW2YrMTNdLEM9bVtmKzE0XSxEPW1bZisxNV0sYj1nWzBdLGM9Z1sxXSxkPWdbMl0sZT1nWzNdLGI9aChiLGMsZCxlLGosNyxhWzBdKSxlPWgoZSxiLGMsZCxwLDEyLGFbMV0pLGQ9aChkLGUsYixjLHEsMTcsYVsyXSksYz1oKGMsZCxlLGIsciwyMixhWzNdKSxiPWgoYixjLGQsZSxzLDcsYVs0XSksZT1oKGUsYixjLGQsdCwxMixhWzVdKSxkPWgoZCxlLGIsYyx1LDE3LGFbNl0pLGM9aChjLGQsZSxiLHYsMjIsYVs3XSksXG5iPWgoYixjLGQsZSx3LDcsYVs4XSksZT1oKGUsYixjLGQseCwxMixhWzldKSxkPWgoZCxlLGIsYyx5LDE3LGFbMTBdKSxjPWgoYyxkLGUsYix6LDIyLGFbMTFdKSxiPWgoYixjLGQsZSxBLDcsYVsxMl0pLGU9aChlLGIsYyxkLEIsMTIsYVsxM10pLGQ9aChkLGUsYixjLEMsMTcsYVsxNF0pLGM9aChjLGQsZSxiLEQsMjIsYVsxNV0pLGI9ayhiLGMsZCxlLHAsNSxhWzE2XSksZT1rKGUsYixjLGQsdSw5LGFbMTddKSxkPWsoZCxlLGIsYyx6LDE0LGFbMThdKSxjPWsoYyxkLGUsYixqLDIwLGFbMTldKSxiPWsoYixjLGQsZSx0LDUsYVsyMF0pLGU9ayhlLGIsYyxkLHksOSxhWzIxXSksZD1rKGQsZSxiLGMsRCwxNCxhWzIyXSksYz1rKGMsZCxlLGIscywyMCxhWzIzXSksYj1rKGIsYyxkLGUseCw1LGFbMjRdKSxlPWsoZSxiLGMsZCxDLDksYVsyNV0pLGQ9ayhkLGUsYixjLHIsMTQsYVsyNl0pLGM9ayhjLGQsZSxiLHcsMjAsYVsyN10pLGI9ayhiLGMsZCxlLEIsNSxhWzI4XSksZT1rKGUsYixcbmMsZCxxLDksYVsyOV0pLGQ9ayhkLGUsYixjLHYsMTQsYVszMF0pLGM9ayhjLGQsZSxiLEEsMjAsYVszMV0pLGI9bChiLGMsZCxlLHQsNCxhWzMyXSksZT1sKGUsYixjLGQsdywxMSxhWzMzXSksZD1sKGQsZSxiLGMseiwxNixhWzM0XSksYz1sKGMsZCxlLGIsQywyMyxhWzM1XSksYj1sKGIsYyxkLGUscCw0LGFbMzZdKSxlPWwoZSxiLGMsZCxzLDExLGFbMzddKSxkPWwoZCxlLGIsYyx2LDE2LGFbMzhdKSxjPWwoYyxkLGUsYix5LDIzLGFbMzldKSxiPWwoYixjLGQsZSxCLDQsYVs0MF0pLGU9bChlLGIsYyxkLGosMTEsYVs0MV0pLGQ9bChkLGUsYixjLHIsMTYsYVs0Ml0pLGM9bChjLGQsZSxiLHUsMjMsYVs0M10pLGI9bChiLGMsZCxlLHgsNCxhWzQ0XSksZT1sKGUsYixjLGQsQSwxMSxhWzQ1XSksZD1sKGQsZSxiLGMsRCwxNixhWzQ2XSksYz1sKGMsZCxlLGIscSwyMyxhWzQ3XSksYj1uKGIsYyxkLGUsaiw2LGFbNDhdKSxlPW4oZSxiLGMsZCx2LDEwLGFbNDldKSxkPW4oZCxlLGIsYyxcbkMsMTUsYVs1MF0pLGM9bihjLGQsZSxiLHQsMjEsYVs1MV0pLGI9bihiLGMsZCxlLEEsNixhWzUyXSksZT1uKGUsYixjLGQsciwxMCxhWzUzXSksZD1uKGQsZSxiLGMseSwxNSxhWzU0XSksYz1uKGMsZCxlLGIscCwyMSxhWzU1XSksYj1uKGIsYyxkLGUsdyw2LGFbNTZdKSxlPW4oZSxiLGMsZCxELDEwLGFbNTddKSxkPW4oZCxlLGIsYyx1LDE1LGFbNThdKSxjPW4oYyxkLGUsYixCLDIxLGFbNTldKSxiPW4oYixjLGQsZSxzLDYsYVs2MF0pLGU9bihlLGIsYyxkLHosMTAsYVs2MV0pLGQ9bihkLGUsYixjLHEsMTUsYVs2Ml0pLGM9bihjLGQsZSxiLHgsMjEsYVs2M10pO2dbMF09Z1swXStifDA7Z1sxXT1nWzFdK2N8MDtnWzJdPWdbMl0rZHwwO2dbM109Z1szXStlfDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fZGF0YSxmPWEud29yZHMsZz04KnRoaXMuX25EYXRhQnl0ZXMsaj04KmEuc2lnQnl0ZXM7ZltqPj4+NV18PTEyODw8MjQtaiUzMjt2YXIgaD1FLmZsb29yKGcvXG40Mjk0OTY3Mjk2KTtmWyhqKzY0Pj4+OTw8NCkrMTVdPShoPDw4fGg+Pj4yNCkmMTY3MTE5MzV8KGg8PDI0fGg+Pj44KSY0Mjc4MjU1MzYwO2ZbKGorNjQ+Pj45PDw0KSsxNF09KGc8PDh8Zz4+PjI0KSYxNjcxMTkzNXwoZzw8MjR8Zz4+PjgpJjQyNzgyNTUzNjA7YS5zaWdCeXRlcz00KihmLmxlbmd0aCsxKTt0aGlzLl9wcm9jZXNzKCk7YT10aGlzLl9oYXNoO2Y9YS53b3Jkcztmb3IoZz0wOzQ+ZztnKyspaj1mW2ddLGZbZ109KGo8PDh8aj4+PjI0KSYxNjcxMTkzNXwoajw8MjR8aj4+PjgpJjQyNzgyNTUzNjA7cmV0dXJuIGF9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGE9cy5jbG9uZS5jYWxsKHRoaXMpO2EuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBhfX0pO3IuTUQ1PXMuX2NyZWF0ZUhlbHBlcihxKTtyLkhtYWNNRDU9cy5fY3JlYXRlSG1hY0hlbHBlcihxKX0pKE1hdGgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTEtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe3ZhciBrPUNyeXB0b0pTLGI9ay5saWIsbT1iLldvcmRBcnJheSxsPWIuSGFzaGVyLGQ9W10sYj1rLmFsZ28uU0hBMT1sLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyBtLmluaXQoWzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OCwzMjg1Mzc3NTIwXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihuLHApe2Zvcih2YXIgYT10aGlzLl9oYXNoLndvcmRzLGU9YVswXSxmPWFbMV0saD1hWzJdLGo9YVszXSxiPWFbNF0sYz0wOzgwPmM7YysrKXtpZigxNj5jKWRbY109bltwK2NdfDA7ZWxzZXt2YXIgZz1kW2MtM11eZFtjLThdXmRbYy0xNF1eZFtjLTE2XTtkW2NdPWc8PDF8Zz4+PjMxfWc9KGU8PDV8ZT4+PjI3KStiK2RbY107Zz0yMD5jP2crKChmJmh8fmYmaikrMTUxODUwMDI0OSk6NDA+Yz9nKygoZl5oXmopKzE4NTk3NzUzOTMpOjYwPmM/ZysoKGYmaHxmJmp8aCZqKS0xODk0MDA3NTg4KTpnKygoZl5oXlxuaiktODk5NDk3NTE0KTtiPWo7aj1oO2g9Zjw8MzB8Zj4+PjI7Zj1lO2U9Z31hWzBdPWFbMF0rZXwwO2FbMV09YVsxXStmfDA7YVsyXT1hWzJdK2h8MDthWzNdPWFbM10ranwwO2FbNF09YVs0XStifDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fZGF0YSxkPWIud29yZHMsYT04KnRoaXMuX25EYXRhQnl0ZXMsZT04KmIuc2lnQnl0ZXM7ZFtlPj4+NV18PTEyODw8MjQtZSUzMjtkWyhlKzY0Pj4+OTw8NCkrMTRdPU1hdGguZmxvb3IoYS80Mjk0OTY3Mjk2KTtkWyhlKzY0Pj4+OTw8NCkrMTVdPWE7Yi5zaWdCeXRlcz00KmQubGVuZ3RoO3RoaXMuX3Byb2Nlc3MoKTtyZXR1cm4gdGhpcy5faGFzaH0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYj1sLmNsb25lLmNhbGwodGhpcyk7Yi5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGJ9fSk7ay5TSEExPWwuX2NyZWF0ZUhlbHBlcihiKTtrLkhtYWNTSEExPWwuX2NyZWF0ZUhtYWNIZWxwZXIoYil9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTI1Ni1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKGspe2Zvcih2YXIgZz1DcnlwdG9KUyxoPWcubGliLHY9aC5Xb3JkQXJyYXksaj1oLkhhc2hlcixoPWcuYWxnbyxzPVtdLHQ9W10sdT1mdW5jdGlvbihxKXtyZXR1cm4gNDI5NDk2NzI5NioocS0ocXwwKSl8MH0sbD0yLGI9MDs2ND5iOyl7dmFyIGQ7YTp7ZD1sO2Zvcih2YXIgdz1rLnNxcnQoZCkscj0yO3I8PXc7cisrKWlmKCEoZCVyKSl7ZD0hMTticmVhayBhfWQ9ITB9ZCYmKDg+YiYmKHNbYl09dShrLnBvdyhsLDAuNSkpKSx0W2JdPXUoay5wb3cobCwxLzMpKSxiKyspO2wrK312YXIgbj1bXSxoPWguU0hBMjU2PWouZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IHYuaW5pdChzLnNsaWNlKDApKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHEsaCl7Zm9yKHZhciBhPXRoaXMuX2hhc2gud29yZHMsYz1hWzBdLGQ9YVsxXSxiPWFbMl0saz1hWzNdLGY9YVs0XSxnPWFbNV0saj1hWzZdLGw9YVs3XSxlPTA7NjQ+ZTtlKyspe2lmKDE2PmUpbltlXT1cbnFbaCtlXXwwO2Vsc2V7dmFyIG09bltlLTE1XSxwPW5bZS0yXTtuW2VdPSgobTw8MjV8bT4+PjcpXihtPDwxNHxtPj4+MTgpXm0+Pj4zKStuW2UtN10rKChwPDwxNXxwPj4+MTcpXihwPDwxM3xwPj4+MTkpXnA+Pj4xMCkrbltlLTE2XX1tPWwrKChmPDwyNnxmPj4+NileKGY8PDIxfGY+Pj4xMSleKGY8PDd8Zj4+PjI1KSkrKGYmZ15+ZiZqKSt0W2VdK25bZV07cD0oKGM8PDMwfGM+Pj4yKV4oYzw8MTl8Yz4+PjEzKV4oYzw8MTB8Yz4+PjIyKSkrKGMmZF5jJmJeZCZiKTtsPWo7aj1nO2c9ZjtmPWsrbXwwO2s9YjtiPWQ7ZD1jO2M9bStwfDB9YVswXT1hWzBdK2N8MDthWzFdPWFbMV0rZHwwO2FbMl09YVsyXStifDA7YVszXT1hWzNdK2t8MDthWzRdPWFbNF0rZnwwO2FbNV09YVs1XStnfDA7YVs2XT1hWzZdK2p8MDthWzddPWFbN10rbHwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBkPXRoaXMuX2RhdGEsYj1kLndvcmRzLGE9OCp0aGlzLl9uRGF0YUJ5dGVzLGM9OCpkLnNpZ0J5dGVzO1xuYltjPj4+NV18PTEyODw8MjQtYyUzMjtiWyhjKzY0Pj4+OTw8NCkrMTRdPWsuZmxvb3IoYS80Mjk0OTY3Mjk2KTtiWyhjKzY0Pj4+OTw8NCkrMTVdPWE7ZC5zaWdCeXRlcz00KmIubGVuZ3RoO3RoaXMuX3Byb2Nlc3MoKTtyZXR1cm4gdGhpcy5faGFzaH0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYj1qLmNsb25lLmNhbGwodGhpcyk7Yi5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGJ9fSk7Zy5TSEEyNTY9ai5fY3JlYXRlSGVscGVyKGgpO2cuSG1hY1NIQTI1Nj1qLl9jcmVhdGVIbWFjSGVscGVyKGgpfSkoTWF0aCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhMjI0LW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYj1DcnlwdG9KUyxkPWIubGliLldvcmRBcnJheSxhPWIuYWxnbyxjPWEuU0hBMjU2LGE9YS5TSEEyMjQ9Yy5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgZC5pbml0KFszMjM4MzcxMDMyLDkxNDE1MDY2Myw4MTI3MDI5OTksNDE0NDkxMjY5Nyw0MjkwNzc1ODU3LDE3NTA2MDMwMjUsMTY5NDA3NjgzOSwzMjA0MDc1NDI4XSl9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9Yy5fZG9GaW5hbGl6ZS5jYWxsKHRoaXMpO2Euc2lnQnl0ZXMtPTQ7cmV0dXJuIGF9fSk7Yi5TSEEyMjQ9Yy5fY3JlYXRlSGVscGVyKGEpO2IuSG1hY1NIQTIyND1jLl9jcmVhdGVIbWFjSGVscGVyKGEpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGE1MTItbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gZC5jcmVhdGUuYXBwbHkoZCxhcmd1bWVudHMpfWZvcih2YXIgbj1DcnlwdG9KUyxyPW4ubGliLkhhc2hlcixlPW4ueDY0LGQ9ZS5Xb3JkLFQ9ZS5Xb3JkQXJyYXksZT1uLmFsZ28sZWE9W2EoMTExNjM1MjQwOCwzNjA5NzY3NDU4KSxhKDE4OTk0NDc0NDEsNjAyODkxNzI1KSxhKDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSksYSgzOTIxMDA5NTczLDIxNzMyOTU1NDgpLGEoOTYxOTg3MTYzLDQwODE2Mjg0NzIpLGEoMTUwODk3MDk5MywzMDUzODM0MjY1KSxhKDI0NTM2MzU3NDgsMjkzNzY3MTU3OSksYSgyODcwNzYzMjIxLDM2NjQ2MDk1NjApLGEoMzYyNDM4MTA4MCwyNzM0ODgzMzk0KSxhKDMxMDU5ODQwMSwxMTY0OTk2NTQyKSxhKDYwNzIyNTI3OCwxMzIzNjEwNzY0KSxhKDE0MjY4ODE5ODcsMzU5MDMwNDk5NCksYSgxOTI1MDc4Mzg4LDQwNjgxODIzODMpLGEoMjE2MjA3ODIwNiw5OTEzMzYxMTMpLGEoMjYxNDg4ODEwMyw2MzM4MDMzMTcpLFxuYSgzMjQ4MjIyNTgwLDM0Nzk3NzQ4NjgpLGEoMzgzNTM5MDQwMSwyNjY2NjEzNDU4KSxhKDQwMjIyMjQ3NzQsOTQ0NzExMTM5KSxhKDI2NDM0NzA3OCwyMzQxMjYyNzczKSxhKDYwNDgwNzYyOCwyMDA3ODAwOTMzKSxhKDc3MDI1NTk4MywxNDk1OTkwOTAxKSxhKDEyNDkxNTAxMjIsMTg1NjQzMTIzNSksYSgxNTU1MDgxNjkyLDMxNzUyMTgxMzIpLGEoMTk5NjA2NDk4NiwyMTk4OTUwODM3KSxhKDI1NTQyMjA4ODIsMzk5OTcxOTMzOSksYSgyODIxODM0MzQ5LDc2Njc4NDAxNiksYSgyOTUyOTk2ODA4LDI1NjY1OTQ4NzkpLGEoMzIxMDMxMzY3MSwzMjAzMzM3OTU2KSxhKDMzMzY1NzE4OTEsMTAzNDQ1NzAyNiksYSgzNTg0NTI4NzExLDI0NjY5NDg5MDEpLGEoMTEzOTI2OTkzLDM3NTgzMjYzODMpLGEoMzM4MjQxODk1LDE2ODcxNzkzNiksYSg2NjYzMDcyMDUsMTE4ODE3OTk2NCksYSg3NzM1Mjk5MTIsMTU0NjA0NTczNCksYSgxMjk0NzU3MzcyLDE1MjI4MDU0ODUpLGEoMTM5NjE4MjI5MSxcbjI2NDM4MzM4MjMpLGEoMTY5NTE4MzcwMCwyMzQzNTI3MzkwKSxhKDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCksYSgyMTc3MDI2MzUwLDEyMDY3NTkxNDIpLGEoMjQ1Njk1NjAzNywzNDQwNzc2MjcpLGEoMjczMDQ4NTkyMSwxMjkwODYzNDYwKSxhKDI4MjAzMDI0MTEsMzE1ODQ1NDI3MyksYSgzMjU5NzMwODAwLDM1MDU5NTI2NTcpLGEoMzM0NTc2NDc3MSwxMDYyMTcwMDgpLGEoMzUxNjA2NTgxNywzNjA2MDA4MzQ0KSxhKDM2MDAzNTI4MDQsMTQzMjcyNTc3NiksYSg0MDk0NTcxOTA5LDE0NjcwMzE1OTQpLGEoMjc1NDIzMzQ0LDg1MTE2OTcyMCksYSg0MzAyMjc3MzQsMzEwMDgyMzc1MiksYSg1MDY5NDg2MTYsMTM2MzI1ODE5NSksYSg2NTkwNjA1NTYsMzc1MDY4NTU5MyksYSg4ODM5OTc4NzcsMzc4NTA1MDI4MCksYSg5NTgxMzk1NzEsMzMxODMwNzQyNyksYSgxMzIyODIyMjE4LDM4MTI3MjM0MDMpLGEoMTUzNzAwMjA2MywyMDAzMDM0OTk1KSxhKDE3NDc4NzM3NzksMzYwMjAzNjg5OSksXG5hKDE5NTU1NjIyMjIsMTU3NTk5MDAxMiksYSgyMDI0MTA0ODE1LDExMjU1OTI5MjgpLGEoMjIyNzczMDQ1MiwyNzE2OTA0MzA2KSxhKDIzNjE4NTI0MjQsNDQyNzc2MDQ0KSxhKDI0Mjg0MzY0NzQsNTkzNjk4MzQ0KSxhKDI3NTY3MzQxODcsMzczMzExMDI0OSksYSgzMjA0MDMxNDc5LDI5OTkzNTE1NzMpLGEoMzMyOTMyNTI5OCwzODE1OTIwNDI3KSxhKDMzOTE1Njk2MTQsMzkyODM4MzkwMCksYSgzNTE1MjY3MjcxLDU2NjI4MDcxMSksYSgzOTQwMTg3NjA2LDM0NTQwNjk1MzQpLGEoNDExODYzMDI3MSw0MDAwMjM5OTkyKSxhKDExNjQxODQ3NCwxOTE0MTM4NTU0KSxhKDE3NDI5MjQyMSwyNzMxMDU1MjcwKSxhKDI4OTM4MDM1NiwzMjAzOTkzMDA2KSxhKDQ2MDM5MzI2OSwzMjA2MjAzMTUpLGEoNjg1NDcxNzMzLDU4NzQ5NjgzNiksYSg4NTIxNDI5NzEsMTA4Njc5Mjg1MSksYSgxMDE3MDM2Mjk4LDM2NTU0MzEwMCksYSgxMTI2MDAwNTgwLDI2MTgyOTc2NzYpLGEoMTI4ODAzMzQ3MCxcbjM0MDk4NTUxNTgpLGEoMTUwMTUwNTk0OCw0MjM0NTA5ODY2KSxhKDE2MDcxNjc5MTUsOTg3MTY3NDY4KSxhKDE4MTY0MDIzMTYsMTI0NjE4OTU5MSldLHY9W10sdz0wOzgwPnc7dysrKXZbd109YSgpO2U9ZS5TSEE1MTI9ci5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgVC5pbml0KFtuZXcgZC5pbml0KDE3NzkwMzM3MDMsNDA4OTIzNTcyMCksbmV3IGQuaW5pdCgzMTQ0MTM0Mjc3LDIyMjc4NzM1OTUpLG5ldyBkLmluaXQoMTAxMzkwNDI0Miw0MjcxMTc1NzIzKSxuZXcgZC5pbml0KDI3NzM0ODA3NjIsMTU5NTc1MDEyOSksbmV3IGQuaW5pdCgxMzU5ODkzMTE5LDI5MTc1NjUxMzcpLG5ldyBkLmluaXQoMjYwMDgyMjkyNCw3MjU1MTExOTkpLG5ldyBkLmluaXQoNTI4NzM0NjM1LDQyMTUzODk1NDcpLG5ldyBkLmluaXQoMTU0MTQ1OTIyNSwzMjcwMzMyMDkpXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGQpe2Zvcih2YXIgZj10aGlzLl9oYXNoLndvcmRzLFxuRj1mWzBdLGU9ZlsxXSxuPWZbMl0scj1mWzNdLEc9Zls0XSxIPWZbNV0sST1mWzZdLGY9Zls3XSx3PUYuaGlnaCxKPUYubG93LFg9ZS5oaWdoLEs9ZS5sb3csWT1uLmhpZ2gsTD1uLmxvdyxaPXIuaGlnaCxNPXIubG93LCQ9Ry5oaWdoLE49Ry5sb3csYWE9SC5oaWdoLE89SC5sb3csYmE9SS5oaWdoLFA9SS5sb3csY2E9Zi5oaWdoLFE9Zi5sb3csaz13LGc9Six6PVgseD1LLEE9WSx5PUwsVT1aLEI9TSxsPSQsaD1OLFI9YWEsQz1PLFM9YmEsRD1QLFY9Y2EsRT1RLG09MDs4MD5tO20rKyl7dmFyIHM9dlttXTtpZigxNj5tKXZhciBqPXMuaGlnaD1hW2QrMiptXXwwLGI9cy5sb3c9YVtkKzIqbSsxXXwwO2Vsc2V7dmFyIGo9dlttLTE1XSxiPWouaGlnaCxwPWoubG93LGo9KGI+Pj4xfHA8PDMxKV4oYj4+Pjh8cDw8MjQpXmI+Pj43LHA9KHA+Pj4xfGI8PDMxKV4ocD4+Pjh8Yjw8MjQpXihwPj4+N3xiPDwyNSksdT12W20tMl0sYj11LmhpZ2gsYz11Lmxvdyx1PShiPj4+MTl8Yzw8MTMpXihiPDxcbjN8Yz4+PjI5KV5iPj4+NixjPShjPj4+MTl8Yjw8MTMpXihjPDwzfGI+Pj4yOSleKGM+Pj42fGI8PDI2KSxiPXZbbS03XSxXPWIuaGlnaCx0PXZbbS0xNl0scT10LmhpZ2gsdD10LmxvdyxiPXArYi5sb3csaj1qK1crKGI+Pj4wPHA+Pj4wPzE6MCksYj1iK2Msaj1qK3UrKGI+Pj4wPGM+Pj4wPzE6MCksYj1iK3Qsaj1qK3ErKGI+Pj4wPHQ+Pj4wPzE6MCk7cy5oaWdoPWo7cy5sb3c9Yn12YXIgVz1sJlJefmwmUyx0PWgmQ15+aCZELHM9ayZ6XmsmQV56JkEsVD1nJnheZyZ5XngmeSxwPShrPj4+Mjh8Zzw8NCleKGs8PDMwfGc+Pj4yKV4oazw8MjV8Zz4+PjcpLHU9KGc+Pj4yOHxrPDw0KV4oZzw8MzB8az4+PjIpXihnPDwyNXxrPj4+NyksYz1lYVttXSxmYT1jLmhpZ2gsZGE9Yy5sb3csYz1FKygoaD4+PjE0fGw8PDE4KV4oaD4+PjE4fGw8PDE0KV4oaDw8MjN8bD4+PjkpKSxxPVYrKChsPj4+MTR8aDw8MTgpXihsPj4+MTh8aDw8MTQpXihsPDwyM3xoPj4+OSkpKyhjPj4+MDxFPj4+MD8xOlxuMCksYz1jK3QscT1xK1crKGM+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+Pj4wPzE6MCk7UD1JLmxvdz1QK0Q7XG5JLmhpZ2g9YmErUysoUD4+PjA8RD4+PjA/MTowKTtRPWYubG93PVErRTtmLmhpZ2g9Y2ErVisoUT4+PjA8RT4+PjA/MTowKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9kYXRhLGQ9YS53b3JkcyxmPTgqdGhpcy5fbkRhdGFCeXRlcyxlPTgqYS5zaWdCeXRlcztkW2U+Pj41XXw9MTI4PDwyNC1lJTMyO2RbKGUrMTI4Pj4+MTA8PDUpKzMwXT1NYXRoLmZsb29yKGYvNDI5NDk2NzI5Nik7ZFsoZSsxMjg+Pj4xMDw8NSkrMzFdPWY7YS5zaWdCeXRlcz00KmQubGVuZ3RoO3RoaXMuX3Byb2Nlc3MoKTtyZXR1cm4gdGhpcy5faGFzaC50b1gzMigpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPXIuY2xvbmUuY2FsbCh0aGlzKTthLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gYX0sYmxvY2tTaXplOjMyfSk7bi5TSEE1MTI9ci5fY3JlYXRlSGVscGVyKGUpO24uSG1hY1NIQTUxMj1yLl9jcmVhdGVIbWFjSGVscGVyKGUpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGEzODQtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe3ZhciBjPUNyeXB0b0pTLGE9Yy54NjQsYj1hLldvcmQsZT1hLldvcmRBcnJheSxhPWMuYWxnbyxkPWEuU0hBNTEyLGE9YS5TSEEzODQ9ZC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgZS5pbml0KFtuZXcgYi5pbml0KDM0MTgwNzAzNjUsMzIzODM3MTAzMiksbmV3IGIuaW5pdCgxNjU0MjcwMjUwLDkxNDE1MDY2MyksbmV3IGIuaW5pdCgyNDM4NTI5MzcwLDgxMjcwMjk5OSksbmV3IGIuaW5pdCgzNTU0NjIzNjAsNDE0NDkxMjY5NyksbmV3IGIuaW5pdCgxNzMxNDA1NDE1LDQyOTA3NzU4NTcpLG5ldyBiLmluaXQoMjM5NDE4MDIzMSwxNzUwNjAzMDI1KSxuZXcgYi5pbml0KDM2NzUwMDg1MjUsMTY5NDA3NjgzOSksbmV3IGIuaW5pdCgxMjAzMDYyODEzLDMyMDQwNzU0MjgpXSl9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9ZC5fZG9GaW5hbGl6ZS5jYWxsKHRoaXMpO2Euc2lnQnl0ZXMtPTE2O3JldHVybiBhfX0pO2MuU0hBMzg0PVxuZC5fY3JlYXRlSGVscGVyKGEpO2MuSG1hY1NIQTM4ND1kLl9jcmVhdGVIbWFjSGVscGVyKGEpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiByaXBlbWQxNjAtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbi8qXG5cbihjKSAyMDEyIGJ5IENlZHJpYyBNZXNuaWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIHE9Q3J5cHRvSlMsZD1xLmxpYixuPWQuV29yZEFycmF5LHA9ZC5IYXNoZXIsZD1xLmFsZ28seD1uLmNyZWF0ZShbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSw3LDQsMTMsMSwxMCw2LDE1LDMsMTIsMCw5LDUsMiwxNCwxMSw4LDMsMTAsMTQsNCw5LDE1LDgsMSwyLDcsMCw2LDEzLDExLDUsMTIsMSw5LDExLDEwLDAsOCwxMiw0LDEzLDMsNywxNSwxNCw1LDYsMiw0LDAsNSw5LDcsMTIsMiwxMCwxNCwxLDMsOCwxMSw2LDE1LDEzXSkseT1uLmNyZWF0ZShbNSwxNCw3LDAsOSwyLDExLDQsMTMsNiwxNSw4LDEsMTAsMywxMiw2LDExLDMsNywwLDEzLDUsMTAsMTQsMTUsOCwxMiw0LDksMSwyLDE1LDUsMSwzLDcsMTQsNiw5LDExLDgsMTIsMiwxMCwwLDQsMTMsOCw2LDQsMSwzLDExLDE1LDAsNSwxMiwyLDEzLDksNywxMCwxNCwxMiwxNSwxMCw0LDEsNSw4LDcsNiwyLDEzLDE0LDAsMyw5LDExXSksej1uLmNyZWF0ZShbMTEsMTQsMTUsMTIsXG41LDgsNyw5LDExLDEzLDE0LDE1LDYsNyw5LDgsNyw2LDgsMTMsMTEsOSw3LDE1LDcsMTIsMTUsOSwxMSw3LDEzLDEyLDExLDEzLDYsNywxNCw5LDEzLDE1LDE0LDgsMTMsNiw1LDEyLDcsNSwxMSwxMiwxNCwxNSwxNCwxNSw5LDgsOSwxNCw1LDYsOCw2LDUsMTIsOSwxNSw1LDExLDYsOCwxMywxMiw1LDEyLDEzLDE0LDExLDgsNSw2XSksQT1uLmNyZWF0ZShbOCw5LDksMTEsMTMsMTUsMTUsNSw3LDcsOCwxMSwxNCwxNCwxMiw2LDksMTMsMTUsNywxMiw4LDksMTEsNyw3LDEyLDcsNiwxNSwxMywxMSw5LDcsMTUsMTEsOCw2LDYsMTQsMTIsMTMsNSwxNCwxMywxMyw3LDUsMTUsNSw4LDExLDE0LDE0LDYsMTQsNiw5LDEyLDksMTIsNSwxNSw4LDgsNSwxMiw5LDEyLDUsMTQsNiw4LDEzLDYsNSwxNSwxMywxMSwxMV0pLEI9bi5jcmVhdGUoWzAsMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMjg0MDg1MzgzOF0pLEM9bi5jcmVhdGUoWzEzNTI4Mjk5MjYsMTU0ODYwMzY4NCwxODM2MDcyNjkxLFxuMjA1Mzk5NDIxNywwXSksZD1kLlJJUEVNRDE2MD1wLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW4uY3JlYXRlKFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oZSx2KXtmb3IodmFyIGI9MDsxNj5iO2IrKyl7dmFyIGM9ditiLGY9ZVtjXTtlW2NdPShmPDw4fGY+Pj4yNCkmMTY3MTE5MzV8KGY8PDI0fGY+Pj44KSY0Mjc4MjU1MzYwfXZhciBjPXRoaXMuX2hhc2gud29yZHMsZj1CLndvcmRzLGQ9Qy53b3JkcyxuPXgud29yZHMscT15LndvcmRzLHA9ei53b3Jkcyx3PUEud29yZHMsdCxnLGgsaixyLHUsayxsLG0sczt1PXQ9Y1swXTtrPWc9Y1sxXTtsPWg9Y1syXTttPWo9Y1szXTtzPXI9Y1s0XTtmb3IodmFyIGEsYj0wOzgwPmI7Yis9MSlhPXQrZVt2K25bYl1dfDAsYT0xNj5iP2ErKChnXmheaikrZlswXSk6MzI+Yj9hKygoZyZofH5nJmopK2ZbMV0pOjQ4PmI/XG5hKygoKGd8fmgpXmopK2ZbMl0pOjY0PmI/YSsoKGcmanxoJn5qKStmWzNdKTphKygoZ14oaHx+aikpK2ZbNF0pLGF8PTAsYT1hPDxwW2JdfGE+Pj4zMi1wW2JdLGE9YStyfDAsdD1yLHI9aixqPWg8PDEwfGg+Pj4yMixoPWcsZz1hLGE9dStlW3YrcVtiXV18MCxhPTE2PmI/YSsoKGteKGx8fm0pKStkWzBdKTozMj5iP2ErKChrJm18bCZ+bSkrZFsxXSk6NDg+Yj9hKygoKGt8fmwpXm0pK2RbMl0pOjY0PmI/YSsoKGsmbHx+ayZtKStkWzNdKTphKygoa15sXm0pK2RbNF0pLGF8PTAsYT1hPDx3W2JdfGE+Pj4zMi13W2JdLGE9YStzfDAsdT1zLHM9bSxtPWw8PDEwfGw+Pj4yMixsPWssaz1hO2E9Y1sxXStoK218MDtjWzFdPWNbMl0raitzfDA7Y1syXT1jWzNdK3IrdXwwO2NbM109Y1s0XSt0K2t8MDtjWzRdPWNbMF0rZytsfDA7Y1swXT1hfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2RhdGEsZD1lLndvcmRzLGI9OCp0aGlzLl9uRGF0YUJ5dGVzLGM9OCplLnNpZ0J5dGVzO1xuZFtjPj4+NV18PTEyODw8MjQtYyUzMjtkWyhjKzY0Pj4+OTw8NCkrMTRdPShiPDw4fGI+Pj4yNCkmMTY3MTE5MzV8KGI8PDI0fGI+Pj44KSY0Mjc4MjU1MzYwO2Uuc2lnQnl0ZXM9NCooZC5sZW5ndGgrMSk7dGhpcy5fcHJvY2VzcygpO2U9dGhpcy5faGFzaDtkPWUud29yZHM7Zm9yKGI9MDs1PmI7YisrKWM9ZFtiXSxkW2JdPShjPDw4fGM+Pj4yNCkmMTY3MTE5MzV8KGM8PDI0fGM+Pj44KSY0Mjc4MjU1MzYwO3JldHVybiBlfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBkPXAuY2xvbmUuY2FsbCh0aGlzKTtkLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gZH19KTtxLlJJUEVNRDE2MD1wLl9jcmVhdGVIZWxwZXIoZCk7cS5IbWFjUklQRU1EMTYwPXAuX2NyZWF0ZUhtYWNIZWxwZXIoZCl9KShNYXRoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBobWFjLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe3ZhciBjPUNyeXB0b0pTLGs9Yy5lbmMuVXRmODtjLmFsZ28uSE1BQz1jLmxpYi5CYXNlLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihhLGIpe2E9dGhpcy5faGFzaGVyPW5ldyBhLmluaXQ7XCJzdHJpbmdcIj09dHlwZW9mIGImJihiPWsucGFyc2UoYikpO3ZhciBjPWEuYmxvY2tTaXplLGU9NCpjO2Iuc2lnQnl0ZXM+ZSYmKGI9YS5maW5hbGl6ZShiKSk7Yi5jbGFtcCgpO2Zvcih2YXIgZj10aGlzLl9vS2V5PWIuY2xvbmUoKSxnPXRoaXMuX2lLZXk9Yi5jbG9uZSgpLGg9Zi53b3JkcyxqPWcud29yZHMsZD0wO2Q8YztkKyspaFtkXV49MTU0OTU1NjgyOCxqW2RdXj05MDk1MjI0ODY7Zi5zaWdCeXRlcz1nLnNpZ0J5dGVzPWU7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2hhc2hlcjthLnJlc2V0KCk7YS51cGRhdGUodGhpcy5faUtleSl9LHVwZGF0ZTpmdW5jdGlvbihhKXt0aGlzLl9oYXNoZXIudXBkYXRlKGEpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbihhKXt2YXIgYj1cbnRoaXMuX2hhc2hlcjthPWIuZmluYWxpemUoYSk7Yi5yZXNldCgpO3JldHVybiBiLmZpbmFsaXplKHRoaXMuX29LZXkuY2xvbmUoKS5jb25jYXQoYSkpfX0pfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBwYmtkZjItbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe3ZhciBiPUNyeXB0b0pTLGE9Yi5saWIsZD1hLkJhc2UsbT1hLldvcmRBcnJheSxhPWIuYWxnbyxxPWEuSE1BQyxsPWEuUEJLREYyPWQuZXh0ZW5kKHtjZmc6ZC5leHRlbmQoe2tleVNpemU6NCxoYXNoZXI6YS5TSEExLGl0ZXJhdGlvbnM6MX0pLGluaXQ6ZnVuY3Rpb24oYSl7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKGEpfSxjb21wdXRlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPXRoaXMuY2ZnLGY9cS5jcmVhdGUoYy5oYXNoZXIsYSksZz1tLmNyZWF0ZSgpLGQ9bS5jcmVhdGUoWzFdKSxsPWcud29yZHMscj1kLndvcmRzLG49Yy5rZXlTaXplLGM9Yy5pdGVyYXRpb25zO2wubGVuZ3RoPG47KXt2YXIgaD1mLnVwZGF0ZShiKS5maW5hbGl6ZShkKTtmLnJlc2V0KCk7Zm9yKHZhciBqPWgud29yZHMscz1qLmxlbmd0aCxrPWgscD0xO3A8YztwKyspe2s9Zi5maW5hbGl6ZShrKTtmLnJlc2V0KCk7Zm9yKHZhciB0PWsud29yZHMsZT0wO2U8cztlKyspaltlXV49dFtlXX1nLmNvbmNhdChoKTtcbnJbMF0rK31nLnNpZ0J5dGVzPTQqbjtyZXR1cm4gZ319KTtiLlBCS0RGMj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGwuY3JlYXRlKGMpLmNvbXB1dGUoYSxiKX19KSgpO1xuXG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xudmFyIGI2NG1hcD1cIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjt2YXIgYjY0cGFkPVwiPVwiO2Z1bmN0aW9uIGhleDJiNjQoZCl7dmFyIGI7dmFyIGU7dmFyIGE9XCJcIjtmb3IoYj0wO2IrMzw9ZC5sZW5ndGg7Yis9Myl7ZT1wYXJzZUludChkLnN1YnN0cmluZyhiLGIrMyksMTYpO2ErPWI2NG1hcC5jaGFyQXQoZT4+NikrYjY0bWFwLmNoYXJBdChlJjYzKX1pZihiKzE9PWQubGVuZ3RoKXtlPXBhcnNlSW50KGQuc3Vic3RyaW5nKGIsYisxKSwxNik7YSs9YjY0bWFwLmNoYXJBdChlPDwyKX1lbHNle2lmKGIrMj09ZC5sZW5ndGgpe2U9cGFyc2VJbnQoZC5zdWJzdHJpbmcoYixiKzIpLDE2KTthKz1iNjRtYXAuY2hhckF0KGU+PjIpK2I2NG1hcC5jaGFyQXQoKGUmMyk8PDQpfX1pZihiNjRwYWQpe3doaWxlKChhLmxlbmd0aCYzKT4wKXthKz1iNjRwYWR9fXJldHVybiBhfWZ1bmN0aW9uIGI2NHRvaGV4KGYpe3ZhciBkPVwiXCI7dmFyIGU7dmFyIGI9MDt2YXIgYzt2YXIgYTtmb3IoZT0wO2U8Zi5sZW5ndGg7KytlKXtpZihmLmNoYXJBdChlKT09YjY0cGFkKXticmVha31hPWI2NG1hcC5pbmRleE9mKGYuY2hhckF0KGUpKTtpZihhPDApe2NvbnRpbnVlfWlmKGI9PTApe2QrPWludDJjaGFyKGE+PjIpO2M9YSYzO2I9MX1lbHNle2lmKGI9PTEpe2QrPWludDJjaGFyKChjPDwyKXwoYT4+NCkpO2M9YSYxNTtiPTJ9ZWxzZXtpZihiPT0yKXtkKz1pbnQyY2hhcihjKTtkKz1pbnQyY2hhcihhPj4yKTtjPWEmMztiPTN9ZWxzZXtkKz1pbnQyY2hhcigoYzw8Mil8KGE+PjQpKTtkKz1pbnQyY2hhcihhJjE1KTtiPTB9fX19aWYoYj09MSl7ZCs9aW50MmNoYXIoYzw8Mil9cmV0dXJuIGR9ZnVuY3Rpb24gYjY0dG9CQShlKXt2YXIgZD1iNjR0b2hleChlKTt2YXIgYzt2YXIgYj1uZXcgQXJyYXkoKTtmb3IoYz0wOzIqYzxkLmxlbmd0aDsrK2Mpe2JbY109cGFyc2VJbnQoZC5zdWJzdHJpbmcoMipjLDIqYysyKSwxNil9cmV0dXJuIGJ9O1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbnZhciBkYml0czt2YXIgY2FuYXJ5PTI0NDgzNzgxNDA5NDU5MDt2YXIgal9sbT0oKGNhbmFyeSYxNjc3NzIxNSk9PTE1NzE1MDcwKTtmdW5jdGlvbiBCaWdJbnRlZ2VyKGUsZCxmKXtpZihlIT1udWxsKXtpZihcIm51bWJlclwiPT10eXBlb2YgZSl7dGhpcy5mcm9tTnVtYmVyKGUsZCxmKX1lbHNle2lmKGQ9PW51bGwmJlwic3RyaW5nXCIhPXR5cGVvZiBlKXt0aGlzLmZyb21TdHJpbmcoZSwyNTYpfWVsc2V7dGhpcy5mcm9tU3RyaW5nKGUsZCl9fX19ZnVuY3Rpb24gbmJpKCl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKG51bGwpfWZ1bmN0aW9uIGFtMShmLGEsYixlLGgsZyl7d2hpbGUoLS1nPj0wKXt2YXIgZD1hKnRoaXNbZisrXStiW2VdK2g7aD1NYXRoLmZsb29yKGQvNjcxMDg4NjQpO2JbZSsrXT1kJjY3MTA4ODYzfXJldHVybiBofWZ1bmN0aW9uIGFtMihmLHEscixlLG8sYSl7dmFyIGs9cSYzMjc2NyxwPXE+PjE1O3doaWxlKC0tYT49MCl7dmFyIGQ9dGhpc1tmXSYzMjc2Nzt2YXIgZz10aGlzW2YrK10+PjE1O3ZhciBiPXAqZCtnKms7ZD1rKmQrKChiJjMyNzY3KTw8MTUpK3JbZV0rKG8mMTA3Mzc0MTgyMyk7bz0oZD4+PjMwKSsoYj4+PjE1KStwKmcrKG8+Pj4zMCk7cltlKytdPWQmMTA3Mzc0MTgyM31yZXR1cm4gb31mdW5jdGlvbiBhbTMoZixxLHIsZSxvLGEpe3ZhciBrPXEmMTYzODMscD1xPj4xNDt3aGlsZSgtLWE+PTApe3ZhciBkPXRoaXNbZl0mMTYzODM7dmFyIGc9dGhpc1tmKytdPj4xNDt2YXIgYj1wKmQrZyprO2Q9aypkKygoYiYxNjM4Myk8PDE0KStyW2VdK287bz0oZD4+MjgpKyhiPj4xNCkrcCpnO3JbZSsrXT1kJjI2ODQzNTQ1NX1yZXR1cm4gb31pZihqX2xtJiYobmF2aWdhdG9yLmFwcE5hbWU9PVwiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyXCIpKXtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbT1hbTI7ZGJpdHM9MzB9ZWxzZXtpZihqX2xtJiYobmF2aWdhdG9yLmFwcE5hbWUhPVwiTmV0c2NhcGVcIikpe0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMTtkYml0cz0yNn1lbHNle0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMztkYml0cz0yOH19QmlnSW50ZWdlci5wcm90b3R5cGUuREI9ZGJpdHM7QmlnSW50ZWdlci5wcm90b3R5cGUuRE09KCgxPDxkYml0cyktMSk7QmlnSW50ZWdlci5wcm90b3R5cGUuRFY9KDE8PGRiaXRzKTt2YXIgQklfRlA9NTI7QmlnSW50ZWdlci5wcm90b3R5cGUuRlY9TWF0aC5wb3coMixCSV9GUCk7QmlnSW50ZWdlci5wcm90b3R5cGUuRjE9QklfRlAtZGJpdHM7QmlnSW50ZWdlci5wcm90b3R5cGUuRjI9MipkYml0cy1CSV9GUDt2YXIgQklfUk09XCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjt2YXIgQklfUkM9bmV3IEFycmF5KCk7dmFyIHJyLHZ2O3JyPVwiMFwiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTA7dnY8PTk7Kyt2dil7QklfUkNbcnIrK109dnZ9cnI9XCJhXCIuY2hhckNvZGVBdCgwKTtmb3IodnY9MTA7dnY8MzY7Kyt2dil7QklfUkNbcnIrK109dnZ9cnI9XCJBXCIuY2hhckNvZGVBdCgwKTtmb3IodnY9MTA7dnY8MzY7Kyt2dil7QklfUkNbcnIrK109dnZ9ZnVuY3Rpb24gaW50MmNoYXIoYSl7cmV0dXJuIEJJX1JNLmNoYXJBdChhKX1mdW5jdGlvbiBpbnRBdChiLGEpe3ZhciBkPUJJX1JDW2IuY2hhckNvZGVBdChhKV07cmV0dXJuKGQ9PW51bGwpPy0xOmR9ZnVuY3Rpb24gYm5wQ29weVRvKGIpe2Zvcih2YXIgYT10aGlzLnQtMTthPj0wOy0tYSl7YlthXT10aGlzW2FdfWIudD10aGlzLnQ7Yi5zPXRoaXMuc31mdW5jdGlvbiBibnBGcm9tSW50KGEpe3RoaXMudD0xO3RoaXMucz0oYTwwKT8tMTowO2lmKGE+MCl7dGhpc1swXT1hfWVsc2V7aWYoYTwtMSl7dGhpc1swXT1hK3RoaXMuRFZ9ZWxzZXt0aGlzLnQ9MH19fWZ1bmN0aW9uIG5idihhKXt2YXIgYj1uYmkoKTtiLmZyb21JbnQoYSk7cmV0dXJuIGJ9ZnVuY3Rpb24gYm5wRnJvbVN0cmluZyhoLGMpe3ZhciBlO2lmKGM9PTE2KXtlPTR9ZWxzZXtpZihjPT04KXtlPTN9ZWxzZXtpZihjPT0yNTYpe2U9OH1lbHNle2lmKGM9PTIpe2U9MX1lbHNle2lmKGM9PTMyKXtlPTV9ZWxzZXtpZihjPT00KXtlPTJ9ZWxzZXt0aGlzLmZyb21SYWRpeChoLGMpO3JldHVybn19fX19fXRoaXMudD0wO3RoaXMucz0wO3ZhciBnPWgubGVuZ3RoLGQ9ZmFsc2UsZj0wO3doaWxlKC0tZz49MCl7dmFyIGE9KGU9PTgpP2hbZ10mMjU1OmludEF0KGgsZyk7aWYoYTwwKXtpZihoLmNoYXJBdChnKT09XCItXCIpe2Q9dHJ1ZX1jb250aW51ZX1kPWZhbHNlO2lmKGY9PTApe3RoaXNbdGhpcy50KytdPWF9ZWxzZXtpZihmK2U+dGhpcy5EQil7dGhpc1t0aGlzLnQtMV18PShhJigoMTw8KHRoaXMuREItZikpLTEpKTw8Zjt0aGlzW3RoaXMudCsrXT0oYT4+KHRoaXMuREItZikpfWVsc2V7dGhpc1t0aGlzLnQtMV18PWE8PGZ9fWYrPWU7aWYoZj49dGhpcy5EQil7Zi09dGhpcy5EQn19aWYoZT09OCYmKGhbMF0mMTI4KSE9MCl7dGhpcy5zPS0xO2lmKGY+MCl7dGhpc1t0aGlzLnQtMV18PSgoMTw8KHRoaXMuREItZikpLTEpPDxmfX10aGlzLmNsYW1wKCk7aWYoZCl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyl9fWZ1bmN0aW9uIGJucENsYW1wKCl7dmFyIGE9dGhpcy5zJnRoaXMuRE07d2hpbGUodGhpcy50PjAmJnRoaXNbdGhpcy50LTFdPT1hKXstLXRoaXMudH19ZnVuY3Rpb24gYm5Ub1N0cmluZyhjKXtpZih0aGlzLnM8MCl7cmV0dXJuXCItXCIrdGhpcy5uZWdhdGUoKS50b1N0cmluZyhjKX12YXIgZTtpZihjPT0xNil7ZT00fWVsc2V7aWYoYz09OCl7ZT0zfWVsc2V7aWYoYz09Mil7ZT0xfWVsc2V7aWYoYz09MzIpe2U9NX1lbHNle2lmKGM9PTQpe2U9Mn1lbHNle3JldHVybiB0aGlzLnRvUmFkaXgoYyl9fX19fXZhciBnPSgxPDxlKS0xLGwsYT1mYWxzZSxoPVwiXCIsZj10aGlzLnQ7dmFyIGo9dGhpcy5EQi0oZip0aGlzLkRCKSVlO2lmKGYtLT4wKXtpZihqPHRoaXMuREImJihsPXRoaXNbZl0+PmopPjApe2E9dHJ1ZTtoPWludDJjaGFyKGwpfXdoaWxlKGY+PTApe2lmKGo8ZSl7bD0odGhpc1tmXSYoKDE8PGopLTEpKTw8KGUtaik7bHw9dGhpc1stLWZdPj4oais9dGhpcy5EQi1lKX1lbHNle2w9KHRoaXNbZl0+PihqLT1lKSkmZztpZihqPD0wKXtqKz10aGlzLkRCOy0tZn19aWYobD4wKXthPXRydWV9aWYoYSl7aCs9aW50MmNoYXIobCl9fX1yZXR1cm4gYT9oOlwiMFwifWZ1bmN0aW9uIGJuTmVnYXRlKCl7dmFyIGE9bmJpKCk7QmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5BYnMoKXtyZXR1cm4odGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpc31mdW5jdGlvbiBibkNvbXBhcmVUbyhiKXt2YXIgZD10aGlzLnMtYi5zO2lmKGQhPTApe3JldHVybiBkfXZhciBjPXRoaXMudDtkPWMtYi50O2lmKGQhPTApe3JldHVybih0aGlzLnM8MCk/LWQ6ZH13aGlsZSgtLWM+PTApe2lmKChkPXRoaXNbY10tYltjXSkhPTApe3JldHVybiBkfX1yZXR1cm4gMH1mdW5jdGlvbiBuYml0cyhhKXt2YXIgYz0xLGI7aWYoKGI9YT4+PjE2KSE9MCl7YT1iO2MrPTE2fWlmKChiPWE+PjgpIT0wKXthPWI7Yys9OH1pZigoYj1hPj40KSE9MCl7YT1iO2MrPTR9aWYoKGI9YT4+MikhPTApe2E9YjtjKz0yfWlmKChiPWE+PjEpIT0wKXthPWI7Yys9MX1yZXR1cm4gY31mdW5jdGlvbiBibkJpdExlbmd0aCgpe2lmKHRoaXMudDw9MCl7cmV0dXJuIDB9cmV0dXJuIHRoaXMuREIqKHRoaXMudC0xKStuYml0cyh0aGlzW3RoaXMudC0xXV4odGhpcy5zJnRoaXMuRE0pKX1mdW5jdGlvbiBibnBETFNoaWZ0VG8oYyxiKXt2YXIgYTtmb3IoYT10aGlzLnQtMTthPj0wOy0tYSl7YlthK2NdPXRoaXNbYV19Zm9yKGE9Yy0xO2E+PTA7LS1hKXtiW2FdPTB9Yi50PXRoaXMudCtjO2Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wRFJTaGlmdFRvKGMsYil7Zm9yKHZhciBhPWM7YTx0aGlzLnQ7KythKXtiW2EtY109dGhpc1thXX1iLnQ9TWF0aC5tYXgodGhpcy50LWMsMCk7Yi5zPXRoaXMuc31mdW5jdGlvbiBibnBMU2hpZnRUbyhqLGUpe3ZhciBiPWoldGhpcy5EQjt2YXIgYT10aGlzLkRCLWI7dmFyIGc9KDE8PGEpLTE7dmFyIGY9TWF0aC5mbG9vcihqL3RoaXMuREIpLGg9KHRoaXMuczw8YikmdGhpcy5ETSxkO2ZvcihkPXRoaXMudC0xO2Q+PTA7LS1kKXtlW2QrZisxXT0odGhpc1tkXT4+YSl8aDtoPSh0aGlzW2RdJmcpPDxifWZvcihkPWYtMTtkPj0wOy0tZCl7ZVtkXT0wfWVbZl09aDtlLnQ9dGhpcy50K2YrMTtlLnM9dGhpcy5zO2UuY2xhbXAoKX1mdW5jdGlvbiBibnBSU2hpZnRUbyhnLGQpe2Qucz10aGlzLnM7dmFyIGU9TWF0aC5mbG9vcihnL3RoaXMuREIpO2lmKGU+PXRoaXMudCl7ZC50PTA7cmV0dXJufXZhciBiPWcldGhpcy5EQjt2YXIgYT10aGlzLkRCLWI7dmFyIGY9KDE8PGIpLTE7ZFswXT10aGlzW2VdPj5iO2Zvcih2YXIgYz1lKzE7Yzx0aGlzLnQ7KytjKXtkW2MtZS0xXXw9KHRoaXNbY10mZik8PGE7ZFtjLWVdPXRoaXNbY10+PmJ9aWYoYj4wKXtkW3RoaXMudC1lLTFdfD0odGhpcy5zJmYpPDxhfWQudD10aGlzLnQtZTtkLmNsYW1wKCl9ZnVuY3Rpb24gYm5wU3ViVG8oZCxmKXt2YXIgZT0wLGc9MCxiPU1hdGgubWluKGQudCx0aGlzLnQpO3doaWxlKGU8Yil7Zys9dGhpc1tlXS1kW2VdO2ZbZSsrXT1nJnRoaXMuRE07Zz4+PXRoaXMuREJ9aWYoZC50PHRoaXMudCl7Zy09ZC5zO3doaWxlKGU8dGhpcy50KXtnKz10aGlzW2VdO2ZbZSsrXT1nJnRoaXMuRE07Zz4+PXRoaXMuREJ9Zys9dGhpcy5zfWVsc2V7Zys9dGhpcy5zO3doaWxlKGU8ZC50KXtnLT1kW2VdO2ZbZSsrXT1nJnRoaXMuRE07Zz4+PXRoaXMuREJ9Zy09ZC5zfWYucz0oZzwwKT8tMTowO2lmKGc8LTEpe2ZbZSsrXT10aGlzLkRWK2d9ZWxzZXtpZihnPjApe2ZbZSsrXT1nfX1mLnQ9ZTtmLmNsYW1wKCl9ZnVuY3Rpb24gYm5wTXVsdGlwbHlUbyhjLGUpe3ZhciBiPXRoaXMuYWJzKCksZj1jLmFicygpO3ZhciBkPWIudDtlLnQ9ZCtmLnQ7d2hpbGUoLS1kPj0wKXtlW2RdPTB9Zm9yKGQ9MDtkPGYudDsrK2Qpe2VbZCtiLnRdPWIuYW0oMCxmW2RdLGUsZCwwLGIudCl9ZS5zPTA7ZS5jbGFtcCgpO2lmKHRoaXMucyE9Yy5zKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8oZSxlKX19ZnVuY3Rpb24gYm5wU3F1YXJlVG8oZCl7dmFyIGE9dGhpcy5hYnMoKTt2YXIgYj1kLnQ9MiphLnQ7d2hpbGUoLS1iPj0wKXtkW2JdPTB9Zm9yKGI9MDtiPGEudC0xOysrYil7dmFyIGU9YS5hbShiLGFbYl0sZCwyKmIsMCwxKTtpZigoZFtiK2EudF0rPWEuYW0oYisxLDIqYVtiXSxkLDIqYisxLGUsYS50LWItMSkpPj1hLkRWKXtkW2IrYS50XS09YS5EVjtkW2IrYS50KzFdPTF9fWlmKGQudD4wKXtkW2QudC0xXSs9YS5hbShiLGFbYl0sZCwyKmIsMCwxKX1kLnM9MDtkLmNsYW1wKCl9ZnVuY3Rpb24gYm5wRGl2UmVtVG8obixoLGcpe3ZhciB3PW4uYWJzKCk7aWYody50PD0wKXtyZXR1cm59dmFyIGs9dGhpcy5hYnMoKTtpZihrLnQ8dy50KXtpZihoIT1udWxsKXtoLmZyb21JbnQoMCl9aWYoZyE9bnVsbCl7dGhpcy5jb3B5VG8oZyl9cmV0dXJufWlmKGc9PW51bGwpe2c9bmJpKCl9dmFyIGQ9bmJpKCksYT10aGlzLnMsbD1uLnM7dmFyIHY9dGhpcy5EQi1uYml0cyh3W3cudC0xXSk7aWYodj4wKXt3LmxTaGlmdFRvKHYsZCk7ay5sU2hpZnRUbyh2LGcpfWVsc2V7dy5jb3B5VG8oZCk7ay5jb3B5VG8oZyl9dmFyIHA9ZC50O3ZhciBiPWRbcC0xXTtpZihiPT0wKXtyZXR1cm59dmFyIG89YiooMTw8dGhpcy5GMSkrKChwPjEpP2RbcC0yXT4+dGhpcy5GMjowKTt2YXIgQT10aGlzLkZWL28sej0oMTw8dGhpcy5GMSkvbyx4PTE8PHRoaXMuRjI7dmFyIHU9Zy50LHM9dS1wLGY9KGg9PW51bGwpP25iaSgpOmg7ZC5kbFNoaWZ0VG8ocyxmKTtpZihnLmNvbXBhcmVUbyhmKT49MCl7Z1tnLnQrK109MTtnLnN1YlRvKGYsZyl9QmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKHAsZik7Zi5zdWJUbyhkLGQpO3doaWxlKGQudDxwKXtkW2QudCsrXT0wfXdoaWxlKC0tcz49MCl7dmFyIGM9KGdbLS11XT09Yik/dGhpcy5ETTpNYXRoLmZsb29yKGdbdV0qQSsoZ1t1LTFdK3gpKnopO2lmKChnW3VdKz1kLmFtKDAsYyxnLHMsMCxwKSk8Yyl7ZC5kbFNoaWZ0VG8ocyxmKTtnLnN1YlRvKGYsZyk7d2hpbGUoZ1t1XTwtLWMpe2cuc3ViVG8oZixnKX19fWlmKGghPW51bGwpe2cuZHJTaGlmdFRvKHAsaCk7aWYoYSE9bCl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKGgsaCl9fWcudD1wO2cuY2xhbXAoKTtpZih2PjApe2cuclNoaWZ0VG8odixnKX1pZihhPDApe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyhnLGcpfX1mdW5jdGlvbiBibk1vZChiKXt2YXIgYz1uYmkoKTt0aGlzLmFicygpLmRpdlJlbVRvKGIsbnVsbCxjKTtpZih0aGlzLnM8MCYmYy5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKT4wKXtiLnN1YlRvKGMsYyl9cmV0dXJuIGN9ZnVuY3Rpb24gQ2xhc3NpYyhhKXt0aGlzLm09YX1mdW5jdGlvbiBjQ29udmVydChhKXtpZihhLnM8MHx8YS5jb21wYXJlVG8odGhpcy5tKT49MCl7cmV0dXJuIGEubW9kKHRoaXMubSl9ZWxzZXtyZXR1cm4gYX19ZnVuY3Rpb24gY1JldmVydChhKXtyZXR1cm4gYX1mdW5jdGlvbiBjUmVkdWNlKGEpe2EuZGl2UmVtVG8odGhpcy5tLG51bGwsYSl9ZnVuY3Rpb24gY011bFRvKGEsYyxiKXthLm11bHRpcGx5VG8oYyxiKTt0aGlzLnJlZHVjZShiKX1mdW5jdGlvbiBjU3FyVG8oYSxiKXthLnNxdWFyZVRvKGIpO3RoaXMucmVkdWNlKGIpfUNsYXNzaWMucHJvdG90eXBlLmNvbnZlcnQ9Y0NvbnZlcnQ7Q2xhc3NpYy5wcm90b3R5cGUucmV2ZXJ0PWNSZXZlcnQ7Q2xhc3NpYy5wcm90b3R5cGUucmVkdWNlPWNSZWR1Y2U7Q2xhc3NpYy5wcm90b3R5cGUubXVsVG89Y011bFRvO0NsYXNzaWMucHJvdG90eXBlLnNxclRvPWNTcXJUbztmdW5jdGlvbiBibnBJbnZEaWdpdCgpe2lmKHRoaXMudDwxKXtyZXR1cm4gMH12YXIgYT10aGlzWzBdO2lmKChhJjEpPT0wKXtyZXR1cm4gMH12YXIgYj1hJjM7Yj0oYiooMi0oYSYxNSkqYikpJjE1O2I9KGIqKDItKGEmMjU1KSpiKSkmMjU1O2I9KGIqKDItKCgoYSY2NTUzNSkqYikmNjU1MzUpKSkmNjU1MzU7Yj0oYiooMi1hKmIldGhpcy5EVikpJXRoaXMuRFY7cmV0dXJuKGI+MCk/dGhpcy5EVi1iOi1ifWZ1bmN0aW9uIE1vbnRnb21lcnkoYSl7dGhpcy5tPWE7dGhpcy5tcD1hLmludkRpZ2l0KCk7dGhpcy5tcGw9dGhpcy5tcCYzMjc2Nzt0aGlzLm1waD10aGlzLm1wPj4xNTt0aGlzLnVtPSgxPDwoYS5EQi0xNSkpLTE7dGhpcy5tdDI9MiphLnR9ZnVuY3Rpb24gbW9udENvbnZlcnQoYSl7dmFyIGI9bmJpKCk7YS5hYnMoKS5kbFNoaWZ0VG8odGhpcy5tLnQsYik7Yi5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxiKTtpZihhLnM8MCYmYi5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKT4wKXt0aGlzLm0uc3ViVG8oYixiKX1yZXR1cm4gYn1mdW5jdGlvbiBtb250UmV2ZXJ0KGEpe3ZhciBiPW5iaSgpO2EuY29weVRvKGIpO3RoaXMucmVkdWNlKGIpO3JldHVybiBifWZ1bmN0aW9uIG1vbnRSZWR1Y2UoYSl7d2hpbGUoYS50PD10aGlzLm10Mil7YVthLnQrK109MH1mb3IodmFyIGM9MDtjPHRoaXMubS50OysrYyl7dmFyIGI9YVtjXSYzMjc2Nzt2YXIgZD0oYip0aGlzLm1wbCsoKChiKnRoaXMubXBoKyhhW2NdPj4xNSkqdGhpcy5tcGwpJnRoaXMudW0pPDwxNSkpJmEuRE07Yj1jK3RoaXMubS50O2FbYl0rPXRoaXMubS5hbSgwLGQsYSxjLDAsdGhpcy5tLnQpO3doaWxlKGFbYl0+PWEuRFYpe2FbYl0tPWEuRFY7YVsrK2JdKyt9fWEuY2xhbXAoKTthLmRyU2hpZnRUbyh0aGlzLm0udCxhKTtpZihhLmNvbXBhcmVUbyh0aGlzLm0pPj0wKXthLnN1YlRvKHRoaXMubSxhKX19ZnVuY3Rpb24gbW9udFNxclRvKGEsYil7YS5zcXVhcmVUbyhiKTt0aGlzLnJlZHVjZShiKX1mdW5jdGlvbiBtb250TXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpO3RoaXMucmVkdWNlKGIpfU1vbnRnb21lcnkucHJvdG90eXBlLmNvbnZlcnQ9bW9udENvbnZlcnQ7TW9udGdvbWVyeS5wcm90b3R5cGUucmV2ZXJ0PW1vbnRSZXZlcnQ7TW9udGdvbWVyeS5wcm90b3R5cGUucmVkdWNlPW1vbnRSZWR1Y2U7TW9udGdvbWVyeS5wcm90b3R5cGUubXVsVG89bW9udE11bFRvO01vbnRnb21lcnkucHJvdG90eXBlLnNxclRvPW1vbnRTcXJUbztmdW5jdGlvbiBibnBJc0V2ZW4oKXtyZXR1cm4oKHRoaXMudD4wKT8odGhpc1swXSYxKTp0aGlzLnMpPT0wfWZ1bmN0aW9uIGJucEV4cChoLGope2lmKGg+NDI5NDk2NzI5NXx8aDwxKXtyZXR1cm4gQmlnSW50ZWdlci5PTkV9dmFyIGY9bmJpKCksYT1uYmkoKSxkPWouY29udmVydCh0aGlzKSxjPW5iaXRzKGgpLTE7ZC5jb3B5VG8oZik7d2hpbGUoLS1jPj0wKXtqLnNxclRvKGYsYSk7aWYoKGgmKDE8PGMpKT4wKXtqLm11bFRvKGEsZCxmKX1lbHNle3ZhciBiPWY7Zj1hO2E9Yn19cmV0dXJuIGoucmV2ZXJ0KGYpfWZ1bmN0aW9uIGJuTW9kUG93SW50KGIsYSl7dmFyIGM7aWYoYjwyNTZ8fGEuaXNFdmVuKCkpe2M9bmV3IENsYXNzaWMoYSl9ZWxzZXtjPW5ldyBNb250Z29tZXJ5KGEpfXJldHVybiB0aGlzLmV4cChiLGMpfUJpZ0ludGVnZXIucHJvdG90eXBlLmNvcHlUbz1ibnBDb3B5VG87QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbUludD1ibnBGcm9tSW50O0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21TdHJpbmc9Ym5wRnJvbVN0cmluZztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGFtcD1ibnBDbGFtcDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kbFNoaWZ0VG89Ym5wRExTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmRyU2hpZnRUbz1ibnBEUlNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUubFNoaWZ0VG89Ym5wTFNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuclNoaWZ0VG89Ym5wUlNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuc3ViVG89Ym5wU3ViVG87QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlUbz1ibnBNdWx0aXBseVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLnNxdWFyZVRvPWJucFNxdWFyZVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmRpdlJlbVRvPWJucERpdlJlbVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmludkRpZ2l0PWJucEludkRpZ2l0O0JpZ0ludGVnZXIucHJvdG90eXBlLmlzRXZlbj1ibnBJc0V2ZW47QmlnSW50ZWdlci5wcm90b3R5cGUuZXhwPWJucEV4cDtCaWdJbnRlZ2VyLnByb3RvdHlwZS50b1N0cmluZz1iblRvU3RyaW5nO0JpZ0ludGVnZXIucHJvdG90eXBlLm5lZ2F0ZT1ibk5lZ2F0ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hYnM9Ym5BYnM7QmlnSW50ZWdlci5wcm90b3R5cGUuY29tcGFyZVRvPWJuQ29tcGFyZVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmJpdExlbmd0aD1ibkJpdExlbmd0aDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2Q9Ym5Nb2Q7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93SW50PWJuTW9kUG93SW50O0JpZ0ludGVnZXIuWkVSTz1uYnYoMCk7QmlnSW50ZWdlci5PTkU9bmJ2KDEpO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIGJuQ2xvbmUoKXt2YXIgYT1uYmkoKTt0aGlzLmNvcHlUbyhhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkludFZhbHVlKCl7aWYodGhpcy5zPDApe2lmKHRoaXMudD09MSl7cmV0dXJuIHRoaXNbMF0tdGhpcy5EVn1lbHNle2lmKHRoaXMudD09MCl7cmV0dXJuIC0xfX19ZWxzZXtpZih0aGlzLnQ9PTEpe3JldHVybiB0aGlzWzBdfWVsc2V7aWYodGhpcy50PT0wKXtyZXR1cm4gMH19fXJldHVybigodGhpc1sxXSYoKDE8PCgzMi10aGlzLkRCKSktMSkpPDx0aGlzLkRCKXx0aGlzWzBdfWZ1bmN0aW9uIGJuQnl0ZVZhbHVlKCl7cmV0dXJuKHRoaXMudD09MCk/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+bG93cHJpbWVzLmxlbmd0aCl7Zj1sb3dwcmltZXMubGVuZ3RofXZhciBiPW5iaSgpO2Zvcih2YXIgZT0wO2U8ZjsrK2Upe2IuZnJvbUludChsb3dwcmltZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxvd3ByaW1lcy5sZW5ndGgpXSk7dmFyIGw9Yi5tb2RQb3coaCx0aGlzKTtpZihsLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTAmJmwuY29tcGFyZVRvKGcpIT0wKXt2YXIgZD0xO3doaWxlKGQrKzxjJiZsLmNvbXBhcmVUbyhnKSE9MCl7bD1sLm1vZFBvd0ludCgyLHRoaXMpO2lmKGwuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCl7cmV0dXJuIGZhbHNlfX1pZihsLmNvbXBhcmVUbyhnKSE9MCl7cmV0dXJuIGZhbHNlfX19cmV0dXJuIHRydWV9QmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplPWJucENodW5rU2l6ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS50b1JhZGl4PWJucFRvUmFkaXg7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVJhZGl4PWJucEZyb21SYWRpeDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tTnVtYmVyPWJucEZyb21OdW1iZXI7QmlnSW50ZWdlci5wcm90b3R5cGUuYml0d2lzZVRvPWJucEJpdHdpc2VUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jaGFuZ2VCaXQ9Ym5wQ2hhbmdlQml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmFkZFRvPWJucEFkZFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmRNdWx0aXBseT1ibnBETXVsdGlwbHk7QmlnSW50ZWdlci5wcm90b3R5cGUuZEFkZE9mZnNldD1ibnBEQWRkT2Zmc2V0O0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5TG93ZXJUbz1ibnBNdWx0aXBseUxvd2VyVG87QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlVcHBlclRvPWJucE11bHRpcGx5VXBwZXJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnQ9Ym5wTW9kSW50O0JpZ0ludGVnZXIucHJvdG90eXBlLm1pbGxlclJhYmluPWJucE1pbGxlclJhYmluO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsb25lPWJuQ2xvbmU7QmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWU9Ym5JbnRWYWx1ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5ieXRlVmFsdWU9Ym5CeXRlVmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuc2hvcnRWYWx1ZT1iblNob3J0VmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtPWJuU2lnTnVtO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvQnl0ZUFycmF5PWJuVG9CeXRlQXJyYXk7QmlnSW50ZWdlci5wcm90b3R5cGUuZXF1YWxzPWJuRXF1YWxzO0JpZ0ludGVnZXIucHJvdG90eXBlLm1pbj1ibk1pbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tYXg9Ym5NYXg7QmlnSW50ZWdlci5wcm90b3R5cGUuYW5kPWJuQW5kO0JpZ0ludGVnZXIucHJvdG90eXBlLm9yPWJuT3I7QmlnSW50ZWdlci5wcm90b3R5cGUueG9yPWJuWG9yO0JpZ0ludGVnZXIucHJvdG90eXBlLmFuZE5vdD1ibkFuZE5vdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3Q9Ym5Ob3Q7QmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRMZWZ0PWJuU2hpZnRMZWZ0O0JpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0UmlnaHQ9Ym5TaGlmdFJpZ2h0O0JpZ0ludGVnZXIucHJvdG90eXBlLmdldExvd2VzdFNldEJpdD1ibkdldExvd2VzdFNldEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRDb3VudD1ibkJpdENvdW50O0JpZ0ludGVnZXIucHJvdG90eXBlLnRlc3RCaXQ9Ym5UZXN0Qml0O0JpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdD1iblNldEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGVhckJpdD1ibkNsZWFyQml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmZsaXBCaXQ9Ym5GbGlwQml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmFkZD1ibkFkZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJ0cmFjdD1iblN1YnRyYWN0O0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5PWJuTXVsdGlwbHk7QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlPWJuRGl2aWRlO0JpZ0ludGVnZXIucHJvdG90eXBlLnJlbWFpbmRlcj1iblJlbWFpbmRlcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGVBbmRSZW1haW5kZXI9Ym5EaXZpZGVBbmRSZW1haW5kZXI7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93PWJuTW9kUG93O0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludmVyc2U9Ym5Nb2RJbnZlcnNlO0JpZ0ludGVnZXIucHJvdG90eXBlLnBvdz1iblBvdztCaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2Q9Ym5HQ0Q7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNQcm9iYWJsZVByaW1lPWJuSXNQcm9iYWJsZVByaW1lO0JpZ0ludGVnZXIucHJvdG90eXBlLnNxdWFyZT1iblNxdWFyZTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBBcmNmb3VyKCl7dGhpcy5pPTA7dGhpcy5qPTA7dGhpcy5TPW5ldyBBcnJheSgpfWZ1bmN0aW9uIEFSQzRpbml0KGQpe3ZhciBjLGEsYjtmb3IoYz0wO2M8MjU2OysrYyl7dGhpcy5TW2NdPWN9YT0wO2ZvcihjPTA7YzwyNTY7KytjKXthPShhK3RoaXMuU1tjXStkW2MlZC5sZW5ndGhdKSYyNTU7Yj10aGlzLlNbY107dGhpcy5TW2NdPXRoaXMuU1thXTt0aGlzLlNbYV09Yn10aGlzLmk9MDt0aGlzLmo9MH1mdW5jdGlvbiBBUkM0bmV4dCgpe3ZhciBhO3RoaXMuaT0odGhpcy5pKzEpJjI1NTt0aGlzLmo9KHRoaXMuait0aGlzLlNbdGhpcy5pXSkmMjU1O2E9dGhpcy5TW3RoaXMuaV07dGhpcy5TW3RoaXMuaV09dGhpcy5TW3RoaXMual07dGhpcy5TW3RoaXMual09YTtyZXR1cm4gdGhpcy5TWyhhK3RoaXMuU1t0aGlzLmldKSYyNTVdfUFyY2ZvdXIucHJvdG90eXBlLmluaXQ9QVJDNGluaXQ7QXJjZm91ci5wcm90b3R5cGUubmV4dD1BUkM0bmV4dDtmdW5jdGlvbiBwcm5nX25ld3N0YXRlKCl7cmV0dXJuIG5ldyBBcmNmb3VyKCl9dmFyIHJuZ19wc2l6ZT0yNTY7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xudmFyIHJuZ19zdGF0ZTt2YXIgcm5nX3Bvb2w7dmFyIHJuZ19wcHRyO2Z1bmN0aW9uIHJuZ19zZWVkX2ludChhKXtybmdfcG9vbFtybmdfcHB0cisrXV49YSYyNTU7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePShhPj44KSYyNTU7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePShhPj4xNikmMjU1O3JuZ19wb29sW3JuZ19wcHRyKytdXj0oYT4+MjQpJjI1NTtpZihybmdfcHB0cj49cm5nX3BzaXplKXtybmdfcHB0ci09cm5nX3BzaXplfX1mdW5jdGlvbiBybmdfc2VlZF90aW1lKCl7cm5nX3NlZWRfaW50KG5ldyBEYXRlKCkuZ2V0VGltZSgpKX1pZihybmdfcG9vbD09bnVsbCl7cm5nX3Bvb2w9bmV3IEFycmF5KCk7cm5nX3BwdHI9MDt2YXIgdDtpZih3aW5kb3cuY3J5cHRvJiZ3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyl7dmFyIHVhPW5ldyBVaW50OEFycmF5KDMyKTt3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1YSk7Zm9yKHQ9MDt0PDMyOysrdCl7cm5nX3Bvb2xbcm5nX3BwdHIrK109dWFbdF19fWlmKG5hdmlnYXRvci5hcHBOYW1lPT1cIk5ldHNjYXBlXCImJm5hdmlnYXRvci5hcHBWZXJzaW9uPFwiNVwiJiZ3aW5kb3cuY3J5cHRvKXt2YXIgej13aW5kb3cuY3J5cHRvLnJhbmRvbSgzMik7Zm9yKHQ9MDt0PHoubGVuZ3RoOysrdCl7cm5nX3Bvb2xbcm5nX3BwdHIrK109ei5jaGFyQ29kZUF0KHQpJjI1NX19d2hpbGUocm5nX3BwdHI8cm5nX3BzaXplKXt0PU1hdGguZmxvb3IoNjU1MzYqTWF0aC5yYW5kb20oKSk7cm5nX3Bvb2xbcm5nX3BwdHIrK109dD4+Pjg7cm5nX3Bvb2xbcm5nX3BwdHIrK109dCYyNTV9cm5nX3BwdHI9MDtybmdfc2VlZF90aW1lKCl9ZnVuY3Rpb24gcm5nX2dldF9ieXRlKCl7aWYocm5nX3N0YXRlPT1udWxsKXtybmdfc2VlZF90aW1lKCk7cm5nX3N0YXRlPXBybmdfbmV3c3RhdGUoKTtybmdfc3RhdGUuaW5pdChybmdfcG9vbCk7Zm9yKHJuZ19wcHRyPTA7cm5nX3BwdHI8cm5nX3Bvb2wubGVuZ3RoOysrcm5nX3BwdHIpe3JuZ19wb29sW3JuZ19wcHRyXT0wfXJuZ19wcHRyPTB9cmV0dXJuIHJuZ19zdGF0ZS5uZXh0KCl9ZnVuY3Rpb24gcm5nX2dldF9ieXRlcyhiKXt2YXIgYTtmb3IoYT0wO2E8Yi5sZW5ndGg7KythKXtiW2FdPXJuZ19nZXRfYnl0ZSgpfX1mdW5jdGlvbiBTZWN1cmVSYW5kb20oKXt9U2VjdXJlUmFuZG9tLnByb3RvdHlwZS5uZXh0Qnl0ZXM9cm5nX2dldF9ieXRlcztcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBwYXJzZUJpZ0ludChiLGEpe3JldHVybiBuZXcgQmlnSW50ZWdlcihiLGEpfWZ1bmN0aW9uIGxpbmVicmsoYyxkKXt2YXIgYT1cIlwiO3ZhciBiPTA7d2hpbGUoYitkPGMubGVuZ3RoKXthKz1jLnN1YnN0cmluZyhiLGIrZCkrXCJcXG5cIjtiKz1kfXJldHVybiBhK2Muc3Vic3RyaW5nKGIsYy5sZW5ndGgpfWZ1bmN0aW9uIGJ5dGUySGV4KGEpe2lmKGE8MTYpe3JldHVyblwiMFwiK2EudG9TdHJpbmcoMTYpfWVsc2V7cmV0dXJuIGEudG9TdHJpbmcoMTYpfX1mdW5jdGlvbiBwa2NzMXBhZDIoZSxoKXtpZihoPGUubGVuZ3RoKzExKXthbGVydChcIk1lc3NhZ2UgdG9vIGxvbmcgZm9yIFJTQVwiKTtyZXR1cm4gbnVsbH12YXIgZz1uZXcgQXJyYXkoKTt2YXIgZD1lLmxlbmd0aC0xO3doaWxlKGQ+PTAmJmg+MCl7dmFyIGY9ZS5jaGFyQ29kZUF0KGQtLSk7aWYoZjwxMjgpe2dbLS1oXT1mfWVsc2V7aWYoKGY+MTI3KSYmKGY8MjA0OCkpe2dbLS1oXT0oZiY2Myl8MTI4O2dbLS1oXT0oZj4+Nil8MTkyfWVsc2V7Z1stLWhdPShmJjYzKXwxMjg7Z1stLWhdPSgoZj4+NikmNjMpfDEyODtnWy0taF09KGY+PjEyKXwyMjR9fX1nWy0taF09MDt2YXIgYj1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIGE9bmV3IEFycmF5KCk7d2hpbGUoaD4yKXthWzBdPTA7d2hpbGUoYVswXT09MCl7Yi5uZXh0Qnl0ZXMoYSl9Z1stLWhdPWFbMF19Z1stLWhdPTI7Z1stLWhdPTA7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGcpfWZ1bmN0aW9uIG9hZXBfbWdmMV9hcnIoYyxhLGUpe3ZhciBiPVwiXCIsZD0wO3doaWxlKGIubGVuZ3RoPGEpe2IrPWUoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsYy5jb25jYXQoWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKSk7ZCs9MX1yZXR1cm4gYn12YXIgU0hBMV9TSVpFPTIwO2Z1bmN0aW9uIG9hZXBfcGFkKGwsYSxjKXtpZihsLmxlbmd0aCsyKlNIQTFfU0laRSsyPmEpe3Rocm93XCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0FcIn12YXIgaD1cIlwiLGQ7Zm9yKGQ9MDtkPGEtbC5sZW5ndGgtMipTSEExX1NJWkUtMjtkKz0xKXtoKz1cIlxceDAwXCJ9dmFyIGU9cnN0cl9zaGExKFwiXCIpK2grXCJcXHgwMVwiK2w7dmFyIGY9bmV3IEFycmF5KFNIQTFfU0laRSk7bmV3IFNlY3VyZVJhbmRvbSgpLm5leHRCeXRlcyhmKTt2YXIgZz1vYWVwX21nZjFfYXJyKGYsZS5sZW5ndGgsY3x8cnN0cl9zaGExKTt2YXIgaz1bXTtmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCs9MSl7a1tkXT1lLmNoYXJDb2RlQXQoZCleZy5jaGFyQ29kZUF0KGQpfXZhciBqPW9hZXBfbWdmMV9hcnIoayxmLmxlbmd0aCxyc3RyX3NoYTEpO3ZhciBiPVswXTtmb3IoZD0wO2Q8Zi5sZW5ndGg7ZCs9MSl7YltkKzFdPWZbZF1eai5jaGFyQ29kZUF0KGQpfXJldHVybiBuZXcgQmlnSW50ZWdlcihiLmNvbmNhdChrKSl9ZnVuY3Rpb24gUlNBS2V5KCl7dGhpcy5uPW51bGw7dGhpcy5lPTA7dGhpcy5kPW51bGw7dGhpcy5wPW51bGw7dGhpcy5xPW51bGw7dGhpcy5kbXAxPW51bGw7dGhpcy5kbXExPW51bGw7dGhpcy5jb2VmZj1udWxsfWZ1bmN0aW9uIFJTQVNldFB1YmxpYyhiLGEpe3RoaXMuaXNQdWJsaWM9dHJ1ZTtpZih0eXBlb2YgYiE9PVwic3RyaW5nXCIpe3RoaXMubj1iO3RoaXMuZT1hfWVsc2V7aWYoYiE9bnVsbCYmYSE9bnVsbCYmYi5sZW5ndGg+MCYmYS5sZW5ndGg+MCl7dGhpcy5uPXBhcnNlQmlnSW50KGIsMTYpO3RoaXMuZT1wYXJzZUludChhLDE2KX1lbHNle2FsZXJ0KFwiSW52YWxpZCBSU0EgcHVibGljIGtleVwiKX19fWZ1bmN0aW9uIFJTQURvUHVibGljKGEpe3JldHVybiBhLm1vZFBvd0ludCh0aGlzLmUsdGhpcy5uKX1mdW5jdGlvbiBSU0FFbmNyeXB0KGQpe3ZhciBhPXBrY3MxcGFkMihkLCh0aGlzLm4uYml0TGVuZ3RoKCkrNyk+PjMpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXZhciBlPXRoaXMuZG9QdWJsaWMoYSk7aWYoZT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGI9ZS50b1N0cmluZygxNik7aWYoKGIubGVuZ3RoJjEpPT0wKXtyZXR1cm4gYn1lbHNle3JldHVyblwiMFwiK2J9fWZ1bmN0aW9uIFJTQUVuY3J5cHRPQUVQKGUsZCl7dmFyIGE9b2FlcF9wYWQoZSwodGhpcy5uLmJpdExlbmd0aCgpKzcpPj4zLGQpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXZhciBmPXRoaXMuZG9QdWJsaWMoYSk7aWYoZj09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGI9Zi50b1N0cmluZygxNik7aWYoKGIubGVuZ3RoJjEpPT0wKXtyZXR1cm4gYn1lbHNle3JldHVyblwiMFwiK2J9fVJTQUtleS5wcm90b3R5cGUuZG9QdWJsaWM9UlNBRG9QdWJsaWM7UlNBS2V5LnByb3RvdHlwZS5zZXRQdWJsaWM9UlNBU2V0UHVibGljO1JTQUtleS5wcm90b3R5cGUuZW5jcnlwdD1SU0FFbmNyeXB0O1JTQUtleS5wcm90b3R5cGUuZW5jcnlwdE9BRVA9UlNBRW5jcnlwdE9BRVA7UlNBS2V5LnByb3RvdHlwZS50eXBlPVwiUlNBXCI7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gcGtjczF1bnBhZDIoZyxqKXt2YXIgYT1nLnRvQnl0ZUFycmF5KCk7dmFyIGY9MDt3aGlsZShmPGEubGVuZ3RoJiZhW2ZdPT0wKXsrK2Z9aWYoYS5sZW5ndGgtZiE9ai0xfHxhW2ZdIT0yKXtyZXR1cm4gbnVsbH0rK2Y7d2hpbGUoYVtmXSE9MCl7aWYoKytmPj1hLmxlbmd0aCl7cmV0dXJuIG51bGx9fXZhciBlPVwiXCI7d2hpbGUoKytmPGEubGVuZ3RoKXt2YXIgaD1hW2ZdJjI1NTtpZihoPDEyOCl7ZSs9U3RyaW5nLmZyb21DaGFyQ29kZShoKX1lbHNle2lmKChoPjE5MSkmJihoPDIyNCkpe2UrPVN0cmluZy5mcm9tQ2hhckNvZGUoKChoJjMxKTw8Nil8KGFbZisxXSY2MykpOysrZn1lbHNle2UrPVN0cmluZy5mcm9tQ2hhckNvZGUoKChoJjE1KTw8MTIpfCgoYVtmKzFdJjYzKTw8Nil8KGFbZisyXSY2MykpO2YrPTJ9fX1yZXR1cm4gZX1mdW5jdGlvbiBvYWVwX21nZjFfc3RyKGMsYSxlKXt2YXIgYj1cIlwiLGQ9MDt3aGlsZShiLmxlbmd0aDxhKXtiKz1lKGMrU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKTtkKz0xfXJldHVybiBifXZhciBTSEExX1NJWkU9MjA7ZnVuY3Rpb24gb2FlcF91bnBhZChsLGIsZSl7bD1sLnRvQnl0ZUFycmF5KCk7dmFyIGY7Zm9yKGY9MDtmPGwubGVuZ3RoO2YrPTEpe2xbZl0mPTI1NX13aGlsZShsLmxlbmd0aDxiKXtsLnVuc2hpZnQoMCl9bD1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxsKTtpZihsLmxlbmd0aDwyKlNIQTFfU0laRSsyKXt0aHJvd1wiQ2lwaGVyIHRvbyBzaG9ydFwifXZhciBjPWwuc3Vic3RyKDEsU0hBMV9TSVpFKTt2YXIgbz1sLnN1YnN0cihTSEExX1NJWkUrMSk7dmFyIG09b2FlcF9tZ2YxX3N0cihvLFNIQTFfU0laRSxlfHxyc3RyX3NoYTEpO3ZhciBoPVtdLGY7Zm9yKGY9MDtmPGMubGVuZ3RoO2YrPTEpe2hbZl09Yy5jaGFyQ29kZUF0KGYpXm0uY2hhckNvZGVBdChmKX12YXIgaj1vYWVwX21nZjFfc3RyKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGgpLGwubGVuZ3RoLVNIQTFfU0laRSxyc3RyX3NoYTEpO3ZhciBnPVtdO2ZvcihmPTA7ZjxvLmxlbmd0aDtmKz0xKXtnW2ZdPW8uY2hhckNvZGVBdChmKV5qLmNoYXJDb2RlQXQoZil9Zz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxnKTtpZihnLnN1YnN0cigwLFNIQTFfU0laRSkhPT1yc3RyX3NoYTEoXCJcIikpe3Rocm93XCJIYXNoIG1pc21hdGNoXCJ9Zz1nLnN1YnN0cihTSEExX1NJWkUpO3ZhciBhPWcuaW5kZXhPZihcIlxceDAxXCIpO3ZhciBrPShhIT0tMSk/Zy5zdWJzdHIoMCxhKS5sYXN0SW5kZXhPZihcIlxceDAwXCIpOi0xO2lmKGsrMSE9YSl7dGhyb3dcIk1hbGZvcm1lZCBkYXRhXCJ9cmV0dXJuIGcuc3Vic3RyKGErMSl9ZnVuY3Rpb24gUlNBU2V0UHJpdmF0ZShjLGEsYil7dGhpcy5pc1ByaXZhdGU9dHJ1ZTtpZih0eXBlb2YgYyE9PVwic3RyaW5nXCIpe3RoaXMubj1jO3RoaXMuZT1hO3RoaXMuZD1ifWVsc2V7aWYoYyE9bnVsbCYmYSE9bnVsbCYmYy5sZW5ndGg+MCYmYS5sZW5ndGg+MCl7dGhpcy5uPXBhcnNlQmlnSW50KGMsMTYpO3RoaXMuZT1wYXJzZUludChhLDE2KTt0aGlzLmQ9cGFyc2VCaWdJbnQoYiwxNil9ZWxzZXthbGVydChcIkludmFsaWQgUlNBIHByaXZhdGUga2V5XCIpfX19ZnVuY3Rpb24gUlNBU2V0UHJpdmF0ZUV4KGcsZCxlLGMsYixhLGgsZil7dGhpcy5pc1ByaXZhdGU9dHJ1ZTtpZihnPT1udWxsKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IE4gPT0gbnVsbFwifWlmKGQ9PW51bGwpe3Rocm93XCJSU0FTZXRQcml2YXRlRXggRSA9PSBudWxsXCJ9aWYoZy5sZW5ndGg9PTApe3Rocm93XCJSU0FTZXRQcml2YXRlRXggTi5sZW5ndGggPT0gMFwifWlmKGQubGVuZ3RoPT0wKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IEUubGVuZ3RoID09IDBcIn1pZihnIT1udWxsJiZkIT1udWxsJiZnLmxlbmd0aD4wJiZkLmxlbmd0aD4wKXt0aGlzLm49cGFyc2VCaWdJbnQoZywxNik7dGhpcy5lPXBhcnNlSW50KGQsMTYpO3RoaXMuZD1wYXJzZUJpZ0ludChlLDE2KTt0aGlzLnA9cGFyc2VCaWdJbnQoYywxNik7dGhpcy5xPXBhcnNlQmlnSW50KGIsMTYpO3RoaXMuZG1wMT1wYXJzZUJpZ0ludChhLDE2KTt0aGlzLmRtcTE9cGFyc2VCaWdJbnQoaCwxNik7dGhpcy5jb2VmZj1wYXJzZUJpZ0ludChmLDE2KX1lbHNle2FsZXJ0KFwiSW52YWxpZCBSU0EgcHJpdmF0ZSBrZXkgaW4gUlNBU2V0UHJpdmF0ZUV4XCIpfX1mdW5jdGlvbiBSU0FHZW5lcmF0ZShiLGkpe3ZhciBhPW5ldyBTZWN1cmVSYW5kb20oKTt2YXIgZj1iPj4xO3RoaXMuZT1wYXJzZUludChpLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihpLDE2KTtmb3IoOzspe2Zvcig7Oyl7dGhpcy5wPW5ldyBCaWdJbnRlZ2VyKGItZiwxLGEpO2lmKHRoaXMucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKGMpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk9PTAmJnRoaXMucC5pc1Byb2JhYmxlUHJpbWUoMTApKXticmVha319Zm9yKDs7KXt0aGlzLnE9bmV3IEJpZ0ludGVnZXIoZiwxLGEpO2lmKHRoaXMucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKGMpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk9PTAmJnRoaXMucS5pc1Byb2JhYmxlUHJpbWUoMTApKXticmVha319aWYodGhpcy5wLmNvbXBhcmVUbyh0aGlzLnEpPD0wKXt2YXIgaD10aGlzLnA7dGhpcy5wPXRoaXMucTt0aGlzLnE9aH12YXIgZz10aGlzLnAuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3ZhciBkPXRoaXMucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7dmFyIGU9Zy5tdWx0aXBseShkKTtpZihlLmdjZChjKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wKXt0aGlzLm49dGhpcy5wLm11bHRpcGx5KHRoaXMucSk7dGhpcy5kPWMubW9kSW52ZXJzZShlKTt0aGlzLmRtcDE9dGhpcy5kLm1vZChnKTt0aGlzLmRtcTE9dGhpcy5kLm1vZChkKTt0aGlzLmNvZWZmPXRoaXMucS5tb2RJbnZlcnNlKHRoaXMucCk7YnJlYWt9fX1mdW5jdGlvbiBSU0FEb1ByaXZhdGUoYSl7aWYodGhpcy5wPT1udWxsfHx0aGlzLnE9PW51bGwpe3JldHVybiBhLm1vZFBvdyh0aGlzLmQsdGhpcy5uKX12YXIgYz1hLm1vZCh0aGlzLnApLm1vZFBvdyh0aGlzLmRtcDEsdGhpcy5wKTt2YXIgYj1hLm1vZCh0aGlzLnEpLm1vZFBvdyh0aGlzLmRtcTEsdGhpcy5xKTt3aGlsZShjLmNvbXBhcmVUbyhiKTwwKXtjPWMuYWRkKHRoaXMucCl9cmV0dXJuIGMuc3VidHJhY3QoYikubXVsdGlwbHkodGhpcy5jb2VmZikubW9kKHRoaXMucCkubXVsdGlwbHkodGhpcy5xKS5hZGQoYil9ZnVuY3Rpb24gUlNBRGVjcnlwdChiKXt2YXIgZD1wYXJzZUJpZ0ludChiLDE2KTt2YXIgYT10aGlzLmRvUHJpdmF0ZShkKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gcGtjczF1bnBhZDIoYSwodGhpcy5uLmJpdExlbmd0aCgpKzcpPj4zKX1mdW5jdGlvbiBSU0FEZWNyeXB0T0FFUChkLGIpe3ZhciBlPXBhcnNlQmlnSW50KGQsMTYpO3ZhciBhPXRoaXMuZG9Qcml2YXRlKGUpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXJldHVybiBvYWVwX3VucGFkKGEsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+MyxiKX1SU0FLZXkucHJvdG90eXBlLmRvUHJpdmF0ZT1SU0FEb1ByaXZhdGU7UlNBS2V5LnByb3RvdHlwZS5zZXRQcml2YXRlPVJTQVNldFByaXZhdGU7UlNBS2V5LnByb3RvdHlwZS5zZXRQcml2YXRlRXg9UlNBU2V0UHJpdmF0ZUV4O1JTQUtleS5wcm90b3R5cGUuZ2VuZXJhdGU9UlNBR2VuZXJhdGU7UlNBS2V5LnByb3RvdHlwZS5kZWNyeXB0PVJTQURlY3J5cHQ7UlNBS2V5LnByb3RvdHlwZS5kZWNyeXB0T0FFUD1SU0FEZWNyeXB0T0FFUDtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBFQ0ZpZWxkRWxlbWVudEZwKGIsYSl7dGhpcy54PWE7dGhpcy5xPWJ9ZnVuY3Rpb24gZmVGcEVxdWFscyhhKXtpZihhPT10aGlzKXtyZXR1cm4gdHJ1ZX1yZXR1cm4odGhpcy5xLmVxdWFscyhhLnEpJiZ0aGlzLnguZXF1YWxzKGEueCkpfWZ1bmN0aW9uIGZlRnBUb0JpZ0ludGVnZXIoKXtyZXR1cm4gdGhpcy54fWZ1bmN0aW9uIGZlRnBOZWdhdGUoKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5uZWdhdGUoKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcEFkZChhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5hZGQoYS50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBTdWJ0cmFjdChhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5zdWJ0cmFjdChhLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcE11bHRpcGx5KGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54Lm11bHRpcGx5KGEudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwU3F1YXJlKCl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLnguc3F1YXJlKCkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBEaXZpZGUoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLngubXVsdGlwbHkoYS50b0JpZ0ludGVnZXIoKS5tb2RJbnZlcnNlKHRoaXMucSkpLm1vZCh0aGlzLnEpKX1FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5lcXVhbHM9ZmVGcEVxdWFscztFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS50b0JpZ0ludGVnZXI9ZmVGcFRvQmlnSW50ZWdlcjtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5uZWdhdGU9ZmVGcE5lZ2F0ZTtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5hZGQ9ZmVGcEFkZDtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5zdWJ0cmFjdD1mZUZwU3VidHJhY3Q7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUubXVsdGlwbHk9ZmVGcE11bHRpcGx5O0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnNxdWFyZT1mZUZwU3F1YXJlO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmRpdmlkZT1mZUZwRGl2aWRlO2Z1bmN0aW9uIEVDUG9pbnRGcChjLGEsZCxiKXt0aGlzLmN1cnZlPWM7dGhpcy54PWE7dGhpcy55PWQ7aWYoYj09bnVsbCl7dGhpcy56PUJpZ0ludGVnZXIuT05FfWVsc2V7dGhpcy56PWJ9dGhpcy56aW52PW51bGx9ZnVuY3Rpb24gcG9pbnRGcEdldFgoKXtpZih0aGlzLnppbnY9PW51bGwpe3RoaXMuemludj10aGlzLnoubW9kSW52ZXJzZSh0aGlzLmN1cnZlLnEpfXJldHVybiB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnppbnYpLm1vZCh0aGlzLmN1cnZlLnEpKX1mdW5jdGlvbiBwb2ludEZwR2V0WSgpe2lmKHRoaXMuemludj09bnVsbCl7dGhpcy56aW52PXRoaXMuei5tb2RJbnZlcnNlKHRoaXMuY3VydmUucSl9cmV0dXJuIHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMuemludikubW9kKHRoaXMuY3VydmUucSkpfWZ1bmN0aW9uIHBvaW50RnBFcXVhbHMoYSl7aWYoYT09dGhpcyl7cmV0dXJuIHRydWV9aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiBhLmlzSW5maW5pdHkoKX1pZihhLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpfXZhciBjLGI7Yz1hLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkoYS56KSkubW9kKHRoaXMuY3VydmUucSk7aWYoIWMuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTykpe3JldHVybiBmYWxzZX1iPWEueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShhLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtyZXR1cm4gYi5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKX1mdW5jdGlvbiBwb2ludEZwSXNJbmZpbml0eSgpe2lmKCh0aGlzLng9PW51bGwpJiYodGhpcy55PT1udWxsKSl7cmV0dXJuIHRydWV9cmV0dXJuIHRoaXMuei5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSYmIXRoaXMueS50b0JpZ0ludGVnZXIoKS5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKX1mdW5jdGlvbiBwb2ludEZwTmVnYXRlKCl7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSx0aGlzLngsdGhpcy55Lm5lZ2F0ZSgpLHRoaXMueil9ZnVuY3Rpb24gcG9pbnRGcEFkZChsKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIGx9aWYobC5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfXZhciBwPWwueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShsLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgbz1sLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkobC56KSkubW9kKHRoaXMuY3VydmUucSk7aWYoQmlnSW50ZWdlci5aRVJPLmVxdWFscyhvKSl7aWYoQmlnSW50ZWdlci5aRVJPLmVxdWFscyhwKSl7cmV0dXJuIHRoaXMudHdpY2UoKX1yZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBqPW5ldyBCaWdJbnRlZ2VyKFwiM1wiKTt2YXIgZT10aGlzLngudG9CaWdJbnRlZ2VyKCk7dmFyIG49dGhpcy55LnRvQmlnSW50ZWdlcigpO3ZhciBjPWwueC50b0JpZ0ludGVnZXIoKTt2YXIgaz1sLnkudG9CaWdJbnRlZ2VyKCk7dmFyIG09by5zcXVhcmUoKTt2YXIgaT1tLm11bHRpcGx5KG8pO3ZhciBkPWUubXVsdGlwbHkobSk7dmFyIGc9cC5zcXVhcmUoKS5tdWx0aXBseSh0aGlzLnopO3ZhciBhPWcuc3VidHJhY3QoZC5zaGlmdExlZnQoMSkpLm11bHRpcGx5KGwueikuc3VidHJhY3QoaSkubXVsdGlwbHkobykubW9kKHRoaXMuY3VydmUucSk7dmFyIGg9ZC5tdWx0aXBseShqKS5tdWx0aXBseShwKS5zdWJ0cmFjdChuLm11bHRpcGx5KGkpKS5zdWJ0cmFjdChnLm11bHRpcGx5KHApKS5tdWx0aXBseShsLnopLmFkZChwLm11bHRpcGx5KGkpKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgZj1pLm11bHRpcGx5KHRoaXMueikubXVsdGlwbHkobC56KS5tb2QodGhpcy5jdXJ2ZS5xKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoYSksdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihoKSxmKX1mdW5jdGlvbiBwb2ludEZwVHdpY2UoKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYodGhpcy55LnRvQmlnSW50ZWdlcigpLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPW5ldyBCaWdJbnRlZ2VyKFwiM1wiKTt2YXIgYz10aGlzLngudG9CaWdJbnRlZ2VyKCk7dmFyIGg9dGhpcy55LnRvQmlnSW50ZWdlcigpO3ZhciBlPWgubXVsdGlwbHkodGhpcy56KTt2YXIgaj1lLm11bHRpcGx5KGgpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBpPXRoaXMuY3VydmUuYS50b0JpZ0ludGVnZXIoKTt2YXIgaz1jLnNxdWFyZSgpLm11bHRpcGx5KGcpO2lmKCFCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKGkpKXtrPWsuYWRkKHRoaXMuei5zcXVhcmUoKS5tdWx0aXBseShpKSl9az1rLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBiPWsuc3F1YXJlKCkuc3VidHJhY3QoYy5zaGlmdExlZnQoMykubXVsdGlwbHkoaikpLnNoaWZ0TGVmdCgxKS5tdWx0aXBseShlKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgZj1rLm11bHRpcGx5KGcpLm11bHRpcGx5KGMpLnN1YnRyYWN0KGouc2hpZnRMZWZ0KDEpKS5zaGlmdExlZnQoMikubXVsdGlwbHkoaikuc3VidHJhY3Qoay5zcXVhcmUoKS5tdWx0aXBseShrKSkubW9kKHRoaXMuY3VydmUucSk7dmFyIGQ9ZS5zcXVhcmUoKS5tdWx0aXBseShlKS5zaGlmdExlZnQoMykubW9kKHRoaXMuY3VydmUucSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGIpLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoZiksZCl9ZnVuY3Rpb24gcG9pbnRGcE11bHRpcGx5KGIpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZihiLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPWI7dmFyIGY9Zy5tdWx0aXBseShuZXcgQmlnSW50ZWdlcihcIjNcIikpO3ZhciBsPXRoaXMubmVnYXRlKCk7dmFyIGQ9dGhpczt2YXIgYztmb3IoYz1mLmJpdExlbmd0aCgpLTI7Yz4wOy0tYyl7ZD1kLnR3aWNlKCk7dmFyIGE9Zi50ZXN0Qml0KGMpO3ZhciBqPWcudGVzdEJpdChjKTtpZihhIT1qKXtkPWQuYWRkKGE/dGhpczpsKX19cmV0dXJuIGR9ZnVuY3Rpb24gcG9pbnRGcE11bHRpcGx5VHdvKGMsYSxiKXt2YXIgZDtpZihjLmJpdExlbmd0aCgpPmIuYml0TGVuZ3RoKCkpe2Q9Yy5iaXRMZW5ndGgoKS0xfWVsc2V7ZD1iLmJpdExlbmd0aCgpLTF9dmFyIGY9dGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpO3ZhciBlPXRoaXMuYWRkKGEpO3doaWxlKGQ+PTApe2Y9Zi50d2ljZSgpO2lmKGMudGVzdEJpdChkKSl7aWYoYi50ZXN0Qml0KGQpKXtmPWYuYWRkKGUpfWVsc2V7Zj1mLmFkZCh0aGlzKX19ZWxzZXtpZihiLnRlc3RCaXQoZCkpe2Y9Zi5hZGQoYSl9fS0tZH1yZXR1cm4gZn1FQ1BvaW50RnAucHJvdG90eXBlLmdldFg9cG9pbnRGcEdldFg7RUNQb2ludEZwLnByb3RvdHlwZS5nZXRZPXBvaW50RnBHZXRZO0VDUG9pbnRGcC5wcm90b3R5cGUuZXF1YWxzPXBvaW50RnBFcXVhbHM7RUNQb2ludEZwLnByb3RvdHlwZS5pc0luZmluaXR5PXBvaW50RnBJc0luZmluaXR5O0VDUG9pbnRGcC5wcm90b3R5cGUubmVnYXRlPXBvaW50RnBOZWdhdGU7RUNQb2ludEZwLnByb3RvdHlwZS5hZGQ9cG9pbnRGcEFkZDtFQ1BvaW50RnAucHJvdG90eXBlLnR3aWNlPXBvaW50RnBUd2ljZTtFQ1BvaW50RnAucHJvdG90eXBlLm11bHRpcGx5PXBvaW50RnBNdWx0aXBseTtFQ1BvaW50RnAucHJvdG90eXBlLm11bHRpcGx5VHdvPXBvaW50RnBNdWx0aXBseVR3bztmdW5jdGlvbiBFQ0N1cnZlRnAoZSxkLGMpe3RoaXMucT1lO3RoaXMuYT10aGlzLmZyb21CaWdJbnRlZ2VyKGQpO3RoaXMuYj10aGlzLmZyb21CaWdJbnRlZ2VyKGMpO3RoaXMuaW5maW5pdHk9bmV3IEVDUG9pbnRGcCh0aGlzLG51bGwsbnVsbCl9ZnVuY3Rpb24gY3VydmVGcEdldFEoKXtyZXR1cm4gdGhpcy5xfWZ1bmN0aW9uIGN1cnZlRnBHZXRBKCl7cmV0dXJuIHRoaXMuYX1mdW5jdGlvbiBjdXJ2ZUZwR2V0Qigpe3JldHVybiB0aGlzLmJ9ZnVuY3Rpb24gY3VydmVGcEVxdWFscyhhKXtpZihhPT10aGlzKXtyZXR1cm4gdHJ1ZX1yZXR1cm4odGhpcy5xLmVxdWFscyhhLnEpJiZ0aGlzLmEuZXF1YWxzKGEuYSkmJnRoaXMuYi5lcXVhbHMoYS5iKSl9ZnVuY3Rpb24gY3VydmVGcEdldEluZmluaXR5KCl7cmV0dXJuIHRoaXMuaW5maW5pdHl9ZnVuY3Rpb24gY3VydmVGcEZyb21CaWdJbnRlZ2VyKGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsYSl9ZnVuY3Rpb24gY3VydmVGcERlY29kZVBvaW50SGV4KGQpe3N3aXRjaChwYXJzZUludChkLnN1YnN0cigwLDIpLDE2KSl7Y2FzZSAwOnJldHVybiB0aGlzLmluZmluaXR5O2Nhc2UgMjpjYXNlIDM6cmV0dXJuIG51bGw7Y2FzZSA0OmNhc2UgNjpjYXNlIDc6dmFyIGE9KGQubGVuZ3RoLTIpLzI7dmFyIGM9ZC5zdWJzdHIoMixhKTt2YXIgYj1kLnN1YnN0cihhKzIsYSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcyx0aGlzLmZyb21CaWdJbnRlZ2VyKG5ldyBCaWdJbnRlZ2VyKGMsMTYpKSx0aGlzLmZyb21CaWdJbnRlZ2VyKG5ldyBCaWdJbnRlZ2VyKGIsMTYpKSk7ZGVmYXVsdDpyZXR1cm4gbnVsbH19RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRRPWN1cnZlRnBHZXRRO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0QT1jdXJ2ZUZwR2V0QTtFQ0N1cnZlRnAucHJvdG90eXBlLmdldEI9Y3VydmVGcEdldEI7RUNDdXJ2ZUZwLnByb3RvdHlwZS5lcXVhbHM9Y3VydmVGcEVxdWFscztFQ0N1cnZlRnAucHJvdG90eXBlLmdldEluZmluaXR5PWN1cnZlRnBHZXRJbmZpbml0eTtFQ0N1cnZlRnAucHJvdG90eXBlLmZyb21CaWdJbnRlZ2VyPWN1cnZlRnBGcm9tQmlnSW50ZWdlcjtFQ0N1cnZlRnAucHJvdG90eXBlLmRlY29kZVBvaW50SGV4PWN1cnZlRnBEZWNvZGVQb2ludEhleDtcbi8qISAoYykgU3RlZmFuIFRob21hcyB8IGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luanMvYml0Y29pbmpzLWxpYlxuICovXG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5nZXRCeXRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZmxvb3IoKHRoaXMudG9CaWdJbnRlZ2VyKCkuYml0TGVuZ3RoKCkrNykvOCl9O0VDUG9pbnRGcC5wcm90b3R5cGUuZ2V0RW5jb2RlZD1mdW5jdGlvbihjKXt2YXIgZD1mdW5jdGlvbihoLGYpe3ZhciBnPWgudG9CeXRlQXJyYXlVbnNpZ25lZCgpO2lmKGY8Zy5sZW5ndGgpe2c9Zy5zbGljZShnLmxlbmd0aC1mKX1lbHNle3doaWxlKGY+Zy5sZW5ndGgpe2cudW5zaGlmdCgwKX19cmV0dXJuIGd9O3ZhciBhPXRoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBlPXRoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBiPWQoYSwzMik7aWYoYyl7aWYoZS5pc0V2ZW4oKSl7Yi51bnNoaWZ0KDIpfWVsc2V7Yi51bnNoaWZ0KDMpfX1lbHNle2IudW5zaGlmdCg0KTtiPWIuY29uY2F0KGQoZSwzMikpfXJldHVybiBifTtFQ1BvaW50RnAuZGVjb2RlRnJvbT1mdW5jdGlvbihnLGMpe3ZhciBmPWNbMF07dmFyIGU9Yy5sZW5ndGgtMTt2YXIgZD1jLnNsaWNlKDEsMStlLzIpO3ZhciBiPWMuc2xpY2UoMStlLzIsMStlKTtkLnVuc2hpZnQoMCk7Yi51bnNoaWZ0KDApO3ZhciBhPW5ldyBCaWdJbnRlZ2VyKGQpO3ZhciBoPW5ldyBCaWdJbnRlZ2VyKGIpO3JldHVybiBuZXcgRUNQb2ludEZwKGcsZy5mcm9tQmlnSW50ZWdlcihhKSxnLmZyb21CaWdJbnRlZ2VyKGgpKX07RUNQb2ludEZwLmRlY29kZUZyb21IZXg9ZnVuY3Rpb24oZyxjKXt2YXIgZj1jLnN1YnN0cigwLDIpO3ZhciBlPWMubGVuZ3RoLTI7dmFyIGQ9Yy5zdWJzdHIoMixlLzIpO3ZhciBiPWMuc3Vic3RyKDIrZS8yLGUvMik7dmFyIGE9bmV3IEJpZ0ludGVnZXIoZCwxNik7dmFyIGg9bmV3IEJpZ0ludGVnZXIoYiwxNik7cmV0dXJuIG5ldyBFQ1BvaW50RnAoZyxnLmZyb21CaWdJbnRlZ2VyKGEpLGcuZnJvbUJpZ0ludGVnZXIoaCkpfTtFQ1BvaW50RnAucHJvdG90eXBlLmFkZDJEPWZ1bmN0aW9uKGMpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gY31pZihjLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYodGhpcy54LmVxdWFscyhjLngpKXtpZih0aGlzLnkuZXF1YWxzKGMueSkpe3JldHVybiB0aGlzLnR3aWNlKCl9cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1jLnguc3VidHJhY3QodGhpcy54KTt2YXIgZT1jLnkuc3VidHJhY3QodGhpcy55KTt2YXIgYT1lLmRpdmlkZShnKTt2YXIgZD1hLnNxdWFyZSgpLnN1YnRyYWN0KHRoaXMueCkuc3VidHJhY3QoYy54KTt2YXIgZj1hLm11bHRpcGx5KHRoaXMueC5zdWJ0cmFjdChkKSkuc3VidHJhY3QodGhpcy55KTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLGQsZil9O0VDUG9pbnRGcC5wcm90b3R5cGUudHdpY2UyRD1mdW5jdGlvbigpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnkudG9CaWdJbnRlZ2VyKCkuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGI9dGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoMikpO3ZhciBlPXRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDMpKTt2YXIgYT10aGlzLnguc3F1YXJlKCkubXVsdGlwbHkoZSkuYWRkKHRoaXMuY3VydmUuYSkuZGl2aWRlKHRoaXMueS5tdWx0aXBseShiKSk7dmFyIGM9YS5zcXVhcmUoKS5zdWJ0cmFjdCh0aGlzLngubXVsdGlwbHkoYikpO3ZhciBkPWEubXVsdGlwbHkodGhpcy54LnN1YnRyYWN0KGMpKS5zdWJ0cmFjdCh0aGlzLnkpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsYyxkKX07RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseTJEPWZ1bmN0aW9uKGIpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZihiLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPWI7dmFyIGY9Zy5tdWx0aXBseShuZXcgQmlnSW50ZWdlcihcIjNcIikpO3ZhciBsPXRoaXMubmVnYXRlKCk7dmFyIGQ9dGhpczt2YXIgYztmb3IoYz1mLmJpdExlbmd0aCgpLTI7Yz4wOy0tYyl7ZD1kLnR3aWNlKCk7dmFyIGE9Zi50ZXN0Qml0KGMpO3ZhciBqPWcudGVzdEJpdChjKTtpZihhIT1qKXtkPWQuYWRkMkQoYT90aGlzOmwpfX1yZXR1cm4gZH07RUNQb2ludEZwLnByb3RvdHlwZS5pc09uQ3VydmU9ZnVuY3Rpb24oKXt2YXIgZD10aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgaT10aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgZj10aGlzLmN1cnZlLmdldEEoKS50b0JpZ0ludGVnZXIoKTt2YXIgYz10aGlzLmN1cnZlLmdldEIoKS50b0JpZ0ludGVnZXIoKTt2YXIgaD10aGlzLmN1cnZlLmdldFEoKTt2YXIgZT1pLm11bHRpcGx5KGkpLm1vZChoKTt2YXIgZz1kLm11bHRpcGx5KGQpLm11bHRpcGx5KGQpLmFkZChmLm11bHRpcGx5KGQpKS5hZGQoYykubW9kKGgpO3JldHVybiBlLmVxdWFscyhnKX07RUNQb2ludEZwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiKFwiK3RoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKCkrXCIsXCIrdGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCkudG9TdHJpbmcoKStcIilcIn07RUNQb2ludEZwLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbigpe3ZhciBjPXRoaXMuY3VydmUuZ2V0USgpO2lmKHRoaXMuaXNJbmZpbml0eSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBhdCBpbmZpbml0eS5cIil9dmFyIGE9dGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGI9dGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7aWYoYS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fGEuY29tcGFyZVRvKGMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKT4wKXt0aHJvdyBuZXcgRXJyb3IoXCJ4IGNvb3JkaW5hdGUgb3V0IG9mIGJvdW5kc1wiKX1pZihiLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8Yi5jb21wYXJlVG8oYy5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpPjApe3Rocm93IG5ldyBFcnJvcihcInkgY29vcmRpbmF0ZSBvdXQgb2YgYm91bmRzXCIpfWlmKCF0aGlzLmlzT25DdXJ2ZSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBub3Qgb24gdGhlIGN1cnZlLlwiKX1pZih0aGlzLm11bHRpcGx5KGMpLmlzSW5maW5pdHkoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgbm90IGEgc2NhbGFyIG11bHRpcGxlIG9mIEcuXCIpfXJldHVybiB0cnVlfTtcbi8qISBNaWtlIFNhbXVlbCAoYykgMjAwOSB8IGNvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2Fucy1ldmFsXG4gKi9cbnZhciBqc29uUGFyc2U9KGZ1bmN0aW9uKCl7dmFyIGU9XCIoPzotP1xcXFxiKD86MHxbMS05XVswLTldKikoPzpcXFxcLlswLTldKyk/KD86W2VFXVsrLV0/WzAtOV0rKT9cXFxcYilcIjt2YXIgaj0nKD86W15cXFxcMC1cXFxceDA4XFxcXHgwYS1cXFxceDFmXCJcXFxcXFxcXF18XFxcXFxcXFwoPzpbXCIvXFxcXFxcXFxiZm5ydF18dVswLTlBLUZhLWZdezR9KSknO3ZhciBpPScoPzpcIicraisnKlwiKSc7dmFyIGQ9bmV3IFJlZ0V4cChcIig/OmZhbHNlfHRydWV8bnVsbHxbXFxcXHtcXFxcfVxcXFxbXFxcXF1dfFwiK2UrXCJ8XCIraStcIilcIixcImdcIik7dmFyIGs9bmV3IFJlZ0V4cChcIlxcXFxcXFxcKD86KFtedV0pfHUoLns0fSkpXCIsXCJnXCIpO3ZhciBnPXsnXCInOidcIicsXCIvXCI6XCIvXCIsXCJcXFxcXCI6XCJcXFxcXCIsYjpcIlxcYlwiLGY6XCJcXGZcIixuOlwiXFxuXCIscjpcIlxcclwiLHQ6XCJcXHRcIn07ZnVuY3Rpb24gaChsLG0sbil7cmV0dXJuIG0/Z1ttXTpTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4sMTYpKX12YXIgYz1uZXcgU3RyaW5nKFwiXCIpO3ZhciBhPVwiXFxcXFwiO3ZhciBmPXtcIntcIjpPYmplY3QsXCJbXCI6QXJyYXl9O3ZhciBiPU9iamVjdC5oYXNPd25Qcm9wZXJ0eTtyZXR1cm4gZnVuY3Rpb24odSxxKXt2YXIgcD11Lm1hdGNoKGQpO3ZhciB4O3ZhciB2PXBbMF07dmFyIGw9ZmFsc2U7aWYoXCJ7XCI9PT12KXt4PXt9fWVsc2V7aWYoXCJbXCI9PT12KXt4PVtdfWVsc2V7eD1bXTtsPXRydWV9fXZhciB0O3ZhciByPVt4XTtmb3IodmFyIG89MS1sLG09cC5sZW5ndGg7bzxtOysrbyl7dj1wW29dO3ZhciB3O3N3aXRjaCh2LmNoYXJDb2RlQXQoMCkpe2RlZmF1bHQ6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPSsodik7dD12b2lkIDA7YnJlYWs7Y2FzZSAzNDp2PXYuc3Vic3RyaW5nKDEsdi5sZW5ndGgtMSk7aWYodi5pbmRleE9mKGEpIT09LTEpe3Y9di5yZXBsYWNlKGssaCl9dz1yWzBdO2lmKCF0KXtpZih3IGluc3RhbmNlb2YgQXJyYXkpe3Q9dy5sZW5ndGh9ZWxzZXt0PXZ8fGM7YnJlYWt9fXdbdF09djt0PXZvaWQgMDticmVhaztjYXNlIDkxOnc9clswXTtyLnVuc2hpZnQod1t0fHx3Lmxlbmd0aF09W10pO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgOTM6ci5zaGlmdCgpO2JyZWFrO2Nhc2UgMTAyOnc9clswXTt3W3R8fHcubGVuZ3RoXT1mYWxzZTt0PXZvaWQgMDticmVhaztjYXNlIDExMDp3PXJbMF07d1t0fHx3Lmxlbmd0aF09bnVsbDt0PXZvaWQgMDticmVhaztjYXNlIDExNjp3PXJbMF07d1t0fHx3Lmxlbmd0aF09dHJ1ZTt0PXZvaWQgMDticmVhaztjYXNlIDEyMzp3PXJbMF07ci51bnNoaWZ0KHdbdHx8dy5sZW5ndGhdPXt9KTt0PXZvaWQgMDticmVhaztjYXNlIDEyNTpyLnNoaWZ0KCk7YnJlYWt9fWlmKGwpe2lmKHIubGVuZ3RoIT09MSl7dGhyb3cgbmV3IEVycm9yKCl9eD14WzBdfWVsc2V7aWYoci5sZW5ndGgpe3Rocm93IG5ldyBFcnJvcigpfX1pZihxKXt2YXIgcz1mdW5jdGlvbihDLEIpe3ZhciBEPUNbQl07aWYoRCYmdHlwZW9mIEQ9PT1cIm9iamVjdFwiKXt2YXIgbj1udWxsO2Zvcih2YXIgeiBpbiBEKXtpZihiLmNhbGwoRCx6KSYmRCE9PUMpe3ZhciB5PXMoRCx6KTtpZih5IT09dm9pZCAwKXtEW3pdPXl9ZWxzZXtpZighbil7bj1bXX1uLnB1c2goeil9fX1pZihuKXtmb3IodmFyIEE9bi5sZW5ndGg7LS1BPj0wOyl7ZGVsZXRlIERbbltBXV19fX1yZXR1cm4gcS5jYWxsKEMsQixEKX07eD1zKHtcIlwiOnh9LFwiXCIpfXJldHVybiB4fX0pKCk7XG4vKiEgYXNuMS0xLjAuMTAuanMgKGMpIDIwMTMtMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuYXNuMT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMSl7S0pVUi5hc24xPXt9fUtKVVIuYXNuMS5BU04xVXRpbD1uZXcgZnVuY3Rpb24oKXt0aGlzLmludGVnZXJUb0J5dGVIZXg9ZnVuY3Rpb24oYSl7dmFyIGI9YS50b1N0cmluZygxNik7aWYoKGIubGVuZ3RoJTIpPT0xKXtiPVwiMFwiK2J9cmV0dXJuIGJ9O3RoaXMuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXg9ZnVuY3Rpb24oail7dmFyIGY9ai50b1N0cmluZygxNik7aWYoZi5zdWJzdHIoMCwxKSE9XCItXCIpe2lmKGYubGVuZ3RoJTI9PTEpe2Y9XCIwXCIrZn1lbHNle2lmKCFmLm1hdGNoKC9eWzAtN10vKSl7Zj1cIjAwXCIrZn19fWVsc2V7dmFyIGE9Zi5zdWJzdHIoMSk7dmFyIGU9YS5sZW5ndGg7aWYoZSUyPT0xKXtlKz0xfWVsc2V7aWYoIWYubWF0Y2goL15bMC03XS8pKXtlKz0yfX12YXIgZz1cIlwiO2Zvcih2YXIgZD0wO2Q8ZTtkKyspe2crPVwiZlwifXZhciBjPW5ldyBCaWdJbnRlZ2VyKGcsMTYpO3ZhciBiPWMueG9yKGopLmFkZChCaWdJbnRlZ2VyLk9ORSk7Zj1iLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eLS8sXCJcIil9cmV0dXJuIGZ9O3RoaXMuZ2V0UEVNU3RyaW5nRnJvbUhleD1mdW5jdGlvbihhLGIpe3ZhciBjPWhleHRvYjY0KGEpO3ZhciBkPWMucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7ZD1kLnJlcGxhY2UoL1xcclxcbiQvLFwiXCIpO3JldHVyblwiLS0tLS1CRUdJTiBcIitiK1wiLS0tLS1cXHJcXG5cIitkK1wiXFxyXFxuLS0tLS1FTkQgXCIrYitcIi0tLS0tXFxyXFxuXCJ9O3RoaXMubmV3T2JqZWN0PWZ1bmN0aW9uKGIpe3ZhciBnPUtKVVIuYXNuMTt2YXIgaz1PYmplY3Qua2V5cyhiKTtpZihrLmxlbmd0aCE9MSl7dGhyb3dcImtleSBvZiBwYXJhbSBzaGFsbCBiZSBvbmx5IG9uZS5cIn12YXIgaj1rWzBdO2lmKFwiOmJvb2w6aW50OmJpdHN0cjpvY3RzdHI6bnVsbDpvaWQ6ZW51bTp1dGY4c3RyOm51bXN0cjpwcm5zdHI6dGVsc3RyOmlhNXN0cjp1dGN0aW1lOmdlbnRpbWU6c2VxOnNldDp0YWc6XCIuaW5kZXhPZihcIjpcIitqK1wiOlwiKT09LTEpe3Rocm93XCJ1bmRlZmluZWQga2V5OiBcIitqfWlmKGo9PVwiYm9vbFwiKXtyZXR1cm4gbmV3IGcuREVSQm9vbGVhbihiW2pdKX1pZihqPT1cImludFwiKXtyZXR1cm4gbmV3IGcuREVSSW50ZWdlcihiW2pdKX1pZihqPT1cImJpdHN0clwiKXtyZXR1cm4gbmV3IGcuREVSQml0U3RyaW5nKGJbal0pfWlmKGo9PVwib2N0c3RyXCIpe3JldHVybiBuZXcgZy5ERVJPY3RldFN0cmluZyhiW2pdKX1pZihqPT1cIm51bGxcIil7cmV0dXJuIG5ldyBnLkRFUk51bGwoYltqXSl9aWYoaj09XCJvaWRcIil7cmV0dXJuIG5ldyBnLkRFUk9iamVjdElkZW50aWZpZXIoYltqXSl9aWYoaj09XCJlbnVtXCIpe3JldHVybiBuZXcgZy5ERVJFbnVtZXJhdGVkKGJbal0pfWlmKGo9PVwidXRmOHN0clwiKXtyZXR1cm4gbmV3IGcuREVSVVRGOFN0cmluZyhiW2pdKX1pZihqPT1cIm51bXN0clwiKXtyZXR1cm4gbmV3IGcuREVSTnVtZXJpY1N0cmluZyhiW2pdKX1pZihqPT1cInBybnN0clwiKXtyZXR1cm4gbmV3IGcuREVSUHJpbnRhYmxlU3RyaW5nKGJbal0pfWlmKGo9PVwidGVsc3RyXCIpe3JldHVybiBuZXcgZy5ERVJUZWxldGV4U3RyaW5nKGJbal0pfWlmKGo9PVwiaWE1c3RyXCIpe3JldHVybiBuZXcgZy5ERVJJQTVTdHJpbmcoYltqXSl9aWYoaj09XCJ1dGN0aW1lXCIpe3JldHVybiBuZXcgZy5ERVJVVENUaW1lKGJbal0pfWlmKGo9PVwiZ2VudGltZVwiKXtyZXR1cm4gbmV3IGcuREVSR2VuZXJhbGl6ZWRUaW1lKGJbal0pfWlmKGo9PVwic2VxXCIpe3ZhciBtPWJbal07dmFyIGg9W107Zm9yKHZhciBlPTA7ZTxtLmxlbmd0aDtlKyspe3ZhciBsPWcuQVNOMVV0aWwubmV3T2JqZWN0KG1bZV0pO2gucHVzaChsKX1yZXR1cm4gbmV3IGcuREVSU2VxdWVuY2Uoe2FycmF5Omh9KX1pZihqPT1cInNldFwiKXt2YXIgbT1iW2pdO3ZhciBoPVtdO2Zvcih2YXIgZT0wO2U8bS5sZW5ndGg7ZSsrKXt2YXIgbD1nLkFTTjFVdGlsLm5ld09iamVjdChtW2VdKTtoLnB1c2gobCl9cmV0dXJuIG5ldyBnLkRFUlNldCh7YXJyYXk6aH0pfWlmKGo9PVwidGFnXCIpe3ZhciBjPWJbal07aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGMpPT09XCJbb2JqZWN0IEFycmF5XVwiJiZjLmxlbmd0aD09Myl7dmFyIGQ9Zy5BU04xVXRpbC5uZXdPYmplY3QoY1syXSk7cmV0dXJuIG5ldyBnLkRFUlRhZ2dlZE9iamVjdCh7dGFnOmNbMF0sZXhwbGljaXQ6Y1sxXSxvYmo6ZH0pfWVsc2V7dmFyIGY9e307aWYoYy5leHBsaWNpdCE9PXVuZGVmaW5lZCl7Zi5leHBsaWNpdD1jLmV4cGxpY2l0fWlmKGMudGFnIT09dW5kZWZpbmVkKXtmLnRhZz1jLnRhZ31pZihjLm9iaj09PXVuZGVmaW5lZCl7dGhyb3dcIm9iaiBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yICd0YWcnLlwifWYub2JqPWcuQVNOMVV0aWwubmV3T2JqZWN0KGMub2JqKTtyZXR1cm4gbmV3IGcuREVSVGFnZ2VkT2JqZWN0KGYpfX19O3RoaXMuanNvblRvQVNOMUhFWD1mdW5jdGlvbihiKXt2YXIgYT10aGlzLm5ld09iamVjdChiKTtyZXR1cm4gYS5nZXRFbmNvZGVkSGV4KCl9fTtLSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQ9ZnVuY3Rpb24oYSl7dmFyIGo9XCJcIjt2YXIgaz1wYXJzZUludChhLnN1YnN0cigwLDIpLDE2KTt2YXIgZD1NYXRoLmZsb29yKGsvNDApO3ZhciBjPWslNDA7dmFyIGo9ZCtcIi5cIitjO3ZhciBlPVwiXCI7Zm9yKHZhciBmPTI7ZjxhLmxlbmd0aDtmKz0yKXt2YXIgZz1wYXJzZUludChhLnN1YnN0cihmLDIpLDE2KTt2YXIgaD0oXCIwMDAwMDAwMFwiK2cudG9TdHJpbmcoMikpLnNsaWNlKC04KTtlPWUraC5zdWJzdHIoMSw3KTtpZihoLnN1YnN0cigwLDEpPT1cIjBcIil7dmFyIGI9bmV3IEJpZ0ludGVnZXIoZSwyKTtqPWorXCIuXCIrYi50b1N0cmluZygxMCk7ZT1cIlwifX1yZXR1cm4gan07S0pVUi5hc24xLkFTTjFVdGlsLm9pZEludFRvSGV4PWZ1bmN0aW9uKGYpe3ZhciBlPWZ1bmN0aW9uKGEpe3ZhciBrPWEudG9TdHJpbmcoMTYpO2lmKGsubGVuZ3RoPT0xKXtrPVwiMFwiK2t9cmV0dXJuIGt9O3ZhciBkPWZ1bmN0aW9uKG8pe3ZhciBuPVwiXCI7dmFyIGs9bmV3IEJpZ0ludGVnZXIobywxMCk7dmFyIGE9ay50b1N0cmluZygyKTt2YXIgbD03LWEubGVuZ3RoJTc7aWYobD09Nyl7bD0wfXZhciBxPVwiXCI7Zm9yKHZhciBtPTA7bTxsO20rKyl7cSs9XCIwXCJ9YT1xK2E7Zm9yKHZhciBtPTA7bTxhLmxlbmd0aC0xO20rPTcpe3ZhciBwPWEuc3Vic3RyKG0sNyk7aWYobSE9YS5sZW5ndGgtNyl7cD1cIjFcIitwfW4rPWUocGFyc2VJbnQocCwyKSl9cmV0dXJuIG59O2lmKCFmLm1hdGNoKC9eWzAtOS5dKyQvKSl7dGhyb3dcIm1hbGZvcm1lZCBvaWQgc3RyaW5nOiBcIitmfXZhciBnPVwiXCI7dmFyIGI9Zi5zcGxpdChcIi5cIik7dmFyIGo9cGFyc2VJbnQoYlswXSkqNDArcGFyc2VJbnQoYlsxXSk7Zys9ZShqKTtiLnNwbGljZSgwLDIpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtnKz1kKGJbY10pfXJldHVybiBnfTtLSlVSLmFzbjEuQVNOMU9iamVjdD1mdW5jdGlvbigpe3ZhciBjPXRydWU7dmFyIGI9bnVsbDt2YXIgZD1cIjAwXCI7dmFyIGU9XCIwMFwiO3ZhciBhPVwiXCI7dGhpcy5nZXRMZW5ndGhIZXhGcm9tVmFsdWU9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVj09XCJ1bmRlZmluZWRcInx8dGhpcy5oVj09bnVsbCl7dGhyb3dcInRoaXMuaFYgaXMgbnVsbCBvciB1bmRlZmluZWQuXCJ9aWYodGhpcy5oVi5sZW5ndGglMj09MSl7dGhyb3dcInZhbHVlIGhleCBtdXN0IGJlIGV2ZW4gbGVuZ3RoOiBuPVwiK2EubGVuZ3RoK1wiLHY9XCIrdGhpcy5oVn12YXIgaT10aGlzLmhWLmxlbmd0aC8yO3ZhciBoPWkudG9TdHJpbmcoMTYpO2lmKGgubGVuZ3RoJTI9PTEpe2g9XCIwXCIraH1pZihpPDEyOCl7cmV0dXJuIGh9ZWxzZXt2YXIgZz1oLmxlbmd0aC8yO2lmKGc+MTUpe3Rocm93XCJBU04uMSBsZW5ndGggdG9vIGxvbmcgdG8gcmVwcmVzZW50IGJ5IDh4OiBuID0gXCIraS50b1N0cmluZygxNil9dmFyIGY9MTI4K2c7cmV0dXJuIGYudG9TdHJpbmcoMTYpK2h9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmhUTFY9PW51bGx8fHRoaXMuaXNNb2RpZmllZCl7dGhpcy5oVj10aGlzLmdldEZyZXNoVmFsdWVIZXgoKTt0aGlzLmhMPXRoaXMuZ2V0TGVuZ3RoSGV4RnJvbVZhbHVlKCk7dGhpcy5oVExWPXRoaXMuaFQrdGhpcy5oTCt0aGlzLmhWO3RoaXMuaXNNb2RpZmllZD1mYWxzZX1yZXR1cm4gdGhpcy5oVExWfTt0aGlzLmdldFZhbHVlSGV4PWZ1bmN0aW9uKCl7dGhpcy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFZ9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVyblwiXCJ9fTtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmc9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBhPW51bGw7dGhpcy5nZXRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfTt0aGlzLnNldFN0cmluZz1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9ZDt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfTt0aGlzLnNldFN0cmluZ0hleD1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9bnVsbDt0aGlzLmhWPWR9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwic3RyaW5nXCIpe3RoaXMuc2V0U3RyaW5nKGMpfWVsc2V7aWYodHlwZW9mIGMuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFN0cmluZyhjLnN0cil9ZWxzZXtpZih0eXBlb2YgYy5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0U3RyaW5nSGV4KGMuaGV4KX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkFic3RyYWN0VGltZT1mdW5jdGlvbihjKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBhPW51bGw7dGhpcy5sb2NhbERhdGVUb1VUQz1mdW5jdGlvbihmKXt1dGM9Zi5nZXRUaW1lKCkrKGYuZ2V0VGltZXpvbmVPZmZzZXQoKSo2MDAwMCk7dmFyIGU9bmV3IERhdGUodXRjKTtyZXR1cm4gZX07dGhpcy5mb3JtYXREYXRlPWZ1bmN0aW9uKG0sbyxlKXt2YXIgZz10aGlzLnplcm9QYWRkaW5nO3ZhciBuPXRoaXMubG9jYWxEYXRlVG9VVEMobSk7dmFyIHA9U3RyaW5nKG4uZ2V0RnVsbFllYXIoKSk7aWYobz09XCJ1dGNcIil7cD1wLnN1YnN0cigyLDIpfXZhciBsPWcoU3RyaW5nKG4uZ2V0TW9udGgoKSsxKSwyKTt2YXIgcT1nKFN0cmluZyhuLmdldERhdGUoKSksMik7dmFyIGg9ZyhTdHJpbmcobi5nZXRIb3VycygpKSwyKTt2YXIgaT1nKFN0cmluZyhuLmdldE1pbnV0ZXMoKSksMik7dmFyIGo9ZyhTdHJpbmcobi5nZXRTZWNvbmRzKCkpLDIpO3ZhciByPXArbCtxK2graStqO2lmKGU9PT10cnVlKXt2YXIgZj1uLmdldE1pbGxpc2Vjb25kcygpO2lmKGYhPTApe3ZhciBrPWcoU3RyaW5nKGYpLDMpO2s9ay5yZXBsYWNlKC9bMF0rJC8sXCJcIik7cj1yK1wiLlwiK2t9fXJldHVybiByK1wiWlwifTt0aGlzLnplcm9QYWRkaW5nPWZ1bmN0aW9uKGUsZCl7aWYoZS5sZW5ndGg+PWQpe3JldHVybiBlfXJldHVybiBuZXcgQXJyYXkoZC1lLmxlbmd0aCsxKS5qb2luKFwiMFwiKStlfTt0aGlzLmdldFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN9O3RoaXMuc2V0U3RyaW5nPWZ1bmN0aW9uKGQpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1kO3RoaXMuaFY9c3RvaGV4KGQpfTt0aGlzLnNldEJ5RGF0ZVZhbHVlPWZ1bmN0aW9uKGgsaixlLGQsZixnKXt2YXIgaT1uZXcgRGF0ZShEYXRlLlVUQyhoLGotMSxlLGQsZixnLDApKTt0aGlzLnNldEJ5RGF0ZShpKX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLnNldEJ5QVNOMU9iamVjdEFycmF5PWZ1bmN0aW9uKGMpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuYXNuMUFycmF5PWN9O3RoaXMuYXBwZW5kQVNOMU9iamVjdD1mdW5jdGlvbihjKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmFzbjFBcnJheS5wdXNoKGMpfTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMUFycmF5PWIuYXJyYXl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkJvb2xlYW49ZnVuY3Rpb24oKXtLSlVSLmFzbjEuREVSQm9vbGVhbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAxXCI7dGhpcy5oVExWPVwiMDEwMWZmXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJCb29sZWFuLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSSW50ZWdlcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSSW50ZWdlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAyXCI7dGhpcy5zZXRCeUJpZ0ludGVnZXI9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1LSlVSLmFzbjEuQVNOMVV0aWwuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgoYil9O3RoaXMuc2V0QnlJbnRlZ2VyPWZ1bmN0aW9uKGMpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKFN0cmluZyhjKSwxMCk7dGhpcy5zZXRCeUJpZ0ludGVnZXIoYil9O3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oYil7dGhpcy5oVj1ifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmJpZ2ludCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUJpZ0ludGVnZXIoYS5iaWdpbnQpfWVsc2V7aWYodHlwZW9mIGFbXCJpbnRcIl0hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGFbXCJpbnRcIl0pfWVsc2V7aWYodHlwZW9mIGE9PVwibnVtYmVyXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGEpfWVsc2V7aWYodHlwZW9mIGEuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlSGV4KGEuaGV4KX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSSW50ZWdlcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkJpdFN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSQml0U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMDNcIjt0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cz1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmhWPWJ9O3RoaXMuc2V0VW51c2VkQml0c0FuZEhleFZhbHVlPWZ1bmN0aW9uKGIsZCl7aWYoYjwwfHw3PGIpe3Rocm93XCJ1bnVzZWQgYml0cyBzaGFsbCBiZSBmcm9tIDAgdG8gNzogdSA9IFwiK2J9dmFyIGM9XCIwXCIrYjt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmhWPWMrZH07dGhpcy5zZXRCeUJpbmFyeVN0cmluZz1mdW5jdGlvbihlKXtlPWUucmVwbGFjZSgvMCskLyxcIlwiKTt2YXIgZj04LWUubGVuZ3RoJTg7aWYoZj09OCl7Zj0wfWZvcih2YXIgZz0wO2c8PWY7ZysrKXtlKz1cIjBcIn12YXIgaj1cIlwiO2Zvcih2YXIgZz0wO2c8ZS5sZW5ndGgtMTtnKz04KXt2YXIgZD1lLnN1YnN0cihnLDgpO3ZhciBjPXBhcnNlSW50KGQsMikudG9TdHJpbmcoMTYpO2lmKGMubGVuZ3RoPT0xKXtjPVwiMFwiK2N9ais9Y310aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmhWPVwiMFwiK2Yran07dGhpcy5zZXRCeUJvb2xlYW5BcnJheT1mdW5jdGlvbihkKXt2YXIgYz1cIlwiO2Zvcih2YXIgYj0wO2I8ZC5sZW5ndGg7YisrKXtpZihkW2JdPT10cnVlKXtjKz1cIjFcIn1lbHNle2MrPVwiMFwifX10aGlzLnNldEJ5QmluYXJ5U3RyaW5nKGMpfTt0aGlzLm5ld0ZhbHNlQXJyYXk9ZnVuY3Rpb24oZCl7dmFyIGI9bmV3IEFycmF5KGQpO2Zvcih2YXIgYz0wO2M8ZDtjKyspe2JbY109ZmFsc2V9cmV0dXJuIGJ9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGE9PVwic3RyaW5nXCImJmEudG9Mb3dlckNhc2UoKS5tYXRjaCgvXlswLTlhLWZdKyQvKSl7dGhpcy5zZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHMoYSl9ZWxzZXtpZih0eXBlb2YgYS5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzKGEuaGV4KX1lbHNle2lmKHR5cGVvZiBhLmJpbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUJpbmFyeVN0cmluZyhhLmJpbil9ZWxzZXtpZih0eXBlb2YgYS5hcnJheSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUJvb2xlYW5BcnJheShhLmFycmF5KX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQml0U3RyaW5nLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIwNFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSTnVsbD1mdW5jdGlvbigpe0tKVVIuYXNuMS5ERVJOdWxsLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMDVcIjt0aGlzLmhUTFY9XCIwNTAwXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJOdWxsLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcj1mdW5jdGlvbihjKXt2YXIgYj1mdW5jdGlvbihkKXt2YXIgZT1kLnRvU3RyaW5nKDE2KTtpZihlLmxlbmd0aD09MSl7ZT1cIjBcIitlfXJldHVybiBlfTt2YXIgYT1mdW5jdGlvbihrKXt2YXIgaj1cIlwiO3ZhciBlPW5ldyBCaWdJbnRlZ2VyKGssMTApO3ZhciBkPWUudG9TdHJpbmcoMik7dmFyIGY9Ny1kLmxlbmd0aCU3O2lmKGY9PTcpe2Y9MH12YXIgbT1cIlwiO2Zvcih2YXIgZz0wO2c8ZjtnKyspe20rPVwiMFwifWQ9bStkO2Zvcih2YXIgZz0wO2c8ZC5sZW5ndGgtMTtnKz03KXt2YXIgbD1kLnN1YnN0cihnLDcpO2lmKGchPWQubGVuZ3RoLTcpe2w9XCIxXCIrbH1qKz1iKHBhcnNlSW50KGwsMikpfXJldHVybiBqfTtLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjA2XCI7dGhpcy5zZXRWYWx1ZUhleD1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9bnVsbDt0aGlzLmhWPWR9O3RoaXMuc2V0VmFsdWVPaWRTdHJpbmc9ZnVuY3Rpb24oZil7aWYoIWYubWF0Y2goL15bMC05Ll0rJC8pKXt0aHJvd1wibWFsZm9ybWVkIG9pZCBzdHJpbmc6IFwiK2Z9dmFyIGc9XCJcIjt2YXIgZD1mLnNwbGl0KFwiLlwiKTt2YXIgaj1wYXJzZUludChkWzBdKSo0MCtwYXJzZUludChkWzFdKTtnKz1iKGopO2Quc3BsaWNlKDAsMik7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe2crPWEoZFtlXSl9dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1nfTt0aGlzLnNldFZhbHVlTmFtZT1mdW5jdGlvbihlKXtpZih0eXBlb2YgS0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdFtlXSE9XCJ1bmRlZmluZWRcIil7dmFyIGQ9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdFtlXTt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKGQpfWVsc2V7dGhyb3dcIkRFUk9iamVjdElkZW50aWZpZXIgb2lkTmFtZSB1bmRlZmluZWQ6IFwiK2V9fTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiJiZjLm1hdGNoKC9eWzAtMl0uWzAtOS5dKyQvKSl7dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhjKX1lbHNle2lmKEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbY10hPT11bmRlZmluZWQpe3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoS0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdFtjXSl9ZWxzZXtpZih0eXBlb2YgYy5vaWQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoYy5vaWQpfWVsc2V7aWYodHlwZW9mIGMuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlSGV4KGMuaGV4KX1lbHNle2lmKHR5cGVvZiBjLm5hbWUhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVOYW1lKGMubmFtZSl9fX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSRW51bWVyYXRlZD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSRW51bWVyYXRlZC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjBhXCI7dGhpcy5zZXRCeUJpZ0ludGVnZXI9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1LSlVSLmFzbjEuQVNOMVV0aWwuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgoYil9O3RoaXMuc2V0QnlJbnRlZ2VyPWZ1bmN0aW9uKGMpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKFN0cmluZyhjKSwxMCk7dGhpcy5zZXRCeUJpZ0ludGVnZXIoYil9O3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oYil7dGhpcy5oVj1ifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhW1wiaW50XCJdIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5SW50ZWdlcihhW1wiaW50XCJdKX1lbHNle2lmKHR5cGVvZiBhPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5SW50ZWdlcihhKX1lbHNle2lmKHR5cGVvZiBhLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChhLmhleCl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSRW51bWVyYXRlZCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUlVURjhTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlVURjhTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjBjXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJVVEY4U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUk51bWVyaWNTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUk51bWVyaWNTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjEyXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxM1wifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE0XCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUklBNVN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSSUE1U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxNlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSSUE1U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUlVUQ1RpbWU9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlVUQ1RpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE3XCI7dGhpcy5zZXRCeURhdGU9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5kYXRlPWI7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJ1dGNcIik7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuZGF0ZT09XCJ1bmRlZmluZWRcIiYmdHlwZW9mIHRoaXMucz09XCJ1bmRlZmluZWRcIil7dGhpcy5kYXRlPW5ldyBEYXRlKCk7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJ1dGNcIik7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX1yZXR1cm4gdGhpcy5oVn07aWYoYSE9PXVuZGVmaW5lZCl7aWYoYS5zdHIhPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nKGEuc3RyKX1lbHNle2lmKHR5cGVvZiBhPT1cInN0cmluZ1wiJiZhLm1hdGNoKC9eWzAtOV17MTJ9WiQvKSl7dGhpcy5zZXRTdHJpbmcoYSl9ZWxzZXtpZihhLmhleCE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmdIZXgoYS5oZXgpfWVsc2V7aWYoYS5kYXRlIT09dW5kZWZpbmVkKXt0aGlzLnNldEJ5RGF0ZShhLmRhdGUpfX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJVVENUaW1lLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWUpO0tKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWU9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMThcIjt0aGlzLndpdGhNaWxsaXM9ZmFsc2U7dGhpcy5zZXRCeURhdGU9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5kYXRlPWI7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJnZW5cIix0aGlzLndpdGhNaWxsaXMpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe2lmKHRoaXMuZGF0ZT09PXVuZGVmaW5lZCYmdGhpcy5zPT09dW5kZWZpbmVkKXt0aGlzLmRhdGU9bmV3IERhdGUoKTt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcImdlblwiLHRoaXMud2l0aE1pbGxpcyk7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX1yZXR1cm4gdGhpcy5oVn07aWYoYSE9PXVuZGVmaW5lZCl7aWYoYS5zdHIhPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nKGEuc3RyKX1lbHNle2lmKHR5cGVvZiBhPT1cInN0cmluZ1wiJiZhLm1hdGNoKC9eWzAtOV17MTR9WiQvKSl7dGhpcy5zZXRTdHJpbmcoYSl9ZWxzZXtpZihhLmhleCE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmdIZXgoYS5oZXgpfWVsc2V7aWYoYS5kYXRlIT09dW5kZWZpbmVkKXt0aGlzLnNldEJ5RGF0ZShhLmRhdGUpfX19fWlmKGEubWlsbGlzPT09dHJ1ZSl7dGhpcy53aXRoTWlsbGlzPXRydWV9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZSxLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lKTtLSlVSLmFzbjEuREVSU2VxdWVuY2U9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlNlcXVlbmNlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIzMFwiO3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBjPVwiXCI7Zm9yKHZhciBiPTA7Yjx0aGlzLmFzbjFBcnJheS5sZW5ndGg7YisrKXt2YXIgZD10aGlzLmFzbjFBcnJheVtiXTtjKz1kLmdldEVuY29kZWRIZXgoKX10aGlzLmhWPWM7cmV0dXJuIHRoaXMuaFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSU2VxdWVuY2UsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCk7S0pVUi5hc24xLkRFUlNldD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSU2V0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIzMVwiO3RoaXMuc29ydEZsYWc9dHJ1ZTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYj1uZXcgQXJyYXkoKTtmb3IodmFyIGM9MDtjPHRoaXMuYXNuMUFycmF5Lmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuYXNuMUFycmF5W2NdO2IucHVzaChkLmdldEVuY29kZWRIZXgoKSl9aWYodGhpcy5zb3J0RmxhZz09dHJ1ZSl7Yi5zb3J0KCl9dGhpcy5oVj1iLmpvaW4oXCJcIik7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5zb3J0ZmxhZyE9XCJ1bmRlZmluZWRcIiYmYS5zb3J0ZmxhZz09ZmFsc2Upe3RoaXMuc29ydEZsYWc9ZmFsc2V9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlNldCxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkKTtLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0PWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCJhMFwiO3RoaXMuaFY9XCJcIjt0aGlzLmlzRXhwbGljaXQ9dHJ1ZTt0aGlzLmFzbjFPYmplY3Q9bnVsbDt0aGlzLnNldEFTTjFPYmplY3Q9ZnVuY3Rpb24oYixjLGQpe3RoaXMuaFQ9Yzt0aGlzLmlzRXhwbGljaXQ9Yjt0aGlzLmFzbjFPYmplY3Q9ZDtpZih0aGlzLmlzRXhwbGljaXQpe3RoaXMuaFY9dGhpcy5hc24xT2JqZWN0LmdldEVuY29kZWRIZXgoKTt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZX1lbHNle3RoaXMuaFY9bnVsbDt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5oVExWPXRoaXMuaFRMVi5yZXBsYWNlKC9eLi4vLGMpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX19O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEudGFnIT1cInVuZGVmaW5lZFwiKXt0aGlzLmhUPWEudGFnfWlmKHR5cGVvZiBhLmV4cGxpY2l0IT1cInVuZGVmaW5lZFwiKXt0aGlzLmlzRXhwbGljaXQ9YS5leHBsaWNpdH1pZih0eXBlb2YgYS5vYmohPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMU9iamVjdD1hLm9iajt0aGlzLnNldEFTTjFPYmplY3QodGhpcy5pc0V4cGxpY2l0LHRoaXMuaFQsdGhpcy5hc24xT2JqZWN0KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtcbi8qISBhc24xaGV4LTEuMS42LmpzIChjKSAyMDEyLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIEFTTjFIRVg9bmV3IGZ1bmN0aW9uKCl7dGhpcy5nZXRCeXRlTGVuZ3RoT2ZMX0F0T2JqPWZ1bmN0aW9uKGIsYyl7aWYoYi5zdWJzdHJpbmcoYysyLGMrMykhPVwiOFwiKXtyZXR1cm4gMX12YXIgYT1wYXJzZUludChiLnN1YnN0cmluZyhjKzMsYys0KSk7aWYoYT09MCl7cmV0dXJuIC0xfWlmKDA8YSYmYTwxMCl7cmV0dXJuIGErMX1yZXR1cm4gLTJ9O3RoaXMuZ2V0SGV4T2ZMX0F0T2JqPWZ1bmN0aW9uKGIsYyl7dmFyIGE9dGhpcy5nZXRCeXRlTGVuZ3RoT2ZMX0F0T2JqKGIsYyk7aWYoYTwxKXtyZXR1cm5cIlwifXJldHVybiBiLnN1YnN0cmluZyhjKzIsYysyK2EqMil9O3RoaXMuZ2V0SW50T2ZMX0F0T2JqPWZ1bmN0aW9uKGMsZCl7dmFyIGI9dGhpcy5nZXRIZXhPZkxfQXRPYmooYyxkKTtpZihiPT1cIlwiKXtyZXR1cm4gLTF9dmFyIGE7aWYocGFyc2VJbnQoYi5zdWJzdHJpbmcoMCwxKSk8OCl7YT1uZXcgQmlnSW50ZWdlcihiLDE2KX1lbHNle2E9bmV3IEJpZ0ludGVnZXIoYi5zdWJzdHJpbmcoMiksMTYpfXJldHVybiBhLmludFZhbHVlKCl9O3RoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmo9ZnVuY3Rpb24oYixjKXt2YXIgYT10aGlzLmdldEJ5dGVMZW5ndGhPZkxfQXRPYmooYixjKTtpZihhPDApe3JldHVybiBhfXJldHVybiBjKyhhKzEpKjJ9O3RoaXMuZ2V0SGV4T2ZWX0F0T2JqPWZ1bmN0aW9uKGMsZCl7dmFyIGI9dGhpcy5nZXRTdGFydFBvc09mVl9BdE9iaihjLGQpO3ZhciBhPXRoaXMuZ2V0SW50T2ZMX0F0T2JqKGMsZCk7cmV0dXJuIGMuc3Vic3RyaW5nKGIsYithKjIpfTt0aGlzLmdldEhleE9mVExWX0F0T2JqPWZ1bmN0aW9uKGMsZSl7dmFyIGI9Yy5zdWJzdHIoZSwyKTt2YXIgZD10aGlzLmdldEhleE9mTF9BdE9iaihjLGUpO3ZhciBhPXRoaXMuZ2V0SGV4T2ZWX0F0T2JqKGMsZSk7cmV0dXJuIGIrZCthfTt0aGlzLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmo9ZnVuY3Rpb24oYyxkKXt2YXIgYj10aGlzLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGMsZCk7dmFyIGE9dGhpcy5nZXRJbnRPZkxfQXRPYmooYyxkKTtyZXR1cm4gYithKjJ9O3RoaXMuZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqPWZ1bmN0aW9uKGYsail7dmFyIGM9bmV3IEFycmF5KCk7dmFyIGk9dGhpcy5nZXRTdGFydFBvc09mVl9BdE9iaihmLGopO2MucHVzaChpKTt2YXIgYj10aGlzLmdldEludE9mTF9BdE9iaihmLGopO3ZhciBnPWk7dmFyIGQ9MDt3aGlsZSgxKXt2YXIgZT10aGlzLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZixnKTtpZihlPT1udWxsfHwoZS1pPj0oYioyKSkpe2JyZWFrfWlmKGQ+PTIwMCl7YnJlYWt9Yy5wdXNoKGUpO2c9ZTtkKyt9cmV0dXJuIGN9O3RoaXMuZ2V0TnRoQ2hpbGRJbmRleF9BdE9iaj1mdW5jdGlvbihkLGIsZSl7dmFyIGM9dGhpcy5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCxiKTtyZXR1cm4gY1tlXX07dGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdD1mdW5jdGlvbihlLGQsYyl7aWYoYy5sZW5ndGg9PTApe3JldHVybiBkfXZhciBmPWMuc2hpZnQoKTt2YXIgYj10aGlzLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLGQpO3JldHVybiB0aGlzLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGUsYltmXSxjKX07dGhpcy5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3Q9ZnVuY3Rpb24oZCxjLGIpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO3JldHVybiB0aGlzLmdldEhleE9mVExWX0F0T2JqKGQsYSl9O3RoaXMuZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdD1mdW5jdGlvbihkLGMsYil7dmFyIGE9dGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChkLGMsYik7cmV0dXJuIHRoaXMuZ2V0SGV4T2ZWX0F0T2JqKGQsYSl9fTtBU04xSEVYLmdldFZieUxpc3Q9ZnVuY3Rpb24oZCxjLGIsZSl7dmFyIGE9dGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChkLGMsYik7aWYoYT09PXVuZGVmaW5lZCl7dGhyb3dcImNhbid0IGZpbmQgbnRoTGlzdCBvYmplY3RcIn1pZihlIT09dW5kZWZpbmVkKXtpZihkLnN1YnN0cihhLDIpIT1lKXt0aHJvd1wiY2hlY2tpbmcgdGFnIGRvZXNuJ3QgbWF0Y2g6IFwiK2Quc3Vic3RyKGEsMikrXCIhPVwiK2V9fXJldHVybiB0aGlzLmdldEhleE9mVl9BdE9iaihkLGEpfTtBU04xSEVYLmhleHRvb2lkc3RyPWZ1bmN0aW9uKGUpe3ZhciBoPWZ1bmN0aW9uKGIsYSl7aWYoYi5sZW5ndGg+PWEpe3JldHVybiBifXJldHVybiBuZXcgQXJyYXkoYS1iLmxlbmd0aCsxKS5qb2luKFwiMFwiKStifTt2YXIgbD1bXTt2YXIgbz1lLnN1YnN0cigwLDIpO3ZhciBmPXBhcnNlSW50KG8sMTYpO2xbMF09bmV3IFN0cmluZyhNYXRoLmZsb29yKGYvNDApKTtsWzFdPW5ldyBTdHJpbmcoZiU0MCk7dmFyIG09ZS5zdWJzdHIoMik7dmFyIGs9W107Zm9yKHZhciBnPTA7ZzxtLmxlbmd0aC8yO2crKyl7ay5wdXNoKHBhcnNlSW50KG0uc3Vic3RyKGcqMiwyKSwxNikpfXZhciBqPVtdO3ZhciBkPVwiXCI7Zm9yKHZhciBnPTA7ZzxrLmxlbmd0aDtnKyspe2lmKGtbZ10mMTI4KXtkPWQraCgoa1tnXSYxMjcpLnRvU3RyaW5nKDIpLDcpfWVsc2V7ZD1kK2goKGtbZ10mMTI3KS50b1N0cmluZygyKSw3KTtqLnB1c2gobmV3IFN0cmluZyhwYXJzZUludChkLDIpKSk7ZD1cIlwifX12YXIgbj1sLmpvaW4oXCIuXCIpO2lmKGoubGVuZ3RoPjApe249bitcIi5cIitqLmpvaW4oXCIuXCIpfXJldHVybiBufTtBU04xSEVYLmR1bXA9ZnVuY3Rpb24oZSxjLGssZyl7dmFyIG89ZnVuY3Rpb24odyxpKXtpZih3Lmxlbmd0aDw9aSoyKXtyZXR1cm4gd31lbHNle3ZhciB2PXcuc3Vic3RyKDAsaSkrXCIuLih0b3RhbCBcIit3Lmxlbmd0aC8yK1wiYnl0ZXMpLi5cIit3LnN1YnN0cih3Lmxlbmd0aC1pLGkpO3JldHVybiB2fX07aWYoYz09PXVuZGVmaW5lZCl7Yz17b21taXRfbG9uZ19vY3RldDozMn19aWYoaz09PXVuZGVmaW5lZCl7az0wfWlmKGc9PT11bmRlZmluZWQpe2c9XCJcIn12YXIgcj1jLm9tbWl0X2xvbmdfb2N0ZXQ7aWYoZS5zdWJzdHIoaywyKT09XCIwMVwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKGg9PVwiMDBcIil7cmV0dXJuIGcrXCJCT09MRUFOIEZBTFNFXFxuXCJ9ZWxzZXtyZXR1cm4gZytcIkJPT0xFQU4gVFJVRVxcblwifX1pZihlLnN1YnN0cihrLDIpPT1cIjAyXCIpe3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7cmV0dXJuIGcrXCJJTlRFR0VSIFwiK28oaCxyKStcIlxcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMDNcIil7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTtyZXR1cm4gZytcIkJJVFNUUklORyBcIitvKGgscikrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjA0XCIpe3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7aWYoQVNOMUhFWC5pc0FTTjFIRVgoaCkpe3ZhciBqPWcrXCJPQ1RFVFNUUklORywgZW5jYXBzdWxhdGVzXFxuXCI7aj1qK0FTTjFIRVguZHVtcChoLGMsMCxnK1wiICBcIik7cmV0dXJuIGp9ZWxzZXtyZXR1cm4gZytcIk9DVEVUU1RSSU5HIFwiK28oaCxyKStcIlxcblwifX1pZihlLnN1YnN0cihrLDIpPT1cIjA1XCIpe3JldHVybiBnK1wiTlVMTFxcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMDZcIil7dmFyIGw9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQobCk7dmFyIG49S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGEpO3ZhciBiPWEucmVwbGFjZSgvXFwuL2csXCIgXCIpO2lmKG4hPVwiXCIpe3JldHVybiBnK1wiT2JqZWN0SWRlbnRpZmllciBcIituK1wiIChcIitiK1wiKVxcblwifWVsc2V7cmV0dXJuIGcrXCJPYmplY3RJZGVudGlmaWVyIChcIitiK1wiKVxcblwifX1pZihlLnN1YnN0cihrLDIpPT1cIjBjXCIpe3JldHVybiBnK1wiVVRGOFN0cmluZyAnXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiJ1xcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMTNcIil7cmV0dXJuIGcrXCJQcmludGFibGVTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE0XCIpe3JldHVybiBnK1wiVGVsZXRleFN0cmluZyAnXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiJ1xcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMTZcIil7cmV0dXJuIGcrXCJJQTVTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE3XCIpe3JldHVybiBnK1wiVVRDVGltZSBcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE4XCIpe3JldHVybiBnK1wiR2VuZXJhbGl6ZWRUaW1lIFwiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIlxcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMzBcIil7aWYoZS5zdWJzdHIoayw0KT09XCIzMDAwXCIpe3JldHVybiBnK1wiU0VRVUVOQ0Uge31cXG5cIn12YXIgaj1nK1wiU0VRVUVOQ0VcXG5cIjt2YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLGspO3ZhciBmPWM7aWYoKGQubGVuZ3RoPT0yfHxkLmxlbmd0aD09MykmJmUuc3Vic3RyKGRbMF0sMik9PVwiMDZcIiYmZS5zdWJzdHIoZFtkLmxlbmd0aC0xXSwyKT09XCIwNFwiKXt2YXIgdD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGRbMF0pO3ZhciBhPUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludCh0KTt2YXIgbj1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYSk7dmFyIHA9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjKSk7cC54NTA5RXh0TmFtZT1uO2Y9cH1mb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7aj1qK0FTTjFIRVguZHVtcChlLGYsZFtxXSxnK1wiICBcIil9cmV0dXJuIGp9aWYoZS5zdWJzdHIoaywyKT09XCIzMVwiKXt2YXIgaj1nK1wiU0VUXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTtmb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7aj1qK0FTTjFIRVguZHVtcChlLGMsZFtxXSxnK1wiICBcIil9cmV0dXJuIGp9dmFyIHU9cGFyc2VJbnQoZS5zdWJzdHIoaywyKSwxNik7aWYoKHUmMTI4KSE9MCl7dmFyIG09dSYzMTtpZigodSYzMikhPTApe3ZhciBqPWcrXCJbXCIrbStcIl1cXG5cIjt2YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLGspO2Zvcih2YXIgcT0wO3E8ZC5sZW5ndGg7cSsrKXtqPWorQVNOMUhFWC5kdW1wKGUsYyxkW3FdLGcrXCIgIFwiKX1yZXR1cm4gan1lbHNle3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7aWYoaC5zdWJzdHIoMCw4KT09XCI2ODc0NzQ3MFwiKXtoPWhleHRvdXRmOChoKX1pZihjLng1MDlFeHROYW1lPT09XCJzdWJqZWN0QWx0TmFtZVwiJiZtPT0yKXtoPWhleHRvdXRmOChoKX12YXIgaj1nK1wiW1wiK20rXCJdIFwiK2grXCJcXG5cIjtyZXR1cm4gan19cmV0dXJuIGcrXCJVTktOT1dOKFwiK2Uuc3Vic3RyKGssMikrXCIpIFwiK0FTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykrXCJcXG5cIn07QVNOMUhFWC5pc0FTTjFIRVg9ZnVuY3Rpb24oZCl7aWYoZC5sZW5ndGglMj09MSl7cmV0dXJuIGZhbHNlfXZhciBjPUFTTjFIRVguZ2V0SW50T2ZMX0F0T2JqKGQsMCk7dmFyIGI9ZC5zdWJzdHIoMCwyKTt2YXIgZT1BU04xSEVYLmdldEhleE9mTF9BdE9iaihkLDApO3ZhciBhPWQubGVuZ3RoLWIubGVuZ3RoLWUubGVuZ3RoO2lmKGE9PWMqMil7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfTtcbi8qISBhc24xeDUwOS0xLjAuMTQuanMgKGMpIDIwMTMtMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuYXNuMT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMSl7S0pVUi5hc24xPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjEueDUwOT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS54NTA5KXtLSlVSLmFzbjEueDUwOT17fX1LSlVSLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZT1mdW5jdGlvbihnKXtLSlVSLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgZD1udWxsO3ZhciBmPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBlPW51bGw7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3M9ZnVuY3Rpb24oaSxrKXt2YXIgaD1QS0NTNVBLRVkuZ2V0RGVjcnlwdGVkS2V5SGV4KGksayk7dmFyIGo9bmV3IFJTQUtleSgpO2oucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhoKTt0aGlzLnBydktleT1qfTt0aGlzLnNpZ249ZnVuY3Rpb24oKXt0aGlzLmFzbjFTaWduYXR1cmVBbGc9dGhpcy5hc24xVEJTQ2VydC5hc24xU2lnbmF0dXJlQWxnO3NpZz1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6XCJTSEExd2l0aFJTQVwifSk7c2lnLmluaXQodGhpcy5wcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xVEJTQ2VydC5nZXRFbmNvZGVkSGV4KCkpO3RoaXMuaGV4U2lnPXNpZy5zaWduKCk7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGg9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMVRCU0NlcnQsdGhpcy5hc24xU2lnbmF0dXJlQWxnLHRoaXMuYXNuMVNpZ119KTt0aGlzLmhUTFY9aC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfTt0aGlzLnNldFNpZ25hdHVyZUhleD1mdW5jdGlvbihoKXt0aGlzLmFzbjFTaWduYXR1cmVBbGc9dGhpcy5hc24xVEJTQ2VydC5hc24xU2lnbmF0dXJlQWxnO3RoaXMuaGV4U2lnPWg7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGk9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMVRCU0NlcnQsdGhpcy5hc24xU2lnbmF0dXJlQWxnLHRoaXMuYXNuMVNpZ119KTt0aGlzLmhUTFY9aS5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTW9kaWZpZWQ9PWZhbHNlJiZ0aGlzLmhUTFYhPW51bGwpe3JldHVybiB0aGlzLmhUTFZ9dGhyb3dcIm5vdCBzaWduZWQgeWV0XCJ9O3RoaXMuZ2V0UEVNU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGo9dGhpcy5nZXRFbmNvZGVkSGV4KCk7dmFyIGg9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShqKTt2YXIgaT1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShoKTt2YXIgaz1pLnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO3JldHVyblwiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXFxyXFxuXCIraytcIlxcclxcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cXHJcXG5cIn07aWYodHlwZW9mIGchPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBnLnRic2NlcnRvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMVRCU0NlcnQ9Zy50YnNjZXJ0b2JqfWlmKHR5cGVvZiBnLnBydmtleW9iaiE9XCJ1bmRlZmluZWRcIil7dGhpcy5wcnZLZXk9Zy5wcnZrZXlvYmp9ZWxzZXtpZih0eXBlb2YgZy5yc2FwcnZrZXkhPVwidW5kZWZpbmVkXCIpe3RoaXMucHJ2S2V5PWcucnNhcHJ2a2V5fWVsc2V7aWYoKHR5cGVvZiBnLnJzYXBydnBlbSE9XCJ1bmRlZmluZWRcIikmJih0eXBlb2YgZy5yc2FwcnZwYXMhPVwidW5kZWZpbmVkXCIpKXt0aGlzLnNldFJzYVBydktleUJ5UEVNYW5kUGFzcyhnLnJzYXBydnBlbSxnLnJzYXBydnBhcyl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuVEJTQ2VydGlmaWNhdGU9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuVEJTQ2VydGlmaWNhdGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFWZXJzaW9uPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOjJ9KX0pO3RoaXMuYXNuMVNlcmlhbE51bWJlcj1udWxsO3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1udWxsO3RoaXMuYXNuMUlzc3Vlcj1udWxsO3RoaXMuYXNuMU5vdEJlZm9yZT1udWxsO3RoaXMuYXNuMU5vdEFmdGVyPW51bGw7dGhpcy5hc24xU3ViamVjdD1udWxsO3RoaXMuYXNuMVN1YmpQS2V5PW51bGw7dGhpcy5leHRlbnNpb25zQXJyYXk9bmV3IEFycmF5KCl9O3RoaXMuc2V0U2VyaWFsTnVtYmVyQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFTZXJpYWxOdW1iZXI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGIpfTt0aGlzLnNldFNpZ25hdHVyZUFsZ0J5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU2lnbmF0dXJlQWxnPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKGIpfTt0aGlzLnNldElzc3VlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xSXNzdWVyPW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShiKX07dGhpcy5zZXROb3RCZWZvcmVCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMU5vdEJlZm9yZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShiKX07dGhpcy5zZXROb3RBZnRlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xTm90QWZ0ZXI9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYil9O3RoaXMuc2V0U3ViamVjdEJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU3ViamVjdD1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0U3ViamVjdFB1YmxpY0tleUJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKGIpfTt0aGlzLnNldFN1YmplY3RQdWJsaWNLZXlCeUdldEtleT1mdW5jdGlvbihjKXt2YXIgYj1LRVlVVElMLmdldEtleShjKTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8oYil9O3RoaXMuYXBwZW5kRXh0ZW5zaW9uPWZ1bmN0aW9uKGIpe3RoaXMuZXh0ZW5zaW9uc0FycmF5LnB1c2goYil9O3RoaXMuYXBwZW5kRXh0ZW5zaW9uQnlOYW1lPWZ1bmN0aW9uKGQsYil7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImJhc2ljY29uc3RyYWludHNcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHMoYik7dGhpcy5hcHBlbmRFeHRlbnNpb24oYyl9ZWxzZXtpZihkLnRvTG93ZXJDYXNlKCk9PVwia2V5dXNhZ2VcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LktleVVzYWdlKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImNybGRpc3RyaWJ1dGlvbnBvaW50c1wiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImV4dGtleXVzYWdlXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5FeHRLZXlVc2FnZShiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJhdXRob3JpdHlrZXlpZGVudGlmaWVyXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIGV4dGVuc2lvbiBuYW1lOiBcIitkfX19fX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuYXNuMU5vdEJlZm9yZT09bnVsbHx8dGhpcy5hc24xTm90QWZ0ZXI9PW51bGwpe3Rocm93XCJub3RCZWZvcmUgYW5kL29yIG5vdEFmdGVyIG5vdCBzZXRcIn12YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xTm90QmVmb3JlLHRoaXMuYXNuMU5vdEFmdGVyXX0pO3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xVmVyc2lvbik7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTZXJpYWxOdW1iZXIpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU2lnbmF0dXJlQWxnKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMUlzc3Vlcik7dGhpcy5hc24xQXJyYXkucHVzaChjKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmplY3QpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU3VialBLZXkpO2lmKHRoaXMuZXh0ZW5zaW9uc0FycmF5Lmxlbmd0aD4wKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmV4dGVuc2lvbnNBcnJheX0pO3ZhciBiPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDp0cnVlLHRhZzpcImEzXCIsb2JqOmR9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGIpfXZhciBlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplKCl9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5FeHRlbnNpb249ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOnRoaXMub2lkfSk7dmFyIGU9bmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyh7aGV4OnRoaXMuZ2V0RXh0blZhbHVlSGV4KCl9KTt2YXIgZD1uZXcgQXJyYXkoKTtkLnB1c2goZik7aWYodGhpcy5jcml0aWNhbCl7ZC5wdXNoKG5ldyBLSlVSLmFzbjEuREVSQm9vbGVhbigpKX1kLnB1c2goZSk7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZH0pO3JldHVybiBjLmdldEVuY29kZWRIZXgoKX07dGhpcy5jcml0aWNhbD1mYWxzZTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuY3JpdGljYWwhPVwidW5kZWZpbmVkXCIpe3RoaXMuY3JpdGljYWw9Yi5jcml0aWNhbH19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LktleVVzYWdlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LktleVVzYWdlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjE1XCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmJpbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xRXh0blZhbHVlPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKGEpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LktleVVzYWdlLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQmFzaWNDb25zdHJhaW50cz1mdW5jdGlvbihjKXtLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMpO3ZhciBhPWZhbHNlO3ZhciBiPS0xO3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IEFycmF5KCk7aWYodGhpcy5jQSl7ZS5wdXNoKG5ldyBLSlVSLmFzbjEuREVSQm9vbGVhbigpKX1pZih0aGlzLnBhdGhMZW4+LTEpe2UucHVzaChuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6dGhpcy5wYXRoTGVufSkpfXZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmV9KTt0aGlzLmFzbjFFeHRuVmFsdWU9ZDtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5vaWQ9XCIyLjUuMjkuMTlcIjt0aGlzLmNBPWZhbHNlO3RoaXMucGF0aExlbj0tMTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMuY0EhPVwidW5kZWZpbmVkXCIpe3RoaXMuY0E9Yy5jQX1pZih0eXBlb2YgYy5wYXRoTGVuIT1cInVuZGVmaW5lZFwiKXt0aGlzLnBhdGhMZW49Yy5wYXRoTGVufX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHMsS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uKTtLSlVSLmFzbjEueDUwOS5DUkxEaXN0cmlidXRpb25Qb2ludHM9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMuc2V0QnlEUEFycmF5PWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpifSl9O3RoaXMuc2V0QnlPbmVVUkk9ZnVuY3Rpb24oZSl7dmFyIGI9bmV3IEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyhbe3VyaTplfV0pO3ZhciBkPW5ldyBLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWUoYik7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50KHtkcG9iajpkfSk7dGhpcy5zZXRCeURQQXJyYXkoW2NdKX07dGhpcy5vaWQ9XCIyLjUuMjkuMzFcIjtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlEUEFycmF5KGEuYXJyYXkpfWVsc2V7aWYodHlwZW9mIGEudXJpIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5T25lVVJJKGEudXJpKX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuRXh0S2V5VXNhZ2U9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuRXh0S2V5VXNhZ2Uuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5zZXRQdXJwb3NlQXJyYXk9ZnVuY3Rpb24oYil7dGhpcy5hc24xRXh0blZhbHVlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2UoKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKGJbY10pO3RoaXMuYXNuMUV4dG5WYWx1ZS5hcHBlbmRBU04xT2JqZWN0KGQpfX07dGhpcy5nZXRFeHRuVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5vaWQ9XCIyLjUuMjkuMzdcIjtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0UHVycG9zZUFycmF5KGEuYXJyYXkpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuYXNuMUtJRD1udWxsO3RoaXMuYXNuMUNlcnRJc3N1ZXI9bnVsbDt0aGlzLmFzbjFDZXJ0U049bnVsbDt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBjPW5ldyBBcnJheSgpO2lmKHRoaXMuYXNuMUtJRCl7Yy5wdXNoKG5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDpmYWxzZSx0YWc6XCI4MFwiLG9iajp0aGlzLmFzbjFLSUR9KSl9aWYodGhpcy5hc24xQ2VydElzc3Vlcil7Yy5wdXNoKG5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDpmYWxzZSx0YWc6XCJhMVwiLG9iajp0aGlzLmFzbjFDZXJ0SXNzdWVyfSkpfWlmKHRoaXMuYXNuMUNlcnRTTil7Yy5wdXNoKG5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDpmYWxzZSx0YWc6XCI4MlwiLG9iajp0aGlzLmFzbjFDZXJ0U059KSl9dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Y30pO3RoaXMuYXNuMUV4dG5WYWx1ZT1iO3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLnNldEtJREJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xS0lEPW5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoYil9O3RoaXMuc2V0Q2VydElzc3VlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xQ2VydElzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0Q2VydFNOQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFDZXJ0U049bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGIpfTt0aGlzLm9pZD1cIjIuNS4yOS4zNVwiO2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5raWQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0S0lEQnlQYXJhbShhLmtpZCl9aWYodHlwZW9mIGEuaXNzdWVyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldENlcnRJc3N1ZXJCeVBhcmFtKGEuaXNzdWVyKX1pZih0eXBlb2YgYS5zbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0U05CeVBhcmFtKGEuc24pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXIsS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uKTtLSlVSLmFzbjEueDUwOS5DUkw9ZnVuY3Rpb24oZil7S0pVUi5hc24xLng1MDkuQ1JMLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3ZhciBjPW51bGw7dmFyIGU9bnVsbDt2YXIgYj1udWxsO3ZhciBkPW51bGw7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3M9ZnVuY3Rpb24oaCxqKXt2YXIgZz1QS0NTNVBLRVkuZ2V0RGVjcnlwdGVkS2V5SGV4KGgsaik7dmFyIGk9bmV3IFJTQUtleSgpO2kucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhnKTt0aGlzLnJzYVBydktleT1pfTt0aGlzLnNpZ249ZnVuY3Rpb24oKXt0aGlzLmFzbjFTaWduYXR1cmVBbGc9dGhpcy5hc24xVEJTQ2VydExpc3QuYXNuMVNpZ25hdHVyZUFsZztzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOlwiU0hBMXdpdGhSU0FcIixwcm92OlwiY3J5cHRvanMvanNyc2FcIn0pO3NpZy5pbml0U2lnbih0aGlzLnJzYVBydktleSk7c2lnLnVwZGF0ZUhleCh0aGlzLmFzbjFUQlNDZXJ0TGlzdC5nZXRFbmNvZGVkSGV4KCkpO3RoaXMuaGV4U2lnPXNpZy5zaWduKCk7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMVRCU0NlcnRMaXN0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWcuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBpPXRoaXMuZ2V0RW5jb2RlZEhleCgpO3ZhciBnPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoaSk7dmFyIGg9Q3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoZyk7dmFyIGo9aC5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gWDUwOSBDUkwtLS0tLVxcclxcblwiK2orXCJcXHJcXG4tLS0tLUVORCBYNTA5IENSTC0tLS0tXFxyXFxuXCJ9O2lmKHR5cGVvZiBmIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZi50YnNvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMVRCU0NlcnRMaXN0PWYudGJzb2JqfWlmKHR5cGVvZiBmLnJzYXBydmtleSE9XCJ1bmRlZmluZWRcIil7dGhpcy5yc2FQcnZLZXk9Zi5yc2FwcnZrZXl9aWYoKHR5cGVvZiBmLnJzYXBydnBlbSE9XCJ1bmRlZmluZWRcIikmJih0eXBlb2YgZi5yc2FwcnZwYXMhPVwidW5kZWZpbmVkXCIpKXt0aGlzLnNldFJzYVBydktleUJ5UEVNYW5kUGFzcyhmLnJzYXBydnBlbSxmLnJzYXBydnBhcyl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ1JMLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5UQlNDZXJ0TGlzdD1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5UQlNDZXJ0TGlzdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLnNldFNpZ25hdHVyZUFsZ0J5UGFyYW09ZnVuY3Rpb24oYyl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKGMpfTt0aGlzLnNldElzc3VlckJ5UGFyYW09ZnVuY3Rpb24oYyl7dGhpcy5hc24xSXNzdWVyPW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShjKX07dGhpcy5zZXRUaGlzVXBkYXRlQnlQYXJhbT1mdW5jdGlvbihjKXt0aGlzLmFzbjFUaGlzVXBkYXRlPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpfTt0aGlzLnNldE5leHRVcGRhdGVCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMU5leHRVcGRhdGU9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYyl9O3RoaXMuYWRkUmV2b2tlZENlcnQ9ZnVuY3Rpb24oYyxkKXt2YXIgZj17fTtpZihjIT11bmRlZmluZWQmJmMhPW51bGwpe2Yuc249Y31pZihkIT11bmRlZmluZWQmJmQhPW51bGwpe2YudGltZT1kfXZhciBlPW5ldyBLSlVSLmFzbjEueDUwOS5DUkxFbnRyeShmKTt0aGlzLmFSZXZva2VkQ2VydC5wdXNoKGUpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTtpZih0aGlzLmFzbjFWZXJzaW9uIT1udWxsKXt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVZlcnNpb24pfXRoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU2lnbmF0dXJlQWxnKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMUlzc3Vlcik7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFUaGlzVXBkYXRlKTtpZih0aGlzLmFzbjFOZXh0VXBkYXRlIT1udWxsKXt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMU5leHRVcGRhdGUpfWlmKHRoaXMuYVJldm9rZWRDZXJ0Lmxlbmd0aD4wKXt2YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFSZXZva2VkQ2VydH0pO3RoaXMuYXNuMUFycmF5LnB1c2goYyl9dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXt0aGlzLmFzbjFWZXJzaW9uPW51bGw7dGhpcy5hc24xU2lnbmF0dXJlQWxnPW51bGw7dGhpcy5hc24xSXNzdWVyPW51bGw7dGhpcy5hc24xVGhpc1VwZGF0ZT1udWxsO3RoaXMuYXNuMU5leHRVcGRhdGU9bnVsbDt0aGlzLmFSZXZva2VkQ2VydD1uZXcgQXJyYXkoKX07dGhpcy5faW5pdGlhbGl6ZSgpfTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5UQlNDZXJ0TGlzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuQ1JMRW50cnk9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLng1MDkuQ1JMRW50cnkuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLnNldENlcnRTZXJpYWw9ZnVuY3Rpb24oZCl7dGhpcy5zbj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoZCl9O3RoaXMuc2V0UmV2b2NhdGlvbkRhdGU9ZnVuY3Rpb24oZCl7dGhpcy50aW1lPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGQpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5zbix0aGlzLnRpbWVdfSk7dGhpcy5UTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMudGltZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRSZXZvY2F0aW9uRGF0ZShjLnRpbWUpfWlmKHR5cGVvZiBjLnNuIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldENlcnRTZXJpYWwoYy5zbil9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ1JMRW50cnksS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5Llg1MDBOYW1lPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5Llg1MDBOYW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLnNldEJ5U3RyaW5nPWZ1bmN0aW9uKGMpe3ZhciBkPWMuc3BsaXQoXCIvXCIpO2Quc2hpZnQoKTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dGhpcy5hc24xQXJyYXkucHVzaChuZXcgS0pVUi5hc24xLng1MDkuUkROKHtzdHI6ZFtlXX0pKX19O3RoaXMuc2V0QnlPYmplY3Q9ZnVuY3Rpb24oZSl7Zm9yKHZhciBjIGluIGUpe2lmKGUuaGFzT3duUHJvcGVydHkoYykpe3ZhciBkPW5ldyBLSlVSLmFzbjEueDUwOS5SRE4oe3N0cjpjK1wiPVwiK2VbY119KTt0aGlzLmFzbjFBcnJheT90aGlzLmFzbjFBcnJheS5wdXNoKGQpOnRoaXMuYXNuMUFycmF5PVtkXX19fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWMuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5zdHIhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlTdHJpbmcoYi5zdHIpfWVsc2V7aWYodHlwZW9mIGI9PT1cIm9iamVjdFwiKXt0aGlzLnNldEJ5T2JqZWN0KGIpfX1pZih0eXBlb2YgYi5jZXJ0aXNzdWVyIT1cInVuZGVmaW5lZFwiKXt2YXIgYT1uZXcgWDUwOSgpO2EuaGV4PVg1MDkucGVtVG9IZXgoYi5jZXJ0aXNzdWVyKTt0aGlzLmhUTFY9YS5nZXRJc3N1ZXJIZXgoKX1pZih0eXBlb2YgYi5jZXJ0c3ViamVjdCE9XCJ1bmRlZmluZWRcIil7dmFyIGE9bmV3IFg1MDkoKTthLmhleD1YNTA5LnBlbVRvSGV4KGIuY2VydHN1YmplY3QpO3RoaXMuaFRMVj1hLmdldFN1YmplY3RIZXgoKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5YNTAwTmFtZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuUkROPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LlJETi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hZGRCeVN0cmluZz1mdW5jdGlvbihiKXt0aGlzLmFzbjFBcnJheS5wdXNoKG5ldyBLSlVSLmFzbjEueDUwOS5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUoe3N0cjpifSkpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUlNldCh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTt0aGlzLlRMVj1iLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5zdHIhPVwidW5kZWZpbmVkXCIpe3RoaXMuYWRkQnlTdHJpbmcoYS5zdHIpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlJETixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuQXR0cmlidXRlVHlwZUFuZFZhbHVlPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGQ9bnVsbDt2YXIgYz1udWxsO3ZhciBhPVwidXRmOFwiO3RoaXMuc2V0QnlTdHJpbmc9ZnVuY3Rpb24oZSl7aWYoZS5tYXRjaCgvXihbXj1dKyk9KC4rKSQvKSl7dGhpcy5zZXRCeUF0dHJUeXBlQW5kVmFsdWVTdHIoUmVnRXhwLiQxLFJlZ0V4cC4kMil9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIGF0dHJUeXBlQW5kVmFsdWVTdHI6IFwiK2V9fTt0aGlzLnNldEJ5QXR0clR5cGVBbmRWYWx1ZVN0cj1mdW5jdGlvbihnLGYpe3RoaXMudHlwZU9iaj1LSlVSLmFzbjEueDUwOS5PSUQuYXR5cGUyb2JqKGcpO3ZhciBlPWE7aWYoZz09XCJDXCIpe2U9XCJwcm5cIn10aGlzLnZhbHVlT2JqPXRoaXMuZ2V0VmFsdWVPYmooZSxmKX07dGhpcy5nZXRWYWx1ZU9iaj1mdW5jdGlvbihmLGUpe2lmKGY9PVwidXRmOFwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJVVEY4U3RyaW5nKHtzdHI6ZX0pfWlmKGY9PVwicHJuXCIpe3JldHVybiBuZXcgS0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZyh7c3RyOmV9KX1pZihmPT1cInRlbFwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nKHtzdHI6ZX0pfWlmKGY9PVwiaWE1XCIpe3JldHVybiBuZXcgS0pVUi5hc24xLkRFUklBNVN0cmluZyh7c3RyOmV9KX10aHJvd1widW5zdXBwb3J0ZWQgZGlyZWN0b3J5IHN0cmluZyB0eXBlOiB0eXBlPVwiK2YrXCIgdmFsdWU9XCIrZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMudHlwZU9iaix0aGlzLnZhbHVlT2JqXX0pO3RoaXMuVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLlRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeVN0cmluZyhiLnN0cil9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQXR0cmlidXRlVHlwZUFuZFZhbHVlLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbz1mdW5jdGlvbihkKXtLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dGhpcy5zZXRSU0FLZXk9ZnVuY3Rpb24oZSl7aWYoIVJTQUtleS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihlKSl7dGhyb3dcImFyZ3VtZW50IGlzIG5vdCBSU0FLZXkgaW5zdGFuY2VcIn10aGlzLnJzYUtleT1lO3ZhciBnPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmUubn0pO3ZhciBmPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjplLmV9KTt2YXIgaT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbZyxmXX0pO3ZhciBoPWkuZ2V0RW5jb2RlZEhleCgpO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwicnNhRW5jcnlwdGlvblwifSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIraH0pfTt0aGlzLnNldFJTQVBFTT1mdW5jdGlvbihnKXtpZihnLm1hdGNoKC8tLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLS8pKXt2YXIgbj1nO249bi5yZXBsYWNlKC9eLS0tLS1bXi1dKy0tLS0tLyxcIlwiKTtuPW4ucmVwbGFjZSgvLS0tLS1bXi1dKy0tLS0tXFxzKiQvLFwiXCIpO3ZhciBtPW4ucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBmPUNyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2UobSk7dmFyIGk9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkoZik7dmFyIGs9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoaSk7dmFyIGg9a1sxXTt2YXIgbD1oLnN1YnN0cigyKTt2YXIgZT1fcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChsKTt2YXIgaj1uZXcgUlNBS2V5KCk7ai5zZXRQdWJsaWMoZVswXSxlWzFdKTt0aGlzLnNldFJTQUtleShqKX1lbHNle3Rocm93XCJrZXkgbm90IHN1cHBvcnRlZFwifX07dGhpcy5nZXRBU04xT2JqZWN0PWZ1bmN0aW9uKCl7aWYodGhpcy5hc24xQWxnSWQ9PW51bGx8fHRoaXMuYXNuMVN1YmpQS2V5PT1udWxsKXt0aHJvd1wiYWxnSWQgYW5kL29yIHN1YmpQdWJLZXkgbm90IHNldFwifXZhciBlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFBbGdJZCx0aGlzLmFzbjFTdWJqUEtleV19KTtyZXR1cm4gZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRBU04xT2JqZWN0KCk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuX3NldFJTQUtleT1mdW5jdGlvbihlKXt2YXIgZz1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOntiaWdpbnQ6ZS5ufX0se1wiaW50XCI6e1wiaW50XCI6ZS5lfX1dfSk7dmFyIGY9Zy5nZXRFbmNvZGVkSGV4KCk7dGhpcy5hc24xQWxnSWQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJyc2FFbmNyeXB0aW9uXCJ9KTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitmfSl9O3RoaXMuX3NldEVDPWZ1bmN0aW9uKGUpe3ZhciBmPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTplLmN1cnZlTmFtZX0pO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwiZWNQdWJsaWNLZXlcIixhc24xcGFyYW1zOmZ9KTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitlLnB1YktleUhleH0pfTt0aGlzLl9zZXREU0E9ZnVuY3Rpb24oZSl7dmFyIGY9bmV3IEtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6e2JpZ2ludDplLnB9fSx7XCJpbnRcIjp7YmlnaW50OmUucX19LHtcImludFwiOntiaWdpbnQ6ZS5nfX1dfSk7dGhpcy5hc24xQWxnSWQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJkc2FcIixhc24xcGFyYW1zOmZ9KTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDplLnl9KTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitnLmdldEVuY29kZWRIZXgoKX0pfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmZCBpbnN0YW5jZW9mIFJTQUtleSl7dGhpcy5fc2V0UlNBS2V5KGQpfWVsc2V7aWYodHlwZW9mIEtKVVIuY3J5cHRvLkVDRFNBIT1cInVuZGVmaW5lZFwiJiZkIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3RoaXMuX3NldEVDKGQpfWVsc2V7aWYodHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmZCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7dGhpcy5fc2V0RFNBKGQpfWVsc2V7aWYodHlwZW9mIGQucnNha2V5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFJTQUtleShkLnJzYWtleSl9ZWxzZXtpZih0eXBlb2YgZC5yc2FwZW0hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0UlNBUEVNKGQucnNhcGVtKX19fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlRpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLng1MDkuVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMuc2V0VGltZVBhcmFtcz1mdW5jdGlvbihkKXt0aGlzLnRpbWVQYXJhbXM9ZH07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGQ9bnVsbDtpZih0aGlzLnRpbWVQYXJhbXMhPW51bGwpe2lmKHRoaXMudHlwZT09XCJ1dGNcIil7ZD1uZXcgS0pVUi5hc24xLkRFUlVUQ1RpbWUodGhpcy50aW1lUGFyYW1zKX1lbHNle2Q9bmV3IEtKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUodGhpcy50aW1lUGFyYW1zKX19ZWxzZXtpZih0aGlzLnR5cGU9PVwidXRjXCIpe2Q9bmV3IEtKVVIuYXNuMS5ERVJVVENUaW1lKCl9ZWxzZXtkPW5ldyBLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lKCl9fXRoaXMuVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLlRMVn07dGhpcy50eXBlPVwidXRjXCI7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnR5cGUhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1jLnR5cGV9ZWxzZXtpZih0eXBlb2YgYy5zdHIhPVwidW5kZWZpbmVkXCIpe2lmKGMuc3RyLm1hdGNoKC9eWzAtOV17MTJ9WiQvKSl7dGhpcy50eXBlPVwidXRjXCJ9aWYoYy5zdHIubWF0Y2goL15bMC05XXsxNH1aJC8pKXt0aGlzLnR5cGU9XCJnZW5cIn19fXRoaXMudGltZVBhcmFtcz1jfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuVGltZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcj1mdW5jdGlvbihlKXtLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3ZhciBkPW51bGw7dmFyIGI9bnVsbDt2YXIgYz1mYWxzZTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLm5hbWVBbGc9PW51bGwmJnRoaXMuYXNuMUFsZz09bnVsbCl7dGhyb3dcImFsZ29yaXRobSBub3Qgc3BlY2lmaWVkXCJ9aWYodGhpcy5uYW1lQWxnIT1udWxsJiZ0aGlzLmFzbjFBbGc9PW51bGwpe3RoaXMuYXNuMUFsZz1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvYmoodGhpcy5uYW1lQWxnKX12YXIgZj1bdGhpcy5hc24xQWxnXTtpZighdGhpcy5wYXJhbUVtcHR5KXtmLnB1c2godGhpcy5hc24xUGFyYW1zKX12YXIgZz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpmfSk7dGhpcy5oVExWPWcuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5uYW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLm5hbWVBbGc9ZS5uYW1lfWlmKHR5cGVvZiBlLmFzbjFwYXJhbXMhPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMVBhcmFtcz1lLmFzbjFwYXJhbXN9aWYodHlwZW9mIGUucGFyYW1lbXB0eSE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXJhbUVtcHR5PWUucGFyYW1lbXB0eX19aWYodGhpcy5hc24xUGFyYW1zPT1udWxsKXt0aGlzLmFzbjFQYXJhbXM9bmV3IEtKVVIuYXNuMS5ERVJOdWxsKCl9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZT1mdW5jdGlvbihkKXtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGM9bnVsbDt2YXIgYj1udWxsO3ZhciBhPXtyZmM4MjI6XCI4MVwiLGRuczpcIjgyXCIsZG46XCJhNFwiLHVyaTpcIjg2XCJ9O3RoaXMuZXhwbGljaXQ9ZmFsc2U7dGhpcy5zZXRCeVBhcmFtPWZ1bmN0aW9uKGspe3ZhciBqPW51bGw7dmFyIGc9bnVsbDtpZih0eXBlb2Ygaz09XCJ1bmRlZmluZWRcIil7cmV0dXJufWlmKHR5cGVvZiBrLnJmYzgyMiE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwicmZjODIyXCI7Zz1uZXcgS0pVUi5hc24xLkRFUklBNVN0cmluZyh7c3RyOmtbdGhpcy50eXBlXX0pfWlmKHR5cGVvZiBrLmRucyE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwiZG5zXCI7Zz1uZXcgS0pVUi5hc24xLkRFUklBNVN0cmluZyh7c3RyOmtbdGhpcy50eXBlXX0pfWlmKHR5cGVvZiBrLnVyaSE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwidXJpXCI7Zz1uZXcgS0pVUi5hc24xLkRFUklBNVN0cmluZyh7c3RyOmtbdGhpcy50eXBlXX0pfWlmKHR5cGVvZiBrLmNlcnRpc3N1ZXIhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cImRuXCI7dGhpcy5leHBsaWNpdD10cnVlO3ZhciBoPWsuY2VydGlzc3Vlcjt2YXIgZj1udWxsO2lmKGgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe2Y9PWh9aWYoaC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXtmPVg1MDkucGVtVG9IZXgoaCl9aWYoZj09bnVsbCl7dGhyb3dcImNlcnRpc3N1ZXIgcGFyYW0gbm90IGNlcnRcIn12YXIgZT1uZXcgWDUwOSgpO2UuaGV4PWY7dmFyIGk9ZS5nZXRJc3N1ZXJIZXgoKTtnPW5ldyBLSlVSLmFzbjEuQVNOMU9iamVjdCgpO2cuaFRMVj1pfWlmKHR5cGVvZiBrLmNlcnRzdWJqIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9XCJkblwiO3RoaXMuZXhwbGljaXQ9dHJ1ZTt2YXIgaD1rLmNlcnRzdWJqO3ZhciBmPW51bGw7aWYoaC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7Zj09aH1pZihoLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe2Y9WDUwOS5wZW1Ub0hleChoKX1pZihmPT1udWxsKXt0aHJvd1wiY2VydHN1YmogcGFyYW0gbm90IGNlcnRcIn12YXIgZT1uZXcgWDUwOSgpO2UuaGV4PWY7dmFyIGk9ZS5nZXRTdWJqZWN0SGV4KCk7Zz1uZXcgS0pVUi5hc24xLkFTTjFPYmplY3QoKTtnLmhUTFY9aX1pZih0aGlzLnR5cGU9PW51bGwpe3Rocm93XCJ1bnN1cHBvcnRlZCB0eXBlIGluIHBhcmFtcz1cIitrfXRoaXMuYXNuMU9iaj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dGhpcy5leHBsaWNpdCx0YWc6YVt0aGlzLnR5cGVdLG9iajpnfSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFPYmouZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeVBhcmFtKGQpfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcz1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRCeVBhcmFtQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciBjPTA7YzxlLmxlbmd0aDtjKyspe3ZhciBkPW5ldyBLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZShlW2NdKTt0aGlzLmFzbjFBcnJheS5wdXNoKGQpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTtyZXR1cm4gYy5nZXRFbmNvZGVkSGV4KCl9O3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5UGFyYW1BcnJheShiKX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGU9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dmFyIGQ9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLnR5cGUhPVwiZnVsbFwiKXt0aHJvd1wiY3VycmVudGx5IHR5cGUgc2hhbGwgYmUgJ2Z1bGwnOiBcIit0aGlzLnR5cGV9dGhpcy5hc24xT2JqPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDpmYWxzZSx0YWc6dGhpcy50YWcsb2JqOnRoaXMuYXNuMVZ9KTt0aGlzLmhUTFY9dGhpcy5hc24xT2JqLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYoS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWVzLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGIpKXt0aGlzLnR5cGU9XCJmdWxsXCI7dGhpcy50YWc9XCJhMFwiO3RoaXMuYXNuMVY9Yn1lbHNle3Rocm93XCJUaGlzIGNsYXNzIHN1cHBvcnRzIEdlbmVyYWxOYW1lcyBvbmx5IGFzIGFyZ3VtZW50XCJ9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludD1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKCk7aWYodGhpcy5hc24xRFAhPW51bGwpe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDp0cnVlLHRhZzpcImEwXCIsb2JqOnRoaXMuYXNuMURQfSk7Yy5hcHBlbmRBU04xT2JqZWN0KGQpfXRoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuZHBvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMURQPWIuZHBvYmp9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5Lk9JRD1uZXcgZnVuY3Rpb24oYSl7dGhpcy5hdHlwZTJvaWRMaXN0PXtDOlwiMi41LjQuNlwiLE86XCIyLjUuNC4xMFwiLE9VOlwiMi41LjQuMTFcIixTVDpcIjIuNS40LjhcIixMOlwiMi41LjQuN1wiLENOOlwiMi41LjQuM1wiLFNOOlwiMi41LjQuNFwiLEROOlwiMi41LjQuNDlcIixEQzpcIjAuOS4yMzQyLjE5MjAwMzAwLjEwMC4xLjI1XCIsfTt0aGlzLm5hbWUyb2lkTGlzdD17c2hhMTpcIjEuMy4xNC4zLjIuMjZcIixzaGEyNTY6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4xXCIsc2hhMzg0OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuMlwiLHNoYTUxMjpcIjIuMTYuODQwLjEuMTAxLjMuNC4yLjNcIixzaGEyMjQ6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMi40XCIsbWQ1OlwiMS4yLjg0MC4xMTM1NDkuMi41XCIsbWQyOlwiMS4zLjE0LjcuMi4yLjFcIixyaXBlbWQxNjA6XCIxLjMuMzYuMy4yLjFcIixNRDJ3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjJcIixNRDR3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjNcIixNRDV3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjRcIixTSEExd2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS41XCIsU0hBMjI0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xNFwiLFNIQTI1NndpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTFcIixTSEEzODR3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjEyXCIsU0hBNTEyd2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xM1wiLFNIQTF3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMVwiLFNIQTIyNHdpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4zLjFcIixTSEEyNTZ3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy4yXCIsU0hBMzg0d2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjMuM1wiLFNIQTUxMndpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4zLjRcIixkc2E6XCIxLjIuODQwLjEwMDQwLjQuMVwiLFNIQTF3aXRoRFNBOlwiMS4yLjg0MC4xMDA0MC40LjNcIixTSEEyMjR3aXRoRFNBOlwiMi4xNi44NDAuMS4xMDEuMy40LjMuMVwiLFNIQTI1NndpdGhEU0E6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMy4yXCIscnNhRW5jcnlwdGlvbjpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xXCIsY291bnRyeU5hbWU6XCIyLjUuNC42XCIsb3JnYW5pemF0aW9uOlwiMi41LjQuMTBcIixvcmdhbml6YXRpb25hbFVuaXQ6XCIyLjUuNC4xMVwiLHN0YXRlT3JQcm92aW5jZU5hbWU6XCIyLjUuNC44XCIsbG9jYWxpdHk6XCIyLjUuNC43XCIsY29tbW9uTmFtZTpcIjIuNS40LjNcIixzdWJqZWN0S2V5SWRlbnRpZmllcjpcIjIuNS4yOS4xNFwiLGtleVVzYWdlOlwiMi41LjI5LjE1XCIsc3ViamVjdEFsdE5hbWU6XCIyLjUuMjkuMTdcIixiYXNpY0NvbnN0cmFpbnRzOlwiMi41LjI5LjE5XCIsbmFtZUNvbnN0cmFpbnRzOlwiMi41LjI5LjMwXCIsY1JMRGlzdHJpYnV0aW9uUG9pbnRzOlwiMi41LjI5LjMxXCIsY2VydGlmaWNhdGVQb2xpY2llczpcIjIuNS4yOS4zMlwiLGF1dGhvcml0eUtleUlkZW50aWZpZXI6XCIyLjUuMjkuMzVcIixwb2xpY3lDb25zdHJhaW50czpcIjIuNS4yOS4zNlwiLGV4dEtleVVzYWdlOlwiMi41LjI5LjM3XCIsYXV0aG9yaXR5SW5mb0FjY2VzczpcIjEuMy42LjEuNS41LjcuMS4xXCIsYW55RXh0ZW5kZWRLZXlVc2FnZTpcIjIuNS4yOS4zNy4wXCIsc2VydmVyQXV0aDpcIjEuMy42LjEuNS41LjcuMy4xXCIsY2xpZW50QXV0aDpcIjEuMy42LjEuNS41LjcuMy4yXCIsY29kZVNpZ25pbmc6XCIxLjMuNi4xLjUuNS43LjMuM1wiLGVtYWlsUHJvdGVjdGlvbjpcIjEuMy42LjEuNS41LjcuMy40XCIsdGltZVN0YW1waW5nOlwiMS4zLjYuMS41LjUuNy4zLjhcIixvY3NwU2lnbmluZzpcIjEuMy42LjEuNS41LjcuMy45XCIsZWNQdWJsaWNLZXk6XCIxLjIuODQwLjEwMDQ1LjIuMVwiLHNlY3AyNTZyMTpcIjEuMi44NDAuMTAwNDUuMy4xLjdcIixzZWNwMjU2azE6XCIxLjMuMTMyLjAuMTBcIixzZWNwMzg0cjE6XCIxLjMuMTMyLjAuMzRcIixwa2NzNVBCRVMyOlwiMS4yLjg0MC4xMTM1NDkuMS41LjEzXCIscGtjczVQQktERjI6XCIxLjIuODQwLjExMzU0OS4xLjUuMTJcIixcImRlcy1FREUzLUNCQ1wiOlwiMS4yLjg0MC4xMTM1NDkuMy43XCIsZGF0YTpcIjEuMi44NDAuMTEzNTQ5LjEuNy4xXCIsXCJzaWduZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjJcIixcImVudmVsb3BlZC1kYXRhXCI6XCIxLjIuODQwLjExMzU0OS4xLjcuM1wiLFwiZGlnZXN0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjVcIixcImVuY3J5cHRlZC1kYXRhXCI6XCIxLjIuODQwLjExMzU0OS4xLjcuNlwiLFwiYXV0aGVudGljYXRlZC1kYXRhXCI6XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMS4yXCIsdHN0aW5mbzpcIjEuMi44NDAuMTEzNTQ5LjEuOS4xNi4xLjRcIix9O3RoaXMub2JqQ2FjaGU9e307dGhpcy5uYW1lMm9iaj1mdW5jdGlvbihiKXtpZih0eXBlb2YgdGhpcy5vYmpDYWNoZVtiXSE9XCJ1bmRlZmluZWRcIil7cmV0dXJuIHRoaXMub2JqQ2FjaGVbYl19aWYodHlwZW9mIHRoaXMubmFtZTJvaWRMaXN0W2JdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiTmFtZSBvZiBPYmplY3RJZGVudGlmaWVyIG5vdCBkZWZpbmVkOiBcIitifXZhciBjPXRoaXMubmFtZTJvaWRMaXN0W2JdO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmN9KTt0aGlzLm9iakNhY2hlW2JdPWQ7cmV0dXJuIGR9O3RoaXMuYXR5cGUyb2JqPWZ1bmN0aW9uKGIpe2lmKHR5cGVvZiB0aGlzLm9iakNhY2hlW2JdIT1cInVuZGVmaW5lZFwiKXtyZXR1cm4gdGhpcy5vYmpDYWNoZVtiXX1pZih0eXBlb2YgdGhpcy5hdHlwZTJvaWRMaXN0W2JdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiQXR0cmlidXRlVHlwZSBuYW1lIHVuZGVmaW5lZDogXCIrYn12YXIgYz10aGlzLmF0eXBlMm9pZExpc3RbYl07dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKHtvaWQ6Y30pO3RoaXMub2JqQ2FjaGVbYl09ZDtyZXR1cm4gZH19O0tKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZT1mdW5jdGlvbihiKXt2YXIgYz1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0O2Zvcih2YXIgYSBpbiBjKXtpZihjW2FdPT1iKXtyZXR1cm4gYX19cmV0dXJuXCJcIn07S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkPWZ1bmN0aW9uKGEpe3ZhciBiPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3Q7aWYoYlthXT09PXVuZGVmaW5lZCl7cmV0dXJuXCJcIn1yZXR1cm4gYlthXX07S0pVUi5hc24xLng1MDkuWDUwOVV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5nZXRQS0NTOFB1YktleVBFTWZyb21SU0FLZXk9ZnVuY3Rpb24oaSl7dmFyIGg9bnVsbDt2YXIgZj1LSlVSLmFzbjEuQVNOMVV0aWwuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgoaS5uKTt2YXIgaj1LSlVSLmFzbjEuQVNOMVV0aWwuaW50ZWdlclRvQnl0ZUhleChpLmUpO3ZhciBhPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7aGV4OmZ9KTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2hleDpqfSk7dmFyIGw9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2EsZ119KTt2YXIgYz1sLmdldEVuY29kZWRIZXgoKTt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcInJzYUVuY3J5cHRpb25cIn0pO3ZhciBiPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK2N9KTt2YXIgaz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbZCxiXX0pO3ZhciBlPWsuZ2V0RW5jb2RlZEhleCgpO3ZhciBoPUtKVVIuYXNuMS5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGUsXCJQVUJMSUMgS0VZXCIpO3JldHVybiBofX07S0pVUi5hc24xLng1MDkuWDUwOVV0aWwubmV3Q2VydFBFTT1mdW5jdGlvbihmKXt2YXIgYz1LSlVSLmFzbjEueDUwOTt2YXIgZT1uZXcgYy5UQlNDZXJ0aWZpY2F0ZSgpO2lmKGYuc2VyaWFsIT09dW5kZWZpbmVkKXtlLnNldFNlcmlhbE51bWJlckJ5UGFyYW0oZi5zZXJpYWwpfWVsc2V7dGhyb3dcInNlcmlhbCBudW1iZXIgdW5kZWZpbmVkLlwifWlmKHR5cGVvZiBmLnNpZ2FsZy5uYW1lPT1cInN0cmluZ1wiKXtlLnNldFNpZ25hdHVyZUFsZ0J5UGFyYW0oZi5zaWdhbGcpfWVsc2V7dGhyb3dcInVucHJvcGVyIHNpZ25hdHVyZSBhbGdvcml0aG0gbmFtZVwifWlmKGYuaXNzdWVyIT09dW5kZWZpbmVkKXtlLnNldElzc3VlckJ5UGFyYW0oZi5pc3N1ZXIpfWVsc2V7dGhyb3dcImlzc3VlciBuYW1lIHVuZGVmaW5lZC5cIn1pZihmLm5vdGJlZm9yZSE9PXVuZGVmaW5lZCl7ZS5zZXROb3RCZWZvcmVCeVBhcmFtKGYubm90YmVmb3JlKX1lbHNle3Rocm93XCJub3RiZWZvcmUgdW5kZWZpbmVkLlwifWlmKGYubm90YWZ0ZXIhPT11bmRlZmluZWQpe2Uuc2V0Tm90QWZ0ZXJCeVBhcmFtKGYubm90YWZ0ZXIpfWVsc2V7dGhyb3dcIm5vdGFmdGVyIHVuZGVmaW5lZC5cIn1pZihmLnN1YmplY3QhPT11bmRlZmluZWQpe2Uuc2V0U3ViamVjdEJ5UGFyYW0oZi5zdWJqZWN0KX1lbHNle3Rocm93XCJzdWJqZWN0IG5hbWUgdW5kZWZpbmVkLlwifWlmKGYuc2JqcHVia2V5IT09dW5kZWZpbmVkKXtlLnNldFN1YmplY3RQdWJsaWNLZXlCeUdldEtleShmLnNianB1YmtleSl9ZWxzZXt0aHJvd1wic3ViamVjdCBwdWJsaWMga2V5IHVuZGVmaW5lZC5cIn1pZihmLmV4dCE9PXVuZGVmaW5lZCYmZi5leHQubGVuZ3RoIT09dW5kZWZpbmVkKXtmb3IodmFyIGI9MDtiPGYuZXh0Lmxlbmd0aDtiKyspe2ZvcihrZXkgaW4gZi5leHRbYl0pe2UuYXBwZW5kRXh0ZW5zaW9uQnlOYW1lKGtleSxmLmV4dFtiXVtrZXldKX19fWlmKGYuY2FrZXk9PT11bmRlZmluZWQmJmYuc2lnaGV4PT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW0gY2FrZXkgYW5kIHNpZ2hleCB1bmRlZmluZWQuXCJ9dmFyIGQ9bnVsbDt2YXIgYT1udWxsO2lmKGYuY2FrZXkpe2Q9S0VZVVRJTC5nZXRLZXkuYXBwbHkobnVsbCxmLmNha2V5KTthPW5ldyBjLkNlcnRpZmljYXRlKHt0YnNjZXJ0b2JqOmUscHJ2a2V5b2JqOmR9KTthLnNpZ24oKX1pZihmLnNpZ2hleCl7YT1uZXcgYy5DZXJ0aWZpY2F0ZSh7dGJzY2VydG9iajplfSk7YS5zZXRTaWduYXR1cmVIZXgoZi5zaWdoZXgpfXJldHVybiBhLmdldFBFTVN0cmluZygpfTtcbi8qISBhc24xY21zLTEuMC4yLmpzIChjKSAyMDEzLTIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLmNtcz09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jbXMpe0tKVVIuYXNuMS5jbXM9e319S0pVUi5hc24xLmNtcy5BdHRyaWJ1dGU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPVtdO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmLGUsYztmPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOnRoaXMuYXR0clR5cGVPaWR9KTtlPW5ldyBLSlVSLmFzbjEuREVSU2V0KHthcnJheTp0aGlzLnZhbHVlTGlzdH0pO3RyeXtlLmdldEVuY29kZWRIZXgoKX1jYXRjaChkKXt0aHJvd1wiZmFpbCB2YWx1ZVNldC5nZXRFbmNvZGVkSGV4IGluIEF0dHJpYnV0ZSgxKS9cIitkfWM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2YsZV19KTt0cnl7dGhpcy5oVExWPWMuZ2V0RW5jb2RlZEhleCgpfWNhdGNoKGQpe3Rocm93XCJmYWlsZWQgc2VxLmdldEVuY29kZWRIZXggaW4gQXR0cmlidXRlKDIpL1wiK2R9cmV0dXJuIHRoaXMuaFRMVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLkNvbnRlbnRUeXBlPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS5jbXMuQ29udGVudFR5cGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuM1wiO3ZhciBhPW51bGw7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcihiKTt0aGlzLnZhbHVlTGlzdD1bYV19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkNvbnRlbnRUeXBlLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY21zLk1lc3NhZ2VEaWdlc3Q9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLmNtcy5NZXNzYWdlRGlnZXN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjRcIjtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYoZS5lY2lPYmogaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvJiZ0eXBlb2YgZS5oYXNoQWxnPT1cInN0cmluZ1wiKXt2YXIgYj1lLmVjaU9iai5lQ29udGVudFZhbHVlSGV4O3ZhciBhPWUuaGFzaEFsZzt2YXIgYz1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoYixhKTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKHtoZXg6Y30pO2QuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtkXX1lbHNle3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoZSk7ZC5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2RdfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuTWVzc2FnZURpZ2VzdCxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5TaWduaW5nVGltZT1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLlNpZ25pbmdUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjVcIjtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7dmFyIGE9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYyk7dHJ5e2EuZ2V0RW5jb2RlZEhleCgpfWNhdGNoKGIpe3Rocm93XCJTaWduaW5nVGltZS5nZXRFbmNvZGVkSGV4KCkgZmFpbGVkL1wiK2J9dGhpcy52YWx1ZUxpc3Q9W2FdfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5TaWduaW5nVGltZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGU9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi4xMlwiO3ZhciBhPUtKVVIuYXNuMTt2YXIgYz1LSlVSLmFzbjEuY21zO3ZhciBiPUtKVVIuY3J5cHRvO3RoaXMuc2V0Q2VydHM9ZnVuY3Rpb24obCl7dmFyIGo9W107Zm9yKHZhciBoPTA7aDxsLmxlbmd0aDtoKyspe3ZhciBmPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShsW2hdKTt2YXIgZT1iLlV0aWwuaGFzaEhleChmLFwic2hhMVwiKTt2YXIgbT1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OmV9KTttLmdldEVuY29kZWRIZXgoKTt2YXIgaz1uZXcgYy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoe2NlcnQ6bFtoXX0pO2suZ2V0RW5jb2RlZEhleCgpO3ZhciBuPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbbSxrXX0pO24uZ2V0RW5jb2RlZEhleCgpO2oucHVzaChuKX12YXIgZz1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6an0pO2cuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtnXX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBkLmFycmF5PT1cIm9iamVjdFwiKXt0aGlzLnNldENlcnRzKGQuYXJyYXkpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZVYyPWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlVjIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi40N1wiO3ZhciBiPUtKVVIuYXNuMTt2YXIgZj1LSlVSLmFzbjEueDUwOTt2YXIgZD1LSlVSLmFzbjEuY21zO3ZhciBjPUtKVVIuY3J5cHRvO3RoaXMuc2V0Q2VydHM9ZnVuY3Rpb24ocCxoKXt2YXIgbj1bXTtmb3IodmFyIGw9MDtsPHAubGVuZ3RoO2wrKyl7dmFyIGo9S0VZVVRJTC5nZXRIZXhGcm9tUEVNKHBbbF0pO3ZhciByPVtdO2lmKGghPVwic2hhMjU2XCIpe3IucHVzaChuZXcgZi5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmh9KSl9dmFyIGc9Yy5VdGlsLmhhc2hIZXgoaixoKTt2YXIgcT1uZXcgYi5ERVJPY3RldFN0cmluZyh7aGV4Omd9KTtxLmdldEVuY29kZWRIZXgoKTtyLnB1c2gocSk7dmFyIG09bmV3IGQuSXNzdWVyQW5kU2VyaWFsTnVtYmVyKHtjZXJ0OnBbbF19KTttLmdldEVuY29kZWRIZXgoKTtyLnB1c2gobSk7dmFyIG89bmV3IGIuREVSU2VxdWVuY2Uoe2FycmF5OnJ9KTtvLmdldEVuY29kZWRIZXgoKTtuLnB1c2gobyl9dmFyIGs9bmV3IGIuREVSU2VxdWVuY2Uoe2FycmF5Om59KTtrLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1ba119O2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5hcnJheT09XCJvYmplY3RcIil7dmFyIGE9XCJzaGEyNTZcIjtpZih0eXBlb2YgZS5oYXNoQWxnPT1cInN0cmluZ1wiKXthPWUuaGFzaEFsZ310aGlzLnNldENlcnRzKGUuYXJyYXksYSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGVWMixLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXI9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt2YXIgYT1LSlVSLmFzbjE7dmFyIGQ9YS54NTA5O3RoaXMuc2V0QnlDZXJ0UEVNPWZ1bmN0aW9uKGkpe3ZhciBnPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShpKTt2YXIgZj1uZXcgWDUwOSgpO2YuaGV4PWc7dmFyIGo9Zi5nZXRJc3N1ZXJIZXgoKTt0aGlzLmRJc3N1ZXI9bmV3IGQuWDUwME5hbWUoKTt0aGlzLmRJc3N1ZXIuaFRMVj1qO3ZhciBoPWYuZ2V0U2VyaWFsTnVtYmVySGV4KCk7dGhpcy5kU2VyaWFsPW5ldyBhLkRFUkludGVnZXIoe2hleDpofSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRJc3N1ZXIsdGhpcy5kU2VyaWFsXX0pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwic3RyaW5nXCImJmMuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7dGhpcy5zZXRCeUNlcnRQRU0oYyl9aWYoYy5pc3N1ZXImJmMuc2VyaWFsKXtpZihjLmlzc3VlciBpbnN0YW5jZW9mIEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKXt0aGlzLmRJc3N1ZXI9Yy5pc3N1ZXJ9ZWxzZXt0aGlzLmRJc3N1ZXI9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGMuaXNzdWVyKX1pZihjLnNlcmlhbCBpbnN0YW5jZW9mIEtKVVIuYXNuMS5ERVJJbnRlZ2VyKXt0aGlzLmRTZXJpYWw9Yy5zZXJpYWx9ZWxzZXt0aGlzLmRTZXJpYWw9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGMuc2VyaWFsKX19aWYodHlwZW9mIGMuY2VydD09XCJzdHJpbmdcIil7dGhpcy5zZXRCeUNlcnRQRU0oYy5jZXJ0KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLklzc3VlckFuZFNlcmlhbE51bWJlcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5BdHRyaWJ1dGVMaXN0PWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5saXN0PW5ldyBBcnJheSgpO3RoaXMuc29ydEZsYWc9dHJ1ZTt0aGlzLmFkZD1mdW5jdGlvbihiKXtpZihiIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpe3RoaXMubGlzdC5wdXNoKGIpfX07dGhpcy5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saXN0Lmxlbmd0aH07dGhpcy5jbGVhcj1mdW5jdGlvbigpe3RoaXMubGlzdD1uZXcgQXJyYXkoKTt0aGlzLmhUTFY9bnVsbDt0aGlzLmhWPW51bGx9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhUTFY9PVwic3RyaW5nXCIpe3JldHVybiB0aGlzLmhUTFZ9dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJTZXQoe2FycmF5OnRoaXMubGlzdCxzb3J0ZmxhZzp0aGlzLnNvcnRGbGFnfSk7dGhpcy5oVExWPWIuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5zb3J0ZmxhZyE9XCJ1bmRlZmluZWRcIiYmYS5zb3J0ZmxhZz09ZmFsc2Upe3RoaXMuc29ydEZsYWc9ZmFsc2V9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGVMaXN0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLlNpZ25lckluZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5TaWduZXJJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRDTVNWZXJzaW9uPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6MX0pO3RoaXMuZFNpZ25lcklkZW50aWZpZXI9bnVsbDt0aGlzLmREaWdlc3RBbGdvcml0aG09bnVsbDt0aGlzLmRTaWduZWRBdHRycz1uZXcgYi5BdHRyaWJ1dGVMaXN0KCk7dGhpcy5kU2lnQWxnPW51bGw7dGhpcy5kU2lnPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycz1uZXcgYi5BdHRyaWJ1dGVMaXN0KCk7dGhpcy5zZXRTaWduZXJJZGVudGlmaWVyPWZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBmPT1cInN0cmluZ1wiJiZmLmluZGV4T2YoXCJDRVJUSUZJQ0FURVwiKSE9LTEmJmYuaW5kZXhPZihcIkJFR0lOXCIpIT0tMSYmZi5pbmRleE9mKFwiRU5EXCIpIT0tMSl7dmFyIGU9Zjt0aGlzLmRTaWduZXJJZGVudGlmaWVyPW5ldyBiLklzc3VlckFuZFNlcmlhbE51bWJlcih7Y2VydDpmfSl9fTt0aGlzLnNldEZvckNvbnRlbnRBbmRIYXNoPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZihlLmVjaU9iaiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuRW5jYXBzdWxhdGVkQ29udGVudEluZm8pe3RoaXMuZFNpZ25lZEF0dHJzLmFkZChuZXcgYi5Db250ZW50VHlwZSh7b2lkOlwiMS4yLjg0MC4xMTM1NDkuMS43LjFcIn0pKTt0aGlzLmRTaWduZWRBdHRycy5hZGQobmV3IGIuTWVzc2FnZURpZ2VzdCh7ZWNpT2JqOmUuZWNpT2JqLGhhc2hBbGc6ZS5oYXNoQWxnfSkpfWlmKHR5cGVvZiBlLnNkT2JqIT1cInVuZGVmaW5lZFwiJiZlLnNkT2JqIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5TaWduZWREYXRhKXtpZihlLnNkT2JqLmRpZ2VzdEFsZ05hbWVMaXN0LmpvaW4oXCI6XCIpLmluZGV4T2YoZS5oYXNoQWxnKT09LTEpe2Uuc2RPYmouZGlnZXN0QWxnTmFtZUxpc3QucHVzaChlLmhhc2hBbGcpfX1pZih0eXBlb2YgZS5oYXNoQWxnPT1cInN0cmluZ1wiKXt0aGlzLmREaWdlc3RBbGdvcml0aG09bmV3IGQuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTplLmhhc2hBbGd9KX19fTt0aGlzLnNpZ249ZnVuY3Rpb24oaixmKXt0aGlzLmRTaWdBbGc9bmV3IGQuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpmfSk7dmFyIGc9dGhpcy5kU2lnbmVkQXR0cnMuZ2V0RW5jb2RlZEhleCgpO3ZhciBlPUtFWVVUSUwuZ2V0S2V5KGopO3ZhciBpPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpmfSk7aS5pbml0KGUpO2kudXBkYXRlSGV4KGcpO3ZhciBoPWkuc2lnbigpO3RoaXMuZFNpZz1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4Omh9KX07dGhpcy5hZGRVbnNpZ25lZD1mdW5jdGlvbihlKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmRVbnNpZ25lZEF0dHJzLmhUTFY9bnVsbDt0aGlzLmRVbnNpZ25lZEF0dHJzLmFkZChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kU2lnbmVkQXR0cnMgaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZUxpc3QmJnRoaXMuZFNpZ25lZEF0dHJzLmxlbmd0aCgpPT0wKXt0aHJvd1wiU2lnbmVkQXR0cnMgbGVuZ3RoID0gMCAoZW1wdHkpXCJ9dmFyIGU9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6dGhpcy5kU2lnbmVkQXR0cnMsdGFnOlwiYTBcIixleHBsaWNpdDpmYWxzZX0pO3ZhciBoPW51bGw7aWYodGhpcy5kVW5zaWduZWRBdHRycy5sZW5ndGgoKT4wKXtoPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZFVuc2lnbmVkQXR0cnMsdGFnOlwiYTFcIixleHBsaWNpdDpmYWxzZX0pfXZhciBnPVt0aGlzLmRDTVNWZXJzaW9uLHRoaXMuZFNpZ25lcklkZW50aWZpZXIsdGhpcy5kRGlnZXN0QWxnb3JpdGhtLGUsdGhpcy5kU2lnQWxnLHRoaXMuZFNpZyxdO2lmKGghPW51bGwpe2cucHVzaChoKX12YXIgZj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6Z30pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5TaWduZXJJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuRW5jYXBzdWxhdGVkQ29udGVudEluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY21zO3ZhciBkPUtKVVIuYXNuMS54NTA5O3RoaXMuZEVDb250ZW50VHlwZT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKHtuYW1lOlwiZGF0YVwifSk7dGhpcy5kRUNvbnRlbnQ9bnVsbDt0aGlzLmlzRGV0YWNoZWQ9ZmFsc2U7dGhpcy5lQ29udGVudFZhbHVlSGV4PW51bGw7dGhpcy5zZXRDb250ZW50VHlwZT1mdW5jdGlvbihlKXtpZihlLm1hdGNoKC9eWzAtMl1bLl1bMC05Ll0rJC8pKXt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmV9KX1lbHNle3RoaXMuZEVDb250ZW50VHlwZT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKHtuYW1lOmV9KX19O3RoaXMuc2V0Q29udGVudFZhbHVlPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5oZXg9PVwic3RyaW5nXCIpe3RoaXMuZUNvbnRlbnRWYWx1ZUhleD1lLmhleH1lbHNle2lmKHR5cGVvZiBlLnN0cj09XCJzdHJpbmdcIil7dGhpcy5lQ29udGVudFZhbHVlSGV4PXV0Zjh0b2hleChlLnN0cil9fX19O3RoaXMuc2V0Q29udGVudFZhbHVlSGV4PWZ1bmN0aW9uKGUpe3RoaXMuZUNvbnRlbnRWYWx1ZUhleD1lfTt0aGlzLnNldENvbnRlbnRWYWx1ZVN0cj1mdW5jdGlvbihlKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9dXRmOHRvaGV4KGUpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5lQ29udGVudFZhbHVlSGV4IT1cInN0cmluZ1wiKXt0aHJvd1wiZUNvbnRlbnRWYWx1ZSBub3QgeWV0IHNldFwifXZhciBnPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6dGhpcy5lQ29udGVudFZhbHVlSGV4fSk7dGhpcy5kRUNvbnRlbnQ9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6Zyx0YWc6XCJhMFwiLGV4cGxpY2l0OnRydWV9KTt2YXIgZT1bdGhpcy5kRUNvbnRlbnRUeXBlXTtpZighdGhpcy5pc0RldGFjaGVkKXtlLnB1c2godGhpcy5kRUNvbnRlbnQpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLkNvbnRlbnRJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuQ29udGVudEluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY21zO3ZhciBkPUtKVVIuYXNuMS54NTA5O3RoaXMuZENvbnRlbnRUeXBlPW51bGw7dGhpcy5kQ29udGVudD1udWxsO3RoaXMuc2V0Q29udGVudFR5cGU9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PVwic3RyaW5nXCIpe3RoaXMuZENvbnRlbnRUeXBlPWQuT0lELm5hbWUyb2JqKGUpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGY9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6dGhpcy5kQ29udGVudCx0YWc6XCJhMFwiLGV4cGxpY2l0OnRydWV9KTt2YXIgZT1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuZENvbnRlbnRUeXBlLGZdfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZihjLnR5cGUpe3RoaXMuc2V0Q29udGVudFR5cGUoYy50eXBlKX1pZihjLm9iaiYmYy5vYmogaW5zdGFuY2VvZiBhLkFTTjFPYmplY3Qpe3RoaXMuZENvbnRlbnQ9Yy5vYmp9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Db250ZW50SW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5TaWduZWREYXRhPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jbXM7dmFyIGQ9S0pVUi5hc24xLng1MDk7dGhpcy5kQ01TVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmREaWdlc3RBbGdzPW51bGw7dGhpcy5kaWdlc3RBbGdOYW1lTGlzdD1bXTt0aGlzLmRFbmNhcENvbnRlbnRJbmZvPW5ldyBiLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvKCk7dGhpcy5kQ2VydHM9bnVsbDt0aGlzLmNlcnRpZmljYXRlTGlzdD1bXTt0aGlzLmNybExpc3Q9W107dGhpcy5zaWduZXJJbmZvTGlzdD1bbmV3IGIuU2lnbmVySW5mbygpXTt0aGlzLmFkZENlcnRpZmljYXRlc0J5UEVNPWZ1bmN0aW9uKGUpe3ZhciBmPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShlKTt2YXIgZz1uZXcgYS5BU04xT2JqZWN0KCk7Zy5oVExWPWY7dGhpcy5jZXJ0aWZpY2F0ZUxpc3QucHVzaChnKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFRMVj09XCJzdHJpbmdcIil7cmV0dXJuIHRoaXMuaFRMVn1pZih0aGlzLmREaWdlc3RBbGdzPT1udWxsKXt2YXIgaz1bXTtmb3IodmFyIGo9MDtqPHRoaXMuZGlnZXN0QWxnTmFtZUxpc3QubGVuZ3RoO2orKyl7dmFyIGg9dGhpcy5kaWdlc3RBbGdOYW1lTGlzdFtqXTt2YXIgbT1uZXcgZC5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmh9KTtrLnB1c2gobSl9dGhpcy5kRGlnZXN0QWxncz1uZXcgYS5ERVJTZXQoe2FycmF5Omt9KX12YXIgZT1bdGhpcy5kQ01TVmVyc2lvbix0aGlzLmREaWdlc3RBbGdzLHRoaXMuZEVuY2FwQ29udGVudEluZm9dO2lmKHRoaXMuZENlcnRzPT1udWxsKXtpZih0aGlzLmNlcnRpZmljYXRlTGlzdC5sZW5ndGg+MCl7dmFyIGw9bmV3IGEuREVSU2V0KHthcnJheTp0aGlzLmNlcnRpZmljYXRlTGlzdH0pO3RoaXMuZENlcnRzPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOmwsdGFnOlwiYTBcIixleHBsaWNpdDpmYWxzZX0pfX1pZih0aGlzLmRDZXJ0cyE9bnVsbCl7ZS5wdXNoKHRoaXMuZENlcnRzKX12YXIgZz1uZXcgYS5ERVJTZXQoe2FycmF5OnRoaXMuc2lnbmVySW5mb0xpc3R9KTtlLnB1c2goZyk7dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmV9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5nZXRDb250ZW50SW5mbz1mdW5jdGlvbigpe3RoaXMuZ2V0RW5jb2RlZEhleCgpO3ZhciBlPW5ldyBiLkNvbnRlbnRJbmZvKHt0eXBlOlwic2lnbmVkLWRhdGFcIixvYmo6dGhpc30pO3JldHVybiBlfTt0aGlzLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q29udGVudEluZm8oKTt2YXIgZj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gZn07dGhpcy5nZXRQRU09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleCgpO3ZhciBmPWEuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChlLFwiQ01TXCIpO3JldHVybiBmfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5TaWduZWREYXRhLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLkNNU1V0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY21zLkNNU1V0aWwubmV3U2lnbmVkRGF0YT1mdW5jdGlvbihhKXt2YXIgaD1LSlVSLmFzbjEuY21zO3ZhciBnPUtKVVIuYXNuMS5jYWRlczt2YXIgZj1uZXcgaC5TaWduZWREYXRhKCk7Zi5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VmFsdWUoYS5jb250ZW50KTtpZih0eXBlb2YgYS5jZXJ0cz09XCJvYmplY3RcIil7Zm9yKHZhciBiPTA7YjxhLmNlcnRzLmxlbmd0aDtiKyspe2YuYWRkQ2VydGlmaWNhdGVzQnlQRU0oYS5jZXJ0c1tiXSl9fWYuc2lnbmVySW5mb0xpc3Q9W107Zm9yKHZhciBiPTA7YjxhLnNpZ25lckluZm9zLmxlbmd0aDtiKyspe3ZhciBkPWEuc2lnbmVySW5mb3NbYl07dmFyIGM9bmV3IGguU2lnbmVySW5mbygpO2Muc2V0U2lnbmVySWRlbnRpZmllcihkLnNpZ25lckNlcnQpO2Muc2V0Rm9yQ29udGVudEFuZEhhc2goe3NkT2JqOmYsZWNpT2JqOmYuZEVuY2FwQ29udGVudEluZm8saGFzaEFsZzpkLmhhc2hBbGd9KTtmb3IoYXR0ck5hbWUgaW4gZC5zQXR0cil7dmFyIGo9ZC5zQXR0clthdHRyTmFtZV07aWYoYXR0ck5hbWU9PVwiU2lnbmluZ1RpbWVcIil7dmFyIGU9bmV3IGguU2lnbmluZ1RpbWUoaik7Yy5kU2lnbmVkQXR0cnMuYWRkKGUpfWlmKGF0dHJOYW1lPT1cIlNpZ25pbmdDZXJ0aWZpY2F0ZVwiKXt2YXIgZT1uZXcgaC5TaWduaW5nQ2VydGlmaWNhdGUoaik7Yy5kU2lnbmVkQXR0cnMuYWRkKGUpfWlmKGF0dHJOYW1lPT1cIlNpZ25pbmdDZXJ0aWZpY2F0ZVYyXCIpe3ZhciBlPW5ldyBoLlNpZ25pbmdDZXJ0aWZpY2F0ZVYyKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyXCIpe3ZhciBlPW5ldyBnLlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXIoaik7Yy5kU2lnbmVkQXR0cnMuYWRkKGUpfX1jLnNpZ24oZC5zaWduZXJQcnZLZXksZC5zaWdBbGcpO2Yuc2lnbmVySW5mb0xpc3QucHVzaChjKX1yZXR1cm4gZn07XG4vKiEgYXNuMXRzcC0xLjAuMS5qcyAoYykgMjAxNCBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuYXNuMT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMSl7S0pVUi5hc24xPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjEudHNwPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xLnRzcCl7S0pVUi5hc24xLnRzcD17fX1LSlVSLmFzbjEudHNwLkFjY3VyYWN5PWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS50c3AuQWNjdXJhY3kuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt0aGlzLnNlY29uZHM9bnVsbDt0aGlzLm1pbGxpcz1udWxsO3RoaXMubWljcm9zPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGU9bnVsbDt2YXIgZz1udWxsO3ZhciBpPW51bGw7dmFyIGM9W107aWYodGhpcy5zZWNvbmRzIT1udWxsKXtlPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6dGhpcy5zZWNvbmRzfSk7Yy5wdXNoKGUpfWlmKHRoaXMubWlsbGlzIT1udWxsKXt2YXIgaD1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMubWlsbGlzfSk7Zz1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpoLHRhZzpcIjgwXCIsZXhwbGljaXQ6ZmFsc2V9KTtjLnB1c2goZyl9aWYodGhpcy5taWNyb3MhPW51bGwpe3ZhciBmPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6dGhpcy5taWNyb3N9KTtpPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOmYsdGFnOlwiODFcIixleHBsaWNpdDpmYWxzZX0pO2MucHVzaChpKX12YXIgZD1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6Y30pO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuc2Vjb25kcz09XCJudW1iZXJcIil7dGhpcy5zZWNvbmRzPWIuc2Vjb25kc31pZih0eXBlb2YgYi5taWxsaXM9PVwibnVtYmVyXCIpe3RoaXMubWlsbGlzPWIubWlsbGlzfWlmKHR5cGVvZiBiLm1pY3Jvcz09XCJudW1iZXJcIil7dGhpcy5taWNyb3M9Yi5taWNyb3N9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5BY2N1cmFjeSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludD1mdW5jdGlvbihiKXtLSlVSLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLng1MDk7dGhpcy5kSGFzaEFsZz1udWxsO3RoaXMuZEhhc2hWYWx1ZT1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhUTFY9PVwic3RyaW5nXCIpe3JldHVybiB0aGlzLmhUTFZ9dmFyIGQ9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRIYXNoQWxnLHRoaXMuZEhhc2hWYWx1ZV19KTtyZXR1cm4gZC5nZXRFbmNvZGVkSGV4KCl9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5oYXNoQWxnPT1cInN0cmluZ1wiKXt0aGlzLmRIYXNoQWxnPW5ldyBjLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6Yi5oYXNoQWxnfSl9aWYodHlwZW9mIGIuaGFzaFZhbHVlPT1cInN0cmluZ1wiKXt0aGlzLmRIYXNoVmFsdWU9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpiLmhhc2hWYWx1ZX0pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVxPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVxLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRWZXJzaW9uPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6MX0pO3RoaXMuZE1lc3NhZ2VJbXByaW50PW51bGw7dGhpcy5kUG9saWN5PW51bGw7dGhpcy5kTm9uY2U9bnVsbDt0aGlzLmNlcnRSZXE9dHJ1ZTt0aGlzLnNldE1lc3NhZ2VJbXByaW50PWZ1bmN0aW9uKGQpe2lmKGQgaW5zdGFuY2VvZiBLSlVSLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50KXt0aGlzLmRNZXNzYWdlSW1wcmludD1kO3JldHVybn1pZih0eXBlb2YgZD09XCJvYmplY3RcIil7dGhpcy5kTWVzc2FnZUltcHJpbnQ9bmV3IGIuTWVzc2FnZUltcHJpbnQoZCl9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRNZXNzYWdlSW1wcmludD09bnVsbCl7dGhyb3dcIm1lc3NhZ2VJbXByaW50IHNoYWxsIGJlIHNwZWNpZmllZFwifXZhciBkPVt0aGlzLmRWZXJzaW9uLHRoaXMuZE1lc3NhZ2VJbXByaW50XTtpZih0aGlzLmRQb2xpY3khPW51bGwpe2QucHVzaCh0aGlzLmRQb2xpY3kpfWlmKHRoaXMuZE5vbmNlIT1udWxsKXtkLnB1c2godGhpcy5kTm9uY2UpfWlmKHRoaXMuY2VydFJlcSl7ZC5wdXNoKG5ldyBhLkRFUkJvb2xlYW4oKSl9dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLm1pPT1cIm9iamVjdFwiKXt0aGlzLnNldE1lc3NhZ2VJbXByaW50KGMubWkpfWlmKHR5cGVvZiBjLnBvbGljeT09XCJvYmplY3RcIil7dGhpcy5kUG9saWN5PW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoYy5wb2xpY3kpfWlmKHR5cGVvZiBjLm5vbmNlPT1cIm9iamVjdFwiKXt0aGlzLmROb25jZT1uZXcgYS5ERVJJbnRlZ2VyKGMubm9uY2UpfWlmKHR5cGVvZiBjLmNlcnRyZXE9PVwiYm9vbGVhblwiKXt0aGlzLmNlcnRSZXE9Yy5jZXJ0cmVxfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVxLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlRTVEluZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLnRzcC5UU1RJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGQ9S0pVUi5hc24xLng1MDk7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRWZXJzaW9uPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6MX0pO3RoaXMuZFBvbGljeT1udWxsO3RoaXMuZE1lc3NhZ2VJbXByaW50PW51bGw7dGhpcy5kU2VyaWFsTnVtYmVyPW51bGw7dGhpcy5kR2VuVGltZT1udWxsO3RoaXMuZEFjY3VyYWN5PW51bGw7dGhpcy5kT3JkZXJpbmc9bnVsbDt0aGlzLmROb25jZT1udWxsO3RoaXMuZFRzYT1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPVt0aGlzLmRWZXJzaW9uXTtpZih0aGlzLmRQb2xpY3k9PW51bGwpe3Rocm93XCJwb2xpY3kgc2hhbGwgYmUgc3BlY2lmaWVkLlwifWUucHVzaCh0aGlzLmRQb2xpY3kpO2lmKHRoaXMuZE1lc3NhZ2VJbXByaW50PT1udWxsKXt0aHJvd1wibWVzc2FnZUltcHJpbnQgc2hhbGwgYmUgc3BlY2lmaWVkLlwifWUucHVzaCh0aGlzLmRNZXNzYWdlSW1wcmludCk7aWYodGhpcy5kU2VyaWFsTnVtYmVyPT1udWxsKXt0aHJvd1wic2VyaWFsTnVtYmVyIHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kU2VyaWFsTnVtYmVyKTtpZih0aGlzLmRHZW5UaW1lPT1udWxsKXt0aHJvd1wiZ2VuVGltZSBzaGFsbCBiZSBzcGVjaWZpZWQuXCJ9ZS5wdXNoKHRoaXMuZEdlblRpbWUpO2lmKHRoaXMuZEFjY3VyYWN5IT1udWxsKXtlLnB1c2godGhpcy5kQWNjdXJhY3kpfWlmKHRoaXMuZE9yZGVyaW5nIT1udWxsKXtlLnB1c2godGhpcy5kT3JkZXJpbmcpfWlmKHRoaXMuZE5vbmNlIT1udWxsKXtlLnB1c2godGhpcy5kTm9uY2UpfWlmKHRoaXMuZFRzYSE9bnVsbCl7ZS5wdXNoKHRoaXMuZFRzYSl9dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmV9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnBvbGljeT09XCJzdHJpbmdcIil7aWYoIWMucG9saWN5Lm1hdGNoKC9eWzAtOS5dKyQvKSl7dGhyb3dcInBvbGljeSBzaGFsbCBiZSBvaWQgbGlrZSAwLjEuNC4xMzRcIn10aGlzLmRQb2xpY3k9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmMucG9saWN5fSl9aWYodHlwZW9mIGMubWVzc2FnZUltcHJpbnQhPVwidW5kZWZpbmVkXCIpe3RoaXMuZE1lc3NhZ2VJbXByaW50PW5ldyBiLk1lc3NhZ2VJbXByaW50KGMubWVzc2FnZUltcHJpbnQpfWlmKHR5cGVvZiBjLnNlcmlhbE51bWJlciE9XCJ1bmRlZmluZWRcIil7dGhpcy5kU2VyaWFsTnVtYmVyPW5ldyBhLkRFUkludGVnZXIoYy5zZXJpYWxOdW1iZXIpfWlmKHR5cGVvZiBjLmdlblRpbWUhPVwidW5kZWZpbmVkXCIpe3RoaXMuZEdlblRpbWU9bmV3IGEuREVSR2VuZXJhbGl6ZWRUaW1lKGMuZ2VuVGltZSl9aWYodHlwZW9mIGMuYWNjdXJhY3khPVwidW5kZWZpbmRcIil7dGhpcy5kQWNjdXJhY3k9bmV3IGIuQWNjdXJhY3koYy5hY2N1cmFjeSl9aWYodHlwZW9mIGMub3JkZXJpbmchPVwidW5kZWZpbmVkXCImJmMub3JkZXJpbmc9PXRydWUpe3RoaXMuZE9yZGVyaW5nPW5ldyBhLkRFUkJvb2xlYW4oKX1pZih0eXBlb2YgYy5ub25jZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5kTm9uY2U9bmV3IGEuREVSSW50ZWdlcihjLm5vbmNlKX1pZih0eXBlb2YgYy50c2EhPVwidW5kZWZpbmVkXCIpe3RoaXMuZFRzYT1uZXcgZC5YNTAwTmFtZShjLnRzYSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5UU1RJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlc3A9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRTdGF0dXM9bnVsbDt0aGlzLmRUU1Q9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRTdGF0dXM9PW51bGwpe3Rocm93XCJzdGF0dXMgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9dmFyIGQ9W3RoaXMuZFN0YXR1c107aWYodGhpcy5kVFNUIT1udWxsKXtkLnB1c2godGhpcy5kVFNUKX12YXIgZT1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZH0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMuc3RhdHVzPT1cIm9iamVjdFwiKXt0aGlzLmRTdGF0dXM9bmV3IGIuUEtJU3RhdHVzSW5mbyhjLnN0YXR1cyl9aWYodHlwZW9mIGMudHN0IT1cInVuZGVmaW5lZFwiJiZjLnRzdCBpbnN0YW5jZW9mIEtKVVIuYXNuMS5BU04xT2JqZWN0KXt0aGlzLmRUU1Q9Yy50c3QuZ2V0Q29udGVudEluZm8oKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlc3AsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuUEtJU3RhdHVzSW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEudHNwLlBLSVN0YXR1c0luZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3RoaXMuZFN0YXR1cz1udWxsO3RoaXMuZFN0YXR1c1N0cmluZz1udWxsO3RoaXMuZEZhaWx1cmVJbmZvPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kU3RhdHVzPT1udWxsKXt0aHJvd1wic3RhdHVzIHNoYWxsIGJlIHNwZWNpZmllZFwifXZhciBkPVt0aGlzLmRTdGF0dXNdO2lmKHRoaXMuZFN0YXR1c1N0cmluZyE9bnVsbCl7ZC5wdXNoKHRoaXMuZFN0YXR1c1N0cmluZyl9aWYodGhpcy5kRmFpbHVyZUluZm8hPW51bGwpe2QucHVzaCh0aGlzLmRGYWlsdXJlSW5mbyl9dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnN0YXR1cz09XCJvYmplY3RcIil7dGhpcy5kU3RhdHVzPW5ldyBiLlBLSVN0YXR1cyhjLnN0YXR1cyl9aWYodHlwZW9mIGMuc3RhdHN0cj09XCJvYmplY3RcIil7dGhpcy5kU3RhdHVzU3RyaW5nPW5ldyBiLlBLSUZyZWVUZXh0KHthcnJheTpjLnN0YXRzdHJ9KX1pZih0eXBlb2YgYy5mYWlsaW5mbz09XCJvYmplY3RcIil7dGhpcy5kRmFpbHVyZUluZm89bmV3IGIuUEtJRmFpbHVyZUluZm8oYy5mYWlsaW5mbyl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5QS0lTdGF0dXNJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1cz1mdW5jdGlvbihlKXtLSlVSLmFzbjEudHNwLlBLSVN0YXR1cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dmFyIGQ9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt0aGlzLmhUTFY9dGhpcy5kU3RhdHVzLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUubmFtZSE9XCJ1bmRlZmluZWRcIil7dmFyIGM9Yi5QS0lTdGF0dXMudmFsdWVMaXN0O2lmKHR5cGVvZiBjW2UubmFtZV09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJuYW1lIHVuZGVmaW5lZDogXCIrZS5uYW1lfXRoaXMuZFN0YXR1cz1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOmNbZS5uYW1lXX0pfWVsc2V7dGhpcy5kU3RhdHVzPW5ldyBhLkRFUkludGVnZXIoZSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5QS0lTdGF0dXMsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuUEtJU3RhdHVzLnZhbHVlTGlzdD17Z3JhbnRlZDowLGdyYW50ZWRXaXRoTW9kczoxLHJlamVjdGlvbjoyLHdhaXRpbmc6MyxyZXZvY2F0aW9uV2FybmluZzo0LHJldm9jYXRpb25Ob3RpZmljYXRpb246NX07S0pVUi5hc24xLnRzcC5QS0lGcmVlVGV4dD1mdW5jdGlvbihiKXtLSlVSLmFzbjEudHNwLlBLSUZyZWVUZXh0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dGhpcy50ZXh0TGlzdD1bXTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgYz1bXTtmb3IodmFyIGU9MDtlPHRoaXMudGV4dExpc3QubGVuZ3RoO2UrKyl7Yy5wdXNoKG5ldyBhLkRFUlVURjhTdHJpbmcoe3N0cjp0aGlzLnRleHRMaXN0W2VdfSkpfXZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpjfSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5hcnJheT09XCJvYmplY3RcIil7dGhpcy50ZXh0TGlzdD1iLmFycmF5fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJRnJlZVRleHQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm89ZnVuY3Rpb24oZCl7S0pVUi5hc24xLnRzcC5QS0lGYWlsdXJlSW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy52YWx1ZT1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMudmFsdWU9PW51bGwpe3Rocm93XCJ2YWx1ZSBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZT1uZXcgTnVtYmVyKHRoaXMudmFsdWUpLnRvU3RyaW5nKDIpO3ZhciBmPW5ldyBhLkRFUkJpdFN0cmluZygpO2Yuc2V0QnlCaW5hcnlTdHJpbmcoZSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZC5uYW1lPT1cInN0cmluZ1wiKXt2YXIgYz1iLlBLSUZhaWx1cmVJbmZvLnZhbHVlTGlzdDtpZih0eXBlb2YgY1tkLm5hbWVdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wibmFtZSB1bmRlZmluZWQ6IFwiK2QubmFtZX10aGlzLnZhbHVlPWNbZC5uYW1lXX1lbHNle2lmKHR5cGVvZiBkW1wiaW50XCJdPT1cIm51bWJlclwiKXt0aGlzLnZhbHVlPWRbXCJpbnRcIl19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm8udmFsdWVMaXN0PXtiYWRBbGc6MCxiYWRSZXF1ZXN0OjIsYmFkRGF0YUZvcm1hdDo1LHRpbWVOb3RBdmFpbGFibGU6MTQsdW5hY2NlcHRlZFBvbGljeToxNSx1bmFjY2VwdGVkRXh0ZW5zaW9uOjE2LGFkZEluZm9Ob3RBdmFpbGFibGU6MTcsc3lzdGVtRmFpbHVyZToyNX07S0pVUi5hc24xLnRzcC5BYnN0cmFjdFRTQUFkYXB0ZXI9ZnVuY3Rpb24oYSl7dGhpcy5nZXRUU1RIZXg9ZnVuY3Rpb24oYyxiKXt0aHJvd1wibm90IGltcGxlbWVudGVkIHlldFwifX07S0pVUi5hc24xLnRzcC5TaW1wbGVUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS50c3AuU2ltcGxlVFNBQWRhcHRlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5wYXJhbXM9bnVsbDt0aGlzLnNlcmlhbD0wO3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dmFyIGU9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGMsYik7dGhpcy5wYXJhbXMudHN0SW5mby5tZXNzYWdlSW1wcmludD17aGFzaEFsZzpiLGhhc2hWYWx1ZTplfTt0aGlzLnBhcmFtcy50c3RJbmZvLnNlcmlhbE51bWJlcj17XCJpbnRcIjp0aGlzLnNlcmlhbCsrfTt2YXIgZD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTAwMDAwMDAwMCk7dGhpcy5wYXJhbXMudHN0SW5mby5ub25jZT17XCJpbnRcIjpkfTt2YXIgZj1LSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW4odGhpcy5wYXJhbXMpO3JldHVybiBmLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXJhbXM9YX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuU2ltcGxlVFNBQWRhcHRlcixLSlVSLmFzbjEudHNwLkFic3RyYWN0VFNBQWRhcHRlcik7S0pVUi5hc24xLnRzcC5GaXhlZFRTQUFkYXB0ZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLnRzcC5GaXhlZFRTQUFkYXB0ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMucGFyYW1zPW51bGw7dGhpcy5nZXRUU1RIZXg9ZnVuY3Rpb24oYyxiKXt2YXIgZD1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoYyxiKTt0aGlzLnBhcmFtcy50c3RJbmZvLm1lc3NhZ2VJbXByaW50PXtoYXNoQWxnOmIsaGFzaFZhbHVlOmR9O3ZhciBlPUtKVVIuYXNuMS50c3AuVFNQVXRpbC5uZXdUaW1lU3RhbXBUb2tlbih0aGlzLnBhcmFtcyk7cmV0dXJuIGUuZ2V0Q29udGVudEluZm9FbmNvZGVkSGV4KCl9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXt0aGlzLnBhcmFtcz1hfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5GaXhlZFRTQUFkYXB0ZXIsS0pVUi5hc24xLnRzcC5BYnN0cmFjdFRTQUFkYXB0ZXIpO0tKVVIuYXNuMS50c3AuVFNQVXRpbD1uZXcgZnVuY3Rpb24oKXt9O0tKVVIuYXNuMS50c3AuVFNQVXRpbC5uZXdUaW1lU3RhbXBUb2tlbj1mdW5jdGlvbihiKXt2YXIgaj1LSlVSLmFzbjEuY21zO3ZhciBhPUtKVVIuYXNuMS50c3A7dmFyIGc9bmV3IGouU2lnbmVkRGF0YSgpO3ZhciBlPW5ldyBhLlRTVEluZm8oYi50c3RJbmZvKTt2YXIgZj1lLmdldEVuY29kZWRIZXgoKTtnLmRFbmNhcENvbnRlbnRJbmZvLnNldENvbnRlbnRWYWx1ZSh7aGV4OmZ9KTtnLmRFbmNhcENvbnRlbnRJbmZvLnNldENvbnRlbnRUeXBlKFwidHN0aW5mb1wiKTtpZih0eXBlb2YgYi5jZXJ0cz09XCJvYmplY3RcIil7Zm9yKHZhciBjPTA7YzxiLmNlcnRzLmxlbmd0aDtjKyspe2cuYWRkQ2VydGlmaWNhdGVzQnlQRU0oYi5jZXJ0c1tjXSl9fXZhciBkPWcuc2lnbmVySW5mb0xpc3RbMF07ZC5zZXRTaWduZXJJZGVudGlmaWVyKGIuc2lnbmVyQ2VydCk7ZC5zZXRGb3JDb250ZW50QW5kSGFzaCh7c2RPYmo6ZyxlY2lPYmo6Zy5kRW5jYXBDb250ZW50SW5mbyxoYXNoQWxnOmIuaGFzaEFsZ30pO3ZhciBoPW5ldyBqLlNpZ25pbmdDZXJ0aWZpY2F0ZSh7YXJyYXk6W2Iuc2lnbmVyQ2VydF19KTtkLmRTaWduZWRBdHRycy5hZGQoaCk7ZC5zaWduKGIuc2lnbmVyUHJ2S2V5LGIuc2lnQWxnKTtyZXR1cm4gZ307S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlVGltZVN0YW1wUmVxPWZ1bmN0aW9uKGQpe3ZhciBmPXt9O2YuY2VydHJlcT1mYWxzZTt2YXIgaD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLDApO2lmKGgubGVuZ3RoPDIpe3Rocm93XCJUaW1lU3RhbXBSZXEgbXVzdCBoYXZlIGF0IGxlYXN0IDIgaXRlbXNcIn12YXIgYz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsaFsxXSk7Zi5taT1LSlVSLmFzbjEudHNwLlRTUFV0aWwucGFyc2VNZXNzYWdlSW1wcmludChjKTtmb3IodmFyIGU9MjtlPGgubGVuZ3RoO2UrKyl7dmFyIGI9aFtlXTt2YXIgYT1kLnN1YnN0cihiLDIpO2lmKGE9PVwiMDZcIil7dmFyIGc9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZCxiKTtmLnBvbGljeT1BU04xSEVYLmhleHRvb2lkc3RyKGcpfWlmKGE9PVwiMDJcIil7Zi5ub25jZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihkLGIpfWlmKGE9PVwiMDFcIil7Zi5jZXJ0cmVxPXRydWV9fXJldHVybiBmfTtLSlVSLmFzbjEudHNwLlRTUFV0aWwucGFyc2VNZXNzYWdlSW1wcmludD1mdW5jdGlvbihjKXt2YXIgaD17fTtpZihjLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJoZWFkIG9mIG1lc3NhZ2VJbXByaW50IGhleCBzaGFsbCBiZSAnMzAnXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooYywwKTt2YXIgaT1BU04xSEVYLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGMsMCxbMCwwXSk7dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxpKTt2YXIgZT1BU04xSEVYLmhleHRvb2lkc3RyKGQpO3ZhciBnPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShlKTtpZihnPT1cIlwiKXt0aHJvd1wiaGFzaEFsZyBuYW1lIHVuZGVmaW5lZDogXCIrZX12YXIgYj1nO3ZhciBmPUFTTjFIRVguZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoYywwLFsxXSk7aC5oYXNoQWxnPWI7aC5oYXNoVmFsdWU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxmKTtyZXR1cm4gaH07XG4vKiEgYXNuMWNhZGVzLTEuMC4wLmpzIChjKSAyMDEzLTIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLmNhZGVzPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xLmNhZGVzKXtLSlVSLmFzbjEuY2FkZXM9e319S0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXI9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi4xNVwiO3ZhciBiPUtKVVIuYXNuMTt2YXIgZD1LSlVSLmFzbjEuY2FkZXM7aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBlLm9pZD09XCJzdHJpbmdcIiYmdHlwZW9mIGUuaGFzaD09XCJvYmplY3RcIil7dmFyIGY9bmV3IGIuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmUub2lkfSk7dmFyIGE9bmV3IGQuT3RoZXJIYXNoQWxnQW5kVmFsdWUoZS5oYXNoKTt2YXIgYz1uZXcgYi5ERVJTZXF1ZW5jZSh7YXJyYXk6W2YsYV19KTt0aGlzLnZhbHVlTGlzdD1bY119fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXIsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2hBbGdBbmRWYWx1ZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoQWxnQW5kVmFsdWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYz1LSlVSLmFzbjEueDUwOTt0aGlzLmRBbGc9bnVsbDt0aGlzLmRIYXNoPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGQ9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRBbGcsdGhpcy5kSGFzaF19KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmFsZz09XCJzdHJpbmdcIiYmdHlwZW9mIGIuaGFzaD09XCJzdHJpbmdcIil7dGhpcy5kQWxnPW5ldyBjLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6Yi5hbGd9KTt0aGlzLmRIYXNoPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6Yi5oYXNofSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLk90aGVySGFzaEFsZ0FuZFZhbHVlLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVUaW1lU3RhbXAuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi4xNFwiO3RoaXMudHN0SGV4PW51bGw7dmFyIGE9S0pVUi5hc24xO2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5yZXMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnJlcz09XCJzdHJpbmdcIiYmYy5yZXMubWF0Y2goL15bMC05QS1GYS1mXSskLykpe31lbHNle2lmKGMucmVzIGluc3RhbmNlb2YgS0pVUi5hc24xLkFTTjFPYmplY3Qpe31lbHNle3Rocm93XCJyZXMgcGFyYW0gc2hhbGwgYmUgQVNOMU9iamVjdCBvciBoZXggc3RyaW5nXCJ9fX1pZih0eXBlb2YgYy50c3QhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnRzdD09XCJzdHJpbmdcIiYmYy50c3QubWF0Y2goL15bMC05QS1GYS1mXSskLykpe3ZhciBiPW5ldyBhLkFTTjFPYmplY3QoKTt0aGlzLnRzdEhleD1jLnRzdDtiLmhUTFY9dGhpcy50c3RIZXg7Yi5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2JdfWVsc2V7aWYoYy50c3QgaW5zdGFuY2VvZiBLSlVSLmFzbjEuQVNOMU9iamVjdCl7fWVsc2V7dGhyb3dcInRzdCBwYXJhbSBzaGFsbCBiZSBBU04xT2JqZWN0IG9yIGhleCBzdHJpbmdcIn19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVUaW1lU3RhbXAsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jYWRlcy5Db21wbGV0ZUNlcnRpZmljYXRlUmVmcz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY2FkZXMuQ29tcGxldGVDZXJ0aWZpY2F0ZVJlZnMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi4yMVwiO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY2FkZXM7dGhpcy5zZXRCeUFycmF5PWZ1bmN0aW9uKGQpe3RoaXMudmFsdWVMaXN0PVtdO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1uZXcgYi5PdGhlckNlcnRJRChkW2VdKTt0aGlzLnZhbHVlTGlzdC5wdXNoKGYpfX07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cIm9iamVjdFwiJiZ0eXBlb2YgYy5sZW5ndGg9PVwibnVtYmVyXCIpe3RoaXMuc2V0QnlBcnJheShjKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuQ29tcGxldGVDZXJ0aWZpY2F0ZVJlZnMsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jYWRlcy5PdGhlckNlcnRJRD1mdW5jdGlvbihkKXtLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYz1LSlVSLmFzbjEuY21zO3ZhciBiPUtKVVIuYXNuMS5jYWRlczt0aGlzLmhhc0lzc3VlclNlcmlhbD10cnVlO3RoaXMuZE90aGVyQ2VydEhhc2g9bnVsbDt0aGlzLmRJc3N1ZXJTZXJpYWw9bnVsbDt0aGlzLnNldEJ5Q2VydFBFTT1mdW5jdGlvbihlKXt0aGlzLmRPdGhlckNlcnRIYXNoPW5ldyBiLk90aGVySGFzaChlKTtpZih0aGlzLmhhc0lzc3VlclNlcmlhbCl7dGhpcy5kSXNzdWVyU2VyaWFsPW5ldyBjLklzc3VlckFuZFNlcmlhbE51bWJlcihlKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaFRMViE9bnVsbCl7cmV0dXJuIHRoaXMuaFRMVn1pZih0aGlzLmRPdGhlckNlcnRIYXNoPT1udWxsKXt0aHJvd1wib3RoZXJDZXJ0SGFzaCBub3Qgc2V0XCJ9dmFyIGU9W3RoaXMuZE90aGVyQ2VydEhhc2hdO2lmKHRoaXMuZElzc3VlclNlcmlhbCE9bnVsbCl7ZS5wdXNoKHRoaXMuZElzc3VlclNlcmlhbCl9dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmV9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBkPT1cInN0cmluZ1wiJiZkLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe3RoaXMuc2V0QnlDZXJ0UEVNKGQpfWlmKHR5cGVvZiBkPT1cIm9iamVjdFwiKXtpZihkLmhhc2lzPT09ZmFsc2Upe3RoaXMuaGFzSXNzdWVyU2VyaWFsPWZhbHNlfWlmKHR5cGVvZiBkLmNlcnQ9PVwic3RyaW5nXCIpe3RoaXMuc2V0QnlDZXJ0UEVNKGQuY2VydCl9fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckNlcnRJRCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaD1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNhZGVzO3RoaXMuYWxnPVwic2hhMjU2XCI7dGhpcy5kT3RoZXJIYXNoPW51bGw7dGhpcy5zZXRCeUNlcnRQRU09ZnVuY3Rpb24oZCl7aWYoZC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIik9PS0xKXt0aHJvd1wiY2VydFBFTSBub3QgdG8gc2VlbSBQRU0gZm9ybWF0XCJ9dmFyIGU9WDUwOS5wZW1Ub0hleChkKTt2YXIgZj1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoZSx0aGlzLmFsZyk7dGhpcy5kT3RoZXJIYXNoPW5ldyBiLk90aGVySGFzaEFsZ0FuZFZhbHVlKHthbGc6dGhpcy5hbGcsaGFzaDpmfSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZE90aGVySGFzaD09bnVsbCl7dGhyb3dcIk90aGVySGFzaCBub3Qgc2V0XCJ9cmV0dXJuIHRoaXMuZE90aGVySGFzaC5nZXRFbmNvZGVkSGV4KCl9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJzdHJpbmdcIil7aWYoYy5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0aGlzLnNldEJ5Q2VydFBFTShjKX1lbHNle2lmKGMubWF0Y2goL15bMC05QS1GYS1mXSskLykpe3RoaXMuZE90aGVySGFzaD1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OmN9KX1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBzdHJpbmcgdmFsdWUgZm9yIHBhcmFtc1wifX19ZWxzZXtpZih0eXBlb2YgYz09XCJvYmplY3RcIil7aWYodHlwZW9mIGMuY2VydD09XCJzdHJpbmdcIil7aWYodHlwZW9mIGMuYWxnPT1cInN0cmluZ1wiKXt0aGlzLmFsZz1jLmFsZ310aGlzLnNldEJ5Q2VydFBFTShjLmNlcnQpfWVsc2V7dGhpcy5kT3RoZXJIYXNoPW5ldyBiLk90aGVySGFzaEFsZ0FuZFZhbHVlKGMpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLk90aGVySGFzaCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbD1uZXcgZnVuY3Rpb24oKXt9O0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWwuYWRkU2lnVFM9ZnVuY3Rpb24oYyxiLGEpe307S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbC5wYXJzZVNpZ25lZERhdGFGb3JBZGRpbmdVbnNpZ25lZD1mdW5jdGlvbihkKXt2YXIgcT1LSlVSLmFzbjE7dmFyIHA9S0pVUi5hc24xLmNtczt2YXIgYz1LSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsO3ZhciBhPXt9O2lmKEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KGQsMCxbMF0pIT1cIjA2MDkyYTg2NDg4NmY3MGQwMTA3MDJcIil7dGhyb3dcImhleCBpcyBub3QgQ01TIFNpZ25lZERhdGFcIn12YXIgcz1BU04xSEVYLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGQsMCxbMSwwXSk7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCxzKTtpZihiLmxlbmd0aDw0KXt0aHJvd1wibnVtIG9mIFNpZ25lZERhdGEgZWxlbSBzaGFsbCBiZSA0IGF0IGxlYXN0XCJ9dmFyIGY9Yi5zaGlmdCgpO2EudmVyc2lvbj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsZik7dmFyIGw9Yi5zaGlmdCgpO2EuYWxncz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbCk7dmFyIG09Yi5zaGlmdCgpO2EuZW5jYXBjb250ZW50PUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxtKTthLmNlcnRzPW51bGw7YS5yZXZzPW51bGw7YS5zaT1bXTt2YXIgbj1iLnNoaWZ0KCk7aWYoZC5zdWJzdHIobiwyKT09XCJhMFwiKXthLmNlcnRzPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxuKTtuPWIuc2hpZnQoKX1pZihkLnN1YnN0cihuLDIpPT1cImExXCIpe2EucmV2cz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbik7bj1iLnNoaWZ0KCl9dmFyIGs9bjtpZihkLnN1YnN0cihrLDIpIT1cIjMxXCIpe3Rocm93XCJDYW4ndCBmaW5kIHNpZ25lckluZm9zXCJ9dmFyIGo9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCxrKTtmb3IodmFyIGg9MDtoPGoubGVuZ3RoO2grKyl7dmFyIG89altoXTt2YXIgZT1jLnBhcnNlU2lnbmVySW5mb0ZvckFkZGluZ1Vuc2lnbmVkKGQsbyxoKTthLnNpW2hdPWV9dmFyIGc9bnVsbDthLm9iaj1uZXcgcC5TaWduZWREYXRhKCk7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEudmVyc2lvbjthLm9iai5kQ01TVmVyc2lvbj1nO2c9bmV3IHEuQVNOMU9iamVjdCgpO2cuaFRMVj1hLmFsZ3M7YS5vYmouZERpZ2VzdEFsZ3M9ZztnPW5ldyBxLkFTTjFPYmplY3QoKTtnLmhUTFY9YS5lbmNhcGNvbnRlbnQ7YS5vYmouZEVuY2FwQ29udGVudEluZm89ZztnPW5ldyBxLkFTTjFPYmplY3QoKTtnLmhUTFY9YS5jZXJ0czthLm9iai5kQ2VydHM9ZzthLm9iai5zaWduZXJJbmZvTGlzdD1bXTtmb3IodmFyIGg9MDtoPGEuc2kubGVuZ3RoO2grKyl7YS5vYmouc2lnbmVySW5mb0xpc3QucHVzaChhLnNpW2hdLm9iail9cmV0dXJuIGF9O0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWwucGFyc2VTaWduZXJJbmZvRm9yQWRkaW5nVW5zaWduZWQ9ZnVuY3Rpb24oZCxrLGEpe3ZhciBtPUtKVVIuYXNuMTt2YXIgbD1LSlVSLmFzbjEuY21zO3ZhciBiPXt9O3ZhciBlPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsayk7aWYoZS5sZW5ndGghPTYpe3Rocm93XCJub3Qgc3VwcG9ydGVkIGl0ZW1zIGZvciBTaWduZXJJbmZvICghPTYpXCJ9dmFyIGY9ZS5zaGlmdCgpO2IudmVyc2lvbj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsZik7dmFyIG49ZS5zaGlmdCgpO2Iuc2k9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLG4pO3ZhciBoPWUuc2hpZnQoKTtiLmRpZ2FsZz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsaCk7dmFyIGM9ZS5zaGlmdCgpO2Iuc2F0dHJzPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxjKTt2YXIgaT1lLnNoaWZ0KCk7Yi5zaWdhbGc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGkpO3ZhciBqPWUuc2hpZnQoKTtiLnNpZz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsaik7Yi5zaWd2YWw9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZCxqKTt2YXIgZz1udWxsO2Iub2JqPW5ldyBsLlNpZ25lckluZm8oKTtnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi52ZXJzaW9uO2Iub2JqLmRDTVNWZXJzaW9uPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuc2k7Yi5vYmouZFNpZ25lcklkZW50aWZpZXI9ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5kaWdhbGc7Yi5vYmouZERpZ2VzdEFsZ29yaXRobT1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnNhdHRycztiLm9iai5kU2lnbmVkQXR0cnM9ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zaWdhbGc7Yi5vYmouZFNpZ0FsZz1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnNpZztiLm9iai5kU2lnPWc7Yi5vYmouZFVuc2lnbmVkQXR0cnM9bmV3IGwuQXR0cmlidXRlTGlzdCgpO3JldHVybiBifTtcbi8qISBhc24xY3NyLTEuMC4wLmpzIChjKSAyMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSLmFzbjEuY3NyPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xLmNzcil7S0pVUi5hc24xLmNzcj17fX1LSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0PWZ1bmN0aW9uKGYpe0tKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGQ9bnVsbDt2YXIgZT1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt0aGlzLnNpZ249ZnVuY3Rpb24oaSxoKXtpZih0aGlzLnBydktleT09bnVsbCl7dGhpcy5wcnZLZXk9aH10aGlzLmFzbjFTaWduYXR1cmVBbGc9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6aX0pO3NpZz1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6aX0pO3NpZy5pbml0U2lnbih0aGlzLnBydktleSk7c2lnLnVwZGF0ZUhleCh0aGlzLmFzbjFDU1JJbmZvLmdldEVuY29kZWRIZXgoKSk7dGhpcy5oZXhTaWc9c2lnLnNpZ24oKTt0aGlzLmFzbjFTaWc9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrdGhpcy5oZXhTaWd9KTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xQ1NSSW5mbyx0aGlzLmFzbjFTaWduYXR1cmVBbGcsdGhpcy5hc24xU2lnXX0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9O3RoaXMuZ2V0UEVNU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGc9S0pVUi5hc24xLkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgodGhpcy5nZXRFbmNvZGVkSGV4KCksXCJDRVJUSUZJQ0FURSBSRVFVRVNUXCIpO3JldHVybiBnfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTW9kaWZpZWQ9PWZhbHNlJiZ0aGlzLmhUTFYhPW51bGwpe3JldHVybiB0aGlzLmhUTFZ9dGhyb3dcIm5vdCBzaWduZWQgeWV0XCJ9O2lmKHR5cGVvZiBmIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZi5jc3JpbmZvIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFDU1JJbmZvPWYuY3NyaW5mb319fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5faW5pdGlhbGl6ZT1mdW5jdGlvbigpe3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYXNuMVZlcnNpb249bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOjB9KTt0aGlzLmFzbjFTdWJqZWN0PW51bGw7dGhpcy5hc24xU3VialBLZXk9bnVsbDt0aGlzLmV4dGVuc2lvbnNBcnJheT1uZXcgQXJyYXkoKX07dGhpcy5zZXRTdWJqZWN0QnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFTdWJqZWN0PW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShiKX07dGhpcy5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXk9ZnVuY3Rpb24oYyl7dmFyIGI9S0VZVVRJTC5nZXRLZXkoYyk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKGIpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVZlcnNpb24pO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU3ViamVjdCk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTdWJqUEtleSk7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5leHRlbnNpb25zQXJyYXl9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiYTBcIixvYmo6Y30pO3RoaXMuYXNuMUFycmF5LnB1c2goYik7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuX2luaXRpYWxpemUoKX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jc3IuQ1NSVXRpbD1uZXcgZnVuY3Rpb24oKXt9O0tKVVIuYXNuMS5jc3IuQ1NSVXRpbC5uZXdDU1JQRU09ZnVuY3Rpb24oZil7dmFyIGM9S0pVUi5hc24xLmNzcjtpZihmLnN1YmplY3Q9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbWV0ZXIgc3ViamVjdCB1bmRlZmluZWRcIn1pZihmLnNianB1YmtleT09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtZXRlciBzYmpwdWJrZXkgdW5kZWZpbmVkXCJ9aWYoZi5zaWdhbGc9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbWV0ZXIgc2lnYWxnIHVuZGVmaW5lZFwifWlmKGYuc2JqcHJ2a2V5PT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHNianB1YmtleSB1bmRlZmluZWRcIn12YXIgYj1uZXcgYy5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8oKTtiLnNldFN1YmplY3RCeVBhcmFtKGYuc3ViamVjdCk7Yi5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXkoZi5zYmpwdWJrZXkpO3ZhciBkPW5ldyBjLkNlcnRpZmljYXRpb25SZXF1ZXN0KHtjc3JpbmZvOmJ9KTt2YXIgYT1LRVlVVElMLmdldEtleShmLnNianBydmtleSk7ZC5zaWduKGYuc2lnYWxnLGEpO3ZhciBlPWQuZ2V0UEVNU3RyaW5nKCk7cmV0dXJuIGV9O1xuLyohIGJhc2U2NHgtMS4xLjcgKGMpIDIwMTItMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG52YXIgS0pVUjtpZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIubGFuZz09XCJ1bmRlZmluZWRcInx8IUtKVVIubGFuZyl7S0pVUi5sYW5nPXt9fUtKVVIubGFuZy5TdHJpbmc9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIEJhc2U2NHgoKXt9ZnVuY3Rpb24gc3RvQkEoZCl7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe2JbY109ZC5jaGFyQ29kZUF0KGMpfXJldHVybiBifWZ1bmN0aW9uIEJBdG9zKGIpe3ZhciBkPVwiXCI7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2Q9ZCtTdHJpbmcuZnJvbUNoYXJDb2RlKGJbY10pfXJldHVybiBkfWZ1bmN0aW9uIEJBdG9oZXgoYil7dmFyIGU9XCJcIjtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGM9YltkXS50b1N0cmluZygxNik7aWYoYy5sZW5ndGg9PTEpe2M9XCIwXCIrY31lPWUrY31yZXR1cm4gZX1mdW5jdGlvbiBzdG9oZXgoYSl7cmV0dXJuIEJBdG9oZXgoc3RvQkEoYSkpfWZ1bmN0aW9uIHN0b2I2NChhKXtyZXR1cm4gaGV4MmI2NChzdG9oZXgoYSkpfWZ1bmN0aW9uIHN0b2I2NHUoYSl7cmV0dXJuIGI2NHRvYjY0dShoZXgyYjY0KHN0b2hleChhKSkpfWZ1bmN0aW9uIGI2NHV0b3MoYSl7cmV0dXJuIEJBdG9zKGI2NHRvQkEoYjY0dXRvYjY0KGEpKSl9ZnVuY3Rpb24gYjY0dG9iNjR1KGEpe2E9YS5yZXBsYWNlKC9cXD0vZyxcIlwiKTthPWEucmVwbGFjZSgvXFwrL2csXCItXCIpO2E9YS5yZXBsYWNlKC9cXC8vZyxcIl9cIik7cmV0dXJuIGF9ZnVuY3Rpb24gYjY0dXRvYjY0KGEpe2lmKGEubGVuZ3RoJTQ9PTIpe2E9YStcIj09XCJ9ZWxzZXtpZihhLmxlbmd0aCU0PT0zKXthPWErXCI9XCJ9fWE9YS5yZXBsYWNlKC8tL2csXCIrXCIpO2E9YS5yZXBsYWNlKC9fL2csXCIvXCIpO3JldHVybiBhfWZ1bmN0aW9uIGhleHRvYjY0dShhKXtpZihhLmxlbmd0aCUyPT0xKXthPVwiMFwiK2F9cmV0dXJuIGI2NHRvYjY0dShoZXgyYjY0KGEpKX1mdW5jdGlvbiBiNjR1dG9oZXgoYSl7cmV0dXJuIGI2NHRvaGV4KGI2NHV0b2I2NChhKSl9dmFyIHV0Zjh0b2I2NHUsYjY0dXRvdXRmODtpZih0eXBlb2YgQnVmZmVyPT09XCJmdW5jdGlvblwiKXt1dGY4dG9iNjR1PWZ1bmN0aW9uKGEpe3JldHVybiBiNjR0b2I2NHUobmV3IEJ1ZmZlcihhLFwidXRmOFwiKS50b1N0cmluZyhcImJhc2U2NFwiKSl9O2I2NHV0b3V0Zjg9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBCdWZmZXIoYjY0dXRvYjY0KGEpLFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmOFwiKX19ZWxzZXt1dGY4dG9iNjR1PWZ1bmN0aW9uKGEpe3JldHVybiBoZXh0b2I2NHUodXJpY21wdG9oZXgoZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpKSl9O2I2NHV0b3V0Zjg9ZnVuY3Rpb24oYSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChoZXh0b3VyaWNtcChiNjR1dG9oZXgoYSkpKX19ZnVuY3Rpb24gdXRmOHRvYjY0KGEpe3JldHVybiBoZXgyYjY0KHVyaWNtcHRvaGV4KGVuY29kZVVSSUNvbXBvbmVudEFsbChhKSkpfWZ1bmN0aW9uIGI2NHRvdXRmOChhKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGhleHRvdXJpY21wKGI2NHRvaGV4KGEpKSl9ZnVuY3Rpb24gdXRmOHRvaGV4KGEpe3JldHVybiB1cmljbXB0b2hleChlbmNvZGVVUklDb21wb25lbnRBbGwoYSkpfWZ1bmN0aW9uIGhleHRvdXRmOChhKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGhleHRvdXJpY21wKGEpKX1mdW5jdGlvbiBoZXh0b3JzdHIoYyl7dmFyIGI9XCJcIjtmb3IodmFyIGE9MDthPGMubGVuZ3RoLTE7YSs9Mil7Yis9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChjLnN1YnN0cihhLDIpLDE2KSl9cmV0dXJuIGJ9ZnVuY3Rpb24gcnN0cnRvaGV4KGMpe3ZhciBhPVwiXCI7Zm9yKHZhciBiPTA7YjxjLmxlbmd0aDtiKyspe2ErPShcIjBcIitjLmNoYXJDb2RlQXQoYikudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9cmV0dXJuIGF9ZnVuY3Rpb24gaGV4dG9iNjQoYSl7cmV0dXJuIGhleDJiNjQoYSl9ZnVuY3Rpb24gaGV4dG9iNjRubChiKXt2YXIgYT1oZXh0b2I2NChiKTt2YXIgYz1hLnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO2M9Yy5yZXBsYWNlKC9cXHJcXG4kLyxcIlwiKTtyZXR1cm4gY31mdW5jdGlvbiBiNjRubHRvaGV4KGIpe3ZhciBhPWIucmVwbGFjZSgvW14wLTlBLVphLXpcXC8rPV0qL2csXCJcIik7dmFyIGM9YjY0dG9oZXgoYSk7cmV0dXJuIGN9ZnVuY3Rpb24gdXJpY21wdG9oZXgoYSl7cmV0dXJuIGEucmVwbGFjZSgvJS9nLFwiXCIpfWZ1bmN0aW9uIGhleHRvdXJpY21wKGEpe3JldHVybiBhLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKX1mdW5jdGlvbiBlbmNvZGVVUklDb21wb25lbnRBbGwoYSl7dmFyIGQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO3ZhciBiPVwiXCI7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe2lmKGRbY109PVwiJVwiKXtiPWIrZC5zdWJzdHIoYywzKTtjPWMrMn1lbHNle2I9YitcIiVcIitzdG9oZXgoZFtjXSl9fXJldHVybiBifWZ1bmN0aW9uIG5ld2xpbmVfdG9Vbml4KGEpe2E9YS5yZXBsYWNlKC9cXHJcXG4vbWcsXCJcXG5cIik7cmV0dXJuIGF9ZnVuY3Rpb24gbmV3bGluZV90b0RvcyhhKXthPWEucmVwbGFjZSgvXFxyXFxuL21nLFwiXFxuXCIpO2E9YS5yZXBsYWNlKC9cXG4vbWcsXCJcXHJcXG5cIik7cmV0dXJuIGF9S0pVUi5sYW5nLlN0cmluZy5pc0ludGVnZXI9ZnVuY3Rpb24oYSl7aWYoYS5tYXRjaCgvXlswLTldKyQvKSl7cmV0dXJuIHRydWV9ZWxzZXtpZihhLm1hdGNoKC9eLVswLTldKyQvKSl7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gZmFsc2V9fX07S0pVUi5sYW5nLlN0cmluZy5pc0hleD1mdW5jdGlvbihhKXtpZihhLmxlbmd0aCUyPT0wJiYoYS5tYXRjaCgvXlswLTlhLWZdKyQvKXx8YS5tYXRjaCgvXlswLTlBLUZdKyQvKSkpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX07S0pVUi5sYW5nLlN0cmluZy5pc0Jhc2U2ND1mdW5jdGlvbihhKXthPWEucmVwbGFjZSgvXFxzKy9nLFwiXCIpO2lmKGEubWF0Y2goL15bMC05QS1aYS16K1xcL10rPXswLDN9JC8pJiZhLmxlbmd0aCU0PT0wKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19O0tKVVIubGFuZy5TdHJpbmcuaXNCYXNlNjRVUkw9ZnVuY3Rpb24oYSl7aWYoYS5tYXRjaCgvWysvPV0vKSl7cmV0dXJuIGZhbHNlfWE9YjY0dXRvYjY0KGEpO3JldHVybiBLSlVSLmxhbmcuU3RyaW5nLmlzQmFzZTY0KGEpfTtLSlVSLmxhbmcuU3RyaW5nLmlzSW50ZWdlckFycmF5PWZ1bmN0aW9uKGEpe2E9YS5yZXBsYWNlKC9cXHMrL2csXCJcIik7aWYoYS5tYXRjaCgvXlxcW1swLTksXStcXF0kLykpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX07ZnVuY3Rpb24gaW50YXJ5c3RydG9oZXgoYil7Yj1iLnJlcGxhY2UoL15cXHMqXFxbXFxzKi8sXCJcIik7Yj1iLnJlcGxhY2UoL1xccypcXF1cXHMqJC8sXCJcIik7Yj1iLnJlcGxhY2UoL1xccyovZyxcIlwiKTt0cnl7dmFyIGM9Yi5zcGxpdCgvLC8pLm1hcChmdW5jdGlvbihnLGUsaCl7dmFyIGY9cGFyc2VJbnQoZyk7aWYoZjwwfHwyNTU8Zil7dGhyb3dcImludGVnZXIgbm90IGluIHJhbmdlIDAtMjU1XCJ9dmFyIGQ9KFwiMDBcIitmLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpO3JldHVybiBkfSkuam9pbihcIlwiKTtyZXR1cm4gY31jYXRjaChhKXt0aHJvd1wibWFsZm9ybWVkIGludGVnZXIgYXJyYXkgc3RyaW5nOiBcIithfX12YXIgc3RyZGlmZmlkeD1mdW5jdGlvbihjLGEpe3ZhciBkPWMubGVuZ3RoO2lmKGMubGVuZ3RoPmEubGVuZ3RoKXtkPWEubGVuZ3RofWZvcih2YXIgYj0wO2I8ZDtiKyspe2lmKGMuY2hhckNvZGVBdChiKSE9YS5jaGFyQ29kZUF0KGIpKXtyZXR1cm4gYn19aWYoYy5sZW5ndGghPWEubGVuZ3RoKXtyZXR1cm4gZH1yZXR1cm4gLTF9O1xuLyohIGNyeXB0by0xLjEuOC5qcyAoYykgMjAxMy0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5jcnlwdG89PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmNyeXB0byl7S0pVUi5jcnlwdG89e319S0pVUi5jcnlwdG8uVXRpbD1uZXcgZnVuY3Rpb24oKXt0aGlzLkRJR0VTVElORk9IRUFEPXtzaGExOlwiMzAyMTMwMDkwNjA1MmIwZTAzMDIxYTA1MDAwNDE0XCIsc2hhMjI0OlwiMzAyZDMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjA0MDUwMDA0MWNcIixzaGEyNTY6XCIzMDMxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDEwNTAwMDQyMFwiLHNoYTM4NDpcIjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwXCIsc2hhNTEyOlwiMzA1MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAzMDUwMDA0NDBcIixtZDI6XCIzMDIwMzAwYzA2MDgyYTg2NDg4NmY3MGQwMjAyMDUwMDA0MTBcIixtZDU6XCIzMDIwMzAwYzA2MDgyYTg2NDg4NmY3MGQwMjA1MDUwMDA0MTBcIixyaXBlbWQxNjA6XCIzMDIxMzAwOTA2MDUyYjI0MDMwMjAxMDUwMDA0MTRcIix9O3RoaXMuREVGQVVMVFBST1ZJREVSPXttZDU6XCJjcnlwdG9qc1wiLHNoYTE6XCJjcnlwdG9qc1wiLHNoYTIyNDpcImNyeXB0b2pzXCIsc2hhMjU2OlwiY3J5cHRvanNcIixzaGEzODQ6XCJjcnlwdG9qc1wiLHNoYTUxMjpcImNyeXB0b2pzXCIscmlwZW1kMTYwOlwiY3J5cHRvanNcIixobWFjbWQ1OlwiY3J5cHRvanNcIixobWFjc2hhMTpcImNyeXB0b2pzXCIsaG1hY3NoYTIyNDpcImNyeXB0b2pzXCIsaG1hY3NoYTI1NjpcImNyeXB0b2pzXCIsaG1hY3NoYTM4NDpcImNyeXB0b2pzXCIsaG1hY3NoYTUxMjpcImNyeXB0b2pzXCIsaG1hY3JpcGVtZDE2MDpcImNyeXB0b2pzXCIsTUQ1d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMXdpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTM4NHdpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTUxMndpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFJJUEVNRDE2MHdpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLE1ENXdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMXdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyNTZ3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTM4NHdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBNTEyd2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixSSVBFTUQxNjB3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyNTZ3aXRoRFNBOlwiY3J5cHRvanMvanNyc2FcIixNRDV3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMXdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTM4NHdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLH07dGhpcy5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FPXttZDU6Q3J5cHRvSlMuYWxnby5NRDUsc2hhMTpDcnlwdG9KUy5hbGdvLlNIQTEsc2hhMjI0OkNyeXB0b0pTLmFsZ28uU0hBMjI0LHNoYTI1NjpDcnlwdG9KUy5hbGdvLlNIQTI1NixzaGEzODQ6Q3J5cHRvSlMuYWxnby5TSEEzODQsc2hhNTEyOkNyeXB0b0pTLmFsZ28uU0hBNTEyLHJpcGVtZDE2MDpDcnlwdG9KUy5hbGdvLlJJUEVNRDE2MH07dGhpcy5nZXREaWdlc3RJbmZvSGV4PWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIHRoaXMuRElHRVNUSU5GT0hFQURbYl09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJhbGcgbm90IHN1cHBvcnRlZCBpbiBVdGlsLkRJR0VTVElORk9IRUFEOiBcIitifXJldHVybiB0aGlzLkRJR0VTVElORk9IRUFEW2JdK2F9O3RoaXMuZ2V0UGFkZGVkRGlnZXN0SW5mb0hleD1mdW5jdGlvbihoLGEsail7dmFyIGM9dGhpcy5nZXREaWdlc3RJbmZvSGV4KGgsYSk7dmFyIGQ9ai80O2lmKGMubGVuZ3RoKzIyPmQpe3Rocm93XCJrZXkgaXMgdG9vIHNob3J0IGZvciBTaWdBbGc6IGtleWxlbj1cIitqK1wiLFwiK2F9dmFyIGI9XCIwMDAxXCI7dmFyIGs9XCIwMFwiK2M7dmFyIGc9XCJcIjt2YXIgbD1kLWIubGVuZ3RoLWsubGVuZ3RoO2Zvcih2YXIgZj0wO2Y8bDtmKz0yKXtnKz1cImZmXCJ9dmFyIGU9YitnK2s7cmV0dXJuIGV9O3RoaXMuaGFzaFN0cmluZz1mdW5jdGlvbihhLGMpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6Y30pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5oYXNoSGV4PWZ1bmN0aW9uKGIsYyl7dmFyIGE9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpjfSk7cmV0dXJuIGEuZGlnZXN0SGV4KGIpfTt0aGlzLnNoYTE9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTFcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5zaGEyNTY9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTI1NlwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnNoYTI1NkhleD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhMjU2XCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RIZXgoYSl9O3RoaXMuc2hhNTEyPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGE1MTJcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5zaGE1MTJIZXg9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTUxMlwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0SGV4KGEpfTt0aGlzLm1kNT1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwibWQ1XCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMucmlwZW1kMTYwPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJyaXBlbWQxNjBcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5nZXRDcnlwdG9KU01EQnlOYW1lPWZ1bmN0aW9uKGEpe319O0tKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Q9ZnVuY3Rpb24oYyl7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3ZhciBkPW51bGw7dGhpcy5zZXRBbGdBbmRQcm92aWRlcj1mdW5jdGlvbihnLGYpe2lmKGchPW51bGwmJmY9PT11bmRlZmluZWQpe2Y9S0pVUi5jcnlwdG8uVXRpbC5ERUZBVUxUUFJPVklERVJbZ119aWYoXCI6bWQ1OnNoYTE6c2hhMjI0OnNoYTI1NjpzaGEzODQ6c2hhNTEyOnJpcGVtZDE2MDpcIi5pbmRleE9mKGcpIT0tMSYmZj09XCJjcnlwdG9qc1wiKXt0cnl7dGhpcy5tZD1LSlVSLmNyeXB0by5VdGlsLkNSWVBUT0pTTUVTU0FHRURJR0VTVE5BTUVbZ10uY3JlYXRlKCl9Y2F0Y2goZSl7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIGhhc2ggYWxnIHNldCBmYWlsIGFsZz1cIitnK1wiL1wiK2V9dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy5tZC51cGRhdGUoaCl9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGgpe3ZhciBpPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoaCk7dGhpcy5tZC51cGRhdGUoaSl9O3RoaXMuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5tZC5maW5hbGl6ZSgpO3JldHVybiBoLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5IZXgpfTt0aGlzLmRpZ2VzdFN0cmluZz1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZVN0cmluZyhoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX07dGhpcy5kaWdlc3RIZXg9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVIZXgoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9fWlmKFwiOnNoYTI1NjpcIi5pbmRleE9mKGcpIT0tMSYmZj09XCJzamNsXCIpe3RyeXt0aGlzLm1kPW5ldyBzamNsLmhhc2guc2hhMjU2KCl9Y2F0Y2goZSl7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIGhhc2ggYWxnIHNldCBmYWlsIGFsZz1cIitnK1wiL1wiK2V9dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy5tZC51cGRhdGUoaCl9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGkpe3ZhciBoPXNqY2wuY29kZWMuaGV4LnRvQml0cyhpKTt0aGlzLm1kLnVwZGF0ZShoKX07dGhpcy5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLm1kLmZpbmFsaXplKCk7cmV0dXJuIHNqY2wuY29kZWMuaGV4LmZyb21CaXRzKGgpfTt0aGlzLmRpZ2VzdFN0cmluZz1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZVN0cmluZyhoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX07dGhpcy5kaWdlc3RIZXg9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVIZXgoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9fX07dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24oZSl7dGhyb3dcInVwZGF0ZVN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihlKXt0aHJvd1widXBkYXRlSGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMuZGlnZXN0PWZ1bmN0aW9uKCl7dGhyb3dcImRpZ2VzdCgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLmRpZ2VzdFN0cmluZz1mdW5jdGlvbihlKXt0aHJvd1wiZGlnZXN0U3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMuZGlnZXN0SGV4PWZ1bmN0aW9uKGUpe3Rocm93XCJkaWdlc3RIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07aWYoYyE9PXVuZGVmaW5lZCl7aWYoYy5hbGchPT11bmRlZmluZWQpe3RoaXMuYWxnTmFtZT1jLmFsZztpZihjLnByb3Y9PT11bmRlZmluZWQpe3RoaXMucHJvdk5hbWU9S0pVUi5jcnlwdG8uVXRpbC5ERUZBVUxUUFJPVklERVJbdGhpcy5hbGdOYW1lXX10aGlzLnNldEFsZ0FuZFByb3ZpZGVyKHRoaXMuYWxnTmFtZSx0aGlzLnByb3ZOYW1lKX19fTtLSlVSLmNyeXB0by5NYWM9ZnVuY3Rpb24oZCl7dmFyIGY9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dmFyIGU9bnVsbDt2YXIgYj1udWxsO3RoaXMuc2V0QWxnQW5kUHJvdmlkZXI9ZnVuY3Rpb24oayxpKXtrPWsudG9Mb3dlckNhc2UoKTtpZihrPT1udWxsKXtrPVwiaG1hY3NoYTFcIn1rPWsudG9Mb3dlckNhc2UoKTtpZihrLnN1YnN0cigwLDQpIT1cImhtYWNcIil7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIHVuc3VwcG9ydGVkIEhNQUMgYWxnOiBcIitrfWlmKGk9PT11bmRlZmluZWQpe2k9S0pVUi5jcnlwdG8uVXRpbC5ERUZBVUxUUFJPVklERVJba119dGhpcy5hbGdQcm92PWsrXCIvXCIraTt2YXIgZz1rLnN1YnN0cig0KTtpZihcIjptZDU6c2hhMTpzaGEyMjQ6c2hhMjU2OnNoYTM4NDpzaGE1MTI6cmlwZW1kMTYwOlwiLmluZGV4T2YoZykhPS0xJiZpPT1cImNyeXB0b2pzXCIpe3RyeXt2YXIgaj1LSlVSLmNyeXB0by5VdGlsLkNSWVBUT0pTTUVTU0FHRURJR0VTVE5BTUVbZ107dGhpcy5tYWM9Q3J5cHRvSlMuYWxnby5ITUFDLmNyZWF0ZShqLHRoaXMucGFzcyl9Y2F0Y2goaCl7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIGhhc2ggYWxnIHNldCBmYWlsIGhhc2hBbGc9XCIrZytcIi9cIitofXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGwpe3RoaXMubWFjLnVwZGF0ZShsKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24obCl7dmFyIG09Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShsKTt0aGlzLm1hYy51cGRhdGUobSl9O3RoaXMuZG9GaW5hbD1mdW5jdGlvbigpe3ZhciBsPXRoaXMubWFjLmZpbmFsaXplKCk7cmV0dXJuIGwudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleCl9O3RoaXMuZG9GaW5hbFN0cmluZz1mdW5jdGlvbihsKXt0aGlzLnVwZGF0ZVN0cmluZyhsKTtyZXR1cm4gdGhpcy5kb0ZpbmFsKCl9O3RoaXMuZG9GaW5hbEhleD1mdW5jdGlvbihsKXt0aGlzLnVwZGF0ZUhleChsKTtyZXR1cm4gdGhpcy5kb0ZpbmFsKCl9fX07dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24oZyl7dGhyb3dcInVwZGF0ZVN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oZyl7dGhyb3dcInVwZGF0ZUhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5kb0ZpbmFsPWZ1bmN0aW9uKCl7dGhyb3dcImRpZ2VzdCgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5kb0ZpbmFsU3RyaW5nPWZ1bmN0aW9uKGcpe3Rocm93XCJkaWdlc3RTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbEhleD1mdW5jdGlvbihnKXt0aHJvd1wiZGlnZXN0SGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLnNldFBhc3N3b3JkPWZ1bmN0aW9uKGgpe2lmKHR5cGVvZiBoPT1cInN0cmluZ1wiKXt2YXIgZz1oO2lmKGgubGVuZ3RoJTI9PTF8fCFoLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXtnPXJzdHJ0b2hleChoKX10aGlzLnBhc3M9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShnKTtyZXR1cm59aWYodHlwZW9mIGghPVwib2JqZWN0XCIpe3Rocm93XCJLSlVSLmNyeXB0by5NYWMgdW5zdXBwb3J0ZWQgcGFzc3dvcmQgdHlwZTogXCIraH12YXIgZz1udWxsO2lmKGguaGV4IT09dW5kZWZpbmVkKXtpZihoLmhleC5sZW5ndGglMiE9MHx8IWguaGV4Lm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt0aHJvd1wiTWFjOiB3cm9uZyBoZXggcGFzc3dvcmQ6IFwiK2guaGV4fWc9aC5oZXh9aWYoaC51dGY4IT09dW5kZWZpbmVkKXtnPXV0Zjh0b2hleChoLnV0ZjgpfWlmKGgucnN0ciE9PXVuZGVmaW5lZCl7Zz1yc3RydG9oZXgoaC5yc3RyKX1pZihoLmI2NCE9PXVuZGVmaW5lZCl7Zz1iNjR0b2hleChoLmI2NCl9aWYoaC5iNjR1IT09dW5kZWZpbmVkKXtnPWI2NHV0b2hleChoLmI2NHUpfWlmKGc9PW51bGwpe3Rocm93XCJLSlVSLmNyeXB0by5NYWMgdW5zdXBwb3J0ZWQgcGFzc3dvcmQgdHlwZTogXCIraH10aGlzLnBhc3M9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShnKX07aWYoZCE9PXVuZGVmaW5lZCl7aWYoZC5wYXNzIT09dW5kZWZpbmVkKXt0aGlzLnNldFBhc3N3b3JkKGQucGFzcyl9aWYoZC5hbGchPT11bmRlZmluZWQpe3RoaXMuYWxnTmFtZT1kLmFsZztpZihkLnByb3Y9PT11bmRlZmluZWQpe3RoaXMucHJvdk5hbWU9S0pVUi5jcnlwdG8uVXRpbC5ERUZBVUxUUFJPVklERVJbdGhpcy5hbGdOYW1lXX10aGlzLnNldEFsZ0FuZFByb3ZpZGVyKHRoaXMuYWxnTmFtZSx0aGlzLnByb3ZOYW1lKX19fTtLSlVSLmNyeXB0by5TaWduYXR1cmU9ZnVuY3Rpb24obyl7dmFyIHE9bnVsbDt2YXIgbj1udWxsO3ZhciByPW51bGw7dmFyIGM9bnVsbDt2YXIgbD1udWxsO3ZhciBkPW51bGw7dmFyIGs9bnVsbDt2YXIgaD1udWxsO3ZhciBwPW51bGw7dmFyIGU9bnVsbDt2YXIgYj0tMTt2YXIgZz1udWxsO3ZhciBqPW51bGw7dmFyIGE9bnVsbDt2YXIgaT1udWxsO3ZhciBmPW51bGw7dGhpcy5fc2V0QWxnTmFtZXM9ZnVuY3Rpb24oKXtpZih0aGlzLmFsZ05hbWUubWF0Y2goL14oLispd2l0aCguKykkLykpe3RoaXMubWRBbGdOYW1lPVJlZ0V4cC4kMS50b0xvd2VyQ2FzZSgpO3RoaXMucHVia2V5QWxnTmFtZT1SZWdFeHAuJDIudG9Mb3dlckNhc2UoKX19O3RoaXMuX3plcm9QYWRkaW5nT2ZTaWduYXR1cmU9ZnVuY3Rpb24oeCx3KXt2YXIgdj1cIlwiO3ZhciB0PXcvNC14Lmxlbmd0aDtmb3IodmFyIHU9MDt1PHQ7dSsrKXt2PXYrXCIwXCJ9cmV0dXJuIHYreH07dGhpcy5zZXRBbGdBbmRQcm92aWRlcj1mdW5jdGlvbih1LHQpe3RoaXMuX3NldEFsZ05hbWVzKCk7aWYodCE9XCJjcnlwdG9qcy9qc3JzYVwiKXt0aHJvd1wicHJvdmlkZXIgbm90IHN1cHBvcnRlZDogXCIrdH1pZihcIjptZDU6c2hhMTpzaGEyMjQ6c2hhMjU2OnNoYTM4NDpzaGE1MTI6cmlwZW1kMTYwOlwiLmluZGV4T2YodGhpcy5tZEFsZ05hbWUpIT0tMSl7dHJ5e3RoaXMubWQ9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzp0aGlzLm1kQWxnTmFtZX0pfWNhdGNoKHMpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBhbGc9XCIrdGhpcy5tZEFsZ05hbWUrXCIvXCIrc310aGlzLmluaXQ9ZnVuY3Rpb24odyx4KXt2YXIgeT1udWxsO3RyeXtpZih4PT09dW5kZWZpbmVkKXt5PUtFWVVUSUwuZ2V0S2V5KHcpfWVsc2V7eT1LRVlVVElMLmdldEtleSh3LHgpfX1jYXRjaCh2KXt0aHJvd1wiaW5pdCBmYWlsZWQ6XCIrdn1pZih5LmlzUHJpdmF0ZT09PXRydWUpe3RoaXMucHJ2S2V5PXk7dGhpcy5zdGF0ZT1cIlNJR05cIn1lbHNle2lmKHkuaXNQdWJsaWM9PT10cnVlKXt0aGlzLnB1YktleT15O3RoaXMuc3RhdGU9XCJWRVJJRllcIn1lbHNle3Rocm93XCJpbml0IGZhaWxlZC46XCIreX19fTt0aGlzLmluaXRTaWduPWZ1bmN0aW9uKHYpe2lmKHR5cGVvZiB2LmVjcHJ2aGV4PT1cInN0cmluZ1wiJiZ0eXBlb2Ygdi5lY2N1cnZlbmFtZT09XCJzdHJpbmdcIil7dGhpcy5lY3BydmhleD12LmVjcHJ2aGV4O3RoaXMuZWNjdXJ2ZW5hbWU9di5lY2N1cnZlbmFtZX1lbHNle3RoaXMucHJ2S2V5PXZ9dGhpcy5zdGF0ZT1cIlNJR05cIn07dGhpcy5pbml0VmVyaWZ5QnlQdWJsaWNLZXk9ZnVuY3Rpb24odil7aWYodHlwZW9mIHYuZWNwdWJoZXg9PVwic3RyaW5nXCImJnR5cGVvZiB2LmVjY3VydmVuYW1lPT1cInN0cmluZ1wiKXt0aGlzLmVjcHViaGV4PXYuZWNwdWJoZXg7dGhpcy5lY2N1cnZlbmFtZT12LmVjY3VydmVuYW1lfWVsc2V7aWYodiBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXt0aGlzLnB1YktleT12fWVsc2V7aWYodiBpbnN0YW5jZW9mIFJTQUtleSl7dGhpcy5wdWJLZXk9dn19fXRoaXMuc3RhdGU9XCJWRVJJRllcIn07dGhpcy5pbml0VmVyaWZ5QnlDZXJ0aWZpY2F0ZVBFTT1mdW5jdGlvbih2KXt2YXIgdz1uZXcgWDUwOSgpO3cucmVhZENlcnRQRU0odik7dGhpcy5wdWJLZXk9dy5zdWJqZWN0UHVibGljS2V5UlNBO3RoaXMuc3RhdGU9XCJWRVJJRllcIn07dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24odil7dGhpcy5tZC51cGRhdGVTdHJpbmcodil9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKHYpe3RoaXMubWQudXBkYXRlSGV4KHYpfTt0aGlzLnNpZ249ZnVuY3Rpb24oKXt0aGlzLnNIYXNoSGV4PXRoaXMubWQuZGlnZXN0KCk7aWYodHlwZW9mIHRoaXMuZWNwcnZoZXghPVwidW5kZWZpbmVkXCImJnR5cGVvZiB0aGlzLmVjY3VydmVuYW1lIT1cInVuZGVmaW5lZFwiKXt2YXIgdj1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnRoaXMuZWNjdXJ2ZW5hbWV9KTt0aGlzLmhTaWduPXYuc2lnbkhleCh0aGlzLnNIYXNoSGV4LHRoaXMuZWNwcnZoZXgpfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FhbmRtZ2YxXCIpe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaFBTUyh0aGlzLnNIYXNoSGV4LHRoaXMubWRBbGdOYW1lLHRoaXMucHNzU2FsdExlbil9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIFJTQUtleSYmdGhpcy5wdWJrZXlBbGdOYW1lPT1cInJzYVwiKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCx0aGlzLm1kQWxnTmFtZSl9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCl9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgpfWVsc2V7dGhyb3dcIlNpZ25hdHVyZTogdW5zdXBwb3J0ZWQgcHVibGljIGtleSBhbGc6IFwiK3RoaXMucHVia2V5QWxnTmFtZX19fX19cmV0dXJuIHRoaXMuaFNpZ259O3RoaXMuc2lnblN0cmluZz1mdW5jdGlvbih2KXt0aGlzLnVwZGF0ZVN0cmluZyh2KTtyZXR1cm4gdGhpcy5zaWduKCl9O3RoaXMuc2lnbkhleD1mdW5jdGlvbih2KXt0aGlzLnVwZGF0ZUhleCh2KTtyZXR1cm4gdGhpcy5zaWduKCl9O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKHYpe3RoaXMuc0hhc2hIZXg9dGhpcy5tZC5kaWdlc3QoKTtpZih0eXBlb2YgdGhpcy5lY3B1YmhleCE9XCJ1bmRlZmluZWRcIiYmdHlwZW9mIHRoaXMuZWNjdXJ2ZW5hbWUhPVwidW5kZWZpbmVkXCIpe3ZhciB3PW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6dGhpcy5lY2N1cnZlbmFtZX0pO3JldHVybiB3LnZlcmlmeUhleCh0aGlzLnNIYXNoSGV4LHYsdGhpcy5lY3B1YmhleCl9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIFJTQUtleSYmdGhpcy5wdWJrZXlBbGdOYW1lPT1cInJzYWFuZG1nZjFcIil7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUyh0aGlzLnNIYXNoSGV4LHYsdGhpcy5tZEFsZ05hbWUsdGhpcy5wc3NTYWx0TGVuKX1lbHNle2lmKHRoaXMucHViS2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhXCIpe3JldHVybiB0aGlzLnB1YktleS52ZXJpZnlXaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCx2KX1lbHNle2lmKHRoaXMucHViS2V5IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3JldHVybiB0aGlzLnB1YktleS52ZXJpZnlXaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCx2KX1lbHNle2lmKHRoaXMucHViS2V5IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXt0aHJvd1wiU2lnbmF0dXJlOiB1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZzogXCIrdGhpcy5wdWJrZXlBbGdOYW1lfX19fX19fX07dGhpcy5pbml0PWZ1bmN0aW9uKHMsdCl7dGhyb3dcImluaXQoa2V5LCBwYXNzKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuaW5pdFZlcmlmeUJ5UHVibGljS2V5PWZ1bmN0aW9uKHMpe3Rocm93XCJpbml0VmVyaWZ5QnlQdWJsaWNLZXkocnNhUHViS2V5eSkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRWZXJpZnlCeUNlcnRpZmljYXRlUEVNPWZ1bmN0aW9uKHMpe3Rocm93XCJpbml0VmVyaWZ5QnlDZXJ0aWZpY2F0ZVBFTShjZXJ0UEVNKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuaW5pdFNpZ249ZnVuY3Rpb24ocyl7dGhyb3dcImluaXRTaWduKHBydktleSkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihzKXt0aHJvd1widXBkYXRlU3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihzKXt0aHJvd1widXBkYXRlSGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnNpZ249ZnVuY3Rpb24oKXt0aHJvd1wic2lnbigpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5zaWduU3RyaW5nPWZ1bmN0aW9uKHMpe3Rocm93XCJkaWdlc3RTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuc2lnbkhleD1mdW5jdGlvbihzKXt0aHJvd1wiZGlnZXN0SGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnZlcmlmeT1mdW5jdGlvbihzKXt0aHJvd1widmVyaWZ5KGhTaWdWYWwpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0UGFyYW1zPW87aWYobyE9PXVuZGVmaW5lZCl7aWYoby5hbGchPT11bmRlZmluZWQpe3RoaXMuYWxnTmFtZT1vLmFsZztpZihvLnByb3Y9PT11bmRlZmluZWQpe3RoaXMucHJvdk5hbWU9S0pVUi5jcnlwdG8uVXRpbC5ERUZBVUxUUFJPVklERVJbdGhpcy5hbGdOYW1lXX1lbHNle3RoaXMucHJvdk5hbWU9by5wcm92fXRoaXMuYWxnUHJvdk5hbWU9dGhpcy5hbGdOYW1lK1wiOlwiK3RoaXMucHJvdk5hbWU7dGhpcy5zZXRBbGdBbmRQcm92aWRlcih0aGlzLmFsZ05hbWUsdGhpcy5wcm92TmFtZSk7dGhpcy5fc2V0QWxnTmFtZXMoKX1pZihvLnBzc3NhbHRsZW4hPT11bmRlZmluZWQpe3RoaXMucHNzU2FsdExlbj1vLnBzc3NhbHRsZW59aWYoby5wcnZrZXlwZW0hPT11bmRlZmluZWQpe2lmKG8ucHJ2a2V5cGFzIT09dW5kZWZpbmVkKXt0aHJvd1wiYm90aCBwcnZrZXlwZW0gYW5kIHBydmtleXBhcyBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWRcIn1lbHNle3RyeXt2YXIgcT1uZXcgUlNBS2V5KCk7cS5yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmcoby5wcnZrZXlwZW0pO3RoaXMuaW5pdFNpZ24ocSl9Y2F0Y2gobSl7dGhyb3dcImZhdGFsIGVycm9yIHRvIGxvYWQgcGVtIHByaXZhdGUga2V5OiBcIittfX19fX07S0pVUi5jcnlwdG8uT0lEPW5ldyBmdW5jdGlvbigpe3RoaXMub2lkaGV4Mm5hbWU9e1wiMmE4NjQ4ODZmNzBkMDEwMTAxXCI6XCJyc2FFbmNyeXB0aW9uXCIsXCIyYTg2NDhjZTNkMDIwMVwiOlwiZWNQdWJsaWNLZXlcIixcIjJhODY0OGNlMzgwNDAxXCI6XCJkc2FcIixcIjJhODY0OGNlM2QwMzAxMDdcIjpcInNlY3AyNTZyMVwiLFwiMmI4MTA0MDAxZlwiOlwic2VjcDE5MmsxXCIsXCIyYjgxMDQwMDIxXCI6XCJzZWNwMjI0cjFcIixcIjJiODEwNDAwMGFcIjpcInNlY3AyNTZrMVwiLFwiMmI4MTA0MDAyM1wiOlwic2VjcDUyMXIxXCIsXCIyYjgxMDQwMDIyXCI6XCJzZWNwMzg0cjFcIixcIjJhODY0OGNlMzgwNDAzXCI6XCJTSEExd2l0aERTQVwiLFwiNjA4NjQ4MDE2NTAzMDQwMzAxXCI6XCJTSEEyMjR3aXRoRFNBXCIsXCI2MDg2NDgwMTY1MDMwNDAzMDJcIjpcIlNIQTI1NndpdGhEU0FcIix9fTtcbi8qISBlY2RzYS1tb2RpZmllZC0xLjAuNS5qcyAoYykgU3RlcGhhbiBUaG9tYXMsIEtlbmppIFVydXNoaW1hIHwgZ2l0aHViLmNvbS9iaXRjb2luanMvYml0Y29pbmpzLWxpYi9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5jcnlwdG89PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmNyeXB0byl7S0pVUi5jcnlwdG89e319S0pVUi5jcnlwdG8uRUNEU0E9ZnVuY3Rpb24oaCl7dmFyIGU9XCJzZWNwMjU2cjFcIjt2YXIgZz1udWxsO3ZhciBiPW51bGw7dmFyIGY9bnVsbDt2YXIgYT1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIGQ9bnVsbDt0aGlzLnR5cGU9XCJFQ1wiO2Z1bmN0aW9uIGMocyxvLHIsbil7dmFyIGo9TWF0aC5tYXgoby5iaXRMZW5ndGgoKSxuLmJpdExlbmd0aCgpKTt2YXIgdD1zLmFkZDJEKHIpO3ZhciBxPXMuY3VydmUuZ2V0SW5maW5pdHkoKTtmb3IodmFyIHA9ai0xO3A+PTA7LS1wKXtxPXEudHdpY2UyRCgpO3Euej1CaWdJbnRlZ2VyLk9ORTtpZihvLnRlc3RCaXQocCkpe2lmKG4udGVzdEJpdChwKSl7cT1xLmFkZDJEKHQpfWVsc2V7cT1xLmFkZDJEKHMpfX1lbHNle2lmKG4udGVzdEJpdChwKSl7cT1xLmFkZDJEKHIpfX19cmV0dXJuIHF9dGhpcy5nZXRCaWdSYW5kb209ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGkuYml0TGVuZ3RoKCksYSkubW9kKGkuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKS5hZGQoQmlnSW50ZWdlci5PTkUpfTt0aGlzLnNldE5hbWVkQ3VydmU9ZnVuY3Rpb24oaSl7dGhpcy5lY3BhcmFtcz1LSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLmdldEJ5TmFtZShpKTt0aGlzLnBydktleUhleD1udWxsO3RoaXMucHViS2V5SGV4PW51bGw7dGhpcy5jdXJ2ZU5hbWU9aX07dGhpcy5zZXRQcml2YXRlS2V5SGV4PWZ1bmN0aW9uKGkpe3RoaXMuaXNQcml2YXRlPXRydWU7dGhpcy5wcnZLZXlIZXg9aX07dGhpcy5zZXRQdWJsaWNLZXlIZXg9ZnVuY3Rpb24oaSl7dGhpcy5pc1B1YmxpYz10cnVlO3RoaXMucHViS2V5SGV4PWl9O3RoaXMuZ2V0UHVibGljS2V5WFlIZXg9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnB1YktleUhleDtpZihrLnN1YnN0cigwLDIpIT09XCIwNFwiKXt0aHJvd1widGhpcyBtZXRob2Qgc3VwcG9ydHMgdW5jb21wcmVzc2VkIGZvcm1hdCgwNCkgb25seVwifXZhciBqPXRoaXMuZWNwYXJhbXMua2V5bGVuLzQ7aWYoay5sZW5ndGghPT0yK2oqMil7dGhyb3dcIm1hbGZvcm1lZCBwdWJsaWMga2V5IGhleCBsZW5ndGhcIn12YXIgaT17fTtpLng9ay5zdWJzdHIoMixqKTtpLnk9ay5zdWJzdHIoMitqKTtyZXR1cm4gaX07dGhpcy5nZXRTaG9ydE5JU1RQQ3VydmVOYW1lPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5jdXJ2ZU5hbWU7aWYoaT09PVwic2VjcDI1NnIxXCJ8fGk9PT1cIk5JU1QgUC0yNTZcInx8aT09PVwiUC0yNTZcInx8aT09PVwicHJpbWUyNTZ2MVwiKXtyZXR1cm5cIlAtMjU2XCJ9aWYoaT09PVwic2VjcDM4NHIxXCJ8fGk9PT1cIk5JU1QgUC0zODRcInx8aT09PVwiUC0zODRcIil7cmV0dXJuXCJQLTM4NFwifXJldHVybiBudWxsfTt0aGlzLmdlbmVyYXRlS2V5UGFpckhleD1mdW5jdGlvbigpe3ZhciBrPXRoaXMuZWNwYXJhbXMubjt2YXIgbj10aGlzLmdldEJpZ1JhbmRvbShrKTt2YXIgbD10aGlzLmVjcGFyYW1zLkcubXVsdGlwbHkobik7dmFyIHE9bC5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIG89bC5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGk9dGhpcy5lY3BhcmFtcy5rZXlsZW4vNDt2YXIgbT0oXCIwMDAwMDAwMDAwXCIrbi50b1N0cmluZygxNikpLnNsaWNlKC1pKTt2YXIgcj0oXCIwMDAwMDAwMDAwXCIrcS50b1N0cmluZygxNikpLnNsaWNlKC1pKTt2YXIgcD0oXCIwMDAwMDAwMDAwXCIrby50b1N0cmluZygxNikpLnNsaWNlKC1pKTt2YXIgaj1cIjA0XCIrcitwO3RoaXMuc2V0UHJpdmF0ZUtleUhleChtKTt0aGlzLnNldFB1YmxpY0tleUhleChqKTtyZXR1cm57ZWNwcnZoZXg6bSxlY3B1YmhleDpqfX07dGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnNpZ25IZXgoaSx0aGlzLnBydktleUhleCl9O3RoaXMuc2lnbkhleD1mdW5jdGlvbihvLGope3ZhciB0PW5ldyBCaWdJbnRlZ2VyKGosMTYpO3ZhciBsPXRoaXMuZWNwYXJhbXMubjt2YXIgcT1uZXcgQmlnSW50ZWdlcihvLDE2KTtkb3t2YXIgbT10aGlzLmdldEJpZ1JhbmRvbShsKTt2YXIgdT10aGlzLmVjcGFyYW1zLkc7dmFyIHA9dS5tdWx0aXBseShtKTt2YXIgaT1wLmdldFgoKS50b0JpZ0ludGVnZXIoKS5tb2QobCl9d2hpbGUoaS5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKTw9MCk7dmFyIHY9bS5tb2RJbnZlcnNlKGwpLm11bHRpcGx5KHEuYWRkKHQubXVsdGlwbHkoaSkpKS5tb2QobCk7cmV0dXJuIEtKVVIuY3J5cHRvLkVDRFNBLmJpUlNTaWdUb0FTTjFTaWcoaSx2KX07dGhpcy5zaWduPWZ1bmN0aW9uKG0sdSl7dmFyIHE9dTt2YXIgaj10aGlzLmVjcGFyYW1zLm47dmFyIHA9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobSk7ZG97dmFyIGw9dGhpcy5nZXRCaWdSYW5kb20oaik7dmFyIHQ9dGhpcy5lY3BhcmFtcy5HO3ZhciBvPXQubXVsdGlwbHkobCk7dmFyIGk9by5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGopfXdoaWxlKGkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk8PTApO3ZhciB2PWwubW9kSW52ZXJzZShqKS5tdWx0aXBseShwLmFkZChxLm11bHRpcGx5KGkpKSkubW9kKGopO3JldHVybiB0aGlzLnNlcmlhbGl6ZVNpZyhpLHYpfTt0aGlzLnZlcmlmeVdpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihqLGkpe3JldHVybiB0aGlzLnZlcmlmeUhleChqLGksdGhpcy5wdWJLZXlIZXgpfTt0aGlzLnZlcmlmeUhleD1mdW5jdGlvbihtLGkscCl7dmFyIGwsajt2YXIgbz1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleChpKTtsPW8ucjtqPW8uczt2YXIgaztrPUVDUG9pbnRGcC5kZWNvZGVGcm9tSGV4KHRoaXMuZWNwYXJhbXMuY3VydmUscCk7dmFyIG49bmV3IEJpZ0ludGVnZXIobSwxNik7cmV0dXJuIHRoaXMudmVyaWZ5UmF3KG4sbCxqLGspfTt0aGlzLnZlcmlmeT1mdW5jdGlvbihvLHAsail7dmFyIGwsaTtpZihCaXRjb2luLlV0aWwuaXNBcnJheShwKSl7dmFyIG49dGhpcy5wYXJzZVNpZyhwKTtsPW4ucjtpPW4uc31lbHNle2lmKFwib2JqZWN0XCI9PT10eXBlb2YgcCYmcC5yJiZwLnMpe2w9cC5yO2k9cC5zfWVsc2V7dGhyb3dcIkludmFsaWQgdmFsdWUgZm9yIHNpZ25hdHVyZVwifX12YXIgaztpZihqIGluc3RhbmNlb2YgRUNQb2ludEZwKXtrPWp9ZWxzZXtpZihCaXRjb2luLlV0aWwuaXNBcnJheShqKSl7az1FQ1BvaW50RnAuZGVjb2RlRnJvbSh0aGlzLmVjcGFyYW1zLmN1cnZlLGopfWVsc2V7dGhyb3dcIkludmFsaWQgZm9ybWF0IGZvciBwdWJrZXkgdmFsdWUsIG11c3QgYmUgYnl0ZSBhcnJheSBvciBFQ1BvaW50RnBcIn19dmFyIG09QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobyk7cmV0dXJuIHRoaXMudmVyaWZ5UmF3KG0sbCxpLGspfTt0aGlzLnZlcmlmeVJhdz1mdW5jdGlvbihvLGksdyxtKXt2YXIgbD10aGlzLmVjcGFyYW1zLm47dmFyIHU9dGhpcy5lY3BhcmFtcy5HO2lmKGkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKTwwfHxpLmNvbXBhcmVUbyhsKT49MCl7cmV0dXJuIGZhbHNlfWlmKHcuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKTwwfHx3LmNvbXBhcmVUbyhsKT49MCl7cmV0dXJuIGZhbHNlfXZhciBwPXcubW9kSW52ZXJzZShsKTt2YXIgaz1vLm11bHRpcGx5KHApLm1vZChsKTt2YXIgaj1pLm11bHRpcGx5KHApLm1vZChsKTt2YXIgcT11Lm11bHRpcGx5KGspLmFkZChtLm11bHRpcGx5KGopKTt2YXIgdD1xLmdldFgoKS50b0JpZ0ludGVnZXIoKS5tb2QobCk7cmV0dXJuIHQuZXF1YWxzKGkpfTt0aGlzLnNlcmlhbGl6ZVNpZz1mdW5jdGlvbihrLGope3ZhciBsPWsudG9CeXRlQXJyYXlTaWduZWQoKTt2YXIgaT1qLnRvQnl0ZUFycmF5U2lnbmVkKCk7dmFyIG09W107bS5wdXNoKDIpO20ucHVzaChsLmxlbmd0aCk7bT1tLmNvbmNhdChsKTttLnB1c2goMik7bS5wdXNoKGkubGVuZ3RoKTttPW0uY29uY2F0KGkpO20udW5zaGlmdChtLmxlbmd0aCk7bS51bnNoaWZ0KDQ4KTtyZXR1cm4gbX07dGhpcy5wYXJzZVNpZz1mdW5jdGlvbihuKXt2YXIgbTtpZihuWzBdIT00OCl7dGhyb3cgbmV3IEVycm9yKFwiU2lnbmF0dXJlIG5vdCBhIHZhbGlkIERFUlNlcXVlbmNlXCIpfW09MjtpZihuW21dIT0yKXt0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBlbGVtZW50IGluIHNpZ25hdHVyZSBtdXN0IGJlIGEgREVSSW50ZWdlclwiKX12YXIgbD1uLnNsaWNlKG0rMixtKzIrblttKzFdKTttKz0yK25bbSsxXTtpZihuW21dIT0yKXt0aHJvdyBuZXcgRXJyb3IoXCJTZWNvbmQgZWxlbWVudCBpbiBzaWduYXR1cmUgbXVzdCBiZSBhIERFUkludGVnZXJcIil9dmFyIGk9bi5zbGljZShtKzIsbSsyK25bbSsxXSk7bSs9MituW20rMV07dmFyIGs9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobCk7dmFyIGo9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQoaSk7cmV0dXJue3I6ayxzOmp9fTt0aGlzLnBhcnNlU2lnQ29tcGFjdD1mdW5jdGlvbihtKXtpZihtLmxlbmd0aCE9PTY1KXt0aHJvd1wiU2lnbmF0dXJlIGhhcyB0aGUgd3JvbmcgbGVuZ3RoXCJ9dmFyIGo9bVswXS0yNztpZihqPDB8fGo+Nyl7dGhyb3dcIkludmFsaWQgc2lnbmF0dXJlIHR5cGVcIn12YXIgbz10aGlzLmVjcGFyYW1zLm47dmFyIGw9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobS5zbGljZSgxLDMzKSkubW9kKG8pO3ZhciBrPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0uc2xpY2UoMzMsNjUpKS5tb2Qobyk7cmV0dXJue3I6bCxzOmssaTpqfX07aWYoaCE9PXVuZGVmaW5lZCl7aWYoaC5jdXJ2ZSE9PXVuZGVmaW5lZCl7dGhpcy5jdXJ2ZU5hbWU9aC5jdXJ2ZX19aWYodGhpcy5jdXJ2ZU5hbWU9PT11bmRlZmluZWQpe3RoaXMuY3VydmVOYW1lPWV9dGhpcy5zZXROYW1lZEN1cnZlKHRoaXMuY3VydmVOYW1lKTtpZihoIT09dW5kZWZpbmVkKXtpZihoLnBydiE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQcml2YXRlS2V5SGV4KGgucHJ2KX1pZihoLnB1YiE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQdWJsaWNLZXlIZXgoaC5wdWIpfX19O0tKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4PWZ1bmN0aW9uKGEpe3ZhciBiPUtKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4SW5IZXhSUyhhKTt2YXIgZD1uZXcgQmlnSW50ZWdlcihiLnIsMTYpO3ZhciBjPW5ldyBCaWdJbnRlZ2VyKGIucywxNik7cmV0dXJue3I6ZCxzOmN9fTtLSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlM9ZnVuY3Rpb24oYyl7aWYoYy5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wic2lnbmF0dXJlIGlzIG5vdCBhIEFTTi4xIHNlcXVlbmNlXCJ9dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooYywwKTtpZihiLmxlbmd0aCE9Mil7dGhyb3dcIm51bWJlciBvZiBzaWduYXR1cmUgQVNOLjEgc2VxdWVuY2UgZWxlbWVudHMgc2VlbSB3cm9uZ1wifXZhciBnPWJbMF07dmFyIGY9YlsxXTtpZihjLnN1YnN0cihnLDIpIT1cIjAyXCIpe3Rocm93XCIxc3QgaXRlbSBvZiBzZXF1ZW5lIG9mIHNpZ25hdHVyZSBpcyBub3QgQVNOLjEgaW50ZWdlclwifWlmKGMuc3Vic3RyKGYsMikhPVwiMDJcIil7dGhyb3dcIjJuZCBpdGVtIG9mIHNlcXVlbmUgb2Ygc2lnbmF0dXJlIGlzIG5vdCBBU04uMSBpbnRlZ2VyXCJ9dmFyIGU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxnKTt2YXIgZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihjLGYpO3JldHVybntyOmUsczpkfX07S0pVUi5jcnlwdG8uRUNEU0EuYXNuMVNpZ1RvQ29uY2F0U2lnPWZ1bmN0aW9uKGMpe3ZhciBkPUtKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4SW5IZXhSUyhjKTt2YXIgYj1kLnI7dmFyIGE9ZC5zO2lmKGIuc3Vic3RyKDAsMik9PVwiMDBcIiYmKCgoYi5sZW5ndGgvMikqOCklKDE2KjgpKT09OCl7Yj1iLnN1YnN0cigyKX1pZihhLnN1YnN0cigwLDIpPT1cIjAwXCImJigoKGEubGVuZ3RoLzIpKjgpJSgxNio4KSk9PTgpe2E9YS5zdWJzdHIoMil9aWYoKCgoYi5sZW5ndGgvMikqOCklKDE2KjgpKSE9MCl7dGhyb3dcInVua25vd24gRUNEU0Egc2lnIHIgbGVuZ3RoIGVycm9yXCJ9aWYoKCgoYS5sZW5ndGgvMikqOCklKDE2KjgpKSE9MCl7dGhyb3dcInVua25vd24gRUNEU0Egc2lnIHMgbGVuZ3RoIGVycm9yXCJ9cmV0dXJuIGIrYX07S0pVUi5jcnlwdG8uRUNEU0EuY29uY2F0U2lnVG9BU04xU2lnPWZ1bmN0aW9uKGEpe2lmKCgoKGEubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIGNvbmNhdGluYXRlZCByLXMgc2lnICBsZW5ndGggZXJyb3JcIn12YXIgYz1hLnN1YnN0cigwLGEubGVuZ3RoLzIpO3ZhciBiPWEuc3Vic3RyKGEubGVuZ3RoLzIpO3JldHVybiBLSlVSLmNyeXB0by5FQ0RTQS5oZXhSU1NpZ1RvQVNOMVNpZyhjLGIpfTtLSlVSLmNyeXB0by5FQ0RTQS5oZXhSU1NpZ1RvQVNOMVNpZz1mdW5jdGlvbihiLGEpe3ZhciBkPW5ldyBCaWdJbnRlZ2VyKGIsMTYpO3ZhciBjPW5ldyBCaWdJbnRlZ2VyKGEsMTYpO3JldHVybiBLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnKGQsYyl9O0tKVVIuY3J5cHRvLkVDRFNBLmJpUlNTaWdUb0FTTjFTaWc9ZnVuY3Rpb24oZSxjKXt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDplfSk7dmFyIGE9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Y30pO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltiLGFdfSk7cmV0dXJuIGQuZ2V0RW5jb2RlZEhleCgpfTtcbi8qISBlY3BhcmFtLTEuMC4wLmpzIChjKSAyMDEzIEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5jcnlwdG89PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmNyeXB0byl7S0pVUi5jcnlwdG89e319S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQj1uZXcgZnVuY3Rpb24oKXt2YXIgYj17fTt2YXIgYz17fTtmdW5jdGlvbiBhKGQpe3JldHVybiBuZXcgQmlnSW50ZWdlcihkLDE2KX10aGlzLmdldEJ5TmFtZT1mdW5jdGlvbihlKXt2YXIgZD1lO2lmKHR5cGVvZiBjW2RdIT1cInVuZGVmaW5lZFwiKXtkPWNbZV19aWYodHlwZW9mIGJbZF0hPVwidW5kZWZpbmVkXCIpe3JldHVybiBiW2RdfXRocm93XCJ1bnJlZ2lzdGVyZWQgRUMgY3VydmUgbmFtZTogXCIrZH07dGhpcy5yZWdpc3Q9ZnVuY3Rpb24oQSxsLG8sZyxtLGUsaixmLGssdSxkLHgpe2JbQV09e307dmFyIHM9YShvKTt2YXIgej1hKGcpO3ZhciB5PWEobSk7dmFyIHQ9YShlKTt2YXIgdz1hKGopO3ZhciByPW5ldyBFQ0N1cnZlRnAocyx6LHkpO3ZhciBxPXIuZGVjb2RlUG9pbnRIZXgoXCIwNFwiK2Yrayk7YltBXVtcIm5hbWVcIl09QTtiW0FdW1wia2V5bGVuXCJdPWw7YltBXVtcImN1cnZlXCJdPXI7YltBXVtcIkdcIl09cTtiW0FdW1wiblwiXT10O2JbQV1bXCJoXCJdPXc7YltBXVtcIm9pZFwiXT1kO2JbQV1bXCJpbmZvXCJdPXg7Zm9yKHZhciB2PTA7djx1Lmxlbmd0aDt2Kyspe2NbdVt2XV09QX19fTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxMjhyMVwiLDEyOCxcIkZGRkZGRkZERkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGXCIsXCJGRkZGRkZGREZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiLFwiRTg3NTc5QzExMDc5RjQzREQ4MjQ5OTNDMkNFRTVFRDNcIixcIkZGRkZGRkZFMDAwMDAwMDA3NUEzMEQxQjkwMzhBMTE1XCIsXCIxXCIsXCIxNjFGRjc1MjhCODk5QjJEMEMyODYwN0NBNTJDNUI4NlwiLFwiQ0Y1QUM4Mzk1QkFGRUIxM0MwMkRBMjkyRERFRDdBODNcIixbXSxcIlwiLFwic2VjcDEyOHIxIDogU0VDRyBjdXJ2ZSBvdmVyIGEgMTI4IGJpdCBwcmltZSBmaWVsZFwiKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxNjBrMVwiLDE2MCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkFDNzNcIixcIjBcIixcIjdcIixcIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDFCOEZBMTZERkFCOUFDQTE2QjZCM1wiLFwiMVwiLFwiM0I0QzM4MkNFMzdBQTE5MkE0MDE5RTc2MzAzNkY0RjVERDREN0VCQlwiLFwiOTM4Q0Y5MzUzMThGRENFRDZCQzI4Mjg2NTMxNzMzQzNGMDNDNEZFRVwiLFtdLFwiXCIsXCJzZWNwMTYwazEgOiBTRUNHIGN1cnZlIG92ZXIgYSAxNjAgYml0IHByaW1lIGZpZWxkXCIpO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE2MHIxXCIsMTYwLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RkZGRkZGRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RkZGRkZGQ1wiLFwiMUM5N0JFRkM1NEJEN0E4QjY1QUNGODlGODFENEQ0QURDNTY1RkE0NVwiLFwiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMUY0QzhGOTI3QUVEM0NBNzUyMjU3XCIsXCIxXCIsXCI0QTk2QjU2ODhFRjU3MzI4NDY2NDY5ODk2OEMzOEJCOTEzQ0JGQzgyXCIsXCIyM0E2Mjg1NTMxNjg5NDdENTlEQ0M5MTIwNDIzNTEzNzdBQzVGQjMyXCIsW10sXCJcIixcInNlY3AxNjByMSA6IFNFQ0cgY3VydmUgb3ZlciBhIDE2MCBiaXQgcHJpbWUgZmllbGRcIik7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTkyazFcIiwxOTIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkVFMzdcIixcIjBcIixcIjNcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRTI2RjJGQzE3MEY2OTQ2NkE3NERFRkQ4RFwiLFwiMVwiLFwiREI0RkYxMEVDMDU3RTlBRTI2QjA3RDAyODBCN0Y0MzQxREE1RDFCMUVBRTA2QzdEXCIsXCI5QjJGMkY2RDlDNTYyOEE3ODQ0MTYzRDAxNUJFODYzNDQwODJBQTg4RDk1RTJGOURcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTkycjFcIiwxOTIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkZGRkZGRkZGQ1wiLFwiNjQyMTA1MTlFNTlDODBFNzBGQTdFOUFCNzIyNDMwNDlGRUI4REVFQ0MxNDZCOUIxXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY5OURFRjgzNjE0NkJDOUIxQjREMjI4MzFcIixcIjFcIixcIjE4OERBODBFQjAzMDkwRjY3Q0JGMjBFQjQzQTE4ODAwRjRGRjBBRkQ4MkZGMTAxMlwiLFwiMDcxOTJCOTVGRkM4REE3ODYzMTAxMUVENkIyNENERDU3M0Y5NzdBMTFFNzk0ODExXCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDIyNHIxXCIsMjI0LFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFXCIsXCJCNDA1MEE4NTBDMDRCM0FCRjU0MTMyNTY1MDQ0QjBCN0Q3QkZEOEJBMjcwQjM5NDMyMzU1RkZCNFwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjE2QTJFMEI4RjAzRTEzREQyOTQ1NUM1QzJBM0RcIixcIjFcIixcIkI3MEUwQ0JENkJCNEJGN0YzMjEzOTBCOTRBMDNDMUQzNTZDMjExMjIzNDMyODBENjExNUMxRDIxXCIsXCJCRDM3NjM4OEI1RjcyM0ZCNEMyMkRGRTZDRDQzNzVBMDVBMDc0NzY0NDRENTgxOTk4NTAwN0UzNFwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AyNTZrMVwiLDI1NixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZDMkZcIixcIjBcIixcIjdcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFQkFBRURDRTZBRjQ4QTAzQkJGRDI1RThDRDAzNjQxNDFcIixcIjFcIixcIjc5QkU2NjdFRjlEQ0JCQUM1NUEwNjI5NUNFODcwQjA3MDI5QkZDREIyRENFMjhEOTU5RjI4MTVCMTZGODE3OThcIixcIjQ4M0FEQTc3MjZBM0M0NjU1REE0RkJGQzBFMTEwOEE4RkQxN0I0NDhBNjg1NTQxOTlDNDdEMDhGRkIxMEQ0QjhcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMjU2cjFcIiwyNTYsXCJGRkZGRkZGRjAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGXCIsXCJGRkZGRkZGRjAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDXCIsXCI1QUM2MzVEOEFBM0E5M0U3QjNFQkJENTU3Njk4ODZCQzY1MUQwNkIwQ0M1M0IwRjYzQkNFM0MzRTI3RDI2MDRCXCIsXCJGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkJDRTZGQUFEQTcxNzlFODRGM0I5Q0FDMkZDNjMyNTUxXCIsXCIxXCIsXCI2QjE3RDFGMkUxMkM0MjQ3RjhCQ0U2RTU2M0E0NDBGMjc3MDM3RDgxMkRFQjMzQTBGNEExMzk0NUQ4OThDMjk2XCIsXCI0RkUzNDJFMkZFMUE3RjlCOEVFN0VCNEE3QzBGOUUxNjJCQ0UzMzU3NkIzMTVFQ0VDQkI2NDA2ODM3QkY1MUY1XCIsW1wiTklTVCBQLTI1NlwiLFwiUC0yNTZcIixcInByaW1lMjU2djFcIl0pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDM4NHIxXCIsMzg0LFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkNcIixcIkIzMzEyRkE3RTIzRUU3RTQ5ODhFMDU2QkUzRjgyRDE5MTgxRDlDNkVGRTgxNDExMjAzMTQwODhGNTAxMzg3NUFDNjU2Mzk4RDhBMkVEMTlEMkE4NUM4RUREM0VDMkFFRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQzc2MzREODFGNDM3MkRERjU4MUEwREIyNDhCMEE3N0FFQ0VDMTk2QUNDQzUyOTczXCIsXCIxXCIsXCJBQTg3Q0EyMkJFOEIwNTM3OEVCMUM3MUVGMzIwQUQ3NDZFMUQzQjYyOEJBNzlCOTg1OUY3NDFFMDgyNTQyQTM4NTUwMkYyNURCRjU1Mjk2QzNBNTQ1RTM4NzI3NjBBQjdcIixcIjM2MTdkZTRhOTYyNjJjNmY1ZDllOThiZjkyOTJkYzI5ZjhmNDFkYmQyODlhMTQ3Y2U5ZGEzMTEzYjVmMGI4YzAwYTYwYjFjZTFkN2U4MTlkN2E0MzFkN2M5MGVhMGU1ZlwiLFtcIk5JU1QgUC0zODRcIixcIlAtMzg0XCJdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3A1MjFyMVwiLDUyMSxcIjFGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGXCIsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiLFwiMDUxOTUzRUI5NjE4RTFDOUExRjkyOUEyMUEwQjY4NTQwRUVBMkRBNzI1Qjk5QjMxNUYzQjhCNDg5OTE4RUYxMDlFMTU2MTkzOTUxRUM3RTkzN0IxNjUyQzBCRDNCQjFCRjA3MzU3M0RGODgzRDJDMzRGMUVGNDUxRkQ0NkI1MDNGMDBcIixcIjFGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkE1MTg2ODc4M0JGMkY5NjZCN0ZDQzAxNDhGNzA5QTVEMDNCQjVDOUI4ODk5QzQ3QUVCQjZGQjcxRTkxMzg2NDA5XCIsXCIxXCIsXCJDNjg1OEUwNkI3MDQwNEU5Q0Q5RTNFQ0I2NjIzOTVCNDQyOUM2NDgxMzkwNTNGQjUyMUY4MjhBRjYwNkI0RDNEQkFBMTRCNUU3N0VGRTc1OTI4RkUxREMxMjdBMkZGQThERTMzNDhCM0MxODU2QTQyOUJGOTdFN0UzMUMyRTVCRDY2XCIsXCIwMTE4MzkyOTZhNzg5YTNiYzAwNDVjOGE1ZmI0MmM3ZDFiZDk5OGY1NDQ0OTU3OWI0NDY4MTdhZmJkMTcyNzNlNjYyYzk3ZWU3Mjk5NWVmNDI2NDBjNTUwYjkwMTNmYWQwNzYxMzUzYzcwODZhMjcyYzI0MDg4YmU5NDc2OWZkMTY2NTBcIixbXCJOSVNUIFAtNTIxXCIsXCJQLTUyMVwiXSk7XG4vKiEgZHNhLW1vZGlmaWVkLTEuMC4xLmpzIChjKSBSZWN1cml0eSBMYWJzIEdtYkgsIEtlbmppIFVydXNoaW1tYSB8IGdpdGh1Yi5jb20vb3BlbnBncGpzL29wZW5wZ3Bqcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5jcnlwdG89PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmNyeXB0byl7S0pVUi5jcnlwdG89e319S0pVUi5jcnlwdG8uRFNBPWZ1bmN0aW9uKCl7dGhpcy5wPW51bGw7dGhpcy5xPW51bGw7dGhpcy5nPW51bGw7dGhpcy55PW51bGw7dGhpcy54PW51bGw7dGhpcy50eXBlPVwiRFNBXCI7dGhpcy5zZXRQcml2YXRlPWZ1bmN0aW9uKHosdyx2LEEsdSl7dGhpcy5pc1ByaXZhdGU9dHJ1ZTt0aGlzLnA9ejt0aGlzLnE9dzt0aGlzLmc9djt0aGlzLnk9QTt0aGlzLng9dX07dGhpcy5zZXRQdWJsaWM9ZnVuY3Rpb24odyx2LHUseil7dGhpcy5pc1B1YmxpYz10cnVlO3RoaXMucD13O3RoaXMucT12O3RoaXMuZz11O3RoaXMueT16O3RoaXMueD1udWxsfTt0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24oeil7dmFyIHY9dGhpcy5wO3ZhciB1PXRoaXMucTt2YXIgQz10aGlzLmc7dmFyIEQ9dGhpcy55O3ZhciBFPXRoaXMueDt2YXIgQT16LnN1YnN0cigwLHUuYml0TGVuZ3RoKCkvNCk7dmFyIEI9bmV3IEJpZ0ludGVnZXIoeiwxNik7dmFyIHc9bihCaWdJbnRlZ2VyLk9ORS5hZGQoQmlnSW50ZWdlci5PTkUpLHUuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKTt2YXIgRz0oQy5tb2RQb3codyx2KSkubW9kKHUpO3ZhciBGPSh3Lm1vZEludmVyc2UodSkubXVsdGlwbHkoQi5hZGQoRS5tdWx0aXBseShHKSkpKS5tb2QodSk7dmFyIEg9S0pVUi5hc24xLkFTTjFVdGlsLmpzb25Ub0FTTjFIRVgoe3NlcTpbe1wiaW50XCI6e2JpZ2ludDpHfX0se1wiaW50XCI6e2JpZ2ludDpGfX1dfSk7cmV0dXJuIEh9O3RoaXMudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKEMsQil7dmFyIHo9dGhpcy5wO3ZhciB1PXRoaXMucTt2YXIgRz10aGlzLmc7dmFyIEg9dGhpcy55O3ZhciBFPXRoaXMucGFyc2VBU04xU2lnbmF0dXJlKEIpO3ZhciBLPUVbMF07dmFyIEo9RVsxXTt2YXIgQz1DLnN1YnN0cigwLHUuYml0TGVuZ3RoKCkvNCk7dmFyIEQ9bmV3IEJpZ0ludGVnZXIoQywxNik7aWYoQmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhLKT4wfHxLLmNvbXBhcmVUbyh1KT4wfHxCaWdJbnRlZ2VyLlpFUk8uY29tcGFyZVRvKEopPjB8fEouY29tcGFyZVRvKHUpPjApe3Rocm93XCJpbnZhbGlkIERTQSBzaWduYXR1cmVcIn12YXIgST1KLm1vZEludmVyc2UodSk7dmFyIEE9RC5tdWx0aXBseShJKS5tb2QodSk7dmFyIHY9Sy5tdWx0aXBseShJKS5tb2QodSk7dmFyIEY9Ry5tb2RQb3coQSx6KS5tdWx0aXBseShILm1vZFBvdyh2LHopKS5tb2QoeikubW9kKHUpO3JldHVybiBGLmNvbXBhcmVUbyhLKT09MH07dGhpcy5wYXJzZUFTTjFTaWduYXR1cmU9ZnVuY3Rpb24odSl7dHJ5e3ZhciB5PW5ldyBCaWdJbnRlZ2VyKEFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzBdLFwiMDJcIiksMTYpO3ZhciB2PW5ldyBCaWdJbnRlZ2VyKEFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzFdLFwiMDJcIiksMTYpO3JldHVyblt5LHZdfWNhdGNoKHcpe3Rocm93XCJtYWxmb3JtZWQgRFNBIHNpZ25hdHVyZVwifX07ZnVuY3Rpb24gZChFLHcsQix2LHUsQyl7dmFyIHo9S0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKHcsRS50b0xvd2VyQ2FzZSgpKTt2YXIgej16LnN1YnN0cigwLHUuYml0TGVuZ3RoKCkvNCk7dmFyIEE9bmV3IEJpZ0ludGVnZXIoeiwxNik7dmFyIHk9bihCaWdJbnRlZ2VyLk9ORS5hZGQoQmlnSW50ZWdlci5PTkUpLHUuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKTt2YXIgRj0oQi5tb2RQb3coeSx2KSkubW9kKHUpO3ZhciBEPSh5Lm1vZEludmVyc2UodSkubXVsdGlwbHkoQS5hZGQoQy5tdWx0aXBseShGKSkpKS5tb2QodSk7dmFyIEc9bmV3IEFycmF5KCk7R1swXT1GO0dbMV09RDtyZXR1cm4gR31mdW5jdGlvbiByKHYpe3ZhciB1PW9wZW5wZ3AuY29uZmlnLmNvbmZpZy5wcmVmZXJfaGFzaF9hbGdvcml0aG07c3dpdGNoKE1hdGgucm91bmQodi5iaXRMZW5ndGgoKS84KSl7Y2FzZSAyMDppZih1IT0yJiZ1PjExJiZ1IT0xMCYmdTw4KXtyZXR1cm4gMn1yZXR1cm4gdTtjYXNlIDI4OmlmKHU+MTEmJnU8OCl7cmV0dXJuIDExfXJldHVybiB1O2Nhc2UgMzI6aWYodT4xMCYmdTw4KXtyZXR1cm4gOH1yZXR1cm4gdTtkZWZhdWx0OnV0aWwucHJpbnRfZGVidWcoXCJEU0Egc2VsZWN0IGhhc2ggYWxnb3JpdGhtOiByZXR1cm5pbmcgbnVsbCBmb3IgYW4gdW5rbm93biBsZW5ndGggb2YgcVwiKTtyZXR1cm4gbnVsbH19dGhpcy5zZWxlY3RfaGFzaF9hbGdvcml0aG09cjtmdW5jdGlvbiBtKEksSyxKLEIseix1LEYsRyl7dmFyIEM9S0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKEIsSS50b0xvd2VyQ2FzZSgpKTt2YXIgQz1DLnN1YnN0cigwLHUuYml0TGVuZ3RoKCkvNCk7dmFyIEQ9bmV3IEJpZ0ludGVnZXIoQywxNik7aWYoQmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhLKT4wfHxLLmNvbXBhcmVUbyh1KT4wfHxCaWdJbnRlZ2VyLlpFUk8uY29tcGFyZVRvKEopPjB8fEouY29tcGFyZVRvKHUpPjApe3V0aWwucHJpbnRfZXJyb3IoXCJpbnZhbGlkIERTQSBTaWduYXR1cmVcIik7cmV0dXJuIG51bGx9dmFyIEg9Si5tb2RJbnZlcnNlKHUpO3ZhciBBPUQubXVsdGlwbHkoSCkubW9kKHUpO3ZhciB2PUsubXVsdGlwbHkoSCkubW9kKHUpO3ZhciBFPUYubW9kUG93KEEseikubXVsdGlwbHkoRy5tb2RQb3codix6KSkubW9kKHopLm1vZCh1KTtyZXR1cm4gRS5jb21wYXJlVG8oSyk9PTB9ZnVuY3Rpb24gYSh6KXt2YXIgQT1uZXcgQmlnSW50ZWdlcih6LHByaW1lQ2VudGVyaWUpO3ZhciB5PWoocSw1MTIpO3ZhciB1PXQocCxxLHopO3ZhciB2O2Rve3Y9bmV3IEJpZ0ludGVnZXIocS5iaXRDb3VudCgpLHJhbmQpfXdoaWxlKHguY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykhPTEmJnguY29tcGFyZVRvKHEpIT0tMSk7dmFyIHc9Zy5tb2RQb3coeCxwKTtyZXR1cm57eDp2LHE6QSxwOnksZzp1LHk6d319ZnVuY3Rpb24gaih5LHosdyl7aWYoeiU2NCE9MCl7cmV0dXJuIGZhbHNlfXZhciB1O3ZhciB2O2Rve3U9dyhiaXRjb3VudCx0cnVlKTt2PXUuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3U9dS5zdWJ0cmFjdCh2LnJlbWFpbmRlcih5KSl9d2hpbGUoIXUuaXNQcm9iYWJsZVByaW1lKHByaW1lQ2VudGVyaWUpfHx1LmJpdExlbmd0aCgpIT1sKTtyZXR1cm4gdX1mdW5jdGlvbiB0KEIseixBLHcpe3ZhciB1PUIuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3ZhciB5PXUuZGl2aWRlKHopO3ZhciB2O2Rve3Y9dyhBKX13aGlsZSh2LmNvbXBhcmVUbyh1KSE9LTEmJnYuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSE9MSk7cmV0dXJuIHYubW9kUG93KHksQil9ZnVuY3Rpb24gbyh3LHksdSl7dmFyIHY7ZG97dj11KHksZmFsc2UpfXdoaWxlKHYuY29tcGFyZVRvKHcpIT0tMSYmdi5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSE9MSk7cmV0dXJuIHZ9ZnVuY3Rpb24gaSh2LHcpe2s9byh2KTt2YXIgdT1nLm1vZFBvdyhrLHcpLm1vZCh2KTtyZXR1cm4gdX1mdW5jdGlvbiBoKEIsdyx5LHYseix1KXt2YXIgQT1CKHYpO3M9KHcubW9kSW52ZXJzZSh6KS5tdWx0aXBseShBLmFkZCh1Lm11bHRpcGx5KHkpKSkpLm1vZCh6KTtyZXR1cm4gc310aGlzLnNpZ249ZDt0aGlzLnZlcmlmeT1tO2Z1bmN0aW9uIG4odyx1KXtpZih1LmNvbXBhcmVUbyh3KTw9MCl7cmV0dXJufXZhciB2PXUuc3VidHJhY3Qodyk7dmFyIHk9ZSh2LmJpdExlbmd0aCgpKTt3aGlsZSh5PnYpe3k9ZSh2LmJpdExlbmd0aCgpKX1yZXR1cm4gdy5hZGQoeSl9ZnVuY3Rpb24gZSh3KXtpZih3PDApe3JldHVybiBudWxsfXZhciB1PU1hdGguZmxvb3IoKHcrNykvOCk7dmFyIHY9Yyh1KTtpZih3JTg+MCl7dj1TdHJpbmcuZnJvbUNoYXJDb2RlKChNYXRoLnBvdygyLHclOCktMSkmdi5jaGFyQ29kZUF0KDApKSt2LnN1YnN0cmluZygxKX1yZXR1cm4gbmV3IEJpZ0ludGVnZXIoZih2KSwxNil9ZnVuY3Rpb24gYyh3KXt2YXIgdT1cIlwiO2Zvcih2YXIgdj0wO3Y8dzt2Kyspe3UrPVN0cmluZy5mcm9tQ2hhckNvZGUoYigpKX1yZXR1cm4gdX1mdW5jdGlvbiBiKCl7dmFyIHU9bmV3IFVpbnQzMkFycmF5KDEpO3dpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHUpO3JldHVybiB1WzBdJjI1NX1mdW5jdGlvbiBmKHkpe2lmKHk9PW51bGwpe3JldHVyblwiXCJ9dmFyIHY9W107dmFyIHc9eS5sZW5ndGg7dmFyIHo9MDt2YXIgdTt3aGlsZSh6PHcpe3U9eVt6KytdLmNoYXJDb2RlQXQoKS50b1N0cmluZygxNik7d2hpbGUodS5sZW5ndGg8Mil7dT1cIjBcIit1fXYucHVzaChcIlwiK3UpfXJldHVybiB2LmpvaW4oXCJcIil9dGhpcy5nZXRSYW5kb21CaWdJbnRlZ2VySW5SYW5nZT1uO3RoaXMuZ2V0UmFuZG9tQmlnSW50ZWdlcj1lO3RoaXMuZ2V0UmFuZG9tQnl0ZXM9Y307XG4vKiEgcGtjczVwa2V5LTEuMC42LmpzIChjKSAyMDEzLTIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIFBLQ1M1UEtFWT1mdW5jdGlvbigpe3ZhciBjPWZ1bmN0aW9uKG4scCxvKXtyZXR1cm4gaShDcnlwdG9KUy5BRVMsbixwLG8pfTt2YXIgZD1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGkoQ3J5cHRvSlMuVHJpcGxlREVTLG4scCxvKX07dmFyIGk9ZnVuY3Rpb24ocSx2LHMsbyl7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh2KTt2YXIgdT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHMpO3ZhciBuPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobyk7dmFyIHI9e307ci5rZXk9dTtyLml2PW47ci5jaXBoZXJ0ZXh0PXA7dmFyIHQ9cS5kZWNyeXB0KHIsdSx7aXY6bn0pO3JldHVybiBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh0KX07dmFyIGo9ZnVuY3Rpb24obixwLG8pe3JldHVybiBlKENyeXB0b0pTLkFFUyxuLHAsbyl9O3ZhciBtPWZ1bmN0aW9uKG4scCxvKXtyZXR1cm4gZShDcnlwdG9KUy5UcmlwbGVERVMsbixwLG8pfTt2YXIgZT1mdW5jdGlvbihzLHgsdixwKXt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHgpO3ZhciB3PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIG89Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShwKTt2YXIgbj17fTt2YXIgdT1zLmVuY3J5cHQocix3LHtpdjpvfSk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh1LnRvU3RyaW5nKCkpO3ZhciB0PUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHEpO3JldHVybiB0fTt2YXIgZz17XCJBRVMtMjU2LUNCQ1wiOntwcm9jOmMsZXByb2M6aixrZXlsZW46MzIsaXZsZW46MTZ9LFwiQUVTLTE5Mi1DQkNcIjp7cHJvYzpjLGVwcm9jOmosa2V5bGVuOjI0LGl2bGVuOjE2fSxcIkFFUy0xMjgtQ0JDXCI6e3Byb2M6YyxlcHJvYzpqLGtleWxlbjoxNixpdmxlbjoxNn0sXCJERVMtRURFMy1DQkNcIjp7cHJvYzpkLGVwcm9jOm0sa2V5bGVuOjI0LGl2bGVuOjh9fTt2YXIgYj1mdW5jdGlvbihuKXtyZXR1cm4gZ1tuXVtcInByb2NcIl19O3ZhciBrPWZ1bmN0aW9uKG4pe3ZhciBwPUNyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKG4pO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHApO3JldHVybiBvfTt2YXIgbD1mdW5jdGlvbihxKXt2YXIgcj17fTtpZihxLm1hdGNoKG5ldyBSZWdFeHAoXCJERUstSW5mbzogKFteLF0rKSwoWzAtOUEtRmEtZl0rKVwiLFwibVwiKSkpe3IuY2lwaGVyPVJlZ0V4cC4kMTtyLml2c2FsdD1SZWdFeHAuJDJ9aWYocS5tYXRjaChuZXcgUmVnRXhwKFwiLS0tLS1CRUdJTiAoW0EtWl0rKSBQUklWQVRFIEtFWS0tLS0tXCIpKSl7ci50eXBlPVJlZ0V4cC4kMX12YXIgcD0tMTt2YXIgdD0wO2lmKHEuaW5kZXhPZihcIlxcclxcblxcclxcblwiKSE9LTEpe3A9cS5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpO3Q9Mn1pZihxLmluZGV4T2YoXCJcXG5cXG5cIikhPS0xKXtwPXEuaW5kZXhPZihcIlxcblxcblwiKTt0PTF9dmFyIG89cS5pbmRleE9mKFwiLS0tLS1FTkRcIik7aWYocCE9LTEmJm8hPS0xKXt2YXIgbj1xLnN1YnN0cmluZyhwK3QqMixvLXQpO249bi5yZXBsYWNlKC9cXHMrL2csXCJcIik7ci5kYXRhPW59cmV0dXJuIHJ9O3ZhciBoPWZ1bmN0aW9uKG8sdyxuKXt2YXIgdD1uLnN1YnN0cmluZygwLDE2KTt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHQpO3ZhciBwPUNyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHcpO3ZhciBzPWdbb11bXCJrZXlsZW5cIl0rZ1tvXVtcIml2bGVuXCJdO3ZhciB2PVwiXCI7dmFyIHU9bnVsbDtmb3IoOzspe3ZhciBxPUNyeXB0b0pTLmFsZ28uTUQ1LmNyZWF0ZSgpO2lmKHUhPW51bGwpe3EudXBkYXRlKHUpfXEudXBkYXRlKHApO3EudXBkYXRlKHIpO3U9cS5maW5hbGl6ZSgpO3Y9ditDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh1KTtpZih2Lmxlbmd0aD49cyoyKXticmVha319dmFyIHg9e307eC5rZXloZXg9di5zdWJzdHIoMCxnW29dW1wia2V5bGVuXCJdKjIpO3guaXZoZXg9di5zdWJzdHIoZ1tvXVtcImtleWxlblwiXSoyLGdbb11bXCJpdmxlblwiXSoyKTtyZXR1cm4geH07dmFyIGE9ZnVuY3Rpb24obix0LHAsdSl7dmFyIHE9Q3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShuKTt2YXIgbz1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShxKTt2YXIgcz1nW3RdW1wicHJvY1wiXTt2YXIgcj1zKG8scCx1KTtyZXR1cm4gcn07dmFyIGY9ZnVuY3Rpb24obixxLG8scyl7dmFyIHA9Z1txXVtcImVwcm9jXCJdO3ZhciByPXAobixvLHMpO3JldHVybiByfTtyZXR1cm57dmVyc2lvbjpcIjEuMC41XCIsZ2V0SGV4RnJvbVBFTTpmdW5jdGlvbihvLHIpe3ZhciBwPW87aWYocC5pbmRleE9mKFwiQkVHSU4gXCIrcik9PS0xKXt0aHJvd1wiY2FuJ3QgZmluZCBQRU0gaGVhZGVyOiBcIityfXA9cC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBcIityK1wiLS0tLS1cIixcIlwiKTtwPXAucmVwbGFjZShcIi0tLS0tRU5EIFwiK3IrXCItLS0tLVwiLFwiXCIpO3ZhciBxPXAucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBuPWI2NHRvaGV4KHEpO3JldHVybiBufSxnZXREZWNyeXB0ZWRLZXlIZXhCeUtleUlWOmZ1bmN0aW9uKG8scixxLHApe3ZhciBuPWIocik7cmV0dXJuIG4obyxxLHApfSxwYXJzZVBLQ1M1UEVNOmZ1bmN0aW9uKG4pe3JldHVybiBsKG4pfSxnZXRLZXlBbmRVbnVzZWRJdkJ5UGFzc2NvZGVBbmRJdnNhbHQ6ZnVuY3Rpb24obyxuLHApe3JldHVybiBoKG8sbixwKX0sZGVjcnlwdEtleUI2NDpmdW5jdGlvbihuLHAsbyxxKXtyZXR1cm4gYShuLHAsbyxxKX0sZ2V0RGVjcnlwdGVkS2V5SGV4OmZ1bmN0aW9uKHcsdil7dmFyIG89bCh3KTt2YXIgcj1vLnR5cGU7dmFyIHA9by5jaXBoZXI7dmFyIG49by5pdnNhbHQ7dmFyIHE9by5kYXRhO3ZhciB1PWgocCx2LG4pO3ZhciB0PXUua2V5aGV4O3ZhciBzPWEocSxwLHQsbik7cmV0dXJuIHN9LGdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTNVBFTTpmdW5jdGlvbihwLG8pe3ZhciBxPXRoaXMuZ2V0RGVjcnlwdGVkS2V5SGV4KHAsbyk7dmFyIG49bmV3IFJTQUtleSgpO24ucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhxKTtyZXR1cm4gbn0sZ2V0RXJ5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleDpmdW5jdGlvbihxLHgscixwKXt2YXIgbj1cIlwiO2lmKHR5cGVvZiByPT1cInVuZGVmaW5lZFwifHxyPT1udWxsKXtyPVwiQUVTLTI1Ni1DQkNcIn1pZih0eXBlb2YgZ1tyXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIlBLQ1M1UEtFWSB1bnN1cHBvcnRlZCBhbGdvcml0aG06IFwiK3J9aWYodHlwZW9mIHA9PVwidW5kZWZpbmVkXCJ8fHA9PW51bGwpe3ZhciB0PWdbcl1bXCJpdmxlblwiXTt2YXIgcz1rKHQpO3A9cy50b1VwcGVyQ2FzZSgpfXZhciB3PWgocix4LHApO3ZhciB2PXcua2V5aGV4O3ZhciB1PWYocSxyLHYscCk7dmFyIG89dS5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTt2YXIgbj1cIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtuKz1cIlByb2MtVHlwZTogNCxFTkNSWVBURURcXHJcXG5cIjtuKz1cIkRFSy1JbmZvOiBcIityK1wiLFwiK3ArXCJcXHJcXG5cIjtuKz1cIlxcclxcblwiO24rPW87bis9XCJcXHJcXG4tLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3JldHVybiBufSxnZXRFcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5OmZ1bmN0aW9uKEMsRCxvLHMpe3ZhciBBPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dmFyIHY9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Qy5ufSk7dmFyIHo9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOkMuZX0pO3ZhciBCPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMuZH0pO3ZhciB0PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMucH0pO3ZhciByPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMucX0pO3ZhciB5PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMuZG1wMX0pO3ZhciB1PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMuZG1xMX0pO3ZhciB4PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMuY29lZmZ9KTt2YXIgRT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbQSx2LHosQix0LHIseSx1LHhdfSk7dmFyIHc9RS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuZ2V0RXJ5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleCh3LEQsbyxzKX0sbmV3RW5jcnlwdGVkUEtDUzVQRU06ZnVuY3Rpb24obixvLHIscyl7aWYodHlwZW9mIG89PVwidW5kZWZpbmVkXCJ8fG89PW51bGwpe289MTAyNH1pZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7cj1cIjEwMDAxXCJ9dmFyIHA9bmV3IFJTQUtleSgpO3AuZ2VuZXJhdGUobyxyKTt2YXIgcT1udWxsO2lmKHR5cGVvZiBzPT1cInVuZGVmaW5lZFwifHxzPT1udWxsKXtxPXRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5KHBrZXksbil9ZWxzZXtxPXRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5KHBrZXksbixzKX1yZXR1cm4gcX0sZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhQRU06ZnVuY3Rpb24ocCl7aWYocC5tYXRjaCgvRU5DUllQVEVELykpe3Rocm93XCJwZW0gc2hhbGwgYmUgbm90IEVOQ1JZUFRFRFwifXZhciBvPXRoaXMuZ2V0SGV4RnJvbVBFTShwLFwiUFJJVkFURSBLRVlcIik7dmFyIG49dGhpcy5nZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleChvKTtyZXR1cm4gbn0sZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXg6ZnVuY3Rpb24ocSl7dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSwwKTtpZihwLmxlbmd0aCE9Myl7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMyBlbGVtZW50czogXCIrcC5sZW5ndGh9dmFyIG89QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihxLHBbMV0pO2lmKG8hPVwiMzAwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwXCIpe3Rocm93XCJQS0NTOCBBbGdvcml0aG1JZGVudGlmaWVyIGlzIG5vdCByc2FFbmM6IFwiK299dmFyIG89QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihxLHBbMV0pO3ZhciByPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzJdKTt2YXIgcz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihyLDApO3ZhciBuPW5ldyBSU0FLZXkoKTtuLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcocyk7cmV0dXJuIG59LHBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTODpmdW5jdGlvbih1KXt2YXIgcT17fTt2YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LDApO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMCkuaXRlbXMgIT0gMjogXCIrcC5sZW5ndGh9cS5jaXBoZXJ0ZXh0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUscFsxXSk7dmFyIHc9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxwWzBdKTtpZih3Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMCkuaXRlbXMgIT0gMjogXCIrdy5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSx3WzBdKSE9XCIyYTg2NDg4NmY3MGQwMTA1MGRcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBwa2NzNVBCRVMyXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSx3WzFdKTtpZih3Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xKS5pdGVtcyAhPSAyOiBcIituLmxlbmd0aH12YXIgbz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LG5bMV0pO2lmKG8ubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMSkuaXRlbXMgIT0gMjogXCIrby5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSxvWzBdKSE9XCIyYTg2NDg4NmY3MGQwMzA3XCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgVHJpcGxlREVTXCJ9cS5lbmNyeXB0aW9uU2NoZW1lQWxnPVwiVHJpcGxlREVTXCI7cS5lbmNyeXB0aW9uU2NoZW1lSVY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSxvWzFdKTt2YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LG5bMF0pO2lmKHIubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMCkuaXRlbXMgIT0gMjogXCIrci5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSxyWzBdKSE9XCIyYTg2NDg4NmY3MGQwMTA1MGNcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBwa2NzNVBCS0RGMlwifXZhciB2PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUsclsxXSk7aWYodi5sZW5ndGg8Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjAuMSkuaXRlbXMgPCAyOiBcIit2Lmxlbmd0aH1xLnBia2RmMlNhbHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSx2WzBdKTt2YXIgcz1BU04xSEVYLmdldEhleE9mVl9BdE9iaih1LHZbMV0pO3RyeXtxLnBia2RmMkl0ZXI9cGFyc2VJbnQocywxNil9Y2F0Y2godCl7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQgcGJrZGYySXRlcjogXCIrc31yZXR1cm4gcX0sZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtOmZ1bmN0aW9uKHMsbil7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShzLnBia2RmMlNhbHQpO3ZhciBvPXMucGJrZGYySXRlcjt2YXIgcT1DcnlwdG9KUy5QQktERjIobixyLHtrZXlTaXplOjE5Mi8zMixpdGVyYXRpb25zOm99KTt2YXIgcD1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShxKTtyZXR1cm4gcH0sZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbih2LHcpe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTSh2LFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpO3ZhciBuPXRoaXMucGFyc2VIZXhPZkVuY3J5cHRlZFBLQ1M4KHApO3ZhciBzPVBLQ1M1UEtFWS5nZXRQQktERjJLZXlIZXhGcm9tUGFyYW0obix3KTt2YXIgdD17fTt0LmNpcGhlcnRleHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShuLmNpcGhlcnRleHQpO3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uocyk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShuLmVuY3J5cHRpb25TY2hlbWVJVik7dmFyIHU9Q3J5cHRvSlMuVHJpcGxlREVTLmRlY3J5cHQodCxyLHtpdjpxfSk7dmFyIG89Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodSk7cmV0dXJuIG99LGdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbihxLHApe3ZhciBvPXRoaXMuZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTShxLHApO3ZhciBuPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgobyk7cmV0dXJuIG59LGdldEtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbihxLG8pe3ZhciBuPXRoaXMuZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTShxLG8pO3ZhciBwPXRoaXMuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4KG4pO3JldHVybiBwfSxwYXJzZVBsYWluUHJpdmF0ZVBLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBvPXt9O28uYWxncGFyYW09bnVsbDtpZihxLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSwwKTtpZihwLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBwbGFpbiBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMilcIn1pZihxLnN1YnN0cihwWzFdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDMpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSxwWzFdKTtpZihuLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNClcIn1pZihxLnN1YnN0cihuWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDUpXCJ9by5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxuWzBdKTtpZihxLnN1YnN0cihuWzFdLDIpPT1cIjA2XCIpe28uYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxuWzFdKX1pZihxLnN1YnN0cihwWzJdLDIpIT1cIjA0XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDYpXCJ9by5rZXlpZHg9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihxLHBbMl0pO3JldHVybiBvfSxnZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhQRU06ZnVuY3Rpb24obyl7dmFyIG49dGhpcy5nZXRIZXhGcm9tUEVNKG8sXCJQUklWQVRFIEtFWVwiKTt2YXIgcD10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChuKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4OmZ1bmN0aW9uKG4pe3ZhciBwPXRoaXMucGFyc2VQbGFpblByaXZhdGVQS0NTOEhleChuKTtpZihwLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dGhpcy5wYXJzZVByaXZhdGVSYXdSU0FLZXlIZXhBdE9iaihuLHApO3ZhciBvPXAua2V5O3ZhciBxPW5ldyBSU0FLZXkoKTtxLnNldFByaXZhdGVFeChvLm4sby5lLG8uZCxvLnAsby5xLG8uZHAsby5kcSxvLmNvKTtyZXR1cm4gcX1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe3RoaXMucGFyc2VQcml2YXRlUmF3RUNLZXlIZXhBdE9iaihuLHApO2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXT09PXVuZGVmaW5lZCl7dGhyb3dcIktKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZSB1bmRlZmluZWQ6IFwiK3AuYWxncGFyYW19dmFyIHI9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3AuYWxncGFyYW1dO3ZhciBxPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6cixwcnY6cC5rZXl9KTtyZXR1cm4gcX1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBwcml2YXRlIGtleSBhbGdvcml0aG1cIn19fSxnZXRSU0FLZXlGcm9tUHVibGljUEtDUzhQRU06ZnVuY3Rpb24obyl7dmFyIHA9dGhpcy5nZXRIZXhGcm9tUEVNKG8sXCJQVUJMSUMgS0VZXCIpO3ZhciBuPXRoaXMuZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4SGV4KHApO3JldHVybiBufSxnZXRLZXlGcm9tUHVibGljUEtDUzhQRU06ZnVuY3Rpb24obyl7dmFyIHA9dGhpcy5nZXRIZXhGcm9tUEVNKG8sXCJQVUJMSUMgS0VZXCIpO3ZhciBuPXRoaXMuZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4KHApO3JldHVybiBufSxnZXRLZXlGcm9tUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24obyl7dmFyIG49dGhpcy5wYXJzZVB1YmxpY1BLQ1M4SGV4KG8pO2lmKG4uYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt2YXIgcj10aGlzLnBhcnNlUHVibGljUmF3UlNBS2V5SGV4KG4ua2V5KTt2YXIgcD1uZXcgUlNBS2V5KCk7cC5zZXRQdWJsaWMoci5uLHIuZSk7cmV0dXJuIHB9ZWxzZXtpZihuLmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbbi5hbGdwYXJhbV09PT11bmRlZmluZWQpe3Rocm93XCJLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWUgdW5kZWZpbmVkOiBcIituLmFsZ3BhcmFtfXZhciBxPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtuLmFsZ3BhcmFtXTt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnEscHViOm4ua2V5fSk7cmV0dXJuIHB9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHVibGljIGtleSBhbGdvcml0aG1cIn19fSxwYXJzZVB1YmxpY1Jhd1JTQUtleUhleDpmdW5jdGlvbihwKXt2YXIgbj17fTtpZihwLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMSlcIn12YXIgbz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihwLDApO2lmKG8ubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDIpXCJ9aWYocC5zdWJzdHIob1swXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDMpXCJ9bi5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHAsb1swXSk7aWYocC5zdWJzdHIob1sxXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDQpXCJ9bi5lPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHAsb1sxXSk7cmV0dXJuIG59LHBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqOmZ1bmN0aW9uKG8scSl7dmFyIHA9cS5rZXlpZHg7aWYoby5zdWJzdHIocCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihvLHApO2lmKG4ubGVuZ3RoIT05KXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMilcIn1xLmtleT17fTtxLmtleS5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sblsxXSk7cS5rZXkuZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMl0pO3Eua2V5LmQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzNdKTtxLmtleS5wPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls0XSk7cS5rZXkucT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNV0pO3Eua2V5LmRwPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls2XSk7cS5rZXkuZHE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzddKTtxLmtleS5jbz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bOF0pfSxwYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqOmZ1bmN0aW9uKG8scSl7dmFyIHA9cS5rZXlpZHg7aWYoby5zdWJzdHIocCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIEVDQyBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihvLHApO2lmKG4ubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIEVDQyBwcml2YXRlIGtleShjb2RlOjAwMilcIn1pZihvLnN1YnN0cihuWzFdLDIpIT1cIjA0XCIpe3Rocm93XCJtYWxmb3JtZWQgRUNDIHByaXZhdGUga2V5KGNvZGU6MDAzKVwifXEua2V5PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sblsxXSl9LHBhcnNlUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24ocSl7dmFyIG89e307by5hbGdwYXJhbT1udWxsO3ZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3AubGVuZ3RofXZhciByPXBbMF07aWYocS5zdWJzdHIociwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSxyKTtpZihuLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAyKVwifWlmKHEuc3Vic3RyKG5bMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAzKVwifW8uYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblswXSk7aWYocS5zdWJzdHIoblsxXSwyKT09XCIwNlwiKXtvLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblsxXSl9aWYocS5zdWJzdHIocFsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDQpXCJ9by5rZXk9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzFdKS5zdWJzdHIoMik7cmV0dXJuIG99LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbihyKXt2YXIgcT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLDApO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitxLmxlbmd0aH12YXIgcD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHIscVswXSk7aWYocCE9XCIzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwMTA1MDBcIil7dGhyb3dcIlBLQ1M4IEFsZ29yaXRobUlkIGlzIG5vdCByc2FFbmNyeXB0aW9uXCJ9aWYoci5zdWJzdHIocVsxXSwyKSE9XCIwM1wiKXt0aHJvd1wiUEtDUzggUHVibGljIEtleSBpcyBub3QgQklUU1RSSU5HIGVuY2Fwc2xhdGVkLlwifXZhciB0PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoocixxWzFdKSsyO2lmKHIuc3Vic3RyKHQsMikhPVwiMzBcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IFNFUVVFTkNFLlwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHIsdCk7aWYobi5sZW5ndGghPTIpe3Rocm93XCJpbm5lciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK24ubGVuZ3RofWlmKHIuc3Vic3RyKG5bMF0sMikhPVwiMDJcIil7dGhyb3dcIk4gaXMgbm90IEFTTi4xIElOVEVHRVJcIn1pZihyLnN1YnN0cihuWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJFIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixuWzBdKTt2YXIgcz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihyLG5bMV0pO3ZhciBvPW5ldyBSU0FLZXkoKTtvLnNldFB1YmxpYyh1LHMpO3JldHVybiBvfSx9fSgpO1xuLyohIGtleXV0aWwtMS4wLjEzLmpzIChjKSAyMDEzLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIEtFWVVUSUw9ZnVuY3Rpb24oKXt2YXIgZD1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGsoQ3J5cHRvSlMuQUVTLHAscixxKX07dmFyIGU9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBrKENyeXB0b0pTLlRyaXBsZURFUyxwLHIscSl9O3ZhciBhPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gayhDcnlwdG9KUy5ERVMscCxyLHEpfTt2YXIgaz1mdW5jdGlvbihzLHgsdSxxKXt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHgpO3ZhciB3PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodSk7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShxKTt2YXIgdD17fTt0LmtleT13O3QuaXY9cDt0LmNpcGhlcnRleHQ9cjt2YXIgdj1zLmRlY3J5cHQodCx3LHtpdjpwfSk7cmV0dXJuIENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHYpfTt2YXIgbD1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGcoQ3J5cHRvSlMuQUVTLHAscixxKX07dmFyIG89ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBnKENyeXB0b0pTLlRyaXBsZURFUyxwLHIscSl9O3ZhciBmPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gZyhDcnlwdG9KUy5ERVMscCxyLHEpfTt2YXIgZz1mdW5jdGlvbih0LHksdixxKXt2YXIgcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHkpO3ZhciB4PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShxKTt2YXIgdz10LmVuY3J5cHQocyx4LHtpdjpwfSk7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh3LnRvU3RyaW5nKCkpO3ZhciB1PUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHIpO3JldHVybiB1fTt2YXIgaT17XCJBRVMtMjU2LUNCQ1wiOntwcm9jOmQsZXByb2M6bCxrZXlsZW46MzIsaXZsZW46MTZ9LFwiQUVTLTE5Mi1DQkNcIjp7cHJvYzpkLGVwcm9jOmwsa2V5bGVuOjI0LGl2bGVuOjE2fSxcIkFFUy0xMjgtQ0JDXCI6e3Byb2M6ZCxlcHJvYzpsLGtleWxlbjoxNixpdmxlbjoxNn0sXCJERVMtRURFMy1DQkNcIjp7cHJvYzplLGVwcm9jOm8sa2V5bGVuOjI0LGl2bGVuOjh9LFwiREVTLUNCQ1wiOntwcm9jOmEsZXByb2M6ZixrZXlsZW46OCxpdmxlbjo4fX07dmFyIGM9ZnVuY3Rpb24ocCl7cmV0dXJuIGlbcF1bXCJwcm9jXCJdfTt2YXIgbT1mdW5jdGlvbihwKXt2YXIgcj1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbShwKTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShyKTtyZXR1cm4gcX07dmFyIG49ZnVuY3Rpb24odCl7dmFyIHU9e307aWYodC5tYXRjaChuZXcgUmVnRXhwKFwiREVLLUluZm86IChbXixdKyksKFswLTlBLUZhLWZdKylcIixcIm1cIikpKXt1LmNpcGhlcj1SZWdFeHAuJDE7dS5pdnNhbHQ9UmVnRXhwLiQyfWlmKHQubWF0Y2gobmV3IFJlZ0V4cChcIi0tLS0tQkVHSU4gKFtBLVpdKykgUFJJVkFURSBLRVktLS0tLVwiKSkpe3UudHlwZT1SZWdFeHAuJDF9dmFyIHI9LTE7dmFyIHY9MDtpZih0LmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIikhPS0xKXtyPXQuaW5kZXhPZihcIlxcclxcblxcclxcblwiKTt2PTJ9aWYodC5pbmRleE9mKFwiXFxuXFxuXCIpIT0tMSl7cj10LmluZGV4T2YoXCJcXG5cXG5cIik7dj0xfXZhciBxPXQuaW5kZXhPZihcIi0tLS0tRU5EXCIpO2lmKHIhPS0xJiZxIT0tMSl7dmFyIHA9dC5zdWJzdHJpbmcocit2KjIscS12KTtwPXAucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3UuZGF0YT1wfXJldHVybiB1fTt2YXIgaj1mdW5jdGlvbihxLHkscCl7dmFyIHY9cC5zdWJzdHJpbmcoMCwxNik7dmFyIHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh2KTt2YXIgcj1DcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh5KTt2YXIgdT1pW3FdW1wia2V5bGVuXCJdK2lbcV1bXCJpdmxlblwiXTt2YXIgeD1cIlwiO3ZhciB3PW51bGw7Zm9yKDs7KXt2YXIgcz1DcnlwdG9KUy5hbGdvLk1ENS5jcmVhdGUoKTtpZih3IT1udWxsKXtzLnVwZGF0ZSh3KX1zLnVwZGF0ZShyKTtzLnVwZGF0ZSh0KTt3PXMuZmluYWxpemUoKTt4PXgrQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodyk7aWYoeC5sZW5ndGg+PXUqMil7YnJlYWt9fXZhciB6PXt9O3oua2V5aGV4PXguc3Vic3RyKDAsaVtxXVtcImtleWxlblwiXSoyKTt6Lml2aGV4PXguc3Vic3RyKGlbcV1bXCJrZXlsZW5cIl0qMixpW3FdW1wiaXZsZW5cIl0qMik7cmV0dXJuIHp9O3ZhciBiPWZ1bmN0aW9uKHAsdixyLHcpe3ZhciBzPUNyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2UocCk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocyk7dmFyIHU9aVt2XVtcInByb2NcIl07dmFyIHQ9dShxLHIsdyk7cmV0dXJuIHR9O3ZhciBoPWZ1bmN0aW9uKHAscyxxLHUpe3ZhciByPWlbc11bXCJlcHJvY1wiXTt2YXIgdD1yKHAscSx1KTtyZXR1cm4gdH07cmV0dXJue3ZlcnNpb246XCIxLjAuMFwiLGdldEhleEZyb21QRU06ZnVuY3Rpb24ocSx1KXt2YXIgcj1xO2lmKHIuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpPT0tMSl7dGhyb3dcImNhbid0IGZpbmQgUEVNIGhlYWRlcjogXCIrdX1pZih0eXBlb2YgdT09XCJzdHJpbmdcIiYmdSE9XCJcIil7cj1yLnJlcGxhY2UoXCItLS0tLUJFR0lOIFwiK3UrXCItLS0tLVwiLFwiXCIpO3I9ci5yZXBsYWNlKFwiLS0tLS1FTkQgXCIrdStcIi0tLS0tXCIsXCJcIil9ZWxzZXtyPXIucmVwbGFjZSgvLS0tLS1CRUdJTiBbXi1dKy0tLS0tLyxcIlwiKTtyPXIucmVwbGFjZSgvLS0tLS1FTkQgW14tXSstLS0tLS8sXCJcIil9dmFyIHQ9ci5yZXBsYWNlKC9cXHMrL2csXCJcIik7dmFyIHA9YjY0dG9oZXgodCk7cmV0dXJuIHB9LGdldERlY3J5cHRlZEtleUhleEJ5S2V5SVY6ZnVuY3Rpb24ocSx0LHMscil7dmFyIHA9Yyh0KTtyZXR1cm4gcChxLHMscil9LHBhcnNlUEtDUzVQRU06ZnVuY3Rpb24ocCl7cmV0dXJuIG4ocCl9LGdldEtleUFuZFVudXNlZEl2QnlQYXNzY29kZUFuZEl2c2FsdDpmdW5jdGlvbihxLHAscil7cmV0dXJuIGoocSxwLHIpfSxkZWNyeXB0S2V5QjY0OmZ1bmN0aW9uKHAscixxLHMpe3JldHVybiBiKHAscixxLHMpfSxnZXREZWNyeXB0ZWRLZXlIZXg6ZnVuY3Rpb24oeSx4KXt2YXIgcT1uKHkpO3ZhciB0PXEudHlwZTt2YXIgcj1xLmNpcGhlcjt2YXIgcD1xLml2c2FsdDt2YXIgcz1xLmRhdGE7dmFyIHc9aihyLHgscCk7dmFyIHY9dy5rZXloZXg7dmFyIHU9YihzLHIsdixwKTtyZXR1cm4gdX0sZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKHIscSl7dmFyIHM9dGhpcy5nZXREZWNyeXB0ZWRLZXlIZXgocixxKTt2YXIgcD1uZXcgUlNBS2V5KCk7cC5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHMpO3JldHVybiBwfSxnZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXg6ZnVuY3Rpb24oeCxzLEEsdCxyKXt2YXIgcD1cIlwiO2lmKHR5cGVvZiB0PT1cInVuZGVmaW5lZFwifHx0PT1udWxsKXt0PVwiQUVTLTI1Ni1DQkNcIn1pZih0eXBlb2YgaVt0XT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIktFWVVUSUwgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiBcIit0fWlmKHR5cGVvZiByPT1cInVuZGVmaW5lZFwifHxyPT1udWxsKXt2YXIgdj1pW3RdW1wiaXZsZW5cIl07dmFyIHU9bSh2KTtyPXUudG9VcHBlckNhc2UoKX12YXIgej1qKHQsQSxyKTt2YXIgeT16LmtleWhleDt2YXIgdz1oKHMsdCx5LHIpO3ZhciBxPXcucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7dmFyIHA9XCItLS0tLUJFR0lOIFwiK3grXCIgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3ArPVwiUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFxcclxcblwiO3ArPVwiREVLLUluZm86IFwiK3QrXCIsXCIrcitcIlxcclxcblwiO3ArPVwiXFxyXFxuXCI7cCs9cTtwKz1cIlxcclxcbi0tLS0tRU5EIFwiK3grXCIgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3JldHVybiBwfSxnZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21SU0FLZXk6ZnVuY3Rpb24oRCxFLHIsdCl7dmFyIEI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOjB9KTt2YXIgdz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpELm59KTt2YXIgQT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6RC5lfSk7dmFyIEM9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5kfSk7dmFyIHU9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5wfSk7dmFyIHM9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5xfSk7dmFyIHo9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5kbXAxfSk7dmFyIHY9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5kbXExfSk7dmFyIHk9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5jb2VmZn0pO3ZhciBGPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltCLHcsQSxDLHUscyx6LHYseV19KTt2YXIgeD1GLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgoXCJSU0FcIix4LEUscix0KX0sbmV3RW5jcnlwdGVkUEtDUzVQRU06ZnVuY3Rpb24ocCxxLHQsdSl7aWYodHlwZW9mIHE9PVwidW5kZWZpbmVkXCJ8fHE9PW51bGwpe3E9MTAyNH1pZih0eXBlb2YgdD09XCJ1bmRlZmluZWRcInx8dD09bnVsbCl7dD1cIjEwMDAxXCJ9dmFyIHI9bmV3IFJTQUtleSgpO3IuZ2VuZXJhdGUocSx0KTt2YXIgcz1udWxsO2lmKHR5cGVvZiB1PT1cInVuZGVmaW5lZFwifHx1PT1udWxsKXtzPXRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5KHIscCl9ZWxzZXtzPXRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5KHIscCx1KX1yZXR1cm4gc30sZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhQRU06ZnVuY3Rpb24ocil7aWYoci5tYXRjaCgvRU5DUllQVEVELykpe3Rocm93XCJwZW0gc2hhbGwgYmUgbm90IEVOQ1JZUFRFRFwifXZhciBxPXRoaXMuZ2V0SGV4RnJvbVBFTShyLFwiUFJJVkFURSBLRVlcIik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleChxKTtyZXR1cm4gcH0sZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXg6ZnVuY3Rpb24ocyl7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocywwKTtpZihyLmxlbmd0aCE9Myl7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMyBlbGVtZW50czogXCIrci5sZW5ndGh9dmFyIHE9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihzLHJbMV0pO2lmKHEhPVwiMzAwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwXCIpe3Rocm93XCJQS0NTOCBBbGdvcml0aG1JZGVudGlmaWVyIGlzIG5vdCByc2FFbmM6IFwiK3F9dmFyIHE9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihzLHJbMV0pO3ZhciB0PUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzJdKTt2YXIgdT1BU04xSEVYLmdldEhleE9mVl9BdE9iaih0LDApO3ZhciBwPW5ldyBSU0FLZXkoKTtwLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcodSk7cmV0dXJuIHB9LHBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTODpmdW5jdGlvbih3KXt2YXIgcz17fTt2YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LDApO2lmKHIubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMCkuaXRlbXMgIT0gMjogXCIrci5sZW5ndGh9cy5jaXBoZXJ0ZXh0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcsclsxXSk7dmFyIHk9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxyWzBdKTtpZih5Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMCkuaXRlbXMgIT0gMjogXCIreS5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx5WzBdKSE9XCIyYTg2NDg4NmY3MGQwMTA1MGRcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBwa2NzNVBCRVMyXCJ9dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyx5WzFdKTtpZih5Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xKS5pdGVtcyAhPSAyOiBcIitwLmxlbmd0aH12YXIgcT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHBbMV0pO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMSkuaXRlbXMgIT0gMjogXCIrcS5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyxxWzBdKSE9XCIyYTg2NDg4NmY3MGQwMzA3XCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgVHJpcGxlREVTXCJ9cy5lbmNyeXB0aW9uU2NoZW1lQWxnPVwiVHJpcGxlREVTXCI7cy5lbmNyeXB0aW9uU2NoZW1lSVY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyxxWzFdKTt2YXIgdD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHBbMF0pO2lmKHQubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMCkuaXRlbXMgIT0gMjogXCIrdC5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx0WzBdKSE9XCIyYTg2NDg4NmY3MGQwMTA1MGNcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBwa2NzNVBCS0RGMlwifXZhciB4PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcsdFsxXSk7aWYoeC5sZW5ndGg8Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjAuMSkuaXRlbXMgPCAyOiBcIit4Lmxlbmd0aH1zLnBia2RmMlNhbHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx4WzBdKTt2YXIgdT1BU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHhbMV0pO3RyeXtzLnBia2RmMkl0ZXI9cGFyc2VJbnQodSwxNil9Y2F0Y2godil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQgcGJrZGYySXRlcjogXCIrdX1yZXR1cm4gc30sZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtOmZ1bmN0aW9uKHUscCl7dmFyIHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh1LnBia2RmMlNhbHQpO3ZhciBxPXUucGJrZGYySXRlcjt2YXIgcz1DcnlwdG9KUy5QQktERjIocCx0LHtrZXlTaXplOjE5Mi8zMixpdGVyYXRpb25zOnF9KTt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShzKTtyZXR1cm4gcn0sZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbih4LHkpe3ZhciByPXRoaXMuZ2V0SGV4RnJvbVBFTSh4LFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpO3ZhciBwPXRoaXMucGFyc2VIZXhPZkVuY3J5cHRlZFBLQ1M4KHIpO3ZhciB1PUtFWVVUSUwuZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtKHAseSk7dmFyIHY9e307di5jaXBoZXJ0ZXh0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocC5jaXBoZXJ0ZXh0KTt2YXIgdD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUpO3ZhciBzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocC5lbmNyeXB0aW9uU2NoZW1lSVYpO3ZhciB3PUNyeXB0b0pTLlRyaXBsZURFUy5kZWNyeXB0KHYsdCx7aXY6c30pO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHcpO3JldHVybiBxfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocyxyKXt2YXIgcT10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocyxyKTt2YXIgcD10aGlzLmdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4KHEpO3JldHVybiBwfSxnZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocyxxKXt2YXIgcD10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocyxxKTt2YXIgcj10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChwKTtyZXR1cm4gcn0scGFyc2VQbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihzKXt2YXIgcT17fTtxLmFsZ3BhcmFtPW51bGw7aWYocy5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciByPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsMCk7aWYoci5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYocy5zdWJzdHIoclsxXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAzKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsclsxXSk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDQpXCJ9aWYocy5zdWJzdHIocFswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA1KVwifXEuYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHMscFswXSk7aWYocy5zdWJzdHIocFsxXSwyKT09XCIwNlwiKXtxLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHMscFsxXSl9aWYocy5zdWJzdHIoclsyXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA2KVwifXEua2V5aWR4PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoocyxyWzJdKTtyZXR1cm4gcX0sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNOmZ1bmN0aW9uKHEpe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShxLFwiUFJJVkFURSBLRVlcIik7dmFyIHI9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgocCk7cmV0dXJuIHJ9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihwKXt2YXIgdz10aGlzLnBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXgocCk7aWYody5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3RoaXMucGFyc2VQcml2YXRlUmF3UlNBS2V5SGV4QXRPYmoocCx3KTt2YXIgdT13LmtleTt2YXIgej1uZXcgUlNBS2V5KCk7ei5zZXRQcml2YXRlRXgodS5uLHUuZSx1LmQsdS5wLHUucSx1LmRwLHUuZHEsdS5jbyk7cmV0dXJuIHp9ZWxzZXtpZih3LmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd0VDS2V5SGV4QXRPYmoocCx3KTtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbdy5hbGdwYXJhbV09PT11bmRlZmluZWQpe3Rocm93XCJLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWUgdW5kZWZpbmVkOiBcIit3LmFsZ3BhcmFtfXZhciB2PUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVt3LmFsZ3BhcmFtXTt2YXIgej1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnZ9KTt6LnNldFB1YmxpY0tleUhleCh3LnB1YmtleSk7ei5zZXRQcml2YXRlS2V5SGV4KHcua2V5KTt6LmlzUHVibGljPWZhbHNlO3JldHVybiB6fWVsc2V7aWYody5hbGdvaWQ9PVwiMmE4NjQ4Y2UzODA0MDFcIil7dmFyIHQ9QVNOMUhFWC5nZXRWYnlMaXN0KHAsMCxbMSwxLDBdLFwiMDJcIik7dmFyIHM9QVNOMUhFWC5nZXRWYnlMaXN0KHAsMCxbMSwxLDFdLFwiMDJcIik7dmFyIHk9QVNOMUhFWC5nZXRWYnlMaXN0KHAsMCxbMSwxLDJdLFwiMDJcIik7dmFyIEI9QVNOMUhFWC5nZXRWYnlMaXN0KHAsMCxbMiwwXSxcIjAyXCIpO3ZhciByPW5ldyBCaWdJbnRlZ2VyKHQsMTYpO3ZhciBxPW5ldyBCaWdJbnRlZ2VyKHMsMTYpO3ZhciB4PW5ldyBCaWdJbnRlZ2VyKHksMTYpO3ZhciBBPW5ldyBCaWdJbnRlZ2VyKEIsMTYpO3ZhciB6PW5ldyBLSlVSLmNyeXB0by5EU0EoKTt6LnNldFByaXZhdGUocixxLHgsbnVsbCxBKTtyZXR1cm4gen1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBwcml2YXRlIGtleSBhbGdvcml0aG1cIn19fX0sZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKHEpe3ZhciByPXRoaXMuZ2V0SGV4RnJvbVBFTShxLFwiUFVCTElDIEtFWVwiKTt2YXIgcD10aGlzLmdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleChyKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKHEpe3ZhciByPXRoaXMuZ2V0SGV4RnJvbVBFTShxLFwiUFVCTElDIEtFWVwiKTt2YXIgcD10aGlzLmdldEtleUZyb21QdWJsaWNQS0NTOEhleChyKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBwPXRoaXMucGFyc2VQdWJsaWNQS0NTOEhleChxKTtpZihwLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dmFyIHU9dGhpcy5wYXJzZVB1YmxpY1Jhd1JTQUtleUhleChwLmtleSk7dmFyIHI9bmV3IFJTQUtleSgpO3Iuc2V0UHVibGljKHUubix1LmUpO3JldHVybiByfWVsc2V7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3AuYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrcC5hbGdwYXJhbX12YXIgcz1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbcC5hbGdwYXJhbV07dmFyIHI9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpzLHB1YjpwLmtleX0pO3JldHVybiByfWVsc2V7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4Y2UzODA0MDFcIil7dmFyIHQ9cC5hbGdwYXJhbTt2YXIgdj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLmtleSwwKTt2YXIgcj1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7ci5zZXRQdWJsaWMobmV3IEJpZ0ludGVnZXIodC5wLDE2KSxuZXcgQmlnSW50ZWdlcih0LnEsMTYpLG5ldyBCaWdJbnRlZ2VyKHQuZywxNiksbmV3IEJpZ0ludGVnZXIodiwxNikpO3JldHVybiByfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnb3JpdGhtXCJ9fX19LHBhcnNlUHVibGljUmF3UlNBS2V5SGV4OmZ1bmN0aW9uKHIpe3ZhciBwPXt9O2lmKHIuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAxKVwifXZhciBxPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHIsMCk7aWYocS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMilcIn1pZihyLnN1YnN0cihxWzBdLDIpIT1cIjAyXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMylcIn1wLm49QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixxWzBdKTtpZihyLnN1YnN0cihxWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwNClcIn1wLmU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixxWzFdKTtyZXR1cm4gcH0scGFyc2VQcml2YXRlUmF3UlNBS2V5SGV4QXRPYmo6ZnVuY3Rpb24ocSxzKXt2YXIgcj1zLmtleWlkeDtpZihxLnN1YnN0cihyLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscik7aWYocC5sZW5ndGghPTkpe3Rocm93XCJtYWxmb3JtZWQgUlNBIHByaXZhdGUga2V5KGNvZGU6MDAyKVwifXMua2V5PXt9O3Mua2V5Lm49QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzFdKTtzLmtleS5lPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsyXSk7cy5rZXkuZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbM10pO3Mua2V5LnA9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzRdKTtzLmtleS5xPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs1XSk7cy5rZXkuZHA9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzZdKTtzLmtleS5kcT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbN10pO3Mua2V5LmNvPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs4XSl9LHBhcnNlUHJpdmF0ZVJhd0VDS2V5SGV4QXRPYmo6ZnVuY3Rpb24ocCx0KXt2YXIgcT10LmtleWlkeDt2YXIgcj1BU04xSEVYLmdldFZieUxpc3QocCxxLFsxXSxcIjA0XCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdChwLHEsWzIsMF0sXCIwM1wiKS5zdWJzdHIoMik7dC5rZXk9cjt0LnB1YmtleT1zfSxwYXJzZVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHMpe3ZhciBxPXt9O3EuYWxncGFyYW09bnVsbDt2YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLDApO2lmKHIubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIityLmxlbmd0aH12YXIgdD1yWzBdO2lmKHMuc3Vic3RyKHQsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAxKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsdCk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMilcIn1pZihzLnN1YnN0cihwWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMylcIn1xLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMF0pO2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMDZcIil7cS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMV0pfWVsc2V7aWYocy5zdWJzdHIocFsxXSwyKT09XCIzMFwiKXtxLmFsZ3BhcmFtPXt9O3EuYWxncGFyYW0ucD1BU04xSEVYLmdldFZieUxpc3QocyxwWzFdLFswXSxcIjAyXCIpO3EuYWxncGFyYW0ucT1BU04xSEVYLmdldFZieUxpc3QocyxwWzFdLFsxXSxcIjAyXCIpO3EuYWxncGFyYW0uZz1BU04xSEVYLmdldFZieUxpc3QocyxwWzFdLFsyXSxcIjAyXCIpfX1pZihzLnN1YnN0cihyWzFdLDIpIT1cIjAzXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwNClcIn1xLmtleT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHJbMV0pLnN1YnN0cigyKTtyZXR1cm4gcX0sZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHQpe3ZhciBzPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHQsMCk7aWYocy5sZW5ndGghPTIpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3MubGVuZ3RofXZhciByPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoodCxzWzBdKTtpZihyIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWQgaXMgbm90IHJzYUVuY3J5cHRpb25cIn1pZih0LnN1YnN0cihzWzFdLDIpIT1cIjAzXCIpe3Rocm93XCJQS0NTOCBQdWJsaWMgS2V5IGlzIG5vdCBCSVRTVFJJTkcgZW5jYXBzbGF0ZWQuXCJ9dmFyIHY9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaih0LHNbMV0pKzI7aWYodC5zdWJzdHIodiwyKSE9XCIzMFwiKXt0aHJvd1wiUEtDUzggUHVibGljIEtleSBpcyBub3QgU0VRVUVOQ0UuXCJ9dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodCx2KTtpZihwLmxlbmd0aCE9Mil7dGhyb3dcImlubmVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrcC5sZW5ndGh9aWYodC5zdWJzdHIocFswXSwyKSE9XCIwMlwiKXt0aHJvd1wiTiBpcyBub3QgQVNOLjEgSU5URUdFUlwifWlmKHQuc3Vic3RyKHBbMV0sMikhPVwiMDJcIil7dGhyb3dcIkUgaXMgbm90IEFTTi4xIElOVEVHRVJcIn12YXIgdz1BU04xSEVYLmdldEhleE9mVl9BdE9iaih0LHBbMF0pO3ZhciB1PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHQscFsxXSk7dmFyIHE9bmV3IFJTQUtleSgpO3Euc2V0UHVibGljKHcsdSk7cmV0dXJuIHF9LH19KCk7S0VZVVRJTC5nZXRLZXk9ZnVuY3Rpb24oZixlLGgpe2lmKHR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmYgaW5zdGFuY2VvZiBSU0FLZXkpe3JldHVybiBmfWlmKHR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmZiBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXtyZXR1cm4gZn1pZih0eXBlb2YgS0pVUi5jcnlwdG8uRFNBIT1cInVuZGVmaW5lZFwiJiZmIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBKXtyZXR1cm4gZn1pZihmLmN1cnZlIT09dW5kZWZpbmVkJiZmLnh5IT09dW5kZWZpbmVkJiZmLmQ9PT11bmRlZmluZWQpe3JldHVybiBuZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe3B1YjpmLnh5LGN1cnZlOmYuY3VydmV9KX1pZihmLmN1cnZlIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3JldHVybiBuZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe3BydjpmLmQsY3VydmU6Zi5jdXJ2ZX0pfWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kPT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5zZXRQdWJsaWMoZi5uLGYuZSk7cmV0dXJuIHd9aWYoZi5rdHk9PT11bmRlZmluZWQmJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQmJmYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmRwIT09dW5kZWZpbmVkJiZmLmRxIT09dW5kZWZpbmVkJiZmLmNvIT09dW5kZWZpbmVkJiZmLnFpPT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5zZXRQcml2YXRlRXgoZi5uLGYuZSxmLmQsZi5wLGYucSxmLmRwLGYuZHEsZi5jbyk7cmV0dXJuIHd9aWYoZi5rdHk9PT11bmRlZmluZWQmJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQmJmYucD09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZShmLm4sZi5lLGYuZCk7cmV0dXJuIHd9aWYoZi5wIT09dW5kZWZpbmVkJiZmLnEhPT11bmRlZmluZWQmJmYuZyE9PXVuZGVmaW5lZCYmZi55IT09dW5kZWZpbmVkJiZmLng9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBLSlVSLmNyeXB0by5EU0EoKTt3LnNldFB1YmxpYyhmLnAsZi5xLGYuZyxmLnkpO3JldHVybiB3fWlmKGYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmchPT11bmRlZmluZWQmJmYueSE9PXVuZGVmaW5lZCYmZi54IT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQcml2YXRlKGYucCxmLnEsZi5nLGYueSxmLngpO3JldHVybiB3fWlmKGYua3R5PT09XCJSU0FcIiYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHVibGljKGI2NHV0b2hleChmLm4pLGI2NHV0b2hleChmLmUpKTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQmJmYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmRwIT09dW5kZWZpbmVkJiZmLmRxIT09dW5kZWZpbmVkJiZmLnFpIT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5zZXRQcml2YXRlRXgoYjY0dXRvaGV4KGYubiksYjY0dXRvaGV4KGYuZSksYjY0dXRvaGV4KGYuZCksYjY0dXRvaGV4KGYucCksYjY0dXRvaGV4KGYucSksYjY0dXRvaGV4KGYuZHApLGI2NHV0b2hleChmLmRxKSxiNjR1dG9oZXgoZi5xaSkpO3JldHVybiB3fWlmKGYua3R5PT09XCJSU0FcIiYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZCE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZShiNjR1dG9oZXgoZi5uKSxiNjR1dG9oZXgoZi5lKSxiNjR1dG9oZXgoZi5kKSk7cmV0dXJuIHd9aWYoZi5rdHk9PT1cIkVDXCImJmYuY3J2IT09dW5kZWZpbmVkJiZmLnghPT11bmRlZmluZWQmJmYueSE9PXVuZGVmaW5lZCYmZi5kPT09dW5kZWZpbmVkKXt2YXIgZD1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmYuY3J2fSk7dmFyIGw9ZC5lY3BhcmFtcy5rZXlsZW4vNDt2YXIgcj0oXCIwMDAwMDAwMDAwXCIrYjY0dXRvaGV4KGYueCkpLnNsaWNlKC1sKTt2YXIgbj0oXCIwMDAwMDAwMDAwXCIrYjY0dXRvaGV4KGYueSkpLnNsaWNlKC1sKTt2YXIgbT1cIjA0XCIrcituO2Quc2V0UHVibGljS2V5SGV4KG0pO3JldHVybiBkfWlmKGYua3R5PT09XCJFQ1wiJiZmLmNydiE9PXVuZGVmaW5lZCYmZi54IT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYuZCE9PXVuZGVmaW5lZCl7dmFyIGQ9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpmLmNydn0pO3ZhciBsPWQuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIHI9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLngpKS5zbGljZSgtbCk7dmFyIG49KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLnkpKS5zbGljZSgtbCk7dmFyIG09XCIwNFwiK3Irbjt2YXIgYT0oXCIwMDAwMDAwMDAwXCIrYjY0dXRvaGV4KGYuZCkpLnNsaWNlKC1sKTtkLnNldFB1YmxpY0tleUhleChtKTtkLnNldFByaXZhdGVLZXlIZXgoYSk7cmV0dXJuIGR9aWYoZi5pbmRleE9mKFwiLUVORCBDRVJUSUZJQ0FURS1cIiwwKSE9LTF8fGYuaW5kZXhPZihcIi1FTkQgWDUwOSBDRVJUSUZJQ0FURS1cIiwwKSE9LTF8fGYuaW5kZXhPZihcIi1FTkQgVFJVU1RFRCBDRVJUSUZJQ0FURS1cIiwwKSE9LTEpe3JldHVybiBYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0UEVNKGYpfWlmKGg9PT1cInBrY3M4cHViXCIpe3JldHVybiBLRVlVVElMLmdldEtleUZyb21QdWJsaWNQS0NTOEhleChmKX1pZihmLmluZGV4T2YoXCItRU5EIFBVQkxJQyBLRVktXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4UEVNKGYpfWlmKGg9PT1cInBrY3M1cHJ2XCIpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoZik7cmV0dXJuIHd9aWYoaD09PVwicGtjczVwcnZcIil7dmFyIHc9bmV3IFJTQUtleSgpO3cucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhmKTtyZXR1cm4gd31pZihmLmluZGV4T2YoXCItRU5EIFJTQSBQUklWQVRFIEtFWS1cIikhPS0xJiZmLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKT09LTEpe3ZhciBpPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShmLFwiUlNBIFBSSVZBVEUgS0VZXCIpO3JldHVybiBLRVlVVElMLmdldEtleShpLG51bGwsXCJwa2NzNXBydlwiKX1pZihmLmluZGV4T2YoXCItRU5EIERTQSBQUklWQVRFIEtFWS1cIikhPS0xJiZmLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKT09LTEpe3ZhciB1PXRoaXMuZ2V0SGV4RnJvbVBFTShmLFwiRFNBIFBSSVZBVEUgS0VZXCIpO3ZhciB0PUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzFdLFwiMDJcIik7dmFyIHM9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMl0sXCIwMlwiKTt2YXIgdj1BU04xSEVYLmdldFZieUxpc3QodSwwLFszXSxcIjAyXCIpO3ZhciBqPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzRdLFwiMDJcIik7dmFyIGs9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbNV0sXCIwMlwiKTt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQcml2YXRlKG5ldyBCaWdJbnRlZ2VyKHQsMTYpLG5ldyBCaWdJbnRlZ2VyKHMsMTYpLG5ldyBCaWdJbnRlZ2VyKHYsMTYpLG5ldyBCaWdJbnRlZ2VyKGosMTYpLG5ldyBCaWdJbnRlZ2VyKGssMTYpKTtyZXR1cm4gd31pZihmLmluZGV4T2YoXCItRU5EIFBSSVZBVEUgS0VZLVwiKSE9LTEpe3JldHVybiBLRVlVVElMLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOFBFTShmKX1pZihmLmluZGV4T2YoXCItRU5EIFJTQSBQUklWQVRFIEtFWS1cIikhPS0xJiZmLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKSE9LTEpe3JldHVybiBLRVlVVElMLmdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTNVBFTShmLGUpfWlmKGYuaW5kZXhPZihcIi1FTkQgRUMgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIikhPS0xKXt2YXIgdT1LRVlVVElMLmdldERlY3J5cHRlZEtleUhleChmLGUpO3ZhciB3PUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzFdLFwiMDRcIik7dmFyIGM9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMiwwXSxcIjA2XCIpO3ZhciBvPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzMsMF0sXCIwM1wiKS5zdWJzdHIoMik7dmFyIGI9XCJcIjtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbY10hPT11bmRlZmluZWQpe2I9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW2NdfWVsc2V7dGhyb3dcInVuZGVmaW5lZCBPSUQoaGV4KSBpbiBLSlVSLmNyeXB0by5PSUQ6IFwiK2N9dmFyIGQ9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtuYW1lOmJ9KTtkLnNldFB1YmxpY0tleUhleChvKTtkLnNldFByaXZhdGVLZXlIZXgodyk7ZC5pc1B1YmxpYz1mYWxzZTtyZXR1cm4gZH1pZihmLmluZGV4T2YoXCItRU5EIERTQSBQUklWQVRFIEtFWS1cIikhPS0xJiZmLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKSE9LTEpe3ZhciB1PUtFWVVUSUwuZ2V0RGVjcnlwdGVkS2V5SGV4KGYsZSk7dmFyIHQ9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMV0sXCIwMlwiKTt2YXIgcz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsyXSxcIjAyXCIpO3ZhciB2PUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzNdLFwiMDJcIik7dmFyIGo9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbNF0sXCIwMlwiKTt2YXIgaz1BU04xSEVYLmdldFZieUxpc3QodSwwLFs1XSxcIjAyXCIpO3ZhciB3PW5ldyBLSlVSLmNyeXB0by5EU0EoKTt3LnNldFByaXZhdGUobmV3IEJpZ0ludGVnZXIodCwxNiksbmV3IEJpZ0ludGVnZXIocywxNiksbmV3IEJpZ0ludGVnZXIodiwxNiksbmV3IEJpZ0ludGVnZXIoaiwxNiksbmV3IEJpZ0ludGVnZXIoaywxNikpO3JldHVybiB3fWlmKGYuaW5kZXhPZihcIi1FTkQgRU5DUllQVEVEIFBSSVZBVEUgS0VZLVwiKSE9LTEpe3JldHVybiBLRVlVVElMLmdldEtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTShmLGUpfXRocm93XCJub3Qgc3VwcG9ydGVkIGFyZ3VtZW50XCJ9O0tFWVVUSUwuZ2VuZXJhdGVLZXlwYWlyPWZ1bmN0aW9uKGEsYyl7aWYoYT09XCJSU0FcIil7dmFyIGI9Yzt2YXIgaD1uZXcgUlNBS2V5KCk7aC5nZW5lcmF0ZShiLFwiMTAwMDFcIik7aC5pc1ByaXZhdGU9dHJ1ZTtoLmlzUHVibGljPXRydWU7dmFyIGY9bmV3IFJTQUtleSgpO3ZhciBlPWgubi50b1N0cmluZygxNik7dmFyIGk9aC5lLnRvU3RyaW5nKDE2KTtmLnNldFB1YmxpYyhlLGkpO2YuaXNQcml2YXRlPWZhbHNlO2YuaXNQdWJsaWM9dHJ1ZTt2YXIgaz17fTtrLnBydktleU9iaj1oO2sucHViS2V5T2JqPWY7cmV0dXJuIGt9ZWxzZXtpZihhPT1cIkVDXCIpe3ZhciBkPWM7dmFyIGc9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpkfSk7dmFyIGo9Zy5nZW5lcmF0ZUtleVBhaXJIZXgoKTt2YXIgaD1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmR9KTtoLnNldFB1YmxpY0tleUhleChqLmVjcHViaGV4KTtoLnNldFByaXZhdGVLZXlIZXgoai5lY3BydmhleCk7aC5pc1ByaXZhdGU9dHJ1ZTtoLmlzUHVibGljPWZhbHNlO3ZhciBmPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZH0pO2Yuc2V0UHVibGljS2V5SGV4KGouZWNwdWJoZXgpO2YuaXNQcml2YXRlPWZhbHNlO2YuaXNQdWJsaWM9dHJ1ZTt2YXIgaz17fTtrLnBydktleU9iaj1oO2sucHViS2V5T2JqPWY7cmV0dXJuIGt9ZWxzZXt0aHJvd1widW5rbm93biBhbGdvcml0aG06IFwiK2F9fX07S0VZVVRJTC5nZXRQRU09ZnVuY3Rpb24oYSxyLG8sZyxqKXt2YXIgdj1LSlVSLmFzbjE7dmFyIHU9S0pVUi5jcnlwdG87ZnVuY3Rpb24gcChzKXt2YXIgdz1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtcImludFwiOntiaWdpbnQ6cy5ufX0se1wiaW50XCI6cy5lfSx7XCJpbnRcIjp7YmlnaW50OnMuZH19LHtcImludFwiOntiaWdpbnQ6cy5wfX0se1wiaW50XCI6e2JpZ2ludDpzLnF9fSx7XCJpbnRcIjp7YmlnaW50OnMuZG1wMX19LHtcImludFwiOntiaWdpbnQ6cy5kbXExfX0se1wiaW50XCI6e2JpZ2ludDpzLmNvZWZmfX1dfSk7cmV0dXJuIHd9ZnVuY3Rpb24gcSh3KXt2YXIgcz1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjF9LHtvY3RzdHI6e2hleDp3LnBydktleUhleH19LHt0YWc6W1wiYTBcIix0cnVlLHtvaWQ6e25hbWU6dy5jdXJ2ZU5hbWV9fV19LHt0YWc6W1wiYTFcIix0cnVlLHtiaXRzdHI6e2hleDpcIjAwXCIrdy5wdWJLZXlIZXh9fV19XX0pO3JldHVybiBzfWZ1bmN0aW9uIG4ocyl7dmFyIHc9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7XCJpbnRcIjp7YmlnaW50OnMucH19LHtcImludFwiOntiaWdpbnQ6cy5xfX0se1wiaW50XCI6e2JpZ2ludDpzLmd9fSx7XCJpbnRcIjp7YmlnaW50OnMueX19LHtcImludFwiOntiaWdpbnQ6cy54fX1dfSk7cmV0dXJuIHd9aWYoKCh0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgUlNBS2V5KXx8KHR5cGVvZiB1LkRTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIHUuRFNBKXx8KHR5cGVvZiB1LkVDRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgdS5FQ0RTQSkpJiZhLmlzUHVibGljPT10cnVlJiYocj09PXVuZGVmaW5lZHx8cj09XCJQS0NTOFBVQlwiKSl7dmFyIHQ9bmV3IEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIlBVQkxJQyBLRVlcIil9aWYocj09XCJQS0NTMVBSVlwiJiZ0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgUlNBS2V5JiYobz09PXVuZGVmaW5lZHx8bz09bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgdD1wKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIlJTQSBQUklWQVRFIEtFWVwiKX1pZihyPT1cIlBLQ1MxUFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSYmKG89PT11bmRlZmluZWR8fG89PW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIGY9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKHtuYW1lOmEuY3VydmVOYW1lfSk7dmFyIGw9Zi5nZXRFbmNvZGVkSGV4KCk7dmFyIGU9cShhKTt2YXIgaz1lLmdldEVuY29kZWRIZXgoKTt2YXIgaT1cIlwiO2krPXYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChsLFwiRUMgUEFSQU1FVEVSU1wiKTtpKz12LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoayxcIkVDIFBSSVZBVEUgS0VZXCIpO3JldHVybiBpfWlmKHI9PVwiUEtDUzFQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSYmKG89PT11bmRlZmluZWR8fG89PW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9bihhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJEU0EgUFJJVkFURSBLRVlcIil9aWYocj09XCJQS0NTNVBSVlwiJiZ0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgUlNBS2V5JiYobyE9PXVuZGVmaW5lZCYmbyE9bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgdD1wKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKGc9PT11bmRlZmluZWQpe2c9XCJERVMtRURFMy1DQkNcIn1yZXR1cm4gdGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgoXCJSU0FcIixtLG8sZyl9aWYocj09XCJQS0NTNVBSVlwiJiZ0eXBlb2YgS0pVUi5jcnlwdG8uRUNEU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSYmKG8hPT11bmRlZmluZWQmJm8hPW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9cShhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihnPT09dW5kZWZpbmVkKXtnPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiRUNcIixtLG8sZyl9aWYocj09XCJQS0NTNVBSVlwiJiZ0eXBlb2YgS0pVUi5jcnlwdG8uRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBJiYobyE9PXVuZGVmaW5lZCYmbyE9bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgdD1uKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKGc9PT11bmRlZmluZWQpe2c9XCJERVMtRURFMy1DQkNcIn1yZXR1cm4gdGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgoXCJEU0FcIixtLG8sZyl9dmFyIGg9ZnVuY3Rpb24odyxzKXt2YXIgeT1iKHcscyk7dmFyIHg9bmV3IEtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe3NlcTpbe29pZDp7bmFtZTpcInBrY3M1UEJFUzJcIn19LHtzZXE6W3tzZXE6W3tvaWQ6e25hbWU6XCJwa2NzNVBCS0RGMlwifX0se3NlcTpbe29jdHN0cjp7aGV4OnkucGJrZGYyU2FsdH19LHtcImludFwiOnkucGJrZGYySXRlcn1dfV19LHtzZXE6W3tvaWQ6e25hbWU6XCJkZXMtRURFMy1DQkNcIn19LHtvY3RzdHI6e2hleDp5LmVuY3J5cHRpb25TY2hlbWVJVn19XX1dfV19LHtvY3RzdHI6e2hleDp5LmNpcGhlcnRleHR9fV19KTtyZXR1cm4geC5nZXRFbmNvZGVkSGV4KCl9O3ZhciBiPWZ1bmN0aW9uKEQsRSl7dmFyIHg9MTAwO3ZhciBDPUNyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKDgpO3ZhciBCPVwiREVTLUVERTMtQ0JDXCI7dmFyIHM9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oOCk7dmFyIHk9Q3J5cHRvSlMuUEJLREYyKEUsQyx7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczp4fSk7dmFyIHo9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShEKTt2YXIgQT1DcnlwdG9KUy5UcmlwbGVERVMuZW5jcnlwdCh6LHkse2l2OnN9KStcIlwiO3ZhciB3PXt9O3cuY2lwaGVydGV4dD1BO3cucGJrZGYyU2FsdD1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShDKTt3LnBia2RmMkl0ZXI9eDt3LmVuY3J5cHRpb25TY2hlbWVBbGc9Qjt3LmVuY3J5cHRpb25TY2hlbWVJVj1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShzKTtyZXR1cm4gd307aWYocj09XCJQS0NTOFBSVlwiJiZ0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgUlNBS2V5JiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIGQ9cChhKTt2YXIgYz1kLmdldEVuY29kZWRIZXgoKTt2YXIgdD1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJyc2FFbmNyeXB0aW9uXCJ9fSx7XCJudWxsXCI6dHJ1ZX1dfSx7b2N0c3RyOntoZXg6Y319XX0pO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKG89PT11bmRlZmluZWR8fG89PW51bGwpe3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIlBSSVZBVEUgS0VZXCIpfWVsc2V7dmFyIGs9aChtLG8pO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoayxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKX19aWYocj09XCJQS0NTOFBSVlwiJiZ0eXBlb2YgS0pVUi5jcnlwdG8uRUNEU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBkPW5ldyBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjF9LHtvY3RzdHI6e2hleDphLnBydktleUhleH19LHt0YWc6W1wiYTFcIix0cnVlLHtiaXRzdHI6e2hleDpcIjAwXCIrYS5wdWJLZXlIZXh9fV19XX0pO3ZhciBjPWQuZ2V0RW5jb2RlZEhleCgpO3ZhciB0PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcImVjUHVibGljS2V5XCJ9fSx7b2lkOntuYW1lOmEuY3VydmVOYW1lfX1dfSx7b2N0c3RyOntoZXg6Y319XX0pO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKG89PT11bmRlZmluZWR8fG89PW51bGwpe3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIlBSSVZBVEUgS0VZXCIpfWVsc2V7dmFyIGs9aChtLG8pO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoayxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKX19aWYocj09XCJQS0NTOFBSVlwiJiZ0eXBlb2YgS0pVUi5jcnlwdG8uRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6YS54fSk7dmFyIGM9ZC5nZXRFbmNvZGVkSGV4KCk7dmFyIHQ9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7c2VxOlt7b2lkOntuYW1lOlwiZHNhXCJ9fSx7c2VxOlt7XCJpbnRcIjp7YmlnaW50OmEucH19LHtcImludFwiOntiaWdpbnQ6YS5xfX0se1wiaW50XCI6e2JpZ2ludDphLmd9fV19XX0se29jdHN0cjp7aGV4OmN9fV19KTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihvPT09dW5kZWZpbmVkfHxvPT1udWxsKXtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQUklWQVRFIEtFWVwiKX1lbHNle3ZhciBrPWgobSxvKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fXRocm93XCJ1bnN1cHBvcnRlZCBvYmplY3Qgbm9yIGZvcm1hdFwifTtLRVlVVElMLmdldEtleUZyb21DU1JQRU09ZnVuY3Rpb24oYil7dmFyIGE9S0VZVVRJTC5nZXRIZXhGcm9tUEVNKGIsXCJDRVJUSUZJQ0FURSBSRVFVRVNUXCIpO3ZhciBjPUtFWVVUSUwuZ2V0S2V5RnJvbUNTUkhleChhKTtyZXR1cm4gY307S0VZVVRJTC5nZXRLZXlGcm9tQ1NSSGV4PWZ1bmN0aW9uKGEpe3ZhciBjPUtFWVVUSUwucGFyc2VDU1JIZXgoYSk7dmFyIGI9S0VZVVRJTC5nZXRLZXkoYy5wOHB1YmtleWhleCxudWxsLFwicGtjczhwdWJcIik7cmV0dXJuIGJ9O0tFWVVUSUwucGFyc2VDU1JIZXg9ZnVuY3Rpb24oYyl7dmFyIGI9e307dmFyIGU9YztpZihlLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAxKVwifXZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsMCk7aWYoZC5sZW5ndGg8MSl7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDIpXCJ9aWYoZS5zdWJzdHIoZFswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwMylcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLGRbMF0pO2lmKGEubGVuZ3RoPDMpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDA0KVwifWIucDhwdWJrZXloZXg9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihlLGFbMl0pO3JldHVybiBifTtLRVlVVElMLmdldEpXS0Zyb21LZXk9ZnVuY3Rpb24oZCl7dmFyIGI9e307aWYoZCBpbnN0YW5jZW9mIFJTQUtleSYmZC5pc1ByaXZhdGUpe2Iua3R5PVwiUlNBXCI7Yi5uPWhleHRvYjY0dShkLm4udG9TdHJpbmcoMTYpKTtiLmU9aGV4dG9iNjR1KGQuZS50b1N0cmluZygxNikpO2IuZD1oZXh0b2I2NHUoZC5kLnRvU3RyaW5nKDE2KSk7Yi5wPWhleHRvYjY0dShkLnAudG9TdHJpbmcoMTYpKTtiLnE9aGV4dG9iNjR1KGQucS50b1N0cmluZygxNikpO2IuZHA9aGV4dG9iNjR1KGQuZG1wMS50b1N0cmluZygxNikpO2IuZHE9aGV4dG9iNjR1KGQuZG1xMS50b1N0cmluZygxNikpO2IucWk9aGV4dG9iNjR1KGQuY29lZmYudG9TdHJpbmcoMTYpKTtyZXR1cm4gYn1lbHNle2lmKGQgaW5zdGFuY2VvZiBSU0FLZXkmJmQuaXNQdWJsaWMpe2Iua3R5PVwiUlNBXCI7Yi5uPWhleHRvYjY0dShkLm4udG9TdHJpbmcoMTYpKTtiLmU9aGV4dG9iNjR1KGQuZS50b1N0cmluZygxNikpO3JldHVybiBifWVsc2V7aWYoZCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiZkLmlzUHJpdmF0ZSl7dmFyIGE9ZC5nZXRTaG9ydE5JU1RQQ3VydmVOYW1lKCk7aWYoYSE9PVwiUC0yNTZcIiYmYSE9PVwiUC0zODRcIil7dGhyb3dcInVuc3VwcG9ydGVkIGN1cnZlIG5hbWUgZm9yIEpXVDogXCIrYX12YXIgYz1kLmdldFB1YmxpY0tleVhZSGV4KCk7Yi5rdHk9XCJFQ1wiO2IuY3J2PWE7Yi54PWhleHRvYjY0dShjLngpO2IueT1oZXh0b2I2NHUoYy55KTtiLmQ9aGV4dG9iNjR1KGQucHJ2S2V5SGV4KTtyZXR1cm4gYn1lbHNle2lmKGQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSYmZC5pc1B1YmxpYyl7dmFyIGE9ZC5nZXRTaG9ydE5JU1RQQ3VydmVOYW1lKCk7aWYoYSE9PVwiUC0yNTZcIiYmYSE9PVwiUC0zODRcIil7dGhyb3dcInVuc3VwcG9ydGVkIGN1cnZlIG5hbWUgZm9yIEpXVDogXCIrYX12YXIgYz1kLmdldFB1YmxpY0tleVhZSGV4KCk7Yi5rdHk9XCJFQ1wiO2IuY3J2PWE7Yi54PWhleHRvYjY0dShjLngpO2IueT1oZXh0b2I2NHUoYy55KTtyZXR1cm4gYn19fX10aHJvd1wibm90IHN1cHBvcnRlZCBrZXkgb2JqZWN0XCJ9O1xuLyohIHJzYXBlbS0xLjEuanMgKGMpIDIwMTIgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gX3JzYXBlbV9wZW1Ub0Jhc2U2NChiKXt2YXIgYT1iO2E9YS5yZXBsYWNlKFwiLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLVwiLFwiXCIpO2E9YS5yZXBsYWNlKFwiLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cIixcIlwiKTthPWEucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3JldHVybiBhfWZ1bmN0aW9uIF9yc2FwZW1fZ2V0UG9zQXJyYXlPZkNoaWxkcmVuRnJvbUhleChkKXt2YXIgaj1uZXcgQXJyYXkoKTt2YXIgaz1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGQsMCk7dmFyIGY9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsayk7dmFyIGg9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsZik7dmFyIGI9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsaCk7dmFyIGw9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsYik7dmFyIGU9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsbCk7dmFyIGc9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsZSk7dmFyIGM9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsZyk7dmFyIGk9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsYyk7ai5wdXNoKGssZixoLGIsbCxlLGcsYyxpKTtyZXR1cm4gan1mdW5jdGlvbiBfcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChpKXt2YXIgbz1fcnNhcGVtX2dldFBvc0FycmF5T2ZDaGlsZHJlbkZyb21IZXgoaSk7dmFyIHI9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzBdKTt2YXIgZj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bMV0pO3ZhciBqPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1syXSk7dmFyIGs9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzNdKTt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bNF0pO3ZhciBiPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s1XSk7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzZdKTt2YXIgZz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bN10pO3ZhciBsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s4XSk7dmFyIG09bmV3IEFycmF5KCk7bS5wdXNoKHIsZixqLGssYyxiLGgsZyxsKTtyZXR1cm4gbX1mdW5jdGlvbiBfcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoYyl7dmFyIGI9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoYyk7dGhpcy5zZXRQcml2YXRlRXgoYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdLGJbNl0sYls3XSxiWzhdKX1mdW5jdGlvbiBfcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZyhlKXt2YXIgYz1fcnNhcGVtX3BlbVRvQmFzZTY0KGUpO3ZhciBkPWI2NHRvaGV4KGMpO3ZhciBiPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGQpO3RoaXMuc2V0UHJpdmF0ZUV4KGJbMV0sYlsyXSxiWzNdLGJbNF0sYls1XSxiWzZdLGJbN10sYls4XSl9UlNBS2V5LnByb3RvdHlwZS5yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmc9X3JzYXBlbV9yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmc7UlNBS2V5LnByb3RvdHlwZS5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nPV9yc2FwZW1fcmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZztcbi8qISByc2FzaWduLTEuMi43LmpzIChjKSAyMDEyIEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBfUkVfSEVYREVDT05MWT1uZXcgUmVnRXhwKFwiXCIpO19SRV9IRVhERUNPTkxZLmNvbXBpbGUoXCJbXjAtOWEtZl1cIixcImdpXCIpO2Z1bmN0aW9uIF9yc2FzaWduX2dldEhleFBhZGRlZERpZ2VzdEluZm9Gb3JTdHJpbmcoZCxlLGEpe3ZhciBiPWZ1bmN0aW9uKGYpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoZixhKX07dmFyIGM9YihkKTtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5nZXRQYWRkZWREaWdlc3RJbmZvSGV4KGMsYSxlKX1mdW5jdGlvbiBfemVyb1BhZGRpbmdPZlNpZ25hdHVyZShlLGQpe3ZhciBjPVwiXCI7dmFyIGE9ZC80LWUubGVuZ3RoO2Zvcih2YXIgYj0wO2I8YTtiKyspe2M9YytcIjBcIn1yZXR1cm4gYytlfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmcoZCxhKXt2YXIgYj1mdW5jdGlvbihlKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGUsYSl9O3ZhciBjPWIoZCk7cmV0dXJuIHRoaXMuc2lnbldpdGhNZXNzYWdlSGFzaChjLGEpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2goZSxjKXt2YXIgZj1LSlVSLmNyeXB0by5VdGlsLmdldFBhZGRlZERpZ2VzdEluZm9IZXgoZSxjLHRoaXMubi5iaXRMZW5ndGgoKSk7dmFyIGI9cGFyc2VCaWdJbnQoZiwxNik7dmFyIGQ9dGhpcy5kb1ByaXZhdGUoYik7dmFyIGE9ZC50b1N0cmluZygxNik7cmV0dXJuIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKGEsdGhpcy5uLmJpdExlbmd0aCgpKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTEoYSl7cmV0dXJuIF9yc2FzaWduX3NpZ25TdHJpbmcuY2FsbCh0aGlzLGEsXCJzaGExXCIpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMjU2KGEpe3JldHVybiBfcnNhc2lnbl9zaWduU3RyaW5nLmNhbGwodGhpcyxhLFwic2hhMjU2XCIpfWZ1bmN0aW9uIHBzc19tZ2YxX3N0cihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9aGV4dG9yc3RyKGUocnN0cnRvaGV4KGMrU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKSkpO2QrPTF9cmV0dXJuIGJ9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnblN0cmluZ1BTUyhlLGEsZCl7dmFyIGM9ZnVuY3Rpb24oZil7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChmLGEpfTt2YXIgYj1jKHJzdHJ0b2hleChlKSk7aWYoZD09PXVuZGVmaW5lZCl7ZD0tMX1yZXR1cm4gdGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKGIsYSxkKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKGwsYSxrKXt2YXIgYj1oZXh0b3JzdHIobCk7dmFyIGc9Yi5sZW5ndGg7dmFyIG09dGhpcy5uLmJpdExlbmd0aCgpLTE7dmFyIGM9TWF0aC5jZWlsKG0vOCk7dmFyIGQ7dmFyIG89ZnVuY3Rpb24oaSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChpLGEpfTtpZihrPT09LTF8fGs9PT11bmRlZmluZWQpe2s9Z31lbHNle2lmKGs9PT0tMil7az1jLWctMn1lbHNle2lmKGs8LTIpe3Rocm93XCJpbnZhbGlkIHNhbHQgbGVuZ3RoXCJ9fX1pZihjPChnK2srMikpe3Rocm93XCJkYXRhIHRvbyBsb25nXCJ9dmFyIGY9XCJcIjtpZihrPjApe2Y9bmV3IEFycmF5KGspO25ldyBTZWN1cmVSYW5kb20oKS5uZXh0Qnl0ZXMoZik7Zj1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxmKX12YXIgbj1oZXh0b3JzdHIobyhyc3RydG9oZXgoXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXCIrYitmKSkpO3ZhciBqPVtdO2ZvcihkPTA7ZDxjLWstZy0yO2QrPTEpe2pbZF09MH12YXIgZT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxqKStcIlxceDAxXCIrZjt2YXIgaD1wc3NfbWdmMV9zdHIobixlLmxlbmd0aCxvKTt2YXIgcT1bXTtmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCs9MSl7cVtkXT1lLmNoYXJDb2RlQXQoZCleaC5jaGFyQ29kZUF0KGQpfXZhciBwPSg2NTI4MD4+KDgqYy1tKSkmMjU1O3FbMF0mPX5wO2ZvcihkPTA7ZDxnO2QrKyl7cS5wdXNoKG4uY2hhckNvZGVBdChkKSl9cS5wdXNoKDE4OCk7cmV0dXJuIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKHRoaXMuZG9Qcml2YXRlKG5ldyBCaWdJbnRlZ2VyKHEpKS50b1N0cmluZygxNiksdGhpcy5uLmJpdExlbmd0aCgpKX1mdW5jdGlvbiBfcnNhc2lnbl9nZXREZWNyeXB0U2lnbmF0dXJlQkkoYSxkLGMpe3ZhciBiPW5ldyBSU0FLZXkoKTtiLnNldFB1YmxpYyhkLGMpO3ZhciBlPWIuZG9QdWJsaWMoYSk7cmV0dXJuIGV9ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0SGV4RGlnZXN0SW5mb0Zyb21TaWcoYSxjLGIpe3ZhciBlPV9yc2FzaWduX2dldERlY3J5cHRTaWduYXR1cmVCSShhLGMsYik7dmFyIGQ9ZS50b1N0cmluZygxNikucmVwbGFjZSgvXjFmKzAwLyxcIlwiKTtyZXR1cm4gZH1mdW5jdGlvbiBfcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhmKXtmb3IodmFyIGUgaW4gS0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRCl7dmFyIGQ9S0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRFtlXTt2YXIgYj1kLmxlbmd0aDtpZihmLnN1YnN0cmluZygwLGIpPT1kKXt2YXIgYz1bZSxmLnN1YnN0cmluZyhiKV07cmV0dXJuIGN9fXJldHVybltdfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVNpZ25hdHVyZVdpdGhBcmdzKGYsYixnLGope3ZhciBlPV9yc2FzaWduX2dldEhleERpZ2VzdEluZm9Gcm9tU2lnKGIsZyxqKTt2YXIgaD1fcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhlKTtpZihoLmxlbmd0aD09MCl7cmV0dXJuIGZhbHNlfXZhciBkPWhbMF07dmFyIGk9aFsxXTt2YXIgYT1mdW5jdGlvbihrKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGssZCl9O3ZhciBjPWEoZik7cmV0dXJuKGk9PWMpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeUhleFNpZ25hdHVyZUZvck1lc3NhZ2UoYyxiKXt2YXIgZD1wYXJzZUJpZ0ludChjLDE2KTt2YXIgYT1fcnNhc2lnbl92ZXJpZnlTaWduYXR1cmVXaXRoQXJncyhiLGQsdGhpcy5uLnRvU3RyaW5nKDE2KSx0aGlzLmUudG9TdHJpbmcoMTYpKTtyZXR1cm4gYX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlTdHJpbmcoZixqKXtqPWoucmVwbGFjZShfUkVfSEVYREVDT05MWSxcIlwiKTtqPWoucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3ZhciBiPXBhcnNlQmlnSW50KGosMTYpO2lmKGIuYml0TGVuZ3RoKCk+dGhpcy5uLmJpdExlbmd0aCgpKXtyZXR1cm4gMH12YXIgaT10aGlzLmRvUHVibGljKGIpO3ZhciBlPWkudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14xZiswMC8sXCJcIik7dmFyIGc9X3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZSk7aWYoZy5sZW5ndGg9PTApe3JldHVybiBmYWxzZX12YXIgZD1nWzBdO3ZhciBoPWdbMV07dmFyIGE9ZnVuY3Rpb24oayl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhrLGQpfTt2YXIgYz1hKGYpO3JldHVybihoPT1jKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2goZSxhKXthPWEucmVwbGFjZShfUkVfSEVYREVDT05MWSxcIlwiKTthPWEucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3ZhciBiPXBhcnNlQmlnSW50KGEsMTYpO2lmKGIuYml0TGVuZ3RoKCk+dGhpcy5uLmJpdExlbmd0aCgpKXtyZXR1cm4gMH12YXIgaD10aGlzLmRvUHVibGljKGIpO3ZhciBnPWgudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14xZiswMC8sXCJcIik7dmFyIGM9X3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZyk7aWYoYy5sZW5ndGg9PTApe3JldHVybiBmYWxzZX12YXIgZD1jWzBdO3ZhciBmPWNbMV07cmV0dXJuKGY9PWUpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVN0cmluZ1BTUyhjLGIsYSxmKXt2YXIgZT1mdW5jdGlvbihnKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGcsYSl9O3ZhciBkPWUocnN0cnRvaGV4KGMpKTtpZihmPT09dW5kZWZpbmVkKXtmPS0xfXJldHVybiB0aGlzLnZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUyhkLGIsYSxmKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1MoZixzLGwsYyl7dmFyIGs9bmV3IEJpZ0ludGVnZXIocywxNik7aWYoay5iaXRMZW5ndGgoKT50aGlzLm4uYml0TGVuZ3RoKCkpe3JldHVybiBmYWxzZX12YXIgcj1mdW5jdGlvbihpKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGksbCl9O3ZhciBqPWhleHRvcnN0cihmKTt2YXIgaD1qLmxlbmd0aDt2YXIgZz10aGlzLm4uYml0TGVuZ3RoKCktMTt2YXIgbT1NYXRoLmNlaWwoZy84KTt2YXIgcTtpZihjPT09LTF8fGM9PT11bmRlZmluZWQpe2M9aH1lbHNle2lmKGM9PT0tMil7Yz1tLWgtMn1lbHNle2lmKGM8LTIpe3Rocm93XCJpbnZhbGlkIHNhbHQgbGVuZ3RoXCJ9fX1pZihtPChoK2MrMikpe3Rocm93XCJkYXRhIHRvbyBsb25nXCJ9dmFyIGE9dGhpcy5kb1B1YmxpYyhrKS50b0J5dGVBcnJheSgpO2ZvcihxPTA7cTxhLmxlbmd0aDtxKz0xKXthW3FdJj0yNTV9d2hpbGUoYS5sZW5ndGg8bSl7YS51bnNoaWZ0KDApfWlmKGFbbS0xXSE9PTE4OCl7dGhyb3dcImVuY29kZWQgbWVzc2FnZSBkb2VzIG5vdCBlbmQgaW4gMHhiY1wifWE9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsYSk7dmFyIGQ9YS5zdWJzdHIoMCxtLWgtMSk7dmFyIGU9YS5zdWJzdHIoZC5sZW5ndGgsaCk7dmFyIHA9KDY1MjgwPj4oOCptLWcpKSYyNTU7aWYoKGQuY2hhckNvZGVBdCgwKSZwKSE9PTApe3Rocm93XCJiaXRzIGJleW9uZCBrZXlzaXplIG5vdCB6ZXJvXCJ9dmFyIG49cHNzX21nZjFfc3RyKGUsZC5sZW5ndGgscik7dmFyIG89W107Zm9yKHE9MDtxPGQubGVuZ3RoO3ErPTEpe29bcV09ZC5jaGFyQ29kZUF0KHEpXm4uY2hhckNvZGVBdChxKX1vWzBdJj1+cDt2YXIgYj1tLWgtYy0yO2ZvcihxPTA7cTxiO3ErPTEpe2lmKG9bcV0hPT0wKXt0aHJvd1wibGVmdG1vc3Qgb2N0ZXRzIG5vdCB6ZXJvXCJ9fWlmKG9bYl0hPT0xKXt0aHJvd1wiMHgwMSBtYXJrZXIgbm90IGZvdW5kXCJ9cmV0dXJuIGU9PT1oZXh0b3JzdHIocihyc3RydG9oZXgoXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXCIraitTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxvLnNsaWNlKC1jKSkpKSl9UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aE1lc3NhZ2VIYXNoPV9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2g7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nPV9yc2FzaWduX3NpZ25TdHJpbmc7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nV2l0aFNIQTE9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEExO1JTQUtleS5wcm90b3R5cGUuc2lnblN0cmluZ1dpdGhTSEEyNTY9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEEyNTY7UlNBS2V5LnByb3RvdHlwZS5zaWduPV9yc2FzaWduX3NpZ25TdHJpbmc7UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aFNIQTE9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEExO1JTQUtleS5wcm90b3R5cGUuc2lnbldpdGhTSEEyNTY9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEEyNTY7UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTPV9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2hQU1M7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nUFNTPV9yc2FzaWduX3NpZ25TdHJpbmdQU1M7UlNBS2V5LnByb3RvdHlwZS5zaWduUFNTPV9yc2FzaWduX3NpZ25TdHJpbmdQU1M7UlNBS2V5LlNBTFRfTEVOX0hMRU49LTE7UlNBS2V5LlNBTFRfTEVOX01BWD0tMjtSU0FLZXkucHJvdG90eXBlLnZlcmlmeVdpdGhNZXNzYWdlSGFzaD1fcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2g7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlTdHJpbmc9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZT1fcnNhc2lnbl92ZXJpZnlIZXhTaWduYXR1cmVGb3JNZXNzYWdlO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5PV9yc2FzaWduX3ZlcmlmeVN0cmluZztSU0FLZXkucHJvdG90eXBlLnZlcmlmeUhleFNpZ25hdHVyZUZvckJ5dGVBcnJheU1lc3NhZ2U9X3JzYXNpZ25fdmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZTtSU0FLZXkucHJvdG90eXBlLnZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUz1fcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1M7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlTdHJpbmdQU1M9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nUFNTO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5UFNTPV9yc2FzaWduX3ZlcmlmeVN0cmluZ1BTUztSU0FLZXkuU0FMVF9MRU5fUkVDT1ZFUj0tMjtcbi8qISB4NTA5LTEuMS45LmpzIChjKSAyMDEyLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gWDUwOSgpe3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQT1udWxsO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oTj1udWxsO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oRT1udWxsO3RoaXMuaGV4PW51bGw7dGhpcy5nZXRTZXJpYWxOdW1iZXJIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsMV0pfTt0aGlzLmdldFNpZ25hdHVyZUFsZ29yaXRobUZpZWxkPWZ1bmN0aW9uKCl7dmFyIGI9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsMiwwXSk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGIpO3ZhciBjPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTtyZXR1cm4gY307dGhpcy5nZXRJc3N1ZXJIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCwzXSl9O3RoaXMuZ2V0SXNzdWVyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFg1MDkuaGV4MmRuKEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsM10pKX07dGhpcy5nZXRTdWJqZWN0SGV4PWZ1bmN0aW9uKCl7cmV0dXJuIEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsNV0pfTt0aGlzLmdldFN1YmplY3RTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWDUwOS5oZXgyZG4oQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCw1XSkpfTt0aGlzLmdldE5vdEJlZm9yZT1mdW5jdGlvbigpe3ZhciBhPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDQsMF0pO2E9YS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIik7YT1kZWNvZGVVUklDb21wb25lbnQoYSk7cmV0dXJuIGF9O3RoaXMuZ2V0Tm90QWZ0ZXI9ZnVuY3Rpb24oKXt2YXIgYT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCw0LDFdKTthPWEucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpO2E9ZGVjb2RlVVJJQ29tcG9uZW50KGEpO3JldHVybiBhfTt0aGlzLnJlYWRDZXJ0UEVNPWZ1bmN0aW9uKGMpe3ZhciBlPVg1MDkucGVtVG9IZXgoYyk7dmFyIGI9WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4KGUpO3ZhciBkPW5ldyBSU0FLZXkoKTtkLnNldFB1YmxpYyhiWzBdLGJbMV0pO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQT1kO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oTj1iWzBdO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oRT1iWzFdO3RoaXMuaGV4PWV9O3RoaXMucmVhZENlcnRQRU1XaXRob3V0UlNBSW5pdD1mdW5jdGlvbihjKXt2YXIgZD1YNTA5LnBlbVRvSGV4KGMpO3ZhciBiPVg1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydEhleChkKTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0Euc2V0UHVibGljKGJbMF0sYlsxXSk7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hOPWJbMF07dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hFPWJbMV07dGhpcy5oZXg9ZH07dGhpcy5nZXRJbmZvPWZ1bmN0aW9uKCl7dmFyIHA9XCJCYXNpYyBGaWVsZHNcXG5cIjtwKz1cIiAgc2VyaWFsIG51bWJlcjogXCIrdGhpcy5nZXRTZXJpYWxOdW1iZXJIZXgoKStcIlxcblwiO3ArPVwiICBzaWduYXR1cmUgYWxnb3JpdGhtOiBcIit0aGlzLmdldFNpZ25hdHVyZUFsZ29yaXRobUZpZWxkKCkrXCJcXG5cIjtwKz1cIiAgaXNzdWVyOiBcIit0aGlzLmdldElzc3VlclN0cmluZygpK1wiXFxuXCI7cCs9XCIgIG5vdEJlZm9yZTogXCIrdGhpcy5nZXROb3RCZWZvcmUoKStcIlxcblwiO3ArPVwiICBub3RBZnRlcjogXCIrdGhpcy5nZXROb3RBZnRlcigpK1wiXFxuXCI7cCs9XCIgIHN1YmplY3Q6IFwiK3RoaXMuZ2V0U3ViamVjdFN0cmluZygpK1wiXFxuXCI7cCs9XCIgIHN1YmplY3QgcHVibGljIGtleSBpbmZvOiBcXG5cIjt2YXIgaj1YNTA5LmdldFN1YmplY3RQdWJsaWNLZXlJbmZvUG9zRnJvbUNlcnRIZXgodGhpcy5oZXgpO3ZhciBkPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoodGhpcy5oZXgsaik7dmFyIG49S0VZVVRJTC5nZXRLZXkoZCxudWxsLFwicGtjczhwdWJcIik7aWYobiBpbnN0YW5jZW9mIFJTQUtleSl7cCs9XCIgICAga2V5IGFsZ29yaXRobTogUlNBXFxuXCI7cCs9XCIgICAgbj1cIituLm4udG9TdHJpbmcoMTYpLnN1YnN0cigwLDE2KStcIi4uLlxcblwiO3ArPVwiICAgIGU9XCIrbi5lLnRvU3RyaW5nKDE2KStcIlxcblwifXArPVwiWDUwOXYzIEV4dGVuc2lvbnM6XFxuXCI7dmFyIG09WDUwOS5nZXRWM0V4dEluZm9MaXN0T2ZDZXJ0SGV4KHRoaXMuaGV4KTtmb3IodmFyIGU9MDtlPG0ubGVuZ3RoO2UrKyl7dmFyIGI9bVtlXTt2YXIgbz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYi5vaWQpO2lmKG89PT1cIlwiKXtvPWIub2lkfXZhciBrPVwiXCI7aWYoYi5jcml0aWNhbD09PXRydWUpe2s9XCJDUklUSUNBTFwifXArPVwiICBcIitvK1wiIFwiK2srXCI6XFxuXCI7aWYobz09PVwiYmFzaWNDb25zdHJhaW50c1wiKXt2YXIgZz1YNTA5LmdldEV4dEJhc2ljQ29uc3RyYWludHModGhpcy5oZXgpO2lmKGcuY0E9PT11bmRlZmluZWQpe3ArPVwiICAgIHt9XFxuXCJ9ZWxzZXtwKz1cIiAgICBjQT10cnVlXCI7aWYoZy5wYXRoTGVuIT09dW5kZWZpbmVkKXtwKz1cIiwgcGF0aExlbj1cIitnLnBhdGhMZW59cCs9XCJcXG5cIn19ZWxzZXtpZihvPT09XCJrZXlVc2FnZVwiKXtwKz1cIiAgICBcIitYNTA5LmdldEV4dEtleVVzYWdlU3RyaW5nKHRoaXMuaGV4KStcIlxcblwifWVsc2V7aWYobz09PVwic3ViamVjdEtleUlkZW50aWZpZXJcIil7cCs9XCIgICAgXCIrWDUwOS5nZXRFeHRTdWJqZWN0S2V5SWRlbnRpZmllcih0aGlzLmhleCkrXCJcXG5cIn1lbHNle2lmKG89PT1cImF1dGhvcml0eUtleUlkZW50aWZpZXJcIil7dmFyIGE9WDUwOS5nZXRFeHRBdXRob3JpdHlLZXlJZGVudGlmaWVyKHRoaXMuaGV4KTtpZihhLmtpZCE9PXVuZGVmaW5lZCl7cCs9XCIgICAga2lkPVwiK2Eua2lkK1wiXFxuXCJ9fWVsc2V7aWYobz09PVwiZXh0S2V5VXNhZ2VcIil7dmFyIGg9WDUwOS5nZXRFeHRFeHRLZXlVc2FnZU5hbWUodGhpcy5oZXgpO3ArPVwiICAgIFwiK2guam9pbihcIiwgXCIpK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJzdWJqZWN0QWx0TmFtZVwiKXt2YXIgZj1YNTA5LmdldEV4dFN1YmplY3RBbHROYW1lKHRoaXMuaGV4KTtwKz1cIiAgICBcIitmLmpvaW4oXCIsIFwiKStcIlxcblwifWVsc2V7aWYobz09PVwiY1JMRGlzdHJpYnV0aW9uUG9pbnRzXCIpe3ZhciBsPVg1MDkuZ2V0RXh0Q1JMRGlzdHJpYnV0aW9uUG9pbnRzVVJJKHRoaXMuaGV4KTtwKz1cIiAgICBcIitsK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJhdXRob3JpdHlJbmZvQWNjZXNzXCIpe3ZhciBjPVg1MDkuZ2V0RXh0QUlBSW5mbyh0aGlzLmhleCk7aWYoYy5vY3NwIT09dW5kZWZpbmVkKXtwKz1cIiAgICBvY3NwOiBcIitjLm9jc3Auam9pbihcIixcIikrXCJcXG5cIn1pZihjLmNhaXNzdWVyIT09dW5kZWZpbmVkKXtwKz1cIiAgICBjYWlzc3VlcjogXCIrYy5jYWlzc3Vlci5qb2luKFwiLFwiKStcIlxcblwifX19fX19fX19fXArPVwic2lnbmF0dXJlIGFsZ29yaXRobTogXCIrWDUwOS5nZXRTaWduYXR1cmVBbGdvcml0aG1OYW1lKHRoaXMuaGV4KStcIlxcblwiO3ArPVwic2lnbmF0dXJlOiBcIitYNTA5LmdldFNpZ25hdHVyZVZhbHVlSGV4KHRoaXMuaGV4KS5zdWJzdHIoMCwxNikrXCIuLi5cXG5cIjtyZXR1cm4gcH19WDUwOS5wZW1Ub0Jhc2U2ND1mdW5jdGlvbihhKXt2YXIgYj1hO2I9Yi5yZXBsYWNlKFwiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXCIsXCJcIik7Yj1iLnJlcGxhY2UoXCItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXCIsXCJcIik7Yj1iLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTtyZXR1cm4gYn07WDUwOS5wZW1Ub0hleD1mdW5jdGlvbihhKXt2YXIgYz1YNTA5LnBlbVRvQmFzZTY0KGEpO3ZhciBiPWI2NHRvaGV4KGMpO3JldHVybiBifTtYNTA5LmdldFN1YmplY3RQdWJsaWNLZXlQb3NGcm9tQ2VydEhleD1mdW5jdGlvbihmKXt2YXIgZT1YNTA5LmdldFN1YmplY3RQdWJsaWNLZXlJbmZvUG9zRnJvbUNlcnRIZXgoZik7aWYoZT09LTEpe3JldHVybiAtMX12YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGUpO2lmKGIubGVuZ3RoIT0yKXtyZXR1cm4gLTF9dmFyIGQ9YlsxXTtpZihmLnN1YnN0cmluZyhkLGQrMikhPVwiMDNcIil7cmV0dXJuIC0xfXZhciBjPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooZixkKTtpZihmLnN1YnN0cmluZyhjLGMrMikhPVwiMDBcIil7cmV0dXJuIC0xfXJldHVybiBjKzJ9O1g1MDkuZ2V0U3ViamVjdFB1YmxpY0tleUluZm9Qb3NGcm9tQ2VydEhleD1mdW5jdGlvbihkKXt2YXIgYz1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGQsMCk7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCxjKTtpZihiLmxlbmd0aDwxKXtyZXR1cm4gLTF9aWYoZC5zdWJzdHJpbmcoYlswXSxiWzBdKzEwKT09XCJhMDAzMDIwMTAyXCIpe2lmKGIubGVuZ3RoPDYpe3JldHVybiAtMX1yZXR1cm4gYls2XX1lbHNle2lmKGIubGVuZ3RoPDUpe3JldHVybiAtMX1yZXR1cm4gYls1XX19O1g1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydEhleD1mdW5jdGlvbihmKXt2YXIgZT1YNTA5LmdldFN1YmplY3RQdWJsaWNLZXlQb3NGcm9tQ2VydEhleChmKTt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGUpO2lmKGIubGVuZ3RoIT0yKXtyZXR1cm5bXX12YXIgZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGJbMF0pO3ZhciBjPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsYlsxXSk7aWYoZCE9bnVsbCYmYyE9bnVsbCl7cmV0dXJuW2QsY119ZWxzZXtyZXR1cm5bXX19O1g1MDkuZ2V0SGV4VGJzQ2VydGlmaWNhdGVGcm9tQ2VydD1mdW5jdGlvbihiKXt2YXIgYT1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGIsMCk7cmV0dXJuIGF9O1g1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydFBFTT1mdW5jdGlvbihjKXt2YXIgZD1YNTA5LnBlbVRvSGV4KGMpO3ZhciBiPVg1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydEhleChkKTtyZXR1cm4gYn07WDUwOS5oZXgyZG49ZnVuY3Rpb24oZSl7dmFyIGY9XCJcIjt2YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLDApO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgYj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGUsY1tkXSk7Zj1mK1wiL1wiK1g1MDkuaGV4MnJkbihiKX1yZXR1cm4gZn07WDUwOS5oZXgycmRuPWZ1bmN0aW9uKGEpe3ZhciBmPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KGEsMCxbMCwwXSk7dmFyIGU9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KGEsMCxbMCwxXSk7dmFyIGM9XCJcIjt0cnl7Yz1YNTA5LkROX0FUVFJIRVhbZl19Y2F0Y2goYil7Yz1mfWU9ZS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIik7dmFyIGQ9ZGVjb2RlVVJJQ29tcG9uZW50KGUpO3JldHVybiBjK1wiPVwiK2R9O1g1MDkuRE5fQVRUUkhFWD17XCIwNjAzNTUwNDA2XCI6XCJDXCIsXCIwNjAzNTUwNDBhXCI6XCJPXCIsXCIwNjAzNTUwNDBiXCI6XCJPVVwiLFwiMDYwMzU1MDQwM1wiOlwiQ05cIixcIjA2MDM1NTA0MDVcIjpcIlNOXCIsXCIwNjAzNTUwNDA4XCI6XCJTVFwiLFwiMDYwMzU1MDQwN1wiOlwiTFwiLFwiMDYwMzU1MDQwOVwiOlwic3RyZWV0QWRkcmVzc1wiLFwiMDYwMzU1MDQwZlwiOlwiYnVzaW5lc3NDYXRlZ29yeVwiLFwiMDYwMzU1MDQxMVwiOlwicG9zdGFsQ29kZVwiLFwiMDYwYjJiMDYwMTA0MDE4MjM3M2MwMjAxMDJcIjpcImp1cmlzZGljdGlvbk9mSW5jb3Jwb3JhdGlvblNQXCIsXCIwNjBiMmIwNjAxMDQwMTgyMzczYzAyMDEwM1wiOlwianVyaXNkaWN0aW9uT2ZJbmNvcnBvcmF0aW9uQ1wiLH07WDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTT1mdW5jdGlvbihmKXt2YXIgYz1YNTA5LmdldFB1YmxpY0tleUluZm9Qcm9wT2ZDZXJ0UEVNKGYpO2lmKGMuYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt2YXIgaT1LRVlVVElMLnBhcnNlUHVibGljUmF3UlNBS2V5SGV4KGMua2V5aGV4KTt2YXIgaj1uZXcgUlNBS2V5KCk7ai5zZXRQdWJsaWMoaS5uLGkuZSk7cmV0dXJuIGp9ZWxzZXtpZihjLmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXt2YXIgZT1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbYy5hbGdwYXJhbV07dmFyIGo9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTplLGluZm86Yy5rZXloZXh9KTtqLnNldFB1YmxpY0tleUhleChjLmtleWhleCk7cmV0dXJuIGp9ZWxzZXtpZihjLmFsZ29pZD09XCIyYTg2NDhjZTM4MDQwMVwiKXt2YXIgYj1BU04xSEVYLmdldFZieUxpc3QoYy5hbGdwYXJhbSwwLFswXSxcIjAyXCIpO3ZhciBhPUFTTjFIRVguZ2V0VmJ5TGlzdChjLmFsZ3BhcmFtLDAsWzFdLFwiMDJcIik7dmFyIGQ9QVNOMUhFWC5nZXRWYnlMaXN0KGMuYWxncGFyYW0sMCxbMl0sXCIwMlwiKTt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihjLmtleWhleCwwKTtoPWguc3Vic3RyKDIpO3ZhciBqPW5ldyBLSlVSLmNyeXB0by5EU0EoKTtqLnNldFB1YmxpYyhuZXcgQmlnSW50ZWdlcihiLDE2KSxuZXcgQmlnSW50ZWdlcihhLDE2KSxuZXcgQmlnSW50ZWdlcihkLDE2KSxuZXcgQmlnSW50ZWdlcihoLDE2KSk7cmV0dXJuIGp9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQga2V5XCJ9fX19O1g1MDkuZ2V0UHVibGljS2V5SW5mb1Byb3BPZkNlcnRQRU09ZnVuY3Rpb24oZSl7dmFyIGk9e307aS5hbGdwYXJhbT1udWxsO3ZhciBmPVg1MDkucGVtVG9IZXgoZSk7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZiwwKTtpZihkLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAxKVwifWlmKGYuc3Vic3RyKGRbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAyKVwifXZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsZFswXSk7dmFyIGc9NjtpZihmLnN1YnN0cihjWzBdLDIpIT09XCJhMFwiKXtnPTV9aWYoYy5sZW5ndGg8ZysxKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDMpXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixjW2ddKTtpZihhLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA0KVwifXZhciBoPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsYVswXSk7aWYoaC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNSlcIn1pLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGhbMF0pO2lmKGYuc3Vic3RyKGhbMV0sMik9PVwiMDZcIil7aS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGhbMV0pfWVsc2V7aWYoZi5zdWJzdHIoaFsxXSwyKT09XCIzMFwiKXtpLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZixoWzFdKX19aWYoZi5zdWJzdHIoYVsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDYpXCJ9dmFyIGI9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixhWzFdKTtpLmtleWhleD1iLnN1YnN0cigyKTtyZXR1cm4gaX07WDUwOS5nZXRQdWJsaWNLZXlJbmZvUG9zT2ZDZXJ0SEVYPWZ1bmN0aW9uKGMpe3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7aWYoYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihjLnN1YnN0cihiWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihjLGJbMF0pO2lmKGEubGVuZ3RoPDcpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMylcIn1yZXR1cm4gYVs2XX07WDUwOS5nZXRWM0V4dEluZm9MaXN0T2ZDZXJ0SGV4PWZ1bmN0aW9uKGcpe3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsMCk7aWYoYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihnLnN1YnN0cihiWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGJbMF0pO2lmKGEubGVuZ3RoPDgpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMylcIn1pZihnLnN1YnN0cihhWzddLDIpIT1cImEzXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNClcIn12YXIgaD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGFbN10pO2lmKGgubGVuZ3RoIT0xKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDUpXCJ9aWYoZy5zdWJzdHIoaFswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDYpXCJ9dmFyIGY9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxoWzBdKTt2YXIgZT1mLmxlbmd0aDt2YXIgZD1uZXcgQXJyYXkoZSk7Zm9yKHZhciBjPTA7YzxlO2MrKyl7ZFtjXT1YNTA5LmdldFYzRXh0SXRlbUluZm9fQXRPYmooZyxmW2NdKX1yZXR1cm4gZH07WDUwOS5nZXRWM0V4dEl0ZW1JbmZvX0F0T2JqPWZ1bmN0aW9uKGYsZyl7dmFyIGU9e307ZS5wb3NUTFY9Zzt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGcpO2lmKGIubGVuZ3RoIT0yJiZiLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOXYzIEV4dCAoY29kZTowMDEpXCJ9aWYoZi5zdWJzdHIoYlswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5djMgRXh0IChjb2RlOjAwMilcIn12YXIgZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGJbMF0pO2Uub2lkPUFTTjFIRVguaGV4dG9vaWRzdHIoZCk7ZS5jcml0aWNhbD1mYWxzZTtpZihiLmxlbmd0aD09Myl7ZS5jcml0aWNhbD10cnVlfXZhciBjPWJbYi5sZW5ndGgtMV07aWYoZi5zdWJzdHIoYywyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5djMgRXh0IChjb2RlOjAwMylcIn1lLnBvc1Y9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihmLGMpO3JldHVybiBlfTtYNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWU9ZnVuY3Rpb24oYixhKXt2YXIgYz1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoYixhKTtpZihjPT0tMSl7cmV0dXJuIG51bGx9cmV0dXJuIEFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooYixjKX07WDUwOS5nZXRIZXhPZlZfVjNFeHRWYWx1ZT1mdW5jdGlvbihiLGEpe3ZhciBjPVg1MDkuZ2V0UG9zT2ZUTFZfVjNFeHRWYWx1ZShiLGEpO2lmKGM9PS0xKXtyZXR1cm4gbnVsbH1yZXR1cm4gQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYixjKX07WDUwOS5nZXRQb3NPZlRMVl9WM0V4dFZhbHVlPWZ1bmN0aW9uKGYsYil7dmFyIGQ9YjtpZighYi5tYXRjaCgvXlswLTkuXSskLykpe2Q9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkKGIpfWlmKGQ9PVwiXCIpe3JldHVybiAtMX12YXIgYz1YNTA5LmdldFYzRXh0SW5mb0xpc3RPZkNlcnRIZXgoZik7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aDthKyspe3ZhciBlPWNbYV07aWYoZS5vaWQ9PWQpe3JldHVybiBlLnBvc1Z9fXJldHVybiAtMX07WDUwOS5nZXRFeHRCYXNpY0NvbnN0cmFpbnRzPWZ1bmN0aW9uKGQpe3ZhciBhPVg1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWUoZCxcImJhc2ljQ29uc3RyYWludHNcIik7aWYoYT09PW51bGwpe3JldHVybiBudWxsfWlmKGE9PT1cIlwiKXtyZXR1cm57fX1pZihhPT09XCIwMTAxZmZcIil7cmV0dXJue2NBOnRydWV9fWlmKGEuc3Vic3RyKDAsOCk9PT1cIjAxMDFmZjAyXCIpe3ZhciBjPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGEsNik7dmFyIGI9cGFyc2VJbnQoYywxNik7cmV0dXJue2NBOnRydWUscGF0aExlbjpifX10aHJvd1widW5rbm93biBlcnJvclwifTtYNTA5LktFWVVTQUdFX05BTUU9W1wiZGlnaXRhbFNpZ25hdHVyZVwiLFwibm9uUmVwdWRpYXRpb25cIixcImtleUVuY2lwaGVybWVudFwiLFwiZGF0YUVuY2lwaGVybWVudFwiLFwia2V5QWdyZWVtZW50XCIsXCJrZXlDZXJ0U2lnblwiLFwiY1JMU2lnblwiLFwiZW5jaXBoZXJPbmx5XCIsXCJkZWNpcGhlck9ubHlcIl07WDUwOS5nZXRFeHRLZXlVc2FnZUJpbj1mdW5jdGlvbihkKXt2YXIgYj1YNTA5LmdldEhleE9mVl9WM0V4dFZhbHVlKGQsXCJrZXlVc2FnZVwiKTtpZihiPT1cIlwiKXtyZXR1cm5cIlwifWlmKGIubGVuZ3RoJTIhPTB8fGIubGVuZ3RoPD0yKXt0aHJvd1wibWFsZm9ybWVkIGtleSB1c2FnZSB2YWx1ZVwifXZhciBhPXBhcnNlSW50KGIuc3Vic3RyKDAsMikpO3ZhciBjPXBhcnNlSW50KGIuc3Vic3RyKDIpLDE2KS50b1N0cmluZygyKTtyZXR1cm4gYy5zdWJzdHIoMCxjLmxlbmd0aC1hKX07WDUwOS5nZXRFeHRLZXlVc2FnZVN0cmluZz1mdW5jdGlvbihlKXt2YXIgZD1YNTA5LmdldEV4dEtleVVzYWdlQmluKGUpO3ZhciBiPW5ldyBBcnJheSgpO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXtpZihkLnN1YnN0cihjLDEpPT1cIjFcIil7Yi5wdXNoKFg1MDkuS0VZVVNBR0VfTkFNRVtjXSl9fXJldHVybiBiLmpvaW4oXCIsXCIpfTtYNTA5LmdldEV4dFN1YmplY3RLZXlJZGVudGlmaWVyPWZ1bmN0aW9uKGIpe3ZhciBhPVg1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWUoYixcInN1YmplY3RLZXlJZGVudGlmaWVyXCIpO3JldHVybiBhfTtYNTA5LmdldEV4dEF1dGhvcml0eUtleUlkZW50aWZpZXI9ZnVuY3Rpb24oZil7dmFyIGI9e307dmFyIGU9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKGYsXCJhdXRob3JpdHlLZXlJZGVudGlmaWVyXCIpO2lmKGU9PT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLDApO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXtpZihlLnN1YnN0cihjW2RdLDIpPT09XCI4MFwiKXtiLmtpZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGNbZF0pfX1yZXR1cm4gYn07WDUwOS5nZXRFeHRFeHRLZXlVc2FnZU5hbWU9ZnVuY3Rpb24oayl7dmFyIGI9bmV3IEFycmF5KCk7dmFyIGY9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKGssXCJleHRLZXlVc2FnZVwiKTtpZihmPT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZiwwKTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGo9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixjW2VdKTt2YXIgZz1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQoaik7dmFyIGQ9S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGcpO2IucHVzaChkKX1yZXR1cm4gYn07WDUwOS5nZXRFeHRTdWJqZWN0QWx0TmFtZT1mdW5jdGlvbihnKXt2YXIgYj1uZXcgQXJyYXkoKTt2YXIgZj1YNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWUoZyxcInN1YmplY3RBbHROYW1lXCIpO3ZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsMCk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe2lmKGYuc3Vic3RyKGNbZV0sMik9PT1cIjgyXCIpe3ZhciBkPWhleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGNbZV0pKTtiLnB1c2goZCl9fXJldHVybiBifTtYNTA5LmdldEV4dENSTERpc3RyaWJ1dGlvblBvaW50c1VSST1mdW5jdGlvbihuKXt2YXIgcD1uZXcgQXJyYXkoKTt2YXIgaz1YNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWUobixcImNSTERpc3RyaWJ1dGlvblBvaW50c1wiKTt2YXIgbz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihrLDApO2Zvcih2YXIgZz0wO2c8by5sZW5ndGg7ZysrKXt2YXIgbD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGssb1tnXSk7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobCwwKTtmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKyl7aWYobC5zdWJzdHIoYltlXSwyKT09PVwiYTBcIil7dmFyIGY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobCxiW2VdKTtpZihmLnN1YnN0cigwLDIpPT09XCJhMFwiKXt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLDApO2lmKGMuc3Vic3RyKDAsMik9PT1cIjg2XCIpe3ZhciBtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsMCk7dmFyIGQ9aGV4dG91dGY4KG0pO3AucHVzaChkKX19fX19cmV0dXJuIHB9O1g1MDkuZ2V0RXh0QUlBSW5mbz1mdW5jdGlvbihnKXt2YXIgaj17fTtqLm9jc3A9W107ai5jYWlzc3Vlcj1bXTt2YXIgaD1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoZyxcImF1dGhvcml0eUluZm9BY2Nlc3NcIik7aWYoaD09LTEpe3JldHVybiBudWxsfWlmKGcuc3Vic3RyKGgsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBBSUEgRXh0biBWYWx1ZVwifXZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsaCk7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe3ZhciBhPWRbY107dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxhKTtpZihiLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBBY2Nlc3NEZXNjcmlwdGlvbiBvZiBBSUEgRXh0blwifXZhciBlPWJbMF07dmFyIGY9YlsxXTtpZihBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGUpPT1cIjJiMDYwMTA1MDUwNzMwMDFcIil7aWYoZy5zdWJzdHIoZiwyKT09XCI4NlwiKXtqLm9jc3AucHVzaChoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxmKSkpfX1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGUpPT1cIjJiMDYwMTA1MDUwNzMwMDJcIil7aWYoZy5zdWJzdHIoZiwyKT09XCI4NlwiKXtqLmNhaXNzdWVyLnB1c2goaGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGcsZikpKX19fXJldHVybiBqfTtYNTA5LmdldFNpZ25hdHVyZUFsZ29yaXRobU5hbWU9ZnVuY3Rpb24oZCl7dmFyIGI9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KGQsMCxbMSwwXSk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGIpO3ZhciBjPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTtyZXR1cm4gY307WDUwOS5nZXRTaWduYXR1cmVWYWx1ZUhleD1mdW5jdGlvbihiKXt2YXIgYT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoYiwwLFsyXSk7aWYoYS5zdWJzdHIoMCwyKSE9PVwiMDBcIil7dGhyb3dcImNhbid0IGdldCBzaWduYXR1cmUgdmFsdWVcIn1yZXR1cm4gYS5zdWJzdHIoMil9O1g1MDkuZ2V0U2VyaWFsTnVtYmVySGV4PWZ1bmN0aW9uKGEpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoYSwwLFswLDFdKX07XG4vKiEgandzLTMuMy40IChjKSAyMDEzLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmp3cz09XCJ1bmRlZmluZWRcInx8IUtKVVIuandzKXtLSlVSLmp3cz17fX1LSlVSLmp3cy5KV1M9ZnVuY3Rpb24oKXt2YXIgYT1LSlVSLmp3cy5KV1M7dGhpcy5wYXJzZUpXUz1mdW5jdGlvbihlLGcpe2lmKCh0aGlzLnBhcnNlZEpXUyE9PXVuZGVmaW5lZCkmJihnfHwodGhpcy5wYXJzZWRKV1Muc2lndmFsSCE9PXVuZGVmaW5lZCkpKXtyZXR1cm59aWYoZS5tYXRjaCgvXihbXi5dKylcXC4oW14uXSspXFwuKFteLl0rKSQvKT09bnVsbCl7dGhyb3dcIkpXUyBzaWduYXR1cmUgaXMgbm90IGEgZm9ybSBvZiAnSGVhZC5QYXlsb2FkLlNpZ1ZhbHVlJy5cIn12YXIgaD1SZWdFeHAuJDE7dmFyIGM9UmVnRXhwLiQyO3ZhciBpPVJlZ0V4cC4kMzt2YXIgaz1oK1wiLlwiK2M7dGhpcy5wYXJzZWRKV1M9e307dGhpcy5wYXJzZWRKV1MuaGVhZEI2NFU9aDt0aGlzLnBhcnNlZEpXUy5wYXlsb2FkQjY0VT1jO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEI2NFU9aTt0aGlzLnBhcnNlZEpXUy5zaT1rO2lmKCFnKXt2YXIgZj1iNjR1dG9oZXgoaSk7dmFyIGQ9cGFyc2VCaWdJbnQoZiwxNik7dGhpcy5wYXJzZWRKV1Muc2lndmFsSD1mO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEJJPWR9dmFyIGI9YjY0dXRvdXRmOChoKTt2YXIgaj1iNjR1dG91dGY4KGMpO3RoaXMucGFyc2VkSldTLmhlYWRTPWI7dGhpcy5wYXJzZWRKV1MucGF5bG9hZFM9ajtpZighYS5pc1NhZmVKU09OU3RyaW5nKGIsdGhpcy5wYXJzZWRKV1MsXCJoZWFkUFwiKSl7dGhyb3dcIm1hbGZvcm1lZCBKU09OIHN0cmluZyBmb3IgSldTIEhlYWQ6IFwiK2J9fX07S0pVUi5qd3MuSldTLnNpZ249ZnVuY3Rpb24oYSxpLGMsbSxsKXt2YXIgaz1LSlVSLmp3cy5KV1M7dmFyIHEsZSxqO2lmKHR5cGVvZiBpIT1cInN0cmluZ1wiJiZ0eXBlb2YgaSE9XCJvYmplY3RcIil7dGhyb3dcInNwSGVhZGVyIG11c3QgYmUgSlNPTiBzdHJpbmcgb3Igb2JqZWN0OiBcIitpfWlmKHR5cGVvZiBpPT1cIm9iamVjdFwiKXtlPWk7cT1KU09OLnN0cmluZ2lmeShlKX1pZih0eXBlb2YgaT09XCJzdHJpbmdcIil7cT1pO2lmKCFrLmlzU2FmZUpTT05TdHJpbmcocSkpe3Rocm93XCJKV1MgSGVhZCBpcyBub3Qgc2FmZSBKU09OIHN0cmluZzogXCIrcX1lPWsucmVhZFNhZmVKU09OU3RyaW5nKHEpfWo9YztpZih0eXBlb2YgYz09XCJvYmplY3RcIil7aj1KU09OLnN0cmluZ2lmeShjKX1pZigoYT09XCJcInx8YT09bnVsbCkmJmUuYWxnIT09dW5kZWZpbmVkKXthPWUuYWxnfWlmKChhIT1cIlwiJiZhIT1udWxsKSYmZS5hbGc9PT11bmRlZmluZWQpe2UuYWxnPWE7cT1KU09OLnN0cmluZ2lmeShlKX1pZihhIT09ZS5hbGcpe3Rocm93XCJhbGcgYW5kIHNIZWFkZXIuYWxnIGRvZXNuJ3QgbWF0Y2g6IFwiK2ErXCIhPVwiK2UuYWxnfXZhciBkPW51bGw7aWYoay5qd3NhbGcyc2lnYWxnW2FdPT09dW5kZWZpbmVkKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnIG5hbWU6IFwiK2F9ZWxzZXtkPWsuandzYWxnMnNpZ2FsZ1thXX12YXIgYj11dGY4dG9iNjR1KHEpO3ZhciBnPXV0Zjh0b2I2NHUoaik7dmFyIG89YitcIi5cIitnO3ZhciBuPVwiXCI7aWYoZC5zdWJzdHIoMCw0KT09XCJIbWFjXCIpe2lmKG09PT11bmRlZmluZWQpe3Rocm93XCJtYWMga2V5IHNoYWxsIGJlIHNwZWNpZmllZCBmb3IgSFMqIGFsZ1wifXZhciBoPW5ldyBLSlVSLmNyeXB0by5NYWMoe2FsZzpkLHByb3Y6XCJjcnlwdG9qc1wiLHBhc3M6bX0pO2gudXBkYXRlU3RyaW5nKG8pO249aC5kb0ZpbmFsKCl9ZWxzZXtpZihkLmluZGV4T2YoXCJ3aXRoRUNEU0FcIikhPS0xKXt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6ZH0pO3AuaW5pdChtLGwpO3AudXBkYXRlU3RyaW5nKG8pO2hBU04xU2lnPXAuc2lnbigpO249S0pVUi5jcnlwdG8uRUNEU0EuYXNuMVNpZ1RvQ29uY2F0U2lnKGhBU04xU2lnKX1lbHNle2lmKGQhPVwibm9uZVwiKXt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6ZH0pO3AuaW5pdChtLGwpO3AudXBkYXRlU3RyaW5nKG8pO249cC5zaWduKCl9fX12YXIgZj1oZXh0b2I2NHUobik7cmV0dXJuIG8rXCIuXCIrZn07S0pVUi5qd3MuSldTLnZlcmlmeT1mdW5jdGlvbihwLHQsail7dmFyIG09S0pVUi5qd3MuSldTO3ZhciBxPXAuc3BsaXQoXCIuXCIpO3ZhciBkPXFbMF07dmFyIGw9cVsxXTt2YXIgYj1kK1wiLlwiK2w7dmFyIHI9YjY0dXRvaGV4KHFbMl0pO3ZhciBpPW0ucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgocVswXSkpO3ZhciBoPW51bGw7dmFyIHM9bnVsbDtpZihpLmFsZz09PXVuZGVmaW5lZCl7dGhyb3dcImFsZ29yaXRobSBub3Qgc3BlY2lmaWVkIGluIGhlYWRlclwifWVsc2V7aD1pLmFsZztzPWguc3Vic3RyKDAsMil9aWYoaiE9bnVsbCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGopPT09XCJbb2JqZWN0IEFycmF5XVwiJiZqLmxlbmd0aD4wKXt2YXIgYz1cIjpcIitqLmpvaW4oXCI6XCIpK1wiOlwiO2lmKGMuaW5kZXhPZihcIjpcIitoK1wiOlwiKT09LTEpe3Rocm93XCJhbGdvcml0aG0gJ1wiK2grXCInIG5vdCBhY2NlcHRlZCBpbiB0aGUgbGlzdFwifX1pZihoIT1cIm5vbmVcIiYmdD09PW51bGwpe3Rocm93XCJrZXkgc2hhbGwgYmUgc3BlY2lmaWVkIHRvIHZlcmlmeS5cIn1pZih0eXBlb2YgdD09XCJzdHJpbmdcIiYmdC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0PUtFWVVUSUwuZ2V0S2V5KHQpfWlmKHM9PVwiUlNcInx8cz09XCJQU1wiKXtpZighKHQgaW5zdGFuY2VvZiBSU0FLZXkpKXt0aHJvd1wia2V5IHNoYWxsIGJlIGEgUlNBS2V5IG9iaiBmb3IgUlMqIGFuZCBQUyogYWxnc1wifX1pZihzPT1cIkVTXCIpe2lmKCEodCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKSl7dGhyb3dcImtleSBzaGFsbCBiZSBhIEVDRFNBIG9iaiBmb3IgRVMqIGFsZ3NcIn19aWYoaD09XCJub25lXCIpe312YXIgbj1udWxsO2lmKG0uandzYWxnMnNpZ2FsZ1tpLmFsZ109PT11bmRlZmluZWQpe3Rocm93XCJ1bnN1cHBvcnRlZCBhbGcgbmFtZTogXCIraH1lbHNle249bS5qd3NhbGcyc2lnYWxnW2hdfWlmKG49PVwibm9uZVwiKXt0aHJvd1wibm90IHN1cHBvcnRlZFwifWVsc2V7aWYobi5zdWJzdHIoMCw0KT09XCJIbWFjXCIpe3ZhciBrPW51bGw7aWYodD09PXVuZGVmaW5lZCl7dGhyb3dcImhleGFkZWNpbWFsIGtleSBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yIEhNQUNcIn12YXIgZz1uZXcgS0pVUi5jcnlwdG8uTWFjKHthbGc6bixwYXNzOnR9KTtnLnVwZGF0ZVN0cmluZyhiKTtrPWcuZG9GaW5hbCgpO3JldHVybiByPT1rfWVsc2V7aWYobi5pbmRleE9mKFwid2l0aEVDRFNBXCIpIT0tMSl7dmFyIGY9bnVsbDt0cnl7Zj1LSlVSLmNyeXB0by5FQ0RTQS5jb25jYXRTaWdUb0FTTjFTaWcocil9Y2F0Y2gobyl7cmV0dXJuIGZhbHNlfXZhciBlPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpufSk7ZS5pbml0KHQpO2UudXBkYXRlU3RyaW5nKGIpO3JldHVybiBlLnZlcmlmeShmKX1lbHNle3ZhciBlPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpufSk7ZS5pbml0KHQpO2UudXBkYXRlU3RyaW5nKGIpO3JldHVybiBlLnZlcmlmeShyKX19fX07S0pVUi5qd3MuSldTLnBhcnNlPWZ1bmN0aW9uKGcpe3ZhciBjPWcuc3BsaXQoXCIuXCIpO3ZhciBiPXt9O3ZhciBmLGUsZDtpZihjLmxlbmd0aCE9MiYmYy5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgc0pXUzogd3JvbmcgbnVtYmVyIG9mICcuJyBzcGxpdHRlZCBlbGVtZW50c1wifWY9Y1swXTtlPWNbMV07aWYoYy5sZW5ndGg9PTMpe2Q9Y1syXX1iLmhlYWRlck9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZikpO2IucGF5bG9hZE9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZSkpO2IuaGVhZGVyUFA9SlNPTi5zdHJpbmdpZnkoYi5oZWFkZXJPYmosbnVsbCxcIiAgXCIpO2lmKGIucGF5bG9hZE9iaj09bnVsbCl7Yi5wYXlsb2FkUFA9YjY0dXRvdXRmOChlKX1lbHNle2IucGF5bG9hZFBQPUpTT04uc3RyaW5naWZ5KGIucGF5bG9hZE9iaixudWxsLFwiICBcIil9aWYoZCE9PXVuZGVmaW5lZCl7Yi5zaWdIZXg9YjY0dXRvaGV4KGQpfXJldHVybiBifTtLSlVSLmp3cy5KV1MudmVyaWZ5SldUPWZ1bmN0aW9uKGQsaixsKXt2YXIgaD1LSlVSLmp3cy5KV1M7dmFyIGk9ZC5zcGxpdChcIi5cIik7dmFyIGM9aVswXTt2YXIgZz1pWzFdO3ZhciBtPWMrXCIuXCIrZzt2YXIgaz1iNjR1dG9oZXgoaVsyXSk7dmFyIGY9aC5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChjKSk7dmFyIGU9aC5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChnKSk7aWYoZi5hbGc9PT11bmRlZmluZWQpe3JldHVybiBmYWxzZX1pZihsLmFsZz09PXVuZGVmaW5lZCl7dGhyb3dcImFjY2VwdEZpZWxkLmFsZyBzaGFsbCBiZSBzcGVjaWZpZWRcIn1pZighaC5pbkFycmF5KGYuYWxnLGwuYWxnKSl7cmV0dXJuIGZhbHNlfWlmKGUuaXNzIT09dW5kZWZpbmVkJiZ0eXBlb2YgbC5pc3M9PT1cIm9iamVjdFwiKXtpZighaC5pbkFycmF5KGUuaXNzLGwuaXNzKSl7cmV0dXJuIGZhbHNlfX1pZihlLnN1YiE9PXVuZGVmaW5lZCYmdHlwZW9mIGwuc3ViPT09XCJvYmplY3RcIil7aWYoIWguaW5BcnJheShlLnN1YixsLnN1Yikpe3JldHVybiBmYWxzZX19aWYoZS5hdWQhPT11bmRlZmluZWQmJnR5cGVvZiBsLmF1ZD09PVwib2JqZWN0XCIpe2lmKHR5cGVvZiBlLmF1ZD09XCJzdHJpbmdcIil7aWYoIWguaW5BcnJheShlLmF1ZCxsLmF1ZCkpe3JldHVybiBmYWxzZX19ZWxzZXtpZih0eXBlb2YgZS5hdWQ9PVwib2JqZWN0XCIpe2lmKCFoLmluY2x1ZGVkQXJyYXkoZS5hdWQsbC5hdWQpKXtyZXR1cm4gZmFsc2V9fX19dmFyIGI9S0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKTtpZihsLnZlcmlmeUF0IT09dW5kZWZpbmVkJiZ0eXBlb2YgbC52ZXJpZnlBdD09PVwibnVtYmVyXCIpe2I9bC52ZXJpZnlBdH1pZihsLmdyYWNlUGVyaW9kPT09dW5kZWZpbmVkfHx0eXBlb2YgbC5ncmFjZVBlcmlvZCE9PVwibnVtYmVyXCIpe2wuZ3JhY2VQZXJpb2Q9MH1pZihlLmV4cCE9PXVuZGVmaW5lZCYmdHlwZW9mIGUuZXhwPT1cIm51bWJlclwiKXtpZihlLmV4cCtsLmdyYWNlUGVyaW9kPGIpe3JldHVybiBmYWxzZX19aWYoZS5uYmYhPT11bmRlZmluZWQmJnR5cGVvZiBlLm5iZj09XCJudW1iZXJcIil7aWYoYjxlLm5iZi1sLmdyYWNlUGVyaW9kKXtyZXR1cm4gZmFsc2V9fWlmKGUuaWF0IT09dW5kZWZpbmVkJiZ0eXBlb2YgZS5pYXQ9PVwibnVtYmVyXCIpe2lmKGI8ZS5pYXQtbC5ncmFjZVBlcmlvZCl7cmV0dXJuIGZhbHNlfX1pZihlLmp0aSE9PXVuZGVmaW5lZCYmbC5qdGkhPT11bmRlZmluZWQpe2lmKGUuanRpIT09bC5qdGkpe3JldHVybiBmYWxzZX19aWYoIUtKVVIuandzLkpXUy52ZXJpZnkoZCxqLGwuYWxnKSl7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfTtLSlVSLmp3cy5KV1MuaW5jbHVkZWRBcnJheT1mdW5jdGlvbihiLGEpe3ZhciBkPUtKVVIuandzLkpXUy5pbkFycmF5O2lmKGI9PT1udWxsKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIhPT1cIm9iamVjdFwiKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIubGVuZ3RoIT09XCJudW1iZXJcIil7cmV0dXJuIGZhbHNlfWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtpZighZChiW2NdLGEpKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfTtLSlVSLmp3cy5KV1MuaW5BcnJheT1mdW5jdGlvbihkLGIpe2lmKGI9PT1udWxsKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIhPT1cIm9iamVjdFwiKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIubGVuZ3RoIT09XCJudW1iZXJcIil7cmV0dXJuIGZhbHNlfWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtpZihiW2NdPT1kKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfTtLSlVSLmp3cy5KV1MuandzYWxnMnNpZ2FsZz17SFMyNTY6XCJIbWFjU0hBMjU2XCIsSFMzODQ6XCJIbWFjU0hBMzg0XCIsSFM1MTI6XCJIbWFjU0hBNTEyXCIsUlMyNTY6XCJTSEEyNTZ3aXRoUlNBXCIsUlMzODQ6XCJTSEEzODR3aXRoUlNBXCIsUlM1MTI6XCJTSEE1MTJ3aXRoUlNBXCIsRVMyNTY6XCJTSEEyNTZ3aXRoRUNEU0FcIixFUzM4NDpcIlNIQTM4NHdpdGhFQ0RTQVwiLFBTMjU2OlwiU0hBMjU2d2l0aFJTQWFuZE1HRjFcIixQUzM4NDpcIlNIQTM4NHdpdGhSU0FhbmRNR0YxXCIsUFM1MTI6XCJTSEE1MTJ3aXRoUlNBYW5kTUdGMVwiLG5vbmU6XCJub25lXCIsfTtLSlVSLmp3cy5KV1MuaXNTYWZlSlNPTlN0cmluZz1mdW5jdGlvbihjLGIsZCl7dmFyIGU9bnVsbDt0cnl7ZT1qc29uUGFyc2UoYyk7aWYodHlwZW9mIGUhPVwib2JqZWN0XCIpe3JldHVybiAwfWlmKGUuY29uc3RydWN0b3I9PT1BcnJheSl7cmV0dXJuIDB9aWYoYil7YltkXT1lfXJldHVybiAxfWNhdGNoKGEpe3JldHVybiAwfX07S0pVUi5qd3MuSldTLnJlYWRTYWZlSlNPTlN0cmluZz1mdW5jdGlvbihiKXt2YXIgYz1udWxsO3RyeXtjPWpzb25QYXJzZShiKTtpZih0eXBlb2YgYyE9XCJvYmplY3RcIil7cmV0dXJuIG51bGx9aWYoYy5jb25zdHJ1Y3Rvcj09PUFycmF5KXtyZXR1cm4gbnVsbH1yZXR1cm4gY31jYXRjaChhKXtyZXR1cm4gbnVsbH19O0tKVVIuandzLkpXUy5nZXRFbmNvZGVkU2lnbmF0dXJlVmFsdWVGcm9tSldTPWZ1bmN0aW9uKGEpe2lmKGEubWF0Y2goL15bXi5dK1xcLlteLl0rXFwuKFteLl0rKSQvKT09bnVsbCl7dGhyb3dcIkpXUyBzaWduYXR1cmUgaXMgbm90IGEgZm9ybSBvZiAnSGVhZC5QYXlsb2FkLlNpZ1ZhbHVlJy5cIn1yZXR1cm4gUmVnRXhwLiQxfTtLSlVSLmp3cy5KV1MuZ2V0SldLdGh1bWJwcmludD1mdW5jdGlvbihkKXtpZihkLmt0eSE9PVwiUlNBXCImJmQua3R5IT09XCJFQ1wiJiZkLmt0eSE9PVwib2N0XCIpe3Rocm93XCJ1bnN1cHBvcnRlZCBhbGdvcml0aG0gZm9yIEpXSyBUaHVtcHJpbnRcIn12YXIgYT1cIntcIjtpZihkLmt0eT09PVwiUlNBXCIpe2lmKHR5cGVvZiBkLm4hPVwic3RyaW5nXCJ8fHR5cGVvZiBkLmUhPVwic3RyaW5nXCIpe3Rocm93XCJ3cm9uZyBuIGFuZCBlIHZhbHVlIGZvciBSU0Ega2V5XCJ9YSs9J1wiZVwiOlwiJytkLmUrJ1wiLCc7YSs9J1wia3R5XCI6XCInK2Qua3R5KydcIiwnO2ErPSdcIm5cIjpcIicrZC5uKydcIn0nfWVsc2V7aWYoZC5rdHk9PT1cIkVDXCIpe2lmKHR5cGVvZiBkLmNydiE9XCJzdHJpbmdcInx8dHlwZW9mIGQueCE9XCJzdHJpbmdcInx8dHlwZW9mIGQueSE9XCJzdHJpbmdcIil7dGhyb3dcIndyb25nIGNydiwgeCBhbmQgeSB2YWx1ZSBmb3IgRUMga2V5XCJ9YSs9J1wiY3J2XCI6XCInK2QuY3J2KydcIiwnO2ErPSdcImt0eVwiOlwiJytkLmt0eSsnXCIsJzthKz0nXCJ4XCI6XCInK2QueCsnXCIsJzthKz0nXCJ5XCI6XCInK2QueSsnXCJ9J31lbHNle2lmKGQua3R5PT09XCJvY3RcIil7aWYodHlwZW9mIGQuayE9XCJzdHJpbmdcIil7dGhyb3dcIndyb25nIGsgdmFsdWUgZm9yIG9jdChzeW1tZXRyaWMpIGtleVwifWErPSdcImt0eVwiOlwiJytkLmt0eSsnXCIsJzthKz0nXCJrXCI6XCInK2QuaysnXCJ9J319fXZhciBiPXJzdHJ0b2hleChhKTt2YXIgYz1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoYixcInNoYTI1NlwiKTt2YXIgZT1oZXh0b2I2NHUoYyk7cmV0dXJuIGV9O0tKVVIuandzLkludERhdGU9e307S0pVUi5qd3MuSW50RGF0ZS5nZXQ9ZnVuY3Rpb24oYSl7aWYoYT09XCJub3dcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCl9ZWxzZXtpZihhPT1cIm5vdyArIDFob3VyXCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpKzYwKjYwfWVsc2V7aWYoYT09XCJub3cgKyAxZGF5XCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpKzYwKjYwKjI0fWVsc2V7aWYoYT09XCJub3cgKyAxbW9udGhcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjAqMjQqMzB9ZWxzZXtpZihhPT1cIm5vdyArIDF5ZWFyXCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpKzYwKjYwKjI0KjM2NX1lbHNle2lmKGEubWF0Y2goL1okLykpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldFp1bHUoYSl9ZWxzZXtpZihhLm1hdGNoKC9eWzAtOV0rJC8pKXtyZXR1cm4gcGFyc2VJbnQoYSl9fX19fX19dGhyb3dcInVuc3VwcG9ydGVkIGZvcm1hdDogXCIrYX07S0pVUi5qd3MuSW50RGF0ZS5nZXRadWx1PWZ1bmN0aW9uKGwpe3ZhciBrO2lmKGs9bC5tYXRjaCgvKFxcZCspKFxcZFxcZCkoXFxkXFxkKShcXGRcXGQpKFxcZFxcZCkoXFxkXFxkKVovKSl7dmFyIGI9UmVnRXhwLiQxO3ZhciBpPXBhcnNlSW50KGIpO2lmKGIubGVuZ3RoPT00KXt9ZWxzZXtpZihiLmxlbmd0aD09Mil7aWYoNTA8PWkmJmk8MTAwKXtpPTE5MDAraX1lbHNle2lmKDA8PWkmJmk8NTApe2k9MjAwMCtpfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCB5ZWFyIHN0cmluZyBmb3IgVVRDVGltZVwifX19ZWxzZXt0aHJvd1wibWFsZm9ybWVkIHllYXIgc3RyaW5nXCJ9fXZhciBnPXBhcnNlSW50KFJlZ0V4cC4kMiktMTt2YXIgaj1wYXJzZUludChSZWdFeHAuJDMpO3ZhciBjPXBhcnNlSW50KFJlZ0V4cC4kNCk7dmFyIGU9cGFyc2VJbnQoUmVnRXhwLiQ1KTt2YXIgZj1wYXJzZUludChSZWdFeHAuJDYpO3ZhciBoPW5ldyBEYXRlKERhdGUuVVRDKGksZyxqLGMsZSxmKSk7cmV0dXJuIH5+KGgvMTAwMCl9dGhyb3dcInVuc3VwcG9ydGVkIGZvcm1hdDogXCIrbH07S0pVUi5qd3MuSW50RGF0ZS5nZXROb3c9ZnVuY3Rpb24oKXt2YXIgYT1+fihuZXcgRGF0ZSgpLzEwMDApO3JldHVybiBhfTtLSlVSLmp3cy5JbnREYXRlLmludERhdGUyVVRDU3RyaW5nPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBEYXRlKGEqMTAwMCk7cmV0dXJuIGIudG9VVENTdHJpbmcoKX07S0pVUi5qd3MuSW50RGF0ZS5pbnREYXRlMlp1bHU9ZnVuY3Rpb24oZSl7dmFyIGk9bmV3IERhdGUoZSoxMDAwKTt2YXIgaD0oXCIwMDAwXCIraS5nZXRVVENGdWxsWWVhcigpKS5zbGljZSgtNCk7dmFyIGc9KFwiMDBcIisoaS5nZXRVVENNb250aCgpKzEpKS5zbGljZSgtMik7dmFyIGI9KFwiMDBcIitpLmdldFVUQ0RhdGUoKSkuc2xpY2UoLTIpO3ZhciBhPShcIjAwXCIraS5nZXRVVENIb3VycygpKS5zbGljZSgtMik7dmFyIGM9KFwiMDBcIitpLmdldFVUQ01pbnV0ZXMoKSkuc2xpY2UoLTIpO3ZhciBmPShcIjAwXCIraS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTtyZXR1cm4gaCtnK2IrYStjK2YrXCJaXCJ9O1xuLyohIGp3c2pzLTIuMS4wIChjKSAyMDEwLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmp3cz09XCJ1bmRlZmluZWRcInx8IUtKVVIuandzKXtLSlVSLmp3cz17fX1LSlVSLmp3cy5KV1NKUz1mdW5jdGlvbigpe3ZhciBiPUtKVVIuandzLkpXUzt2YXIgYT1LSlVSLmp3cy5KV1M7dGhpcy5hSGVhZGVyPVtdO3RoaXMuc1BheWxvYWQ9XCJcIjt0aGlzLmFTaWduYXR1cmU9W107dGhpcy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5hSGVhZGVyPVtdO3RoaXMuc1BheWxvYWQ9dW5kZWZpbmVkO3RoaXMuYVNpZ25hdHVyZT1bXX07dGhpcy5pbml0V2l0aEpXUz1mdW5jdGlvbihkKXt0aGlzLmluaXQoKTt2YXIgYz1kLnNwbGl0KFwiLlwiKTtpZihjLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBpbnB1dCBKV1NcIn10aGlzLmFIZWFkZXIucHVzaChjWzBdKTt0aGlzLnNQYXlsb2FkPWNbMV07dGhpcy5hU2lnbmF0dXJlLnB1c2goY1syXSl9O3RoaXMuYWRkU2lnbmF0dXJlPWZ1bmN0aW9uKGMsZixrLGkpe2lmKHRoaXMuc1BheWxvYWQ9PT11bmRlZmluZWR8fHRoaXMuc1BheWxvYWQ9PT1udWxsKXt0aHJvd1widGhlcmUncyBubyBKU09OLUpTIHNpZ25hdHVyZSB0byBhZGQuXCJ9dmFyIGo9dGhpcy5hSGVhZGVyLmxlbmd0aDtpZih0aGlzLmFIZWFkZXIubGVuZ3RoIT10aGlzLmFTaWduYXR1cmUubGVuZ3RoKXt0aHJvd1wiYUhlYWRlci5sZW5ndGggIT0gYVNpZ25hdHVyZS5sZW5ndGhcIn10cnl7dmFyIGQ9S0pVUi5qd3MuSldTLnNpZ24oYyxmLHRoaXMuc1BheWxvYWQsayxpKTt2YXIgaD1kLnNwbGl0KFwiLlwiKTt2YXIgbD1oWzBdO3ZhciBlPWhbMl07dGhpcy5hSGVhZGVyLnB1c2goaFswXSk7dGhpcy5hU2lnbmF0dXJlLnB1c2goaFsyXSl9Y2F0Y2goZyl7aWYodGhpcy5hSGVhZGVyLmxlbmd0aD5qKXt0aGlzLmFIZWFkZXIucG9wKCl9aWYodGhpcy5hU2lnbmF0dXJlLmxlbmd0aD5qKXt0aGlzLmFTaWduYXR1cmUucG9wKCl9dGhyb3dcImFkZFNpZ25hdHVyZSBmYWlsZWQ6IFwiK2d9fTt0aGlzLmFkZFNpZ25hdHVyZUJ5SGVhZGVyS2V5PWZ1bmN0aW9uKGYsYyl7dmFyIGU9YjY0dXRvdXRmOCh0aGlzLnNQYXlsb2FkKTt2YXIgZD1uZXcgS0pVUi5qd3MuSldTKCk7dmFyIGc9ZC5nZW5lcmF0ZUpXU0J5UDFQcnZLZXkoZixlLGMpO3RoaXMuYUhlYWRlci5wdXNoKGQucGFyc2VkSldTLmhlYWRCNjRVKTt0aGlzLmFTaWduYXR1cmUucHVzaChkLnBhcnNlZEpXUy5zaWd2YWxCNjRVKX07dGhpcy5hZGRTaWduYXR1cmVCeUhlYWRlclBheWxvYWRLZXk9ZnVuY3Rpb24oZixlLGMpe3ZhciBkPW5ldyBLSlVSLmp3cy5KV1MoKTt2YXIgZz1kLmdlbmVyYXRlSldTQnlQMVBydktleShmLGUsYyk7dGhpcy5hSGVhZGVyLnB1c2goZC5wYXJzZWRKV1MuaGVhZEI2NFUpO3RoaXMuc1BheWxvYWQ9ZC5wYXJzZWRKV1MucGF5bG9hZEI2NFU7dGhpcy5hU2lnbmF0dXJlLnB1c2goZC5wYXJzZWRKV1Muc2lndmFsQjY0VSl9O3RoaXMudmVyaWZ5QWxsPWZ1bmN0aW9uKGYpe2lmKHRoaXMuYUhlYWRlci5sZW5ndGghPT1mLmxlbmd0aHx8dGhpcy5hU2lnbmF0dXJlLmxlbmd0aCE9PWYubGVuZ3RoKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBlPTA7ZTxmLmxlbmd0aDtlKyspe3ZhciBkPWZbZV07aWYoZC5sZW5ndGghPT0yKXtyZXR1cm4gZmFsc2V9dmFyIGM9dGhpcy52ZXJpZnlOdGgoZSxkWzBdLGRbMV0pO2lmKGM9PT1mYWxzZSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX07dGhpcy52ZXJpZnlOdGg9ZnVuY3Rpb24oZCxoLGUpe2lmKHRoaXMuYUhlYWRlci5sZW5ndGg8PWR8fHRoaXMuYVNpZ25hdHVyZS5sZW5ndGg8PWQpe3JldHVybiBmYWxzZX12YXIgZj10aGlzLmFIZWFkZXJbZF07dmFyIGk9dGhpcy5hU2lnbmF0dXJlW2RdO3ZhciBqPWYrXCIuXCIrdGhpcy5zUGF5bG9hZCtcIi5cIitpO3ZhciBjPWZhbHNlO3RyeXtjPWEudmVyaWZ5KGosaCxlKX1jYXRjaChnKXtyZXR1cm4gZmFsc2V9cmV0dXJuIGN9O3RoaXMudmVyaWZ5V2l0aENlcnRzPWZ1bmN0aW9uKGQpe2lmKHRoaXMuYUhlYWRlci5sZW5ndGghPWQubGVuZ3RoKXt0aHJvd1wibnVtIGhlYWRlcnMgZG9lcyBub3QgbWF0Y2ggd2l0aCBudW0gY2VydHNcIn1pZih0aGlzLmFTaWduYXR1cmUubGVuZ3RoIT1kLmxlbmd0aCl7dGhyb3dcIm51bSBzaWduYXR1cmVzIGRvZXMgbm90IG1hdGNoIHdpdGggbnVtIGNlcnRzXCJ9dmFyIGw9dGhpcy5zUGF5bG9hZDt2YXIgaD1cIlwiO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1kW2VdO3ZhciBnPXRoaXMuYUhlYWRlcltlXTt2YXIgbj10aGlzLmFTaWduYXR1cmVbZV07dmFyIGM9ZytcIi5cIitsK1wiLlwiK247dmFyIGs9bmV3IEtKVVIuandzLkpXUygpO3RyeXt2YXIgbT1rLnZlcmlmeUpXU0J5UGVtWDUwOUNlcnQoYyxmKTtpZihtIT0xKXtoKz0oZSsxKStcInRoIHNpZ25hdHVyZSB1bm1hdGNoLiBcIn19Y2F0Y2goail7aCs9KGUrMSkrXCJ0aCBzaWduYXR1cmUgZmFpbChcIitqK1wiKS4gXCJ9fWlmKGg9PVwiXCIpe3JldHVybiAxfWVsc2V7dGhyb3cgaH19O3RoaXMucmVhZEpXU0pTPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT09XCJzdHJpbmdcIil7dmFyIGQ9Yi5yZWFkU2FmZUpTT05TdHJpbmcoZSk7aWYoZD09bnVsbCl7dGhyb3dcImFyZ3VtZW50IGlzIG5vdCBzYWZlIEpTT04gb2JqZWN0IHN0cmluZ1wifXRoaXMuYUhlYWRlcj1kLmhlYWRlcnM7dGhpcy5zUGF5bG9hZD1kLnBheWxvYWQ7dGhpcy5hU2lnbmF0dXJlPWQuc2lnbmF0dXJlc31lbHNle3RyeXtpZihlLmhlYWRlcnMubGVuZ3RoPjApe3RoaXMuYUhlYWRlcj1lLmhlYWRlcnN9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIGhlYWRlclwifWlmKHR5cGVvZiBlLnBheWxvYWQ9PT1cInN0cmluZ1wiKXt0aGlzLnNQYXlsb2FkPWUucGF5bG9hZH1lbHNle3Rocm93XCJtYWxmb3JtZWQgc2lnbmF0dXJlc1wifWlmKGUuc2lnbmF0dXJlcy5sZW5ndGg+MCl7dGhpcy5zaWduYXR1cmVzPWUuc2lnbmF0dXJlc31lbHNle3Rocm93XCJtYWxmb3JtZWQgc2lnbmF0dXJlc1wifX1jYXRjaChjKXt0aHJvd1wibWFsZm9ybWVkIEpXUy1KUyBKU09OIG9iamVjdDogXCIrY319fTt0aGlzLmdldEpTT049ZnVuY3Rpb24oKXtyZXR1cm57aGVhZGVyczp0aGlzLmFIZWFkZXIscGF5bG9hZDp0aGlzLnNQYXlsb2FkLHNpZ25hdHVyZXM6dGhpcy5hU2lnbmF0dXJlfX07dGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7aWYodGhpcy5hSGVhZGVyLmxlbmd0aD09MCl7cmV0dXJuIDF9cmV0dXJuIDB9fTtcbi8qISBub2RldXRpbC0xLjAuMCAoYykgMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5mdW5jdGlvbiByZWFkRmlsZVVURjgoYSl7cmV0dXJuIHJlcXVpcmUoXCJmc1wiKS5yZWFkRmlsZVN5bmMoYSxcInV0ZjhcIil9ZnVuY3Rpb24gcmVhZEZpbGVIZXhCeUJpbihjKXt2YXIgYj1yZXF1aXJlKFwianNyc2FzaWduXCIpO3ZhciBhPXJlcXVpcmUoXCJmc1wiKTtyZXR1cm4gYi5yc3RydG9oZXgoYS5yZWFkRmlsZVN5bmMoYyxcImJpbmFyeVwiKSl9ZnVuY3Rpb24gcmVhZEZpbGUoYil7dmFyIGE9cmVxdWlyZShcImZzXCIpO3JldHVybiBhLnJlYWRGaWxlU3luYyhiLFwiYmluYXJ5XCIpfWZ1bmN0aW9uIHNhdmVGaWxlKGMsYil7dmFyIGE9cmVxdWlyZShcImZzXCIpO2Eud3JpdGVGaWxlU3luYyhjLGIsXCJiaW5hcnlcIil9ZnVuY3Rpb24gc2F2ZUZpbGVCaW5CeUhleChlLGIpe3ZhciBhPXJlcXVpcmUoXCJmc1wiKTt2YXIgYz1yZXF1aXJlKFwianNyc2FzaWduXCIpO3ZhciBkPWMuaGV4dG9yc3RyKGIpO2Eud3JpdGVGaWxlU3luYyhlLGQsXCJiaW5hcnlcIil9O1xuZXhwb3J0cy5TZWN1cmVSYW5kb20gPSBTZWN1cmVSYW5kb207XG5leHBvcnRzLnJuZ19zZWVkX3RpbWUgPSBybmdfc2VlZF90aW1lO1xuXG5leHBvcnRzLkJpZ0ludGVnZXIgPSBCaWdJbnRlZ2VyO1xuZXhwb3J0cy5SU0FLZXkgPSBSU0FLZXk7XG5leHBvcnRzLkVDRFNBID0gS0pVUi5jcnlwdG8uRUNEU0E7XG5leHBvcnRzLkRTQSA9IEtKVVIuY3J5cHRvLkRTQTtcbmV4cG9ydHMuU2lnbmF0dXJlID0gS0pVUi5jcnlwdG8uU2lnbmF0dXJlO1xuZXhwb3J0cy5NZXNzYWdlRGlnZXN0ID0gS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdDtcbmV4cG9ydHMuTWFjID0gS0pVUi5jcnlwdG8uTWFjO1xuZXhwb3J0cy5LRVlVVElMID0gS0VZVVRJTDtcbmV4cG9ydHMuQVNOMUhFWCA9IEFTTjFIRVg7XG5leHBvcnRzLlg1MDkgPSBYNTA5O1xuZXhwb3J0cy5DcnlwdG9KUyA9IENyeXB0b0pTO1xuXG4vLyBleHQvYmFzZTY0LmpzXG5leHBvcnRzLmI2NHRvaGV4ID0gYjY0dG9oZXg7XG5leHBvcnRzLmI2NHRvQkEgPSBiNjR0b0JBO1xuXG4vLyBiYXNlNjR4LmpzXG5leHBvcnRzLnN0b0JBID0gc3RvQkE7XG5leHBvcnRzLkJBdG9zID0gQkF0b3M7XG5leHBvcnRzLkJBdG9oZXggPSBCQXRvaGV4O1xuZXhwb3J0cy5zdG9oZXggPSBzdG9oZXg7XG5leHBvcnRzLnN0b2I2NCA9IHN0b2I2NDtcbmV4cG9ydHMuc3RvYjY0dSA9IHN0b2I2NHU7XG5leHBvcnRzLmI2NHV0b3MgPSBiNjR1dG9zO1xuZXhwb3J0cy5iNjR0b2I2NHUgPSBiNjR0b2I2NHU7XG5leHBvcnRzLmI2NHV0b2I2NCA9IGI2NHV0b2I2NDtcbmV4cG9ydHMuaGV4MmI2NCA9IGhleDJiNjQ7XG5leHBvcnRzLmhleHRvYjY0dSA9IGhleHRvYjY0dTtcbmV4cG9ydHMuYjY0dXRvaGV4ID0gYjY0dXRvaGV4O1xuZXhwb3J0cy5iNjR0b2hleCA9IGI2NHRvaGV4O1xuZXhwb3J0cy51dGY4dG9iNjR1ID0gdXRmOHRvYjY0dTtcbmV4cG9ydHMuYjY0dXRvdXRmOCA9IGI2NHV0b3V0Zjg7XG5leHBvcnRzLnV0Zjh0b2I2NCA9IHV0Zjh0b2I2NDtcbmV4cG9ydHMuYjY0dG91dGY4ID0gYjY0dG91dGY4O1xuZXhwb3J0cy51dGY4dG9oZXggPSB1dGY4dG9oZXg7XG5leHBvcnRzLmhleHRvdXRmOCA9IGhleHRvdXRmODtcbmV4cG9ydHMuaGV4dG9yc3RyID0gaGV4dG9yc3RyO1xuZXhwb3J0cy5yc3RydG9oZXggPSByc3RydG9oZXg7XG5leHBvcnRzLm5ld2xpbmVfdG9Vbml4ID0gbmV3bGluZV90b1VuaXg7XG5leHBvcnRzLm5ld2xpbmVfdG9Eb3MgPSBuZXdsaW5lX3RvRG9zO1xuZXhwb3J0cy5pbnRhcnlzdHJ0b2hleCA9IGludGFyeXN0cnRvaGV4O1xuZXhwb3J0cy5zdHJkaWZmaWR4ID0gc3RyZGlmZmlkeDtcblxuZXhwb3J0cy5LSlVSID0gS0pVUjtcbmV4cG9ydHMuY3J5cHRvID0gS0pVUi5jcnlwdG87XG5leHBvcnRzLmFzbjEgPSBLSlVSLmFzbjE7XG5leHBvcnRzLmp3cyA9IEtKVVIuandzO1xuZXhwb3J0cy5sYW5nID0gS0pVUi5sYW5nO1xuXG5leHBvcnRzLnJlYWRGaWxlVVRGOCA9IHJlYWRGaWxlVVRGODtcbmV4cG9ydHMucmVhZEZpbGVIZXhCeUJpbiA9IHJlYWRGaWxlSGV4QnlCaW47XG5leHBvcnRzLnJlYWRGaWxlID0gcmVhZEZpbGU7XG5leHBvcnRzLnNhdmVGaWxlID0gc2F2ZUZpbGU7XG5leHBvcnRzLnNhdmVGaWxlQmluQnlIZXggPSBzYXZlRmlsZUJpbkJ5SGV4O1xuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanNyc2FzaWduL2xpYi9qc3JzYXNpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDMzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5pbXBvcnQgU2lnbmluU3RhdGUgZnJvbSAnLi9TaWduaW5TdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBTaWduaW5SZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3Rvcih7XG4gICAgICAgIC8vIG1hbmRhdG9yeVxuICAgICAgICB1cmwsIGNsaWVudF9pZCwgcmVkaXJlY3RfdXJpLCByZXNwb25zZV90eXBlLCBzY29wZSwgYXV0aG9yaXR5LFxuICAgICAgICAvLyBvcHRpb25hbFxuICAgICAgICBkYXRhLCBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsIHJlc291cmNlLFxuICAgICAgICByZXF1ZXN0LCByZXF1ZXN0X3VyaSwgZXh0cmFRdWVyeVBhcmFtcyxcbiAgICB9KSB7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB1cmwgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjbGllbnRfaWQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGNsaWVudF9pZCBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlZGlyZWN0X3VyaSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcmVkaXJlY3RfdXJpIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVkaXJlY3RfdXJpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzcG9uc2VfdHlwZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcmVzcG9uc2VfdHlwZSBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlX3R5cGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzY29wZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2NvcGUgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY29wZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWF1dGhvcml0eSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXV0aG9yaXR5IHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXR5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9pZGMgPSBTaWduaW5SZXF1ZXN0LmlzT2lkYyhyZXNwb25zZV90eXBlKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBTaWduaW5TdGF0ZSh7IG5vbmNlOiBvaWRjLCBkYXRhLCBjbGllbnRfaWQsIGF1dGhvcml0eSB9KTtcblxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcImNsaWVudF9pZFwiLCBjbGllbnRfaWQpO1xuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlZGlyZWN0X3VyaVwiLCByZWRpcmVjdF91cmkpO1xuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlc3BvbnNlX3R5cGVcIiwgcmVzcG9uc2VfdHlwZSk7XG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwic2NvcGVcIiwgc2NvcGUpO1xuICAgICAgICBcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcbiAgICAgICAgaWYgKG9pZGMpIHtcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwibm9uY2VcIiwgdGhpcy5zdGF0ZS5ub25jZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3B0aW9uYWwgPSB7IHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlcywgcmVzb3VyY2UsIHJlcXVlc3QsIHJlcXVlc3RfdXJpIH07XG4gICAgICAgIGZvcihsZXQga2V5IGluIG9wdGlvbmFsKXtcbiAgICAgICAgICAgIGlmIChvcHRpb25hbFtrZXldKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwga2V5LCBvcHRpb25hbFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihsZXQga2V5IGluIGV4dHJhUXVlcnlQYXJhbXMpe1xuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwga2V5LCBleHRyYVF1ZXJ5UGFyYW1zW2tleV0pXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNPaWRjKHJlc3BvbnNlX3R5cGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3BvbnNlX3R5cGUuc3BsaXQoL1xccysvZykuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtID09PSBcImlkX3Rva2VuXCI7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gISEocmVzdWx0WzBdKTtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGlzT0F1dGgocmVzcG9uc2VfdHlwZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gPT09IFwidG9rZW5cIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAhIShyZXN1bHRbMF0pO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TaWduaW5SZXF1ZXN0LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuZXhwb3J0IGNsYXNzIFVybFV0aWxpdHkge1xuICAgIHN0YXRpYyBhZGRRdWVyeVBhcmFtKHVybCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgICB1cmwgKz0gXCI/XCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXJsW3VybC5sZW5ndGggLSAxXSAhPT0gXCI/XCIpIHtcbiAgICAgICAgICAgIHVybCArPSBcIiZcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XG4gICAgICAgIHVybCArPSBcIj1cIjtcbiAgICAgICAgdXJsICs9IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2VVcmxGcmFnbWVudCh2YWx1ZSwgZGVsaW1pdGVyID0gXCIjXCIsIGdsb2JhbCA9IEdsb2JhbCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnRcIik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpe1xuICAgICAgICAgICAgdmFsdWUgPSBnbG9iYWwubG9jYXRpb24uaHJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpZHggPSB2YWx1ZS5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyKGlkeCArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBhcmFtcyA9IHt9LFxuICAgICAgICAgICAgcmVnZXggPSAvKFteJj1dKyk9KFteJl0qKS9nLFxuICAgICAgICAgICAgbTtcblxuICAgICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICAgIHdoaWxlIChtID0gcmVnZXguZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobVsxXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KG1bMl0pO1xuICAgICAgICAgICAgaWYgKGNvdW50ZXIrKyA+IDUwKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwicmVzcG9uc2UgZXhjZWVkZWQgZXhwZWN0ZWQgbnVtYmVyIG9mIHBhcmFtZXRlcnNcIiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBcIlJlc3BvbnNlIGV4Y2VlZGVkIGV4cGVjdGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXJsVXRpbGl0eS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xuaW1wb3J0IHJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbmV4cG9ydCBjbGFzcyBTaWduaW5TdGF0ZSBleHRlbmRzIFN0YXRlIHtcbiAgICBjb25zdHJ1Y3Rvcih7bm9uY2UsIGF1dGhvcml0eSwgY2xpZW50X2lkfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAobm9uY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gcmFuZG9tKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9uY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gbm9uY2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IGF1dGhvcml0eTtcbiAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gY2xpZW50X2lkO1xuICAgIH1cblxuICAgIGdldCBub25jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vbmNlO1xuICAgIH1cbiAgICBnZXQgYXV0aG9yaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yaXR5O1xuICAgIH1cbiAgICBnZXQgY2xpZW50X2lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2lkO1xuICAgIH1cbiAgICBcbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlNpZ25pblN0YXRlLnRvU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkLFxuICAgICAgICAgICAgbm9uY2U6IHRoaXMubm9uY2UsXG4gICAgICAgICAgICBhdXRob3JpdHk6IHRoaXMuYXV0aG9yaXR5LFxuICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudF9pZFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xuICAgICAgICBMb2cuZGVidWcoXCJTaWduaW5TdGF0ZS5mcm9tU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpO1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25pblN0YXRlKGRhdGEpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TaWduaW5TdGF0ZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IHJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioe2lkLCBkYXRhLCBjcmVhdGVkfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2lkID0gaWQgfHwgcmFuZG9tKCk7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY3JlYXRlZCA9PT0gJ251bWJlcicgJiYgY3JlYXRlZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZWQgPSBjcmVhdGVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlZCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIGdldCBjcmVhdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlZDtcbiAgICB9XG5cbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlN0YXRlLnRvU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xuICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZShKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYXJTdGFsZVN0YXRlKHN0b3JhZ2UsIGFnZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5jbGVhclN0YWxlU3RhdGVcIik7XG5cbiAgICAgICAgdmFyIGN1dG9mZiA9IERhdGUubm93KCkgLyAxMDAwIC0gYWdlO1xuXG4gICAgICAgIHJldHVybiBzdG9yYWdlLmdldEFsbEtleXMoKS50aGVuKGtleXMgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IGtleXNcIiwga2V5cyk7XG5cbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIHAgPSBzdG9yYWdlLmdldChrZXkpLnRoZW4oaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhpdGVtKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IGl0ZW0gZnJvbSBrZXk6IFwiLCBrZXksIHN0YXRlLmNyZWF0ZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmNyZWF0ZWQgPD0gY3V0b2ZmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBwYXJzaW5nIHN0YXRlIGZvciBrZXlcIiwga2V5LCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJubyBpdGVtIGluIHN0b3JhZ2UgZm9yIGtleTogXCIsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicmVtb3ZlZCBpdGVtIGZvciBrZXk6IFwiLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIndhaXRpbmcgb24gcHJvbWlzZSBjb3VudDpcIiwgcHJvbWlzZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TdGF0ZS5qcyIsIi8vIE5PVElDRTogdGhlIGNvZGUgaW4gdGhpcyBmaWxlIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IE1pY3Jvc29mdFxuLy8gb3JpZ2luYWwgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmVBRC9henVyZS1hY3RpdmVkaXJlY3RvcnktbGlicmFyeS1mb3ItanMvYmxvYi9tYXN0ZXIvbGliL2FkYWwuanMjTDEwMjlcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRhbEpTIHYxLjAuOFxuLy8gQHByZXNlcnZlIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IE9wZW4gVGVjaG5vbG9naWVzLCBJbmMuXG4vLyBBbGwgUmlnaHRzIFJlc2VydmVkXG4vLyBBcGFjaGUgTGljZW5zZSAyLjBcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5kb20oKSB7XG4gICAgdmFyIGd1aWRIb2xkZXIgPSAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnO1xuICAgIHZhciBoZXggPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBndWlkUmVzcG9uc2UgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3VpZEhvbGRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZ3VpZEhvbGRlcltpXSAhPT0gJy0nICYmIGd1aWRIb2xkZXJbaV0gIT09ICc0Jykge1xuICAgICAgICAgICAgLy8gZWFjaCB4IGFuZCB5IG5lZWRzIHRvIGJlIHJhbmRvbVxuICAgICAgICAgICAgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ3VpZEhvbGRlcltpXSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBndWlkUmVzcG9uc2UgKz0gaGV4W3JdO1xuICAgICAgICB9IGVsc2UgaWYgKGd1aWRIb2xkZXJbaV0gPT09ICd5Jykge1xuICAgICAgICAgICAgLy8gY2xvY2stc2VxLWFuZC1yZXNlcnZlZCBmaXJzdCBoZXggaXMgZmlsdGVyZWQgYW5kIHJlbWFpbmluZyBoZXggdmFsdWVzIGFyZSByYW5kb21cbiAgICAgICAgICAgIHIgJj0gMHgzOyAvLyBiaXQgYW5kIHdpdGggMDAxMSB0byBzZXQgcG9zIDIgdG8gemVybyA/MD8/XG4gICAgICAgICAgICByIHw9IDB4ODsgLy8gc2V0IHBvcyAzIHRvIDEgYXMgMT8/P1xuICAgICAgICAgICAgZ3VpZFJlc3BvbnNlICs9IGhleFtyXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGd1aWRSZXNwb25zZSArPSBndWlkSG9sZGVyW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBndWlkUmVzcG9uc2U7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JhbmRvbS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5cbmNvbnN0IE9pZGNTY29wZSA9IFwib3BlbmlkXCI7XG5cbmV4cG9ydCBjbGFzcyBTaWduaW5SZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IodXJsKSB7XG5cbiAgICAgICAgdmFyIHZhbHVlcyA9IFVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudCh1cmwsIFwiI1wiKTtcblxuICAgICAgICB0aGlzLmVycm9yID0gdmFsdWVzLmVycm9yO1xuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gdmFsdWVzLmVycm9yX2Rlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlcy5zdGF0ZTtcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IHZhbHVlcy5pZF90b2tlbjtcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gdmFsdWVzLnNlc3Npb25fc3RhdGU7XG4gICAgICAgIHRoaXMuYWNjZXNzX3Rva2VuID0gdmFsdWVzLmFjY2Vzc190b2tlbjtcbiAgICAgICAgdGhpcy50b2tlbl90eXBlID0gdmFsdWVzLnRva2VuX3R5cGU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB2YWx1ZXMuc2NvcGU7XG4gICAgICAgIHRoaXMucHJvZmlsZSA9IHVuZGVmaW5lZDsgLy8gd2lsbCBiZSBzZXQgZnJvbSBSZXNwb25zZVZhbGlkYXRvclxuXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gcGFyc2VJbnQodmFsdWVzLmV4cGlyZXNfaW4pO1xuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZXNfaW4gPT09ICdudW1iZXInICYmIGV4cGlyZXNfaW4gPiAwKSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVzX2F0ID0gbm93ICsgZXhwaXJlc19pbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBleHBpcmVzX2luKCkge1xuICAgICAgICBpZiAodGhpcy5leHBpcmVzX2F0KSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwaXJlc19hdCAtIG5vdztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldCBleHBpcmVkKCkge1xuICAgICAgICBsZXQgZXhwaXJlc19pbiA9IHRoaXMuZXhwaXJlc19pbjtcbiAgICAgICAgaWYgKGV4cGlyZXNfaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGlyZXNfaW4gPD0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldCBzY29wZXMoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zY29wZSB8fCBcIlwiKS5zcGxpdChcIiBcIik7XG4gICAgfVxuXG4gICAgZ2V0IGlzT3BlbklkQ29ubmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVzLmluZGV4T2YoT2lkY1Njb3BlKSA+PSAwIHx8ICEhdGhpcy5pZF90b2tlbjtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lnbmluUmVzcG9uc2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5pbXBvcnQgU3RhdGUgZnJvbSAnLi9TdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBTaWdub3V0UmVxdWVzdCB7XG4gICAgY29uc3RydWN0b3Ioe3VybCwgaWRfdG9rZW5faGludCwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLCBkYXRhfSkge1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHBhc3NlZCB0byBTaWdub3V0UmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZF90b2tlbl9oaW50KSB7XG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcImlkX3Rva2VuX2hpbnRcIiwgaWRfdG9rZW5faGludCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpIHtcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwicG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpXCIsIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBTdGF0ZSh7IGRhdGEgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1NpZ25vdXRSZXF1ZXN0LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcblxuZXhwb3J0IGNsYXNzIFNpZ25vdXRSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IodXJsKSB7XG5cbiAgICAgICAgdmFyIHZhbHVlcyA9IFVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudCh1cmwsIFwiP1wiKTtcblxuICAgICAgICB0aGlzLmVycm9yID0gdmFsdWVzLmVycm9yO1xuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gdmFsdWVzLmVycm9yX2Rlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlcy5zdGF0ZTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lnbm91dFJlc3BvbnNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeVdlYlN0b3JhZ2V7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cblxuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkluTWVtb3J5V2ViU3RvcmFnZS5nZXRJdGVtXCIsIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhW2tleV07XG4gICAgfVxuXG4gICAgc2V0SXRlbShrZXksIHZhbHVlKXtcbiAgICAgICAgTG9nLmRlYnVnKFwiSW5NZW1vcnlXZWJTdG9yYWdlLnNldEl0ZW1cIiwga2V5KTtcbiAgICAgICAgdGhpcy5fZGF0YVtrZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShrZXkpe1xuICAgICAgICBMb2cuZGVidWcoXCJJbk1lbW9yeVdlYlN0b3JhZ2UucmVtb3ZlSXRlbVwiLCBrZXkpO1xuICAgICAgICBkZWxldGUgdGhpcy5fZGF0YVtrZXldO1xuICAgIH1cblxuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kYXRhKS5sZW5ndGg7XG4gICAgfVxuXG4gICAga2V5KGluZGV4KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kYXRhKVtpbmRleF07XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0luTWVtb3J5V2ViU3RvcmFnZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IE9pZGNDbGllbnQgZnJvbSAnLi9PaWRjQ2xpZW50JztcbmltcG9ydCBVc2VyTWFuYWdlclNldHRpbmdzIGZyb20gJy4vVXNlck1hbmFnZXJTZXR0aW5ncyc7XG5pbXBvcnQgVXNlciBmcm9tICcuL1VzZXInO1xuaW1wb3J0IFVzZXJNYW5hZ2VyRXZlbnRzIGZyb20gJy4vVXNlck1hbmFnZXJFdmVudHMnO1xuaW1wb3J0IFNpbGVudFJlbmV3U2VydmljZSBmcm9tICcuL1NpbGVudFJlbmV3U2VydmljZSc7XG5pbXBvcnQgU2Vzc2lvbk1vbml0b3IgZnJvbSAnLi9TZXNzaW9uTW9uaXRvcic7XG5pbXBvcnQgVG9rZW5SZXZvY2F0aW9uQ2xpZW50IGZyb20gJy4vVG9rZW5SZXZvY2F0aW9uQ2xpZW50JztcblxuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VyIGV4dGVuZHMgT2lkY0NsaWVudCB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MgPSB7fSxcbiAgICAgICAgU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciA9IFNpbGVudFJlbmV3U2VydmljZSxcbiAgICAgICAgU2Vzc2lvbk1vbml0b3JDdG9yID0gU2Vzc2lvbk1vbml0b3IsXG4gICAgICAgIFRva2VuUmV2b2NhdGlvbkNsaWVudEN0b3IgPSBUb2tlblJldm9jYXRpb25DbGllbnRcbiAgICApIHtcblxuICAgICAgICBpZiAoIShzZXR0aW5ncyBpbnN0YW5jZW9mIFVzZXJNYW5hZ2VyU2V0dGluZ3MpKSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IG5ldyBVc2VyTWFuYWdlclNldHRpbmdzKHNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XG5cbiAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IFVzZXJNYW5hZ2VyRXZlbnRzKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdTZXJ2aWNlID0gbmV3IFNpbGVudFJlbmV3U2VydmljZUN0b3IodGhpcyk7XG5cbiAgICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50IGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM7IHRoZXNlIHNlcnZpY2VzIGRlcGVuZCB1cG9uIHRoZSBldmVudHMuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9tYXRpY1NpbGVudFJlbmV3KSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJhdXRvbWF0aWNTaWxlbnRSZW5ldyBpcyBjb25maWd1cmVkLCBzZXR0aW5nIHVwIHNpbGVudCByZW5ld1wiKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTaWxlbnRSZW5ldygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubW9uaXRvclNlc3Npb24pIHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm1vbml0b3JTZXNzaW9uIGlzIGNvbmZpZ3VyZWQsIHNldHRpbmcgdXAgc2Vzc2lvbiBtb25pdG9yXCIpO1xuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbk1vbml0b3IgPSBuZXcgU2Vzc2lvbk1vbml0b3JDdG9yKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdG9rZW5SZXZvY2F0aW9uQ2xpZW50ID0gbmV3IFRva2VuUmV2b2NhdGlvbkNsaWVudEN0b3IodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIGdldCBfcmVkaXJlY3ROYXZpZ2F0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnJlZGlyZWN0TmF2aWdhdG9yO1xuICAgIH1cbiAgICBnZXQgX3BvcHVwTmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5wb3B1cE5hdmlnYXRvcjtcbiAgICB9XG4gICAgZ2V0IF9pZnJhbWVOYXZpZ2F0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmlmcmFtZU5hdmlnYXRvcjtcbiAgICB9XG4gICAgZ2V0IF91c2VyU3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnVzZXJTdG9yZTtcbiAgICB9XG5cbiAgICBnZXQgZXZlbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzO1xuICAgIH1cblxuICAgIGdldFVzZXIoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLmdldFVzZXJcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIGxvYWRlZFwiKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIG5vdCBmb3VuZCBpbiBzdG9yYWdlXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVVc2VyKCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5yZW1vdmVVc2VyXCIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcihudWxsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciByZW1vdmVkIGZyb20gc3RvcmFnZVwiKTtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cy51bmxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2lnbmluUmVkaXJlY3QoYXJncykge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5SZWRpcmVjdFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yKS50aGVuKCgpPT57XG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblJlZGlyZWN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaWduaW5SZWRpcmVjdENhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5SZWRpcmVjdENhbGxiYWNrXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluRW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgIGlmICh1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLnN1Yikge1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblJlZGlyZWN0Q2FsbGJhY2sgc3VjY2Vzc2Z1bCwgc2lnbmVkIGluIHN1YjogXCIsIHVzZXIucHJvZmlsZS5zdWIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5SZWRpcmVjdENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2lnbmluUG9wdXAoYXJncyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwXCIpO1xuXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnBvcHVwX3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnJlZGlyZWN0X3VyaTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHBvcHVwX3JlZGlyZWN0X3VyaSBvciByZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XG4gICAgICAgIGFyZ3MuZGlzcGxheSA9IFwicG9wdXBcIjtcblxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX3BvcHVwTmF2aWdhdG9yLCB7XG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxuICAgICAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlczogYXJncy5wb3B1cFdpbmRvd0ZlYXR1cmVzIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyxcbiAgICAgICAgICAgIHBvcHVwV2luZG93VGFyZ2V0OiBhcmdzLnBvcHVwV2luZG93VGFyZ2V0IHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dUYXJnZXRcbiAgICAgICAgfSkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluUG9wdXAgc3VjY2Vzc2Z1bCwgc2lnbmVkIGluIHN1YjogXCIsIHVzZXIucHJvZmlsZS5zdWIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5Qb3B1cCBzdWNjZXNzZnVsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaWduaW5Qb3B1cENhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cENhbGxiYWNrXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluQ2FsbGJhY2sodXJsLCB0aGlzLl9wb3B1cE5hdmlnYXRvcikudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluUG9wdXBDYWxsYmFjayBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblBvcHVwQ2FsbGJhY2sgc3VjY2Vzc2Z1bFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaWduaW5TaWxlbnQoYXJncyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudFwiKTtcblxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5zaWxlbnRfcmVkaXJlY3RfdXJpO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2lsZW50X3JlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzLnJlZGlyZWN0X3VyaSA9IHVybDtcbiAgICAgICAgYXJncy5wcm9tcHQgPSBcIm5vbmVcIjtcblxuICAgICAgICBsZXQgc2V0SWRUb2tlbjtcbiAgICAgICAgaWYgKGFyZ3MuaWRfdG9rZW5faGludCB8fCAhdGhpcy5zZXR0aW5ncy5pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcpIHtcbiAgICAgICAgICAgIHNldElkVG9rZW4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldElkVG9rZW4gPSB0aGlzLl9sb2FkVXNlcigpLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgICAgICAgYXJncy5pZF90b2tlbl9oaW50ID0gdXNlciAmJiB1c2VyLmlkX3Rva2VuO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2V0SWRUb2tlbi50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWduaW4oYXJncywgdGhpcy5faWZyYW1lTmF2aWdhdG9yLCB7XG4gICAgICAgICAgICAgICAgc3RhcnRVcmw6IHVybCxcbiAgICAgICAgICAgICAgICBzaWxlbnRSZXF1ZXN0VGltZW91dDogYXJncy5zaWxlbnRSZXF1ZXN0VGltZW91dCB8fCB0aGlzLnNldHRpbmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluU2lsZW50IHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluU2lsZW50IHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNpZ25pblNpbGVudENhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5TaWxlbnRDYWxsYmFja1wiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkNhbGxiYWNrKHVybCwgdGhpcy5faWZyYW1lTmF2aWdhdG9yKS50aGVuKHVzZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlci5wcm9maWxlICYmIHVzZXIucHJvZmlsZS5zdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5TaWxlbnRDYWxsYmFjayBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblNpbGVudENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcXVlcnlTZXNzaW9uU3RhdHVzKGFyZ3MgPSB7fSkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5xdWVyeVNlc3Npb25TdGF0dXNcIik7XG5cbiAgICAgICAgbGV0IHVybCA9IGFyZ3MucmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50X3JlZGlyZWN0X3VyaTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWxlbnRfcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XG4gICAgICAgIGFyZ3MucHJvbXB0ID0gXCJub25lXCI7XG4gICAgICAgIGFyZ3MucmVzcG9uc2VfdHlwZSA9IFwiaWRfdG9rZW5cIjtcbiAgICAgICAgYXJncy5zY29wZSA9IFwib3BlbmlkXCI7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwge1xuICAgICAgICAgICAgc3RhcnRVcmw6IHVybCxcbiAgICAgICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0OiBhcmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0IHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50UmVxdWVzdFRpbWVvdXRcbiAgICAgICAgfSkudGhlbihuYXZSZXNwb25zZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2lnbmluUmVzcG9uc2UobmF2UmVzcG9uc2UudXJsKS50aGVuKHNpZ25pblJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJnb3Qgc2lnbmluIHJlc3BvbnNlXCIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNpZ25pblJlc3BvbnNlLnNlc3Npb25fc3RhdGUgJiYgc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zdWIgJiYgc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJxdWVyeVNlc3Npb25TdGF0dXMgc3VjY2VzcyBmb3Igc3ViOiBcIiwgIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fc3RhdGU6IHNpZ25pblJlc3BvbnNlLnNlc3Npb25fc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWI6IHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lkOiBzaWduaW5SZXNwb25zZS5wcm9maWxlLnNpZFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJxdWVyeVNlc3Npb25TdGF0dXMgc3VjY2Vzc2Z1bCwgdXNlciBub3QgYXV0aGVudGljYXRlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3NpZ25pbihhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIl9zaWduaW5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5TdGFydChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcykudGhlbihuYXZSZXNwb25zZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluRW5kKG5hdlJlc3BvbnNlLnVybCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc2lnbmluU3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluU3RhcnRcIik7XG5cbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5wcmVwYXJlKG5hdmlnYXRvclBhcmFtcykudGhlbihoYW5kbGUgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWduaW5SZXF1ZXN0KGFyZ3MpLnRoZW4oc2lnbmluUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25pbiByZXF1ZXN0XCIpO1xuXG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yUGFyYW1zLnVybCA9IHNpZ25pblJlcXVlc3QudXJsO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy5pZCA9IHNpZ25pblJlcXVlc3Quc3RhdGUuaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuY2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiRXJyb3IgYWZ0ZXIgcHJlcGFyaW5nIG5hdmlnYXRvciwgY2xvc2luZyBuYXZpZ2F0b3Igd2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc2lnbmluRW5kKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluRW5kXCIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWduaW5SZXNwb25zZSh1cmwpLnRoZW4oc2lnbmluUmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25pbiByZXNwb25zZVwiKTtcblxuICAgICAgICAgICAgbGV0IHVzZXIgPSBuZXcgVXNlcihzaWduaW5SZXNwb25zZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcih1c2VyKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ1c2VyIHN0b3JlZFwiKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zaWduaW5DYWxsYmFjayh1cmwsIG5hdmlnYXRvcikge1xuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluQ2FsbGJhY2tcIik7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2FsbGJhY2sodXJsKTtcbiAgICB9XG5cbiAgICBzaWdub3V0UmVkaXJlY3QoYXJncyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25vdXRSZWRpcmVjdFwiKTtcbiAgICAgICAgbGV0IHBvc3RMb2dvdXRSZWRpcmVjdFVyaSA9IGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xuICAgICAgICBpZiAocG9zdExvZ291dFJlZGlyZWN0VXJpKXtcbiAgICAgICAgICAgIGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9zdExvZ291dFJlZGlyZWN0VXJpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IpLnRoZW4oKCk9PntcbiAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbm91dFJlZGlyZWN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaWdub3V0UmVkaXJlY3RDYWxsYmFjayh1cmwpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbm91dFJlZGlyZWN0Q2FsbGJhY2tcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0RW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpLnRoZW4ocmVzcG9uc2U9PntcbiAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbm91dFJlZGlyZWN0Q2FsbGJhY2sgc3VjY2Vzc2Z1bFwiKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2lnbm91dFBvcHVwKGFyZ3MgPSB7fSkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cFwiKTtcblxuICAgICAgICBsZXQgdXJsID0gYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XG4gICAgICAgIGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gdXJsO1xuICAgICAgICBhcmdzLmRpc3BsYXkgPSBcInBvcHVwXCI7XG4gICAgICAgIGlmIChhcmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSl7XG4gICAgICAgICAgICAvLyB3ZSdyZSBwdXR0aW5nIGEgZHVtbXkgZW50cnkgaW4gaGVyZSBiZWNhdXNlIHdlXG4gICAgICAgICAgICAvLyBuZWVkIGEgdW5pcXVlIGlkIGZyb20gdGhlIHN0YXRlIGZvciBub3RpZmljYXRpb25cbiAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJlbnQgd2luZG93LCB3aGljaCBpcyBuZWNlc3NhcnkgaWYgd2VcbiAgICAgICAgICAgIC8vIHBsYW4gdG8gcmV0dXJuIGJhY2sgdG8gdGhlIGNsaWVudCBhZnRlciBzaWdub3V0XG4gICAgICAgICAgICAvLyBhbmQgc28gd2UgY2FuIGNsb3NlIHRoZSBwb3B1cCBhZnRlciBzaWdub3V0XG4gICAgICAgICAgICBhcmdzLnN0YXRlID0gYXJncy5zdGF0ZSB8fCB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0KGFyZ3MsIHRoaXMuX3BvcHVwTmF2aWdhdG9yLCB7XG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxuICAgICAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlczogYXJncy5wb3B1cFdpbmRvd0ZlYXR1cmVzIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyxcbiAgICAgICAgICAgIHBvcHVwV2luZG93VGFyZ2V0OiBhcmdzLnBvcHVwV2luZG93VGFyZ2V0IHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dUYXJnZXRcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25vdXRQb3B1cCBzdWNjZXNzZnVsXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2lnbm91dFBvcHVwQ2FsbGJhY2sodXJsLCBrZWVwT3Blbikge1xuICAgICAgICBpZiAodHlwZW9mKGtlZXBPcGVuKSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mKHVybCkgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdXJsID0gbnVsbDtcbiAgICAgICAgICAgIGtlZXBPcGVuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWdub3V0UG9wdXBDYWxsYmFja1wiKTtcbiAgICAgICAgbGV0IGRlbGltaXRlciA9ICc/JztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwTmF2aWdhdG9yLmNhbGxiYWNrKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25vdXRQb3B1cENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9zaWdub3V0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiX3NpZ25vdXRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMpLnRoZW4obmF2UmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25vdXRFbmQobmF2UmVzcG9uc2UudXJsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zaWdub3V0U3RhcnQoYXJncyA9IHt9LCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIl9zaWdub3V0U3RhcnRcIik7XG5cbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5wcmVwYXJlKG5hdmlnYXRvclBhcmFtcykudGhlbihoYW5kbGUgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFVzZXIoKS50aGVuKHVzZXIgPT4ge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImxvYWRlZCBjdXJyZW50IHVzZXIgZnJvbSBzdG9yYWdlXCIpO1xuXG4gICAgICAgICAgICAgICAgdmFyIHJldm9rZVByb21pc2UgPSB0aGlzLl9zZXR0aW5ncy5yZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCA/IHRoaXMuX3Jldm9rZUludGVybmFsKHVzZXIpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldm9rZVByb21pc2UudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkX3Rva2VuID0gYXJncy5pZF90b2tlbl9oaW50IHx8IHVzZXIgJiYgdXNlci5pZF90b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXR0aW5nIGlkX3Rva2VuIGludG8gc2lnbm91dCByZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5pZF90b2tlbl9oaW50ID0gaWRfdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVVc2VyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ1c2VyIHJlbW92ZWQsIGNyZWF0aW5nIHNpZ25vdXQgcmVxdWVzdFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbm91dFJlcXVlc3QoYXJncykudGhlbihzaWdub3V0UmVxdWVzdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25vdXQgcmVxdWVzdFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy51cmwgPSBzaWdub3V0UmVxdWVzdC51cmw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25vdXRSZXF1ZXN0LnN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy5pZCA9IHNpZ25vdXRSZXF1ZXN0LnN0YXRlLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuY2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiRXJyb3IgYWZ0ZXIgcHJlcGFyaW5nIG5hdmlnYXRvciwgY2xvc2luZyBuYXZpZ2F0b3Igd2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc2lnbm91dEVuZCh1cmwpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiX3NpZ25vdXRFbmRcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25vdXRSZXNwb25zZSh1cmwpLnRoZW4oc2lnbm91dFJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBzaWdub3V0IHJlc3BvbnNlXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gc2lnbm91dFJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXZva2VBY2Nlc3NUb2tlbigpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIucmV2b2tlQWNjZXNzVG9rZW5cIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXZva2VJbnRlcm5hbCh1c2VyLCB0cnVlKS50aGVuKHN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlbW92aW5nIHRva2VuIHByb3BlcnRpZXMgZnJvbSB1c2VyIGFuZCByZS1zdG9yaW5nXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHVzZXIuYWNjZXNzX3Rva2VuID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5leHBpcmVzX2F0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdXNlci50b2tlbl90eXBlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVVzZXIodXNlcikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ1c2VyIHN0b3JlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbigoKT0+e1xuICAgICAgICAgICAgTG9nLmluZm8oXCJhY2Nlc3MgdG9rZW4gcmV2b2tlZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXZva2VJbnRlcm5hbCh1c2VyLCByZXF1aXJlZCkge1xuICAgICAgICBMb2cuZGVidWcoXCJjaGVja2luZyBpZiB0b2tlbiByZXZvY2F0aW9uIGlzIG5lY2Vzc2FyeVwiKTtcblxuICAgICAgICB2YXIgYWNjZXNzX3Rva2VuID0gdXNlciAmJiB1c2VyLmFjY2Vzc190b2tlbjtcblxuICAgICAgICAvLyBjaGVjayBmb3IgSldUIHZzLiByZWZlcmVuY2UgdG9rZW5cbiAgICAgICAgaWYgKCFhY2Nlc3NfdG9rZW4gfHwgYWNjZXNzX3Rva2VuLmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJubyBuZWVkIHRvIHJldm9rZSBkdWUgdG8gbm8gdXNlciwgdG9rZW4sIG9yIEpXVCBmb3JtYXRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl90b2tlblJldm9jYXRpb25DbGllbnQucmV2b2tlKGFjY2Vzc190b2tlbiwgcmVxdWlyZWQpLnRoZW4oKCkgPT4gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc3RhcnRTaWxlbnRSZW5ldygpIHtcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdTZXJ2aWNlLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgc3RvcFNpbGVudFJlbmV3KCkge1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld1NlcnZpY2Uuc3RvcCgpO1xuICAgIH1cblxuICAgIGdldCBfdXNlclN0b3JlS2V5KCkge1xuICAgICAgICByZXR1cm4gYHVzZXI6JHt0aGlzLnNldHRpbmdzLmF1dGhvcml0eX06JHt0aGlzLnNldHRpbmdzLmNsaWVudF9pZH1gO1xuICAgIH1cblxuICAgIF9sb2FkVXNlcigpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiX2xvYWRVc2VyXCIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyU3RvcmUuZ2V0KHRoaXMuX3VzZXJTdG9yZUtleSkudGhlbihzdG9yYWdlU3RyaW5nID0+IHtcbiAgICAgICAgICAgIGlmIChzdG9yYWdlU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBzdG9yYWdlU3RyaW5nIGxvYWRlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gVXNlci5mcm9tU3RvcmFnZVN0cmluZyhzdG9yYWdlU3RyaW5nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgTG9nLmRlYnVnKFwibm8gdXNlciBzdG9yYWdlU3RyaW5nXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0b3JlVXNlcih1c2VyKSB7XG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJzdG9yZVVzZXIgc3RvcmluZyB1c2VyXCIpO1xuXG4gICAgICAgICAgICB2YXIgc3RvcmFnZVN0cmluZyA9IHVzZXIudG9TdG9yYWdlU3RyaW5nKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLnNldCh0aGlzLl91c2VyU3RvcmVLZXksIHN0b3JhZ2VTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwic3RvcmVVc2VyIHJlbW92aW5nIHVzZXIgc3RvcmFnZVwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyU3RvcmUucmVtb3ZlKHRoaXMuX3VzZXJTdG9yZUtleSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXNlck1hbmFnZXIuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBPaWRjQ2xpZW50U2V0dGluZ3MgZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MnO1xuaW1wb3J0IFJlZGlyZWN0TmF2aWdhdG9yIGZyb20gJy4vUmVkaXJlY3ROYXZpZ2F0b3InO1xuaW1wb3J0IFBvcHVwTmF2aWdhdG9yIGZyb20gJy4vUG9wdXBOYXZpZ2F0b3InO1xuaW1wb3J0IElGcmFtZU5hdmlnYXRvciBmcm9tICcuL0lGcmFtZU5hdmlnYXRvcic7XG5pbXBvcnQgV2ViU3RvcmFnZVN0YXRlU3RvcmUgZnJvbSAnLi9XZWJTdG9yYWdlU3RhdGVTdG9yZSc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuY29uc3QgRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gNjA7XG5jb25zdCBEZWZhdWx0Q2hlY2tTZXNzaW9uSW50ZXJ2YWwgPSAyMDAwO1xuXG5leHBvcnQgY2xhc3MgVXNlck1hbmFnZXJTZXR0aW5ncyBleHRlbmRzIE9pZGNDbGllbnRTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBwb3B1cF9yZWRpcmVjdF91cmksXG4gICAgICAgIHBvcHVwX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSxcbiAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlcyxcbiAgICAgICAgcG9wdXBXaW5kb3dUYXJnZXQsXG4gICAgICAgIHNpbGVudF9yZWRpcmVjdF91cmksXG4gICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0LFxuICAgICAgICBhdXRvbWF0aWNTaWxlbnRSZW5ldyA9IGZhbHNlLFxuICAgICAgICBpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcgPSB0cnVlLFxuICAgICAgICBtb25pdG9yU2Vzc2lvbiA9IHRydWUsXG4gICAgICAgIGNoZWNrU2Vzc2lvbkludGVydmFsID0gRGVmYXVsdENoZWNrU2Vzc2lvbkludGVydmFsLFxuICAgICAgICByZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCA9IGZhbHNlLFxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSxcbiAgICAgICAgcmVkaXJlY3ROYXZpZ2F0b3IgPSBuZXcgUmVkaXJlY3ROYXZpZ2F0b3IoKSxcbiAgICAgICAgcG9wdXBOYXZpZ2F0b3IgPSBuZXcgUG9wdXBOYXZpZ2F0b3IoKSxcbiAgICAgICAgaWZyYW1lTmF2aWdhdG9yID0gbmV3IElGcmFtZU5hdmlnYXRvcigpLFxuICAgICAgICB1c2VyU3RvcmUgPSBuZXcgV2ViU3RvcmFnZVN0YXRlU3RvcmUoeyBzdG9yZTogR2xvYmFsLnNlc3Npb25TdG9yYWdlIH0pXG4gICAgfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XG5cbiAgICAgICAgdGhpcy5fcG9wdXBfcmVkaXJlY3RfdXJpID0gcG9wdXBfcmVkaXJlY3RfdXJpO1xuICAgICAgICB0aGlzLl9wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XG4gICAgICAgIHRoaXMuX3BvcHVwV2luZG93RmVhdHVyZXMgPSBwb3B1cFdpbmRvd0ZlYXR1cmVzO1xuICAgICAgICB0aGlzLl9wb3B1cFdpbmRvd1RhcmdldCA9IHBvcHVwV2luZG93VGFyZ2V0O1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fc2lsZW50X3JlZGlyZWN0X3VyaSA9IHNpbGVudF9yZWRpcmVjdF91cmk7XG4gICAgICAgIHRoaXMuX3NpbGVudFJlcXVlc3RUaW1lb3V0ID0gc2lsZW50UmVxdWVzdFRpbWVvdXQ7XG4gICAgICAgIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3ID0gISFhdXRvbWF0aWNTaWxlbnRSZW5ldztcbiAgICAgICAgdGhpcy5faW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3ID0gaW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3O1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xuXG4gICAgICAgIHRoaXMuX21vbml0b3JTZXNzaW9uID0gbW9uaXRvclNlc3Npb247XG4gICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbkludGVydmFsID0gY2hlY2tTZXNzaW9uSW50ZXJ2YWw7XG4gICAgICAgIHRoaXMuX3Jldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0ID0gcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQ7XG5cbiAgICAgICAgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IgPSByZWRpcmVjdE5hdmlnYXRvcjtcbiAgICAgICAgdGhpcy5fcG9wdXBOYXZpZ2F0b3IgPSBwb3B1cE5hdmlnYXRvcjtcbiAgICAgICAgdGhpcy5faWZyYW1lTmF2aWdhdG9yID0gaWZyYW1lTmF2aWdhdG9yO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fdXNlclN0b3JlID0gdXNlclN0b3JlO1xuICAgIH1cblxuICAgIGdldCBwb3B1cF9yZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cF9yZWRpcmVjdF91cmk7XG4gICAgfVxuICAgIGdldCBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XG4gICAgfVxuICAgIGdldCBwb3B1cFdpbmRvd0ZlYXR1cmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dGZWF0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBvcHVwV2luZG93VGFyZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dUYXJnZXQ7XG4gICAgfVxuXG4gICAgZ2V0IHNpbGVudF9yZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWxlbnRfcmVkaXJlY3RfdXJpO1xuICAgIH1cbiAgICAgZ2V0IHNpbGVudFJlcXVlc3RUaW1lb3V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lsZW50UmVxdWVzdFRpbWVvdXQ7XG4gICAgfVxuICAgIGdldCBhdXRvbWF0aWNTaWxlbnRSZW5ldygpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuc2lsZW50X3JlZGlyZWN0X3VyaSAmJiB0aGlzLl9hdXRvbWF0aWNTaWxlbnRSZW5ldyk7XG4gICAgfVxuICAgIGdldCBpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXc7XG4gICAgfVxuICAgIGdldCBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xuICAgIH1cblxuICAgIGdldCBtb25pdG9yU2Vzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbml0b3JTZXNzaW9uO1xuICAgIH1cbiAgICBnZXQgY2hlY2tTZXNzaW9uSW50ZXJ2YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbDtcbiAgICB9XG4gICAgZ2V0IHJldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQ7XG4gICAgfVxuXG4gICAgZ2V0IHJlZGlyZWN0TmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3I7XG4gICAgfVxuICAgIGdldCBwb3B1cE5hdmlnYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwTmF2aWdhdG9yO1xuICAgIH1cbiAgICBnZXQgaWZyYW1lTmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWZyYW1lTmF2aWdhdG9yO1xuICAgIH1cbiAgICBcbiAgICBnZXQgdXNlclN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9Vc2VyTWFuYWdlclNldHRpbmdzLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBjbGFzcyBSZWRpcmVjdE5hdmlnYXRvciB7XG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgIH1cblxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xuICAgICAgICBMb2cuZGVidWcoXCJSZWRpcmVjdE5hdmlnYXRvci5uYXZpZ2F0ZVwiKTtcblxuICAgICAgICBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBwYXJhbXMudXJsO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICBMb2cuZGVidWcoXCJSZWRpcmVjdE5hdmlnYXRvci51cmxcIik7XG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUmVkaXJlY3ROYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBQb3B1cFdpbmRvdyBmcm9tICcuL1BvcHVwV2luZG93JztcblxuZXhwb3J0IGNsYXNzIFBvcHVwTmF2aWdhdG9yIHtcblxuICAgIHByZXBhcmUocGFyYW1zKSB7XG4gICAgICAgIGxldCBwb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhwYXJhbXMpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvcHVwKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayh1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBOYXZpZ2F0b3IuY2FsbGJhY2tcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFBvcHVwV2luZG93Lm5vdGlmeU9wZW5lcih1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUG9wdXBOYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5cbmNvbnN0IENoZWNrRm9yUG9wdXBDbG9zZWRJbnRlcnZhbCA9IDUwMDtcbmNvbnN0IERlZmF1bHRQb3B1cEZlYXR1cmVzID0gJ2xvY2F0aW9uPW5vLHRvb2xiYXI9bm8sd2lkdGg9NTAwLGhlaWdodD01MDAsbGVmdD0xMDAsdG9wPTEwMDsnO1xuLy9jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHdpZHRoPTUwMCxoZWlnaHQ9NTAwLGxlZnQ9MTAwLHRvcD0xMDA7cmVzaXphYmxlPXllcyc7XG5cbmNvbnN0IERlZmF1bHRQb3B1cFRhcmdldCA9IFwiX2JsYW5rXCI7XG5cbmV4cG9ydCBjbGFzcyBQb3B1cFdpbmRvdyB7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuY3RvclwiKTtcblxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB0YXJnZXQgPSBwYXJhbXMucG9wdXBXaW5kb3dUYXJnZXQgfHwgRGVmYXVsdFBvcHVwVGFyZ2V0O1xuICAgICAgICBsZXQgZmVhdHVyZXMgPSBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCBEZWZhdWx0UG9wdXBGZWF0dXJlcztcblxuICAgICAgICB0aGlzLl9wb3B1cCA9IHdpbmRvdy5vcGVuKCcnLCB0YXJnZXQsIGZlYXR1cmVzKTtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJwb3B1cCBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrRm9yUG9wdXBDbG9zZWRUaW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbCh0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkLmJpbmQodGhpcyksIENoZWNrRm9yUG9wdXBDbG9zZWRJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gICAgfVxuXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Lm5hdmlnYXRlXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiRXJyb3Igb3BlbmluZyBwb3B1cCB3aW5kb3dcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJTZXR0aW5nIFVSTCBpbiBwb3B1cFwiKTtcblxuICAgICAgICAgICAgdGhpcy5faWQgPSBwYXJhbXMuaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5faWQpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3dbXCJwb3B1cENhbGxiYWNrX1wiICsgcGFyYW1zLmlkXSA9IHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC53aW5kb3cubG9jYXRpb24gPSBwYXJhbXMudXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG5cbiAgICBfc3VjY2VzcyhkYXRhKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICBMb2cuZGVidWcoXCJTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gcG9wdXAgd2luZG93XCIpO1xuICAgICAgICB0aGlzLl9yZXNvbHZlKGRhdGEpO1xuICAgIH1cbiAgICBfZXJyb3IobWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG5cbiAgICAgICAgTG9nLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cChmYWxzZSk7XG4gICAgfVxuXG4gICAgX2NsZWFudXAoa2VlcE9wZW4pIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuX2NsZWFudXBcIik7XG5cbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyKTtcbiAgICAgICAgdGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyID0gbnVsbDtcblxuICAgICAgICBkZWxldGUgd2luZG93W1wicG9wdXBDYWxsYmFja19cIiArIHRoaXMuX2lkXTtcblxuICAgICAgICBpZiAodGhpcy5fcG9wdXAgJiYgIWtlZXBPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICB9XG5cbiAgICBfY2hlY2tGb3JQb3B1cENsb3NlZCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuX2NoZWNrRm9yUG9wdXBDbG9zZWRcIik7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9wb3B1cCB8fCB0aGlzLl9wb3B1cC5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXAgd2luZG93IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxsYmFjayh1cmwsIGtlZXBPcGVuKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Ll9jYWxsYmFja1wiKTtcblxuICAgICAgICB0aGlzLl9jbGVhbnVwKGtlZXBPcGVuKTtcblxuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiB1cmwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIkludmFsaWQgcmVzcG9uc2UgZnJvbSBwb3B1cFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBub3RpZnlPcGVuZXIodXJsLCBrZWVwT3BlbiwgZGVsaW1pdGVyKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lclwiKTtcblxuICAgICAgICBpZiAod2luZG93Lm9wZW5lcikge1xuICAgICAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgaWYgKHVybCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBkZWxpbWl0ZXIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBcInBvcHVwQ2FsbGJhY2tfXCIgKyBkYXRhLnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSB3aW5kb3cub3BlbmVyW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInBhc3NpbmcgdXJsIG1lc3NhZ2UgdG8gb3BlbmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodXJsLCBrZWVwT3Blbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cud2FybihcIm5vIG1hdGNoaW5nIGNhbGxiYWNrIGZvdW5kIG9uIG9wZW5lclwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJubyBzdGF0ZSBmb3VuZCBpbiByZXNwb25zZSB1cmxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1BvcHVwV2luZG93LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgSUZyYW1lV2luZG93IGZyb20gJy4vSUZyYW1lV2luZG93JztcblxuZXhwb3J0IGNsYXNzIElGcmFtZU5hdmlnYXRvciB7XG5cbiAgICBwcmVwYXJlKHBhcmFtcykge1xuICAgICAgICBsZXQgZnJhbWUgPSBuZXcgSUZyYW1lV2luZG93KHBhcmFtcyk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZnJhbWUpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVOYXZpZ2F0b3IuY2FsbGJhY2tcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIElGcmFtZVdpbmRvdy5ub3RpZnlQYXJlbnQodXJsKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0lGcmFtZU5hdmlnYXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBEZWZhdWx0VGltZW91dCA9IDEwMDAwO1xuXG5leHBvcnQgY2xhc3MgSUZyYW1lV2luZG93IHtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cuY3RvclwiKTtcblxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gdGhpcy5fbWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX2ZyYW1lID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG5cbiAgICAgICAgLy8gc2hvdGd1biBhcHByb2FjaFxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUud2lkdGggPSAwO1xuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5oZWlnaHQgPSAwO1xuICAgICAgICBcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZnJhbWUpO1xuICAgIH1cblxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cubmF2aWdhdGVcIik7XG5cbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRpbWVvdXQgPSBwYXJhbXMuc2lsZW50UmVxdWVzdFRpbWVvdXQgfHwgRGVmYXVsdFRpbWVvdXQ7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJVc2luZyB0aW1lb3V0IG9mOlwiLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gd2luZG93LnNldFRpbWVvdXQodGhpcy5fdGltZW91dC5iaW5kKHRoaXMpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLnNyYyA9IHBhcmFtcy51cmw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgfVxuXG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICAgIH1cblxuICAgIF9zdWNjZXNzKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBmcmFtZSB3aW5kb3dcIik7XG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZGF0YSk7XG4gICAgfVxuICAgIF9lcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICBMb2cuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX3JlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG4gICAgfVxuXG4gICAgX2NsZWFudXAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFtZSkge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Ll9jbGVhbnVwXCIpO1xuXG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5fZnJhbWUpO1xuXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdGltZW91dCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Ll90aW1lb3V0XCIpO1xuICAgICAgICB0aGlzLl9lcnJvcihcIkZyYW1lIHdpbmRvdyB0aW1lZCBvdXRcIik7XG4gICAgfVxuXG4gICAgX21lc3NhZ2UoZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cuX21lc3NhZ2VcIik7XG5cbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyICYmXG4gICAgICAgICAgICBlLm9yaWdpbiA9PT0gdGhpcy5fb3JpZ2luICYmXG4gICAgICAgICAgICBlLnNvdXJjZSA9PT0gdGhpcy5fZnJhbWUuY29udGVudFdpbmRvd1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBlLmRhdGE7XG4gICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3VjY2Vzcyh7IHVybDogdXJsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlIGZyb20gZnJhbWVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgX29yaWdpbigpIHtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdDtcbiAgICB9XG5cbiAgICBzdGF0aWMgbm90aWZ5UGFyZW50KHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cubm90aWZ5UGFyZW50XCIpO1xuXG4gICAgICAgIGlmICh3aW5kb3cucGFyZW50ICYmIHdpbmRvdyAhPT0gd2luZG93LnBhcmVudCkge1xuICAgICAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInBvc3RpbmcgdXJsIG1lc3NhZ2UgdG8gcGFyZW50XCIpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UodXJsLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0lGcmFtZVdpbmRvdy5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5leHBvcnQgY2xhc3MgVXNlciB7XG4gICAgY29uc3RydWN0b3Ioe2lkX3Rva2VuLCBzZXNzaW9uX3N0YXRlLCBhY2Nlc3NfdG9rZW4sIHRva2VuX3R5cGUsIHNjb3BlLCBwcm9maWxlLCBleHBpcmVzX2F0LCBzdGF0ZX0pIHtcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IGlkX3Rva2VuO1xuICAgICAgICB0aGlzLnNlc3Npb25fc3RhdGUgPSBzZXNzaW9uX3N0YXRlO1xuICAgICAgICB0aGlzLmFjY2Vzc190b2tlbiA9IGFjY2Vzc190b2tlbjtcbiAgICAgICAgdGhpcy50b2tlbl90eXBlID0gdG9rZW5fdHlwZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlO1xuICAgICAgICB0aGlzLmV4cGlyZXNfYXQgPSBleHBpcmVzX2F0O1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuXG4gICAgZ2V0IGV4cGlyZXNfaW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cGlyZXNfYXQpIHtcbiAgICAgICAgICAgIGxldCBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHBpcmVzX2F0IC0gbm93O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0IGV4cGlyZWQoKSB7XG4gICAgICAgIGxldCBleHBpcmVzX2luID0gdGhpcy5leHBpcmVzX2luO1xuICAgICAgICBpZiAoZXhwaXJlc19pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwaXJlc19pbiA8PSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHNjb3BlcygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3BlIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICB9XG5cbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXIudG9TdG9yYWdlU3RyaW5nXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgaWRfdG9rZW46IHRoaXMuaWRfdG9rZW4sXG4gICAgICAgICAgICBzZXNzaW9uX3N0YXRlOiB0aGlzLnNlc3Npb25fc3RhdGUsXG4gICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHRoaXMuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgdG9rZW5fdHlwZTogdGhpcy50b2tlbl90eXBlLFxuICAgICAgICAgICAgc2NvcGU6IHRoaXMuc2NvcGUsXG4gICAgICAgICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGUsXG4gICAgICAgICAgICBleHBpcmVzX2F0OiB0aGlzLmV4cGlyZXNfYXRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21TdG9yYWdlU3RyaW5nKHN0b3JhZ2VTdHJpbmcpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlci5mcm9tU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKEpTT04ucGFyc2Uoc3RvcmFnZVN0cmluZykpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9Vc2VyLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgQWNjZXNzVG9rZW5FdmVudHMgZnJvbSAnLi9BY2Nlc3NUb2tlbkV2ZW50cyc7XG5pbXBvcnQgRXZlbnQgZnJvbSAnLi9FdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBVc2VyTWFuYWdlckV2ZW50cyBleHRlbmRzIEFjY2Vzc1Rva2VuRXZlbnRzIHtcblxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZCA9IG5ldyBFdmVudChcIlVzZXIgbG9hZGVkXCIpO1xuICAgICAgICB0aGlzLl91c2VyVW5sb2FkZWQgPSBuZXcgRXZlbnQoXCJVc2VyIHVubG9hZGVkXCIpO1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yID0gbmV3IEV2ZW50KFwiU2lsZW50IHJlbmV3IGVycm9yXCIpO1xuICAgICAgICB0aGlzLl91c2VyU2lnbmVkT3V0ID0gbmV3IEV2ZW50KFwiVXNlciBzaWduZWQgb3V0XCIpO1xuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQgPSBuZXcgRXZlbnQoXCJVc2VyIHNlc3Npb24gY2hhbmdlZFwiKTtcbiAgICB9XG5cbiAgICBsb2FkKHVzZXIsIHJhaXNlRXZlbnQ9dHJ1ZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlckV2ZW50cy5sb2FkXCIpO1xuICAgICAgICBzdXBlci5sb2FkKHVzZXIpO1xuICAgICAgICBpZiAocmFpc2VFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvYWRlZC5yYWlzZSh1c2VyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bmxvYWQoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLnVubG9hZFwiKTtcbiAgICAgICAgc3VwZXIudW5sb2FkKCk7XG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yYWlzZSgpO1xuICAgIH1cblxuICAgIGFkZFVzZXJMb2FkZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlVXNlckxvYWRlZChjYikge1xuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBcbiAgICBhZGRVc2VyVW5sb2FkZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkLmFkZEhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICByZW1vdmVVc2VyVW5sb2FkZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cblxuICAgIGFkZFNpbGVudFJlbmV3RXJyb3IoY2IpIHtcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlU2lsZW50UmVuZXdFcnJvcihjYikge1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBfcmFpc2VTaWxlbnRSZW5ld0Vycm9yKGUpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMuX3JhaXNlU2lsZW50UmVuZXdFcnJvclwiLCBlLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJhaXNlKGUpO1xuICAgIH1cblxuICAgIGFkZFVzZXJTaWduZWRPdXQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlVXNlclNpZ25lZE91dChjYikge1xuICAgICAgICB0aGlzLl91c2VyU2lnbmVkT3V0LnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBfcmFpc2VVc2VyU2lnbmVkT3V0KGUpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMuX3JhaXNlVXNlclNpZ25lZE91dFwiKTtcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5yYWlzZShlKTtcbiAgICB9XG5cbiAgICBhZGRVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclNlc3Npb25DaGFuZ2VkLmFkZEhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICByZW1vdmVVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclNlc3Npb25DaGFuZ2VkLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBfcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWQoZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlckV2ZW50cy5fcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWRcIik7XG4gICAgICAgIHRoaXMuX3VzZXJTZXNzaW9uQ2hhbmdlZC5yYWlzZShlKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXNlck1hbmFnZXJFdmVudHMuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBUaW1lciBmcm9tICcuL1RpbWVyJztcblxuY29uc3QgRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gNjA7IC8vIHNlY29uZHNcblxuZXhwb3J0IGNsYXNzIEFjY2Vzc1Rva2VuRXZlbnRzIHtcblxuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUsXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmluZ1wiKSxcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVkVGltZXIgPSBuZXcgVGltZXIoXCJBY2Nlc3MgdG9rZW4gZXhwaXJlZFwiKVxuICAgIH0gPSB7fSkge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xuXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmcgPSBhY2Nlc3NUb2tlbkV4cGlyaW5nVGltZXI7XG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZCA9IGFjY2Vzc1Rva2VuRXhwaXJlZFRpbWVyO1xuICAgIH1cblxuICAgIGxvYWQoY29udGFpbmVyKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkFjY2Vzc1Rva2VuRXZlbnRzLmxvYWRcIik7XG5cbiAgICAgICAgdGhpcy5fY2FuY2VsVGltZXJzKCk7XG5cbiAgICAgICAgLy8gb25seSByZWdpc3RlciBldmVudHMgaWYgdGhlcmUncyBhbiBhY2Nlc3MgdG9rZW4gd2hlcmUgd2UgY2FyZSBhYm91dCBleHBpcmF0aW9uXG4gICAgICAgIGlmIChjb250YWluZXIuYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBjb250YWluZXIuZXhwaXJlc19pbjtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImFjY2VzcyB0b2tlbiBwcmVzZW50LCByZW1haW5pbmcgZHVyYXRpb246XCIsIGR1cmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZXhwaXJpbmcgaWYgd2Ugc3RpbGwgaGF2ZSB0aW1lXG4gICAgICAgICAgICAgICAgbGV0IGV4cGlyaW5nID0gZHVyYXRpb24gLSB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmcgPD0gMCl7XG4gICAgICAgICAgICAgICAgICAgIGV4cGlyaW5nID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicmVnaXN0ZXJpbmcgZXhwaXJpbmcgdGltZXIgaW46XCIsIGV4cGlyaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmluaXQoZXhwaXJpbmcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhbHdheXMgcmVnaXN0ZXIgZXhwaXJlZC4gaWYgaXQncyBuZWdhdGl2ZSwgaXQgd2lsbCBzdGlsbCBmaXJlXG4gICAgICAgICAgICBsZXQgZXhwaXJlZCA9IGR1cmF0aW9uICsgMTtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlZ2lzdGVyaW5nIGV4cGlyZWQgdGltZXIgaW46XCIsIGV4cGlyZWQpO1xuICAgICAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkLmluaXQoZXhwaXJlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmxvYWQoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkFjY2Vzc1Rva2VuRXZlbnRzLnVubG9hZFwiKTtcbiAgICAgICAgdGhpcy5fY2FuY2VsVGltZXJzKCk7XG4gICAgfVxuXG4gICAgX2NhbmNlbFRpbWVycygpe1xuICAgICAgICBMb2cuZGVidWcoXCJjYW5jZWxpbmcgZXhpc3RpbmcgYWNjZXNzIHRva2VuIHRpbWVyc1wiKTtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkLmNhbmNlbCgpO1xuICAgIH1cblxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJpbmcoY2IpIHtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmluZyhjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cblxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQuYWRkSGFuZGxlcihjYik7XG4gICAgfVxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQucmVtb3ZlSGFuZGxlcihjYik7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0FjY2Vzc1Rva2VuRXZlbnRzLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcbmltcG9ydCBFdmVudCBmcm9tICcuL0V2ZW50JztcblxuY29uc3QgVGltZXJEdXJhdGlvbiA9IDU7IC8vIHNlY29uZHNcblxuZXhwb3J0IGNsYXNzIFRpbWVyIGV4dGVuZHMgRXZlbnQge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdGltZXIgPSBHbG9iYWwudGltZXIpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgICAgIHRoaXMuX3RpbWVyID0gdGltZXI7XG4gICAgICAgIHRoaXMuX25vd0Z1bmMgPSAoKSA9PiBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICB9XG5cbiAgICBnZXQgbm93KCkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5fbm93RnVuYygpKTtcbiAgICB9XG5cbiAgICBpbml0KGR1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG5cbiAgICAgICAgaWYgKGR1cmF0aW9uIDw9IDApIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0gMTtcbiAgICAgICAgfVxuICAgICAgICBkdXJhdGlvbiA9IHBhcnNlSW50KGR1cmF0aW9uKTtcblxuICAgICAgICBMb2cuZGVidWcoXCJUaW1lci5pbml0IHRpbWVyIFwiICsgdGhpcy5fbmFtZSArIFwiIGZvciBkdXJhdGlvbjpcIiwgZHVyYXRpb24pO1xuICAgICAgICB0aGlzLl9leHBpcmF0aW9uID0gdGhpcy5ub3cgKyBkdXJhdGlvbjtcblxuICAgICAgICAvLyB3ZSdyZSB1c2luZyBhIGZhaXJseSBzaG9ydCB0aW1lciBhbmQgdGhlbiBjaGVja2luZyB0aGUgZXhwaXJhdGlvbiBpbiB0aGVcbiAgICAgICAgLy8gY2FsbGJhY2sgdG8gaGFuZGxlIHNjZW5hcmlvcyB3aGVyZSB0aGUgYnJvd3NlciBkZXZpY2Ugc2xlZXBzLCBhbmQgdGhlblxuICAgICAgICAvLyB0aGUgdGltZXJzIGVuZCB1cCBnZXR0aW5nIGRlbGF5ZWQuXG4gICAgICAgIHZhciB0aW1lckR1cmF0aW9uID0gVGltZXJEdXJhdGlvbjtcbiAgICAgICAgaWYgKGR1cmF0aW9uIDwgdGltZXJEdXJhdGlvbikge1xuICAgICAgICAgICAgdGltZXJEdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gdGhpcy5fdGltZXIuc2V0SW50ZXJ2YWwodGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSwgdGltZXJEdXJhdGlvbiAqIDEwMDApO1xuICAgIH1cblxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVySGFuZGxlKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJUaW1lci5jYW5jZWw6IFwiLCB0aGlzLl9uYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyLmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXJIYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5fdGltZXJIYW5kbGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NhbGxiYWNrKCkge1xuICAgICAgICB2YXIgZGlmZiA9IHRoaXMuX2V4cGlyYXRpb24gLSB0aGlzLm5vdztcbiAgICAgICAgTG9nLmRlYnVnKFwiVGltZXIuX2NhbGxiYWNrOyBcIiArIHRoaXMuX25hbWUgKyBcIiB0aW1lciBleHBpcmVzIGluOlwiLCBkaWZmKTtcblxuICAgICAgICBpZiAodGhpcy5fZXhwaXJhdGlvbiA8PSB0aGlzLm5vdykge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgICAgIHN1cGVyLnJhaXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVGltZXIuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuZXhwb3J0IGNsYXNzIEV2ZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgIH1cblxuICAgIGFkZEhhbmRsZXIoY2IpIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgIH1cblxuICAgIHJlbW92ZUhhbmRsZXIoY2IpIHtcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2NhbGxiYWNrcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSBjYik7XG4gICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmFpc2UoLi4ucGFyYW1zKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlJhaXNpbmcgZXZlbnQ6IFwiICsgdGhpcy5fbmFtZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3NbaV0oLi4ucGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9FdmVudC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5leHBvcnQgY2xhc3MgU2lsZW50UmVuZXdTZXJ2aWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVzZXJNYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyID0gdXNlck1hbmFnZXI7XG4gICAgfVxuXG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdGhpcy5fdG9rZW5FeHBpcmluZy5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLmFkZEFjY2Vzc1Rva2VuRXhwaXJpbmcodGhpcy5fY2FsbGJhY2spO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgdHJpZ2dlciBsb2FkaW5nIG9mIHRoZSB1c2VyIHNvIHRoZSBleHBpcmluZyBldmVudHMgY2FuIGJlIGluaXRpYWxpemVkXG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5nZXRVc2VyKCkudGhlbih1c2VyPT57XG4gICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZSBub3BcbiAgICAgICAgICAgIH0pLmNhdGNoKGVycj0+e1xuICAgICAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGN0b3JcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIGdldFVzZXI6XCIsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMucmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmluZyh0aGlzLl9jYWxsYmFjayk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2s7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdG9rZW5FeHBpcmluZygpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiU2lsZW50UmVuZXdTZXJ2aWNlIGF1dG9tYXRpY2FsbHkgcmVuZXdpbmcgYWNjZXNzIHRva2VuXCIpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuc2lnbmluU2lsZW50KCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNpbGVudCB0b2tlbiByZW5ld2FsIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIHNpZ25pblNpbGVudDpcIiwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVNpbGVudFJlbmV3RXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1NpbGVudFJlbmV3U2VydmljZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IENoZWNrU2Vzc2lvbklGcmFtZSBmcm9tICcuL0NoZWNrU2Vzc2lvbklGcmFtZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTW9uaXRvciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1c2VyTWFuYWdlciwgQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciA9IENoZWNrU2Vzc2lvbklGcmFtZSkge1xuICAgICAgICBpZiAoIXVzZXJNYW5hZ2VyKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB1c2VyIG1hbmFnZXIgcGFzc2VkIHRvIFNlc3Npb25Nb25pdG9yXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXNlck1hbmFnZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlciA9IHVzZXJNYW5hZ2VyO1xuICAgICAgICB0aGlzLl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yID0gQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvcjtcblxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuYWRkVXNlckxvYWRlZCh0aGlzLl9zdGFydC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLmFkZFVzZXJVbmxvYWRlZCh0aGlzLl9zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmdldFVzZXIoKS50aGVuKHVzZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydCh1c2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGN0b3JcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNlc3Npb25Nb25pdG9yIGN0b3I7IGVycm9yIGZyb20gZ2V0VXNlcjpcIiwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgX3NldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIuc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBfbWV0YWRhdGFTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIubWV0YWRhdGFTZXJ2aWNlO1xuICAgIH1cbiAgICBnZXQgX2NsaWVudF9pZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcbiAgICB9XG4gICAgZ2V0IF9jaGVja1Nlc3Npb25JbnRlcnZhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNoZWNrU2Vzc2lvbkludGVydmFsO1xuICAgIH1cblxuICAgIF9zdGFydCh1c2VyKSB7XG4gICAgICAgIGxldCBzZXNzaW9uX3N0YXRlID0gdXNlci5zZXNzaW9uX3N0YXRlO1xuXG4gICAgICAgIGlmIChzZXNzaW9uX3N0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWIgPSB1c2VyLnByb2ZpbGUuc3ViO1xuICAgICAgICAgICAgdGhpcy5fc2lkID0gdXNlci5wcm9maWxlLnNpZDtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9zdGFydDsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbl9zdGF0ZSwgXCIsIHN1YjpcIiwgdGhpcy5fc3ViKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lKCkudGhlbih1cmwgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJJbml0aWFsaXppbmcgY2hlY2sgc2Vzc2lvbiBpZnJhbWVcIilcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsaWVudF9pZCA9IHRoaXMuX2NsaWVudF9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnRlcnZhbCA9IHRoaXMuX2NoZWNrU2Vzc2lvbkludGVydmFsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUgPSBuZXcgdGhpcy5fQ2hlY2tTZXNzaW9uSUZyYW1lQ3Rvcih0aGlzLl9jYWxsYmFjay5iaW5kKHRoaXMpLCBjbGllbnRfaWQsIHVybCwgaW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lLmxvYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy53YXJuKFwiTm8gY2hlY2sgc2Vzc2lvbiBpZnJhbWUgZm91bmQgaW4gdGhlIG1ldGFkYXRhXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggdG8gc3VwcHJlc3MgZXJyb3JzIHNpbmNlIHdlJ3JlIGluIG5vbi1wcm9taXNlIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkVycm9yIGZyb20gZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lOlwiLCBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc3RvcCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX3N0b3BcIik7XG5cbiAgICAgICAgdGhpcy5fc3ViID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2lkID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NhbGxiYWNrKCkge1xuICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fY2FsbGJhY2tcIik7XG5cbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzKCkudGhlbihzZXNzaW9uID0+IHtcbiAgICAgICAgICAgIHZhciByYWlzZVVzZXJTaWduZWRPdXRFdmVudCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uc3ViID09PSB0aGlzLl9zdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFpc2VVc2VyU2lnbmVkT3V0RXZlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lLnN0YXJ0KHNlc3Npb24uc2Vzc2lvbl9zdGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uc2lkID09PSB0aGlzLl9zaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNhbWUgc3ViIHN0aWxsIGxvZ2dlZCBpbiBhdCBPUCwgcmVzdGFydGluZyBjaGVjayBzZXNzaW9uIGlmcmFtZTsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbi5zZXNzaW9uX3N0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNhbWUgc3ViIHN0aWxsIGxvZ2dlZCBpbiBhdCBPUCwgc2Vzc2lvbiBzdGF0ZSBoYXMgY2hhbmdlZCwgcmVzdGFydGluZyBjaGVjayBzZXNzaW9uIGlmcmFtZTsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbi5zZXNzaW9uX3N0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5fcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiRGlmZmVyZW50IHN1YmplY3Qgc2lnbmVkIGludG8gT1A6XCIsIHNlc3Npb24uc3ViKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTdWJqZWN0IG5vIGxvbmdlciBzaWduZWQgaW50byBPUFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJhaXNlVXNlclNpZ25lZE91dEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX2NhbGxiYWNrOyByYWlzaW5nIHNpZ25lZCBvdXQgZXZlbnRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkVycm9yIGNhbGxpbmcgcXVlcnlDdXJyZW50U2lnbmluU2Vzc2lvbjsgcmFpc2luZyBzaWduZWQgb3V0IGV2ZW50XCIsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5fcmFpc2VVc2VyU2lnbmVkT3V0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TZXNzaW9uTW9uaXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBEZWZhdWx0SW50ZXJ2YWwgPSAyMDAwO1xuXG5leHBvcnQgY2xhc3MgQ2hlY2tTZXNzaW9uSUZyYW1lIHtcbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgY2xpZW50X2lkLCB1cmwsIGludGVydmFsKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsO1xuICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IGludGVydmFsIHx8IERlZmF1bHRJbnRlcnZhbDtcblxuICAgICAgICB2YXIgaWR4ID0gdXJsLmluZGV4T2YoXCIvXCIsIHVybC5pbmRleE9mKFwiLy9cIikgKyAyKTtcbiAgICAgICAgdGhpcy5fZnJhbWVfb3JpZ2luID0gdXJsLnN1YnN0cigwLCBpZHgpO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG5cbiAgICAgICAgLy8gc2hvdGd1biBhcHByb2FjaFxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUud2lkdGggPSAwO1xuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5oZWlnaHQgPSAwO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lLnNyYyA9IHVybDtcbiAgICB9XG4gICAgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9mcmFtZSk7XG4gICAgICAgICAgICB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCA9IHRoaXMuX21lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX21lc3NhZ2UoZSkge1xuICAgICAgICBpZiAoZS5vcmlnaW4gPT09IHRoaXMuX2ZyYW1lX29yaWdpbiAmJlxuICAgICAgICAgICAgZS5zb3VyY2UgPT09IHRoaXMuX2ZyYW1lLmNvbnRlbnRXaW5kb3dcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoZS5kYXRhID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJlcnJvciBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlLmRhdGEgPT09IFwiY2hhbmdlZFwiKSB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiY2hhbmdlZCBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhlLmRhdGEgKyBcIiBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoc2Vzc2lvbl9zdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbl9zdGF0ZSAhPT0gc2Vzc2lvbl9zdGF0ZSkge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiQ2hlY2tTZXNzaW9uSUZyYW1lLnN0YXJ0XCIpO1xuXG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbl9zdGF0ZSA9IHNlc3Npb25fc3RhdGU7XG5cbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHRoaXMuX2NsaWVudF9pZCArIFwiIFwiICsgdGhpcy5fc2Vzc2lvbl9zdGF0ZSwgdGhpcy5fZnJhbWVfb3JpZ2luKTtcbiAgICAgICAgICAgIH0sIHRoaXMuX2ludGVydmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0b3AoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkNoZWNrU2Vzc2lvbklGcmFtZS5zdG9wXCIpO1xuXG4gICAgICAgIHRoaXMuX3Nlc3Npb25fc3RhdGUgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLl90aW1lcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXIpO1xuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NoZWNrU2Vzc2lvbklGcmFtZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IE1ldGFkYXRhU2VydmljZSBmcm9tICcuL01ldGFkYXRhU2VydmljZSc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuY29uc3QgQWNjZXNzVG9rZW5UeXBlSGludCA9IFwiYWNjZXNzX3Rva2VuXCI7XG5cbmV4cG9ydCBjbGFzcyBUb2tlblJldm9jYXRpb25DbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBYTUxIdHRwUmVxdWVzdEN0b3IgPSBHbG9iYWwuWE1MSHR0cFJlcXVlc3QsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2V0dGluZ3MgcHJvdmlkZWRcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzZXR0aW5ncyBwcm92aWRlZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX1hNTEh0dHBSZXF1ZXN0Q3RvciA9IFhNTEh0dHBSZXF1ZXN0Q3RvcjtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHJldm9rZShhY2Nlc3NUb2tlbiwgcmVxdWlyZWQpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZVwiKTtcblxuICAgICAgICBpZiAoIWFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhY2Nlc3NUb2tlbiBwcm92aWRlZFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGFjY2Vzc1Rva2VuIHByb3ZpZGVkLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0UmV2b2NhdGlvbkVuZHBvaW50KCkudGhlbih1cmwgPT4ge1xuICAgICAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiUmV2b2NhdGlvbiBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXZvY2F0aW9uIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbm90IHJlcXVpcmVkLCBzbyBkb24ndCBlcnJvciBhbmQganVzdCByZXR1cm5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XG4gICAgICAgICAgICB2YXIgY2xpZW50X3NlY3JldCA9IHRoaXMuX3NldHRpbmdzLmNsaWVudF9zZWNyZXQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlKHVybCwgY2xpZW50X2lkLCBjbGllbnRfc2VjcmV0LCBhY2Nlc3NUb2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXZva2UodXJsLCBjbGllbnRfaWQsIGNsaWVudF9zZWNyZXQsIGFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkNhbGxpbmcgcmV2b2NhdGlvbiBlbmRwb2ludFwiKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgICAgICB2YXIgeGhyID0gbmV3IHRoaXMuX1hNTEh0dHBSZXF1ZXN0Q3RvcigpO1xuICAgICAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIHVybCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSFRUUCByZXNwb25zZSByZWNlaXZlZCwgc3RhdHVzXCIsIHhoci5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHhoci5zdGF0dXNUZXh0ICsgXCIgKFwiICsgeGhyLnN0YXR1cyArIFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIGJvZHkgPSBcImNsaWVudF9pZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChjbGllbnRfaWQpOyBcbiAgICAgICAgICAgIGlmIChjbGllbnRfc2VjcmV0KSB7XG4gICAgICAgICAgICAgICAgYm9keSArPSBcIiZjbGllbnRfc2VjcmV0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNsaWVudF9zZWNyZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYm9keSArPSBcIiZ0b2tlbl90eXBlX2hpbnQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoQWNjZXNzVG9rZW5UeXBlSGludCk7XG4gICAgICAgICAgICBib2R5ICs9IFwiJnRva2VuPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgICAgICAgICB4aHIuc2VuZChib2R5KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1Rva2VuUmV2b2NhdGlvbkNsaWVudC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IENvcmRvdmFQb3B1cFdpbmRvdyBmcm9tICcuL0NvcmRvdmFQb3B1cFdpbmRvdyc7XG5cbmV4cG9ydCBjbGFzcyBDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3Ige1xuICAgIFxuICAgIHByZXBhcmUocGFyYW1zKSB7XG4gICAgICAgIGxldCBwb3B1cCA9IG5ldyBDb3Jkb3ZhUG9wdXBXaW5kb3cocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb3B1cCk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvcmRvdmFQb3B1cE5hdmlnYXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHpvb209bm8nO1xuY29uc3QgRGVmYXVsdFBvcHVwVGFyZ2V0ID0gXCJfYmxhbmtcIjtcblxuZXhwb3J0IGNsYXNzIENvcmRvdmFQb3B1cFdpbmRvdyB7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93LmN0b3JcIik7XG5cbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZlYXR1cmVzID0gcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgRGVmYXVsdFBvcHVwRmVhdHVyZXM7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gcGFyYW1zLnBvcHVwV2luZG93VGFyZ2V0IHx8IERlZmF1bHRQb3B1cFRhcmdldDtcbiAgICAgICAgXG4gICAgICAgIHRoaXMucmVkaXJlY3RfdXJpID0gcGFyYW1zLnN0YXJ0VXJsO1xuICAgICAgICBMb2cuZGVidWcoXCJyZWRpcmVjdF91cmk6IFwiICsgdGhpcy5yZWRpcmVjdF91cmkpO1xuICAgIH1cblxuICAgIF9pc0luQXBwQnJvd3Nlckluc3RhbGxlZChjb3Jkb3ZhTWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFtcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3NlclwiLCBcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3Nlci5pbmFwcGJyb3dzZXJcIiwgXCJvcmcuYXBhY2hlLmNvcmRvdmEuaW5hcHBicm93c2VyXCJdLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3Jkb3ZhTWV0YWRhdGEuaGFzT3duUHJvcGVydHkobmFtZSlcbiAgICAgICAgfSlcbiAgICB9XG4gICAgXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkNvcmRvdmFQb3B1cFdpbmRvdy5uYXZpZ2F0ZVwiKTtcblxuICAgICAgICBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXdpbmRvdy5jb3Jkb3ZhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKFwiY29yZG92YSBpcyB1bmRlZmluZWRcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGNvcmRvdmFNZXRhZGF0YSA9IHdpbmRvdy5jb3Jkb3ZhLnJlcXVpcmUoXCJjb3Jkb3ZhL3BsdWdpbl9saXN0XCIpLm1ldGFkYXRhO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5BcHBCcm93c2VySW5zdGFsbGVkKGNvcmRvdmFNZXRhZGF0YSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKFwiSW5BcHBCcm93c2VyIHBsdWdpbiBub3QgZm91bmRcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gY29yZG92YS5JbkFwcEJyb3dzZXIub3BlbihwYXJhbXMudXJsLCB0aGlzLnRhcmdldCwgdGhpcy5mZWF0dXJlcyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJwb3B1cCBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCA9IHRoaXMuX2V4aXRDYWxsYmFjay5iaW5kKHRoaXMpOyBcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50ID0gdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2suYmluZCh0aGlzKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cC5hZGRFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2Fkc3RhcnRcIiwgdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihcIkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgfVxuXG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICAgIH1cblxuICAgIF9sb2FkU3RhcnRDYWxsYmFjayhldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudXJsLmluZGV4T2YodGhpcy5yZWRpcmVjdF91cmkpID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiBldmVudC51cmwgfSk7XG4gICAgICAgIH0gICAgXG4gICAgfVxuICAgIF9leGl0Q2FsbGJhY2sobWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9lcnJvcihtZXNzYWdlKTsgICAgXG4gICAgfVxuICAgIFxuICAgIF9zdWNjZXNzKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBjb3Jkb3ZhIHBvcHVwIHdpbmRvd1wiKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZShkYXRhKTtcbiAgICB9XG4gICAgX2Vycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgIExvZy5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICB9XG5cbiAgICBfY2xlYW51cCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93Ll9jbGVhbnVwXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCl7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImxvYWRzdGFydFwiLCB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50LCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvQ29yZG92YVBvcHVwV2luZG93LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgQ29yZG92YVBvcHVwV2luZG93IGZyb20gJy4vQ29yZG92YVBvcHVwV2luZG93JztcblxuZXhwb3J0IGNsYXNzIENvcmRvdmFJRnJhbWVOYXZpZ2F0b3Ige1xuXG4gICAgcHJlcGFyZShwYXJhbXMpIHtcbiAgICAgICAgcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgPSAnaGlkZGVuPXllcyc7XG4gICAgICAgIGxldCBwb3B1cCA9IG5ldyBDb3Jkb3ZhUG9wdXBXaW5kb3cocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb3B1cCk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiXSwic291cmNlUm9vdCI6IiJ9 diff --git a/dist/oidc-client.min.js b/dist/oidc-client.min.js index 4435e2964..cfa73cea5 100644 --- a/dist/oidc-client.min.js +++ b/dist/oidc-client.min.js @@ -1,24 +1,24 @@ -var Oidc=function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){n(1),t.exports=n(327)},function(t,e,n){(function(t){"use strict";function e(t,e,n){t[e]||Object[r](t,e,{writable:!0,configurable:!0,value:n})}if(n(2),n(323),n(324),t._babelPolyfill)throw new Error("only one instance of babel-polyfill is allowed");t._babelPolyfill=!0;var r="defineProperty";e(String.prototype,"padLeft","".padStart),e(String.prototype,"padRight","".padEnd),"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function(t){[][t]&&e(Array,t,Function.call.bind([][t]))})}).call(e,function(){return this}())},function(t,e,n){n(3),n(51),n(52),n(53),n(54),n(56),n(59),n(60),n(61),n(62),n(63),n(64),n(65),n(66),n(67),n(69),n(71),n(73),n(75),n(78),n(79),n(80),n(84),n(86),n(88),n(91),n(92),n(93),n(94),n(96),n(97),n(98),n(99),n(100),n(101),n(102),n(104),n(105),n(106),n(108),n(109),n(110),n(112),n(114),n(115),n(116),n(117),n(118),n(119),n(120),n(121),n(122),n(123),n(124),n(125),n(126),n(131),n(132),n(136),n(137),n(138),n(139),n(141),n(142),n(143),n(144),n(145),n(146),n(147),n(148),n(149),n(150),n(151),n(152),n(153),n(154),n(155),n(157),n(158),n(160),n(161),n(167),n(168),n(170),n(171),n(172),n(176),n(177),n(178),n(179),n(180),n(182),n(183),n(184),n(185),n(188),n(190),n(191),n(192),n(194),n(196),n(198),n(199),n(200),n(202),n(203),n(204),n(205),n(215),n(219),n(220),n(222),n(223),n(227),n(228),n(230),n(231),n(232),n(233),n(234),n(235),n(236),n(237),n(238),n(239),n(240),n(241),n(242),n(243),n(244),n(245),n(246),n(247),n(248),n(250),n(251),n(252),n(253),n(254),n(256),n(257),n(258),n(261),n(262),n(263),n(264),n(265),n(266),n(267),n(268),n(270),n(271),n(273),n(274),n(275),n(276),n(279),n(280),n(282),n(283),n(284),n(285),n(287),n(288),n(289),n(290),n(291),n(292),n(293),n(294),n(295),n(296),n(298),n(299),n(300),n(301),n(302),n(303),n(304),n(305),n(306),n(307),n(308),n(310),n(311),n(312),n(313),n(314),n(315),n(316),n(317),n(318),n(319),n(320),n(321),n(322),t.exports=n(9)},function(t,e,n){"use strict";var r=n(4),i=n(5),s=n(6),o=n(8),a=n(18),u=n(22).KEY,c=n(7),f=n(23),h=n(24),l=n(19),d=n(25),p=n(26),g=n(27),y=n(29),v=n(44),m=n(12),S=n(13),b=n(32),w=n(16),_=n(17),x=n(45),E=n(48),A=n(50),F=n(11),P=n(30),O=A.f,C=F.f,T=E.f,j=r.Symbol,I=r.JSON,R=I&&I.stringify,D="prototype",H=d("_hidden"),k=d("toPrimitive"),N={}.propertyIsEnumerable,B=f("symbol-registry"),M=f("symbols"),V=f("op-symbols"),L=Object[D],K="function"==typeof j,U=r.QObject,q=!U||!U[D]||!U[D].findChild,W=s&&c(function(){return 7!=x(C({},"a",{get:function(){return C(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=O(L,e);r&&delete L[e],C(t,e,n),r&&t!==L&&C(L,e,r)}:C,z=function(t){var e=M[t]=x(j[D]);return e._k=t,e},J=K&&"symbol"==typeof j.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof j},Y=function(t,e,n){return t===L&&Y(V,e,n),m(t),e=w(e,!0),m(n),i(M,e)?(n.enumerable?(i(t,H)&&t[H][e]&&(t[H][e]=!1),n=x(n,{enumerable:_(0,!1)})):(i(t,H)||C(t,H,_(1,{})),t[H][e]=!0),W(t,e,n)):C(t,e,n)},G=function(t,e){m(t);for(var n,r=y(e=b(e)),i=0,s=r.length;s>i;)Y(t,n=r[i++],e[n]);return t},X=function(t,e){return void 0===e?x(t):G(x(t),e)},$=function(t){var e=N.call(this,t=w(t,!0));return!(this===L&&i(M,t)&&!i(V,t))&&(!(e||!i(this,t)||!i(M,t)||i(this,H)&&this[H][t])||e)},Q=function(t,e){if(t=b(t),e=w(e,!0),t!==L||!i(M,e)||i(V,e)){var n=O(t,e);return!n||!i(M,e)||i(t,H)&&t[H][e]||(n.enumerable=!0),n}},Z=function(t){for(var e,n=T(b(t)),r=[],s=0;n.length>s;)i(M,e=n[s++])||e==H||e==u||r.push(e);return r},tt=function(t){for(var e,n=t===L,r=T(n?V:b(t)),s=[],o=0;r.length>o;)!i(M,e=r[o++])||n&&!i(L,e)||s.push(M[e]);return s};K||(j=function(){if(this instanceof j)throw TypeError("Symbol is not a constructor!");var t=l(arguments.length>0?arguments[0]:void 0),e=function(n){this===L&&e.call(V,n),i(this,H)&&i(this[H],t)&&(this[H][t]=!1),W(this,t,_(1,n))};return s&&q&&W(L,t,{configurable:!0,set:e}),z(t)},a(j[D],"toString",function(){return this._k}),A.f=Q,F.f=Y,n(49).f=E.f=Z,n(43).f=$,n(42).f=tt,s&&!n(28)&&a(L,"propertyIsEnumerable",$,!0),p.f=function(t){return z(d(t))}),o(o.G+o.W+o.F*!K,{Symbol:j});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)d(et[nt++]);for(var rt=P(d.store),it=0;rt.length>it;)g(rt[it++]);o(o.S+o.F*!K,"Symbol",{for:function(t){return i(B,t+="")?B[t]:B[t]=j(t)},keyFor:function(t){if(!J(t))throw TypeError(t+" is not a symbol!");for(var e in B)if(B[e]===t)return e},useSetter:function(){q=!0},useSimple:function(){q=!1}}),o(o.S+o.F*!K,"Object",{create:X,defineProperty:Y,defineProperties:G,getOwnPropertyDescriptor:Q,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),I&&o(o.S+o.F*(!K||c(function(){var t=j();return"[null]"!=R([t])||"{}"!=R({a:t})||"{}"!=R(Object(t))})),"JSON",{stringify:function(t){for(var e,n,r=[t],i=1;arguments.length>i;)r.push(arguments[i++]);if(n=e=r[1],(S(e)||void 0!==t)&&!J(t))return v(e)||(e=function(t,e){if("function"==typeof n&&(e=n.call(this,t,e)),!J(e))return e}),r[1]=e,R.apply(I,r)}}),j[D][k]||n(10)(j[D],k,j[D].valueOf),h(j,"Symbol"),h(Math,"Math",!0),h(r.JSON,"JSON",!0)},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){t.exports=!n(7)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(4),i=n(9),s=n(10),o=n(18),a=n(20),u="prototype",c=function(t,e,n){var f,h,l,d,p=t&c.F,g=t&c.G,y=t&c.S,v=t&c.P,m=t&c.B,S=g?r:y?r[e]||(r[e]={}):(r[e]||{})[u],b=g?i:i[e]||(i[e]={}),w=b[u]||(b[u]={});g&&(n=e);for(f in n)h=!p&&S&&void 0!==S[f],l=(h?S:n)[f],d=m&&h?a(l,r):v&&"function"==typeof l?a(Function.call,l):l,S&&o(S,f,l,t&c.U),b[f]!=l&&s(b,f,d),v&&w[f]!=l&&(w[f]=l)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,e){var n=t.exports={version:"2.5.3"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(11),i=n(17);t.exports=n(6)?function(t,e,n){return r.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(12),i=n(14),s=n(16),o=Object.defineProperty;e.f=n(6)?Object.defineProperty:function(t,e,n){if(r(t),e=s(e,!0),r(n),i)try{return o(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(13);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){t.exports=!n(6)&&!n(7)(function(){return 7!=Object.defineProperty(n(15)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(13),i=n(4).document,s=r(i)&&r(i.createElement);t.exports=function(t){return s?i.createElement(t):{}}},function(t,e,n){var r=n(13);t.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(4),i=n(10),s=n(5),o=n(19)("src"),a="toString",u=Function[a],c=(""+u).split(a);n(9).inspectSource=function(t){return u.call(t)},(t.exports=function(t,e,n,a){var u="function"==typeof n;u&&(s(n,"name")||i(n,"name",e)),t[e]!==n&&(u&&(s(n,o)||i(n,o,t[e]?""+t[e]:c.join(String(e)))),t===r?t[e]=n:a?t[e]?t[e]=n:i(t,e,n):(delete t[e],i(t,e,n)))})(Function.prototype,a,function(){return"function"==typeof this&&this[o]||u.call(this)})},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e,n){var r=n(21);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,n){var r=n(19)("meta"),i=n(13),s=n(5),o=n(11).f,a=0,u=Object.isExtensible||function(){return!0},c=!n(7)(function(){return u(Object.preventExtensions({}))}),f=function(t){o(t,r,{value:{i:"O"+ ++a,w:{}}})},h=function(t,e){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!s(t,r)){if(!u(t))return"F";if(!e)return"E";f(t)}return t[r].i},l=function(t,e){if(!s(t,r)){if(!u(t))return!0;if(!e)return!1;f(t)}return t[r].w},d=function(t){return c&&p.NEED&&u(t)&&!s(t,r)&&f(t),t},p=t.exports={KEY:r,NEED:!1,fastKey:h,getWeak:l,onFreeze:d}},function(t,e,n){var r=n(4),i="__core-js_shared__",s=r[i]||(r[i]={});t.exports=function(t){return s[t]||(s[t]={})}},function(t,e,n){var r=n(11).f,i=n(5),s=n(25)("toStringTag");t.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,s)&&r(t,s,{configurable:!0,value:e})}},function(t,e,n){var r=n(23)("wks"),i=n(19),s=n(4).Symbol,o="function"==typeof s,a=t.exports=function(t){return r[t]||(r[t]=o&&s[t]||(o?s:i)("Symbol."+t))};a.store=r},function(t,e,n){e.f=n(25)},function(t,e,n){var r=n(4),i=n(9),s=n(28),o=n(26),a=n(11).f;t.exports=function(t){var e=i.Symbol||(i.Symbol=s?{}:r.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:o.f(t)})}},function(t,e){t.exports=!1},function(t,e,n){var r=n(30),i=n(42),s=n(43);t.exports=function(t){var e=r(t),n=i.f;if(n)for(var o,a=n(t),u=s.f,c=0;a.length>c;)u.call(t,o=a[c++])&&e.push(o);return e}},function(t,e,n){var r=n(31),i=n(41);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(5),i=n(32),s=n(36)(!1),o=n(40)("IE_PROTO");t.exports=function(t,e){var n,a=i(t),u=0,c=[];for(n in a)n!=o&&r(a,n)&&c.push(n);for(;e.length>u;)r(a,n=e[u++])&&(~s(c,n)||c.push(n));return c}},function(t,e,n){var r=n(33),i=n(35);t.exports=function(t){return r(i(t))}},function(t,e,n){var r=n(34);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(32),i=n(37),s=n(39);t.exports=function(t){return function(e,n,o){var a,u=r(e),c=i(u.length),f=s(o,c);if(t&&n!=n){for(;c>f;)if(a=u[f++],a!=a)return!0}else for(;c>f;f++)if((t||f in u)&&u[f]===n)return t||f||0;return!t&&-1}}},function(t,e,n){var r=n(38),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(38),i=Math.max,s=Math.min;t.exports=function(t,e){return t=r(t),t<0?i(t+e,0):s(t,e)}},function(t,e,n){var r=n(23)("keys"),i=n(19);t.exports=function(t){return r[t]||(r[t]=i(t))}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var r=n(34);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){var r=n(12),i=n(46),s=n(41),o=n(40)("IE_PROTO"),a=function(){},u="prototype",c=function(){var t,e=n(15)("iframe"),r=s.length,i="<",o=">";for(e.style.display="none",n(47).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(i+"script"+o+"document.F=Object"+i+"/script"+o),t.close(),c=t.F;r--;)delete c[u][s[r]];return c()};t.exports=Object.create||function(t,e){var n;return null!==t?(a[u]=r(t),n=new a,a[u]=null,n[o]=t):n=c(),void 0===e?n:i(n,e)}},function(t,e,n){var r=n(11),i=n(12),s=n(30);t.exports=n(6)?Object.defineProperties:function(t,e){i(t);for(var n,o=s(e),a=o.length,u=0;a>u;)r.f(t,n=o[u++],e[n]);return t}},function(t,e,n){var r=n(4).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(32),i=n(49).f,s={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return i(t)}catch(t){return o.slice()}};t.exports.f=function(t){return o&&"[object Window]"==s.call(t)?a(t):i(r(t))}},function(t,e,n){var r=n(31),i=n(41).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},function(t,e,n){var r=n(43),i=n(17),s=n(32),o=n(16),a=n(5),u=n(14),c=Object.getOwnPropertyDescriptor;e.f=n(6)?c:function(t,e){if(t=s(t),e=o(e,!0),u)try{return c(t,e)}catch(t){}if(a(t,e))return i(!r.f.call(t,e),t[e])}},function(t,e,n){var r=n(8);r(r.S,"Object",{create:n(45)})},function(t,e,n){var r=n(8);r(r.S+r.F*!n(6),"Object",{defineProperty:n(11).f})},function(t,e,n){var r=n(8);r(r.S+r.F*!n(6),"Object",{defineProperties:n(46)})},function(t,e,n){var r=n(32),i=n(50).f;n(55)("getOwnPropertyDescriptor",function(){return function(t,e){return i(r(t),e)}})},function(t,e,n){var r=n(8),i=n(9),s=n(7);t.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*s(function(){n(1)}),"Object",o)}},function(t,e,n){var r=n(57),i=n(58);n(55)("getPrototypeOf",function(){return function(t){return i(r(t))}})},function(t,e,n){var r=n(35);t.exports=function(t){return Object(r(t))}},function(t,e,n){var r=n(5),i=n(57),s=n(40)("IE_PROTO"),o=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,s)?t[s]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?o:null}},function(t,e,n){var r=n(57),i=n(30);n(55)("keys",function(){return function(t){return i(r(t))}})},function(t,e,n){n(55)("getOwnPropertyNames",function(){return n(48).f})},function(t,e,n){var r=n(13),i=n(22).onFreeze;n(55)("freeze",function(t){return function(e){return t&&r(e)?t(i(e)):e}})},function(t,e,n){var r=n(13),i=n(22).onFreeze;n(55)("seal",function(t){return function(e){return t&&r(e)?t(i(e)):e}})},function(t,e,n){var r=n(13),i=n(22).onFreeze;n(55)("preventExtensions",function(t){return function(e){return t&&r(e)?t(i(e)):e}})},function(t,e,n){var r=n(13);n(55)("isFrozen",function(t){return function(e){return!r(e)||!!t&&t(e)}})},function(t,e,n){var r=n(13);n(55)("isSealed",function(t){return function(e){return!r(e)||!!t&&t(e)}})},function(t,e,n){var r=n(13);n(55)("isExtensible",function(t){return function(e){return!!r(e)&&(!t||t(e))}})},function(t,e,n){var r=n(8);r(r.S+r.F,"Object",{assign:n(68)})},function(t,e,n){"use strict";var r=n(30),i=n(42),s=n(43),o=n(57),a=n(33),u=Object.assign;t.exports=!u||n(7)(function(){var t={},e={},n=Symbol(),r="abcdefghijklmnopqrst";return t[n]=7,r.split("").forEach(function(t){e[t]=t}),7!=u({},t)[n]||Object.keys(u({},e)).join("")!=r})?function(t,e){for(var n=o(t),u=arguments.length,c=1,f=i.f,h=s.f;u>c;)for(var l,d=a(arguments[c++]),p=f?r(d).concat(f(d)):r(d),g=p.length,y=0;g>y;)h.call(d,l=p[y++])&&(n[l]=d[l]);return n}:u},function(t,e,n){var r=n(8);r(r.S,"Object",{is:n(70)})},function(t,e){t.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},function(t,e,n){var r=n(8);r(r.S,"Object",{setPrototypeOf:n(72).set})},function(t,e,n){var r=n(13),i=n(12),s=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,r){try{r=n(20)(Function.call,n(50).f(Object.prototype,"__proto__").set,2),r(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,n){return s(t,n),e?t.__proto__=n:r(t,n),t}}({},!1):void 0),check:s}},function(t,e,n){"use strict";var r=n(74),i={};i[n(25)("toStringTag")]="z",i+""!="[object z]"&&n(18)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},function(t,e,n){var r=n(34),i=n(25)("toStringTag"),s="Arguments"==r(function(){return arguments}()),o=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,n,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=o(e=Object(t),i))?n:s?r(e):"Object"==(a=r(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,n){var r=n(8);r(r.P,"Function",{bind:n(76)})},function(t,e,n){"use strict";var r=n(21),i=n(13),s=n(77),o=[].slice,a={},u=function(t,e,n){if(!(e in a)){for(var r=[],i=0;i>>0||(o.test(n)?16:10))}:r},function(t,e,n){var r=n(8),i=n(35),s=n(7),o=n(83),a="["+o+"]",u="​…",c=RegExp("^"+a+a+"*"),f=RegExp(a+a+"*$"),h=function(t,e,n){var i={},a=s(function(){return!!o[t]()||u[t]()!=u}),c=i[t]=a?e(l):o[t];n&&(i[n]=c),r(r.P+r.F*a,"String",i)},l=h.trim=function(t,e){return t=String(i(t)),1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(f,"")),t};t.exports=h},function(t,e){t.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},function(t,e,n){var r=n(8),i=n(85);r(r.G+r.F*(parseFloat!=i),{parseFloat:i})},function(t,e,n){var r=n(4).parseFloat,i=n(82).trim;t.exports=1/r(n(83)+"-0")!==-(1/0)?function(t){var e=i(String(t),3),n=r(e);return 0===n&&"-"==e.charAt(0)?-0:n}:r},function(t,e,n){"use strict";var r=n(4),i=n(5),s=n(34),o=n(87),a=n(16),u=n(7),c=n(49).f,f=n(50).f,h=n(11).f,l=n(82).trim,d="Number",p=r[d],g=p,y=p.prototype,v=s(n(45)(y))==d,m="trim"in String.prototype,S=function(t){var e=a(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():l(e,3);var n,r,i,s=e.charCodeAt(0);if(43===s||45===s){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===s){switch(e.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+e}for(var o,u=e.slice(2),c=0,f=u.length;ci)return NaN;return parseInt(u,r)}}return+e};if(!p(" 0o1")||!p("0b1")||p("+0x1")){p=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof p&&(v?u(function(){y.valueOf.call(n)}):s(n)!=d)?o(new g(S(e)),n,p):S(e)};for(var b,w=n(6)?c(g):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),_=0;w.length>_;_++)i(g,b=w[_])&&!i(p,b)&&h(p,b,f(g,b));p.prototype=y,y.constructor=p,n(18)(r,d,p)}},function(t,e,n){var r=n(13),i=n(72).set;t.exports=function(t,e,n){var s,o=e.constructor;return o!==n&&"function"==typeof o&&(s=o.prototype)!==n.prototype&&r(s)&&i&&i(t,s),t}},function(t,e,n){"use strict";var r=n(8),i=n(38),s=n(89),o=n(90),a=1..toFixed,u=Math.floor,c=[0,0,0,0,0,0],f="Number.toFixed: incorrect invocation!",h="0",l=function(t,e){for(var n=-1,r=e;++n<6;)r+=t*c[n],c[n]=r%1e7,r=u(r/1e7)},d=function(t){for(var e=6,n=0;--e>=0;)n+=c[e],c[e]=u(n/t),n=n%t*1e7},p=function(){for(var t=6,e="";--t>=0;)if(""!==e||0===t||0!==c[t]){var n=String(c[t]);e=""===e?n:e+o.call(h,7-n.length)+n}return e},g=function(t,e,n){return 0===e?n:e%2===1?g(t,e-1,n*t):g(t*t,e/2,n)},y=function(t){for(var e=0,n=t;n>=4096;)e+=12,n/=4096;for(;n>=2;)e+=1,n/=2;return e};r(r.P+r.F*(!!a&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!n(7)(function(){a.call({})})),"Number",{toFixed:function(t){var e,n,r,a,u=s(this,f),c=i(t),v="",m=h;if(c<0||c>20)throw RangeError(f);if(u!=u)return"NaN";if(u<=-1e21||u>=1e21)return String(u);if(u<0&&(v="-",u=-u),u>1e-21)if(e=y(u*g(2,69,1))-69,n=e<0?u*g(2,-e,1):u/g(2,e,1),n*=4503599627370496,e=52-e,e>0){for(l(0,n),r=c;r>=7;)l(1e7,0),r-=7;for(l(g(10,r,1),0),r=e-1;r>=23;)d(1<<23),r-=23;d(1<0?(a=m.length,m=v+(a<=c?"0."+o.call(h,c-a)+m:m.slice(0,a-c)+"."+m.slice(a-c))):m=v+m,m}})},function(t,e,n){var r=n(34);t.exports=function(t,e){if("number"!=typeof t&&"Number"!=r(t))throw TypeError(e);return+t}},function(t,e,n){"use strict";var r=n(38),i=n(35);t.exports=function(t){var e=String(i(this)),n="",s=r(t);if(s<0||s==1/0)throw RangeError("Count can't be negative");for(;s>0;(s>>>=1)&&(e+=e))1&s&&(n+=e);return n}},function(t,e,n){"use strict";var r=n(8),i=n(7),s=n(89),o=1..toPrecision;r(r.P+r.F*(i(function(){return"1"!==o.call(1,void 0)})||!i(function(){o.call({})})),"Number",{toPrecision:function(t){var e=s(this,"Number#toPrecision: incorrect invocation!");return void 0===t?o.call(e):o.call(e,t)}})},function(t,e,n){var r=n(8);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},function(t,e,n){var r=n(8),i=n(4).isFinite;r(r.S,"Number",{isFinite:function(t){return"number"==typeof t&&i(t)}})},function(t,e,n){var r=n(8);r(r.S,"Number",{isInteger:n(95)})},function(t,e,n){var r=n(13),i=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},function(t,e,n){var r=n(8);r(r.S,"Number",{isNaN:function(t){return t!=t}})},function(t,e,n){var r=n(8),i=n(95),s=Math.abs;r(r.S,"Number",{isSafeInteger:function(t){return i(t)&&s(t)<=9007199254740991}})},function(t,e,n){var r=n(8);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(t,e,n){var r=n(8);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,e,n){var r=n(8),i=n(85);r(r.S+r.F*(Number.parseFloat!=i),"Number",{parseFloat:i})},function(t,e,n){var r=n(8),i=n(81);r(r.S+r.F*(Number.parseInt!=i),"Number",{parseInt:i})},function(t,e,n){var r=n(8),i=n(103),s=Math.sqrt,o=Math.acosh;r(r.S+r.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))&&o(1/0)==1/0),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+s(t-1)*s(t+1))}})},function(t,e){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,e,n){function r(t){return isFinite(t=+t)&&0!=t?t<0?-r(-t):Math.log(t+Math.sqrt(t*t+1)):t}var i=n(8),s=Math.asinh;i(i.S+i.F*!(s&&1/s(0)>0),"Math",{asinh:r})},function(t,e,n){var r=n(8),i=Math.atanh;r(r.S+r.F*!(i&&1/i(-0)<0),"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,e,n){var r=n(8),i=n(107);r(r.S,"Math",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,e){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,e,n){var r=n(8);r(r.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,e,n){var r=n(8),i=Math.exp;r(r.S,"Math",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},function(t,e,n){var r=n(8),i=n(111);r(r.S+r.F*(i!=Math.expm1),"Math",{expm1:i})},function(t,e){var n=Math.expm1;t.exports=!n||n(10)>22025.465794806718||n(10)<22025.465794806718||n(-2e-17)!=-2e-17?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:n},function(t,e,n){var r=n(8);r(r.S,"Math",{fround:n(113)})},function(t,e,n){var r=n(107),i=Math.pow,s=i(2,-52),o=i(2,-23),a=i(2,127)*(2-o),u=i(2,-126),c=function(t){return t+1/s-1/s};t.exports=Math.fround||function(t){var e,n,i=Math.abs(t),f=r(t);return ia||n!=n?f*(1/0):f*n)}},function(t,e,n){var r=n(8),i=Math.abs;r(r.S,"Math",{hypot:function(t,e){for(var n,r,s=0,o=0,a=arguments.length,u=0;o0?(r=n/u,s+=r*r):s+=n;return u===1/0?1/0:u*Math.sqrt(s)}})},function(t,e,n){var r=n(8),i=Math.imul;r(r.S+r.F*n(7)(function(){return i(4294967295,5)!=-5||2!=i.length}),"Math",{imul:function(t,e){var n=65535,r=+t,i=+e,s=n&r,o=n&i;return 0|s*o+((n&r>>>16)*o+s*(n&i>>>16)<<16>>>0)}})},function(t,e,n){var r=n(8);r(r.S,"Math",{log10:function(t){return Math.log(t)*Math.LOG10E}})},function(t,e,n){var r=n(8);r(r.S,"Math",{log1p:n(103)})},function(t,e,n){var r=n(8);r(r.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,e,n){var r=n(8);r(r.S,"Math",{sign:n(107)})},function(t,e,n){var r=n(8),i=n(111),s=Math.exp;r(r.S+r.F*n(7)(function(){return!Math.sinh(-2e-17)!=-2e-17}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(s(t-1)-s(-t-1))*(Math.E/2)}})},function(t,e,n){var r=n(8),i=n(111),s=Math.exp;r(r.S,"Math",{tanh:function(t){var e=i(t=+t),n=i(-t);return e==1/0?1:n==1/0?-1:(e-n)/(s(t)+s(-t))}})},function(t,e,n){var r=n(8);r(r.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,e,n){var r=n(8),i=n(39),s=String.fromCharCode,o=String.fromCodePoint;r(r.S+r.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],r=arguments.length,o=0;r>o;){if(e=+arguments[o++],i(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(e<65536?s(e):s(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},function(t,e,n){var r=n(8),i=n(32),s=n(37);r(r.S,"String",{raw:function(t){for(var e=i(t.raw),n=s(e.length),r=arguments.length,o=[],a=0;n>a;)o.push(String(e[a++])),a=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){var r=n(38),i=n(35);t.exports=function(t){return function(e,n){var s,o,a=String(i(e)),u=r(n),c=a.length;return u<0||u>=c?t?"":void 0:(s=a.charCodeAt(u),s<55296||s>56319||u+1===c||(o=a.charCodeAt(u+1))<56320||o>57343?t?a.charAt(u):s:t?a.slice(u,u+2):(s-55296<<10)+(o-56320)+65536)}}},function(t,e,n){"use strict";var r=n(28),i=n(8),s=n(18),o=n(10),a=n(5),u=n(129),c=n(130),f=n(24),h=n(58),l=n(25)("iterator"),d=!([].keys&&"next"in[].keys()),p="@@iterator",g="keys",y="values",v=function(){return this};t.exports=function(t,e,n,m,S,b,w){c(n,e,m);var _,x,E,A=function(t){if(!d&&t in C)return C[t];switch(t){case g:return function(){return new n(this,t)};case y:return function(){return new n(this,t)}}return function(){return new n(this,t)}},F=e+" Iterator",P=S==y,O=!1,C=t.prototype,T=C[l]||C[p]||S&&C[S],j=!d&&T||A(S),I=S?P?A("entries"):j:void 0,R="Array"==e?C.entries||T:T;if(R&&(E=h(R.call(new t)),E!==Object.prototype&&E.next&&(f(E,F,!0),r||a(E,l)||o(E,l,v))),P&&T&&T.name!==y&&(O=!0,j=function(){return T.call(this)}),r&&!w||!d&&!O&&C[l]||o(C,l,j),u[e]=j,u[F]=v,S)if(_={values:P?j:A(y),keys:b?j:A(g),entries:I},w)for(x in _)x in C||s(C,x,_[x]);else i(i.P+i.F*(d||O),e,_);return _}},function(t,e){t.exports={}},function(t,e,n){"use strict";var r=n(45),i=n(17),s=n(24),o={};n(10)(o,n(25)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(o,{next:i(1,n)}),s(t,e+" Iterator")}},function(t,e,n){"use strict";var r=n(8),i=n(127)(!1);r(r.P,"String",{codePointAt:function(t){return i(this,t)}})},function(t,e,n){"use strict";var r=n(8),i=n(37),s=n(133),o="endsWith",a=""[o];r(r.P+r.F*n(135)(o),"String",{endsWith:function(t){var e=s(this,t,o),n=arguments.length>1?arguments[1]:void 0,r=i(e.length),u=void 0===n?r:Math.min(i(n),r),c=String(t);return a?a.call(e,c,u):e.slice(u-c.length,u)===c}})},function(t,e,n){var r=n(134),i=n(35);t.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return String(i(t))}},function(t,e,n){var r=n(13),i=n(34),s=n(25)("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[s])?!!e:"RegExp"==i(t))}},function(t,e,n){var r=n(25)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(t){}}return!0}},function(t,e,n){"use strict";var r=n(8),i=n(133),s="includes";r(r.P+r.F*n(135)(s),"String",{includes:function(t){return!!~i(this,t,s).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(8);r(r.P,"String",{repeat:n(90)})},function(t,e,n){"use strict";var r=n(8),i=n(37),s=n(133),o="startsWith",a=""[o];r(r.P+r.F*n(135)(o),"String",{startsWith:function(t){var e=s(this,t,o),n=i(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return a?a.call(e,r,n):e.slice(n,n+r.length)===r}})},function(t,e,n){"use strict";n(140)("anchor",function(t){return function(e){return t(this,"a","name",e)}})},function(t,e,n){var r=n(8),i=n(7),s=n(35),o=/"/g,a=function(t,e,n,r){var i=String(s(t)),a="<"+e;return""!==n&&(a+=" "+n+'="'+String(r).replace(o,""")+'"'),a+">"+i+""};t.exports=function(t,e){var n={};n[t]=e(a),r(r.P+r.F*i(function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}),"String",n)}},function(t,e,n){"use strict";n(140)("big",function(t){return function(){return t(this,"big","","")}})},function(t,e,n){"use strict";n(140)("blink",function(t){return function(){return t(this,"blink","","")}})},function(t,e,n){"use strict";n(140)("bold",function(t){return function(){return t(this,"b","","")}})},function(t,e,n){"use strict";n(140)("fixed",function(t){return function(){return t(this,"tt","","")}})},function(t,e,n){"use strict";n(140)("fontcolor",function(t){return function(e){return t(this,"font","color",e)}})},function(t,e,n){"use strict";n(140)("fontsize",function(t){return function(e){return t(this,"font","size",e)}})},function(t,e,n){"use strict";n(140)("italics",function(t){return function(){return t(this,"i","","")}})},function(t,e,n){"use strict";n(140)("link",function(t){return function(e){return t(this,"a","href",e)}})},function(t,e,n){"use strict";n(140)("small",function(t){return function(){return t(this,"small","","")}})},function(t,e,n){"use strict";n(140)("strike",function(t){return function(){return t(this,"strike","","")}})},function(t,e,n){"use strict";n(140)("sub",function(t){return function(){return t(this,"sub","","")}})},function(t,e,n){"use strict";n(140)("sup",function(t){return function(){return t(this,"sup","","")}})},function(t,e,n){var r=n(8);r(r.S,"Date",{now:function(){return(new Date).getTime()}})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(16);r(r.P+r.F*n(7)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(t){var e=i(this),n=s(e);return"number"!=typeof n||isFinite(n)?e.toISOString():null}})},function(t,e,n){var r=n(8),i=n(156);r(r.P+r.F*(Date.prototype.toISOString!==i),"Date",{toISOString:i})},function(t,e,n){"use strict";var r=n(7),i=Date.prototype.getTime,s=Date.prototype.toISOString,o=function(t){return t>9?t:"0"+t};t.exports=r(function(){return"0385-07-25T07:06:39.999Z"!=s.call(new Date(-5e13-1))})||!r(function(){s.call(new Date(NaN))})?function(){if(!isFinite(i.call(this)))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),r=e<0?"-":e>9999?"+":""; -return r+("00000"+Math.abs(e)).slice(r?-6:-4)+"-"+o(t.getUTCMonth()+1)+"-"+o(t.getUTCDate())+"T"+o(t.getUTCHours())+":"+o(t.getUTCMinutes())+":"+o(t.getUTCSeconds())+"."+(n>99?n:"0"+o(n))+"Z"}:s},function(t,e,n){var r=Date.prototype,i="Invalid Date",s="toString",o=r[s],a=r.getTime;new Date(NaN)+""!=i&&n(18)(r,s,function(){var t=a.call(this);return t===t?o.call(this):i})},function(t,e,n){var r=n(25)("toPrimitive"),i=Date.prototype;r in i||n(10)(i,r,n(159))},function(t,e,n){"use strict";var r=n(12),i=n(16),s="number";t.exports=function(t){if("string"!==t&&t!==s&&"default"!==t)throw TypeError("Incorrect hint");return i(r(this),t!=s)}},function(t,e,n){var r=n(8);r(r.S,"Array",{isArray:n(44)})},function(t,e,n){"use strict";var r=n(20),i=n(8),s=n(57),o=n(162),a=n(163),u=n(37),c=n(164),f=n(165);i(i.S+i.F*!n(166)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,i,h,l=s(t),d="function"==typeof this?this:Array,p=arguments.length,g=p>1?arguments[1]:void 0,y=void 0!==g,v=0,m=f(l);if(y&&(g=r(g,p>2?arguments[2]:void 0,2)),void 0==m||d==Array&&a(m))for(e=u(l.length),n=new d(e);e>v;v++)c(n,v,y?g(l[v],v):l[v]);else for(h=m.call(l),n=new d;!(i=h.next()).done;v++)c(n,v,y?o(h,g,[i.value,v],!0):i.value);return n.length=v,n}})},function(t,e,n){var r=n(12);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var s=t.return;throw void 0!==s&&r(s.call(t)),e}}},function(t,e,n){var r=n(129),i=n(25)("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||s[i]===t)}},function(t,e,n){"use strict";var r=n(11),i=n(17);t.exports=function(t,e,n){e in t?r.f(t,e,i(0,n)):t[e]=n}},function(t,e,n){var r=n(74),i=n(25)("iterator"),s=n(129);t.exports=n(9).getIteratorMethod=function(t){if(void 0!=t)return t[i]||t["@@iterator"]||s[r(t)]}},function(t,e,n){var r=n(25)("iterator"),i=!1;try{var s=[7][r]();s.return=function(){i=!0},Array.from(s,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var s=[7],o=s[r]();o.next=function(){return{done:n=!0}},s[r]=function(){return o},t(s)}catch(t){}return n}},function(t,e,n){"use strict";var r=n(8),i=n(164);r(r.S+r.F*n(7)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments.length,n=new("function"==typeof this?this:Array)(e);e>t;)i(n,t,arguments[t++]);return n.length=e,n}})},function(t,e,n){"use strict";var r=n(8),i=n(32),s=[].join;r(r.P+r.F*(n(33)!=Object||!n(169)(s)),"Array",{join:function(t){return s.call(i(this),void 0===t?",":t)}})},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e){return!!t&&r(function(){e?t.call(null,function(){},1):t.call(null)})}},function(t,e,n){"use strict";var r=n(8),i=n(47),s=n(34),o=n(39),a=n(37),u=[].slice;r(r.P+r.F*n(7)(function(){i&&u.call(i)}),"Array",{slice:function(t,e){var n=a(this.length),r=s(this);if(e=void 0===e?n:e,"Array"==r)return u.call(this,t,e);for(var i=o(t,n),c=o(e,n),f=a(c-i),h=new Array(f),l=0;lw;w++)if((l||w in m)&&(g=m[w],y=S(g,w,v),t))if(n)_[w]=y;else if(y)switch(t){case 3:return!0;case 5:return g;case 6:return w;case 2:_.push(g)}else if(f)return!1;return h?-1:c||f?f:_}}},function(t,e,n){var r=n(175);t.exports=function(t,e){return new(r(t))(e)}},function(t,e,n){var r=n(13),i=n(44),s=n(25)("species");t.exports=function(t){var e;return i(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!i(e.prototype)||(e=void 0),r(e)&&(e=e[s],null===e&&(e=void 0))),void 0===e?Array:e}},function(t,e,n){"use strict";var r=n(8),i=n(173)(1);r(r.P+r.F*!n(169)([].map,!0),"Array",{map:function(t){return i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(173)(2);r(r.P+r.F*!n(169)([].filter,!0),"Array",{filter:function(t){return i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(173)(3);r(r.P+r.F*!n(169)([].some,!0),"Array",{some:function(t){return i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(173)(4);r(r.P+r.F*!n(169)([].every,!0),"Array",{every:function(t){return i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(181);r(r.P+r.F*!n(169)([].reduce,!0),"Array",{reduce:function(t){return i(this,t,arguments.length,arguments[1],!1)}})},function(t,e,n){var r=n(21),i=n(57),s=n(33),o=n(37);t.exports=function(t,e,n,a,u){r(e);var c=i(t),f=s(c),h=o(c.length),l=u?h-1:0,d=u?-1:1;if(n<2)for(;;){if(l in f){a=f[l],l+=d;break}if(l+=d,u?l<0:h<=l)throw TypeError("Reduce of empty array with no initial value")}for(;u?l>=0:h>l;l+=d)l in f&&(a=e(a,f[l],l,c));return a}},function(t,e,n){"use strict";var r=n(8),i=n(181);r(r.P+r.F*!n(169)([].reduceRight,!0),"Array",{reduceRight:function(t){return i(this,t,arguments.length,arguments[1],!0)}})},function(t,e,n){"use strict";var r=n(8),i=n(36)(!1),s=[].indexOf,o=!!s&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(o||!n(169)(s)),"Array",{indexOf:function(t){return o?s.apply(this,arguments)||0:i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(32),s=n(38),o=n(37),a=[].lastIndexOf,u=!!a&&1/[1].lastIndexOf(1,-0)<0;r(r.P+r.F*(u||!n(169)(a)),"Array",{lastIndexOf:function(t){if(u)return a.apply(this,arguments)||0;var e=i(this),n=o(e.length),r=n-1;for(arguments.length>1&&(r=Math.min(r,s(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in e&&e[r]===t)return r||0;return-1}})},function(t,e,n){var r=n(8);r(r.P,"Array",{copyWithin:n(186)}),n(187)("copyWithin")},function(t,e,n){"use strict";var r=n(57),i=n(39),s=n(37);t.exports=[].copyWithin||function(t,e){var n=r(this),o=s(n.length),a=i(t,o),u=i(e,o),c=arguments.length>2?arguments[2]:void 0,f=Math.min((void 0===c?o:i(c,o))-u,o-a),h=1;for(u0;)u in n?n[a]=n[u]:delete n[a],a+=h,u+=h;return n}},function(t,e,n){var r=n(25)("unscopables"),i=Array.prototype;void 0==i[r]&&n(10)(i,r,{}),t.exports=function(t){i[r][t]=!0}},function(t,e,n){var r=n(8);r(r.P,"Array",{fill:n(189)}),n(187)("fill")},function(t,e,n){"use strict";var r=n(57),i=n(39),s=n(37);t.exports=function(t){for(var e=r(this),n=s(e.length),o=arguments.length,a=i(o>1?arguments[1]:void 0,n),u=o>2?arguments[2]:void 0,c=void 0===u?n:i(u,n);c>a;)e[a++]=t;return e}},function(t,e,n){"use strict";var r=n(8),i=n(173)(5),s="find",o=!0;s in[]&&Array(1)[s](function(){o=!1}),r(r.P+r.F*o,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n(187)(s)},function(t,e,n){"use strict";var r=n(8),i=n(173)(6),s="findIndex",o=!0;s in[]&&Array(1)[s](function(){o=!1}),r(r.P+r.F*o,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n(187)(s)},function(t,e,n){n(193)("Array")},function(t,e,n){"use strict";var r=n(4),i=n(11),s=n(6),o=n(25)("species");t.exports=function(t){var e=r[t];s&&e&&!e[o]&&i.f(e,o,{configurable:!0,get:function(){return this}})}},function(t,e,n){"use strict";var r=n(187),i=n(195),s=n(129),o=n(32);t.exports=n(128)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,i(1)):"keys"==e?i(0,n):"values"==e?i(0,t[n]):i(0,[n,t[n]])},"values"),s.Arguments=s.Array,r("keys"),r("values"),r("entries")},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){var r=n(4),i=n(87),s=n(11).f,o=n(49).f,a=n(134),u=n(197),c=r.RegExp,f=c,h=c.prototype,l=/a/g,d=/a/g,p=new c(l)!==l;if(n(6)&&(!p||n(7)(function(){return d[n(25)("match")]=!1,c(l)!=l||c(d)==d||"/a/i"!=c(l,"i")}))){c=function(t,e){var n=this instanceof c,r=a(t),s=void 0===e;return!n&&r&&t.constructor===c&&s?t:i(p?new f(r&&!s?t.source:t,e):f((r=t instanceof c)?t.source:t,r&&s?u.call(t):e),n?this:h,c)};for(var g=(function(t){t in c||s(c,t,{configurable:!0,get:function(){return f[t]},set:function(e){f[t]=e}})}),y=o(f),v=0;y.length>v;)g(y[v++]);h.constructor=c,c.prototype=h,n(18)(r,"RegExp",c)}n(193)("RegExp")},function(t,e,n){"use strict";var r=n(12);t.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},function(t,e,n){"use strict";n(199);var r=n(12),i=n(197),s=n(6),o="toString",a=/./[o],u=function(t){n(18)(RegExp.prototype,o,t,!0)};n(7)(function(){return"/a/b"!=a.call({source:"a",flags:"b"})})?u(function(){var t=r(this);return"/".concat(t.source,"/","flags"in t?t.flags:!s&&t instanceof RegExp?i.call(t):void 0)}):a.name!=o&&u(function(){return a.call(this)})},function(t,e,n){n(6)&&"g"!=/./g.flags&&n(11).f(RegExp.prototype,"flags",{configurable:!0,get:n(197)})},function(t,e,n){n(201)("match",1,function(t,e,n){return[function(n){"use strict";var r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):new RegExp(n)[e](String(r))},n]})},function(t,e,n){"use strict";var r=n(10),i=n(18),s=n(7),o=n(35),a=n(25);t.exports=function(t,e,n){var u=a(t),c=n(o,u,""[t]),f=c[0],h=c[1];s(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(i(String.prototype,t,f),r(RegExp.prototype,u,2==e?function(t,e){return h.call(t,this,e)}:function(t){return h.call(t,this)}))}},function(t,e,n){n(201)("replace",2,function(t,e,n){return[function(r,i){"use strict";var s=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,s,i):n.call(String(s),r,i)},n]})},function(t,e,n){n(201)("search",1,function(t,e,n){return[function(n){"use strict";var r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):new RegExp(n)[e](String(r))},n]})},function(t,e,n){n(201)("split",2,function(t,e,r){"use strict";var i=n(134),s=r,o=[].push,a="split",u="length",c="lastIndex";if("c"=="abbc"[a](/(b)*/)[1]||4!="test"[a](/(?:)/,-1)[u]||2!="ab"[a](/(?:ab)*/)[u]||4!="."[a](/(.?)(.?)/)[u]||"."[a](/()()/)[u]>1||""[a](/.?/)[u]){var f=void 0===/()??/.exec("")[1];r=function(t,e){var n=String(this);if(void 0===t&&0===e)return[];if(!i(t))return s.call(n,t,e);var r,a,h,l,d,p=[],g=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),y=0,v=void 0===e?4294967295:e>>>0,m=new RegExp(t.source,g+"g");for(f||(r=new RegExp("^"+m.source+"$(?!\\s)",g));(a=m.exec(n))&&(h=a.index+a[0][u],!(h>y&&(p.push(n.slice(y,a.index)),!f&&a[u]>1&&a[0].replace(r,function(){for(d=1;d1&&a.index=v)));)m[c]===a.index&&m[c]++;return y===n[u]?!l&&m.test("")||p.push(""):p.push(n.slice(y)),p[u]>v?p.slice(0,v):p}}else"0"[a](void 0,0)[u]&&(r=function(t,e){return void 0===t&&0===e?[]:s.call(this,t,e)});return[function(n,i){var s=t(this),o=void 0==n?void 0:n[e];return void 0!==o?o.call(n,s,i):r.call(String(s),n,i)},r]})},function(t,e,n){"use strict";var r,i,s,o,a=n(28),u=n(4),c=n(20),f=n(74),h=n(8),l=n(13),d=n(21),p=n(206),g=n(207),y=n(208),v=n(209).set,m=n(210)(),S=n(211),b=n(212),w=n(213),_="Promise",x=u.TypeError,E=u.process,A=u[_],F="process"==f(E),P=function(){},O=i=S.f,C=!!function(){try{var t=A.resolve(1),e=(t.constructor={})[n(25)("species")]=function(t){t(P,P)};return(F||"function"==typeof PromiseRejectionEvent)&&t.then(P)instanceof e}catch(t){}}(),T=function(t){var e;return!(!l(t)||"function"!=typeof(e=t.then))&&e},j=function(t,e){if(!t._n){t._n=!0;var n=t._c;m(function(){for(var r=t._v,i=1==t._s,s=0,o=function(e){var n,s,o=i?e.ok:e.fail,a=e.resolve,u=e.reject,c=e.domain;try{o?(i||(2==t._h&&D(t),t._h=1),o===!0?n=r:(c&&c.enter(),n=o(r),c&&c.exit()),n===e.promise?u(x("Promise-chain cycle")):(s=T(n))?s.call(n,a,u):a(n)):u(r)}catch(t){u(t)}};n.length>s;)o(n[s++]);t._c=[],t._n=!1,e&&!t._h&&I(t)})}},I=function(t){v.call(u,function(){var e,n,r,i=t._v,s=R(t);if(s&&(e=b(function(){F?E.emit("unhandledRejection",i,t):(n=u.onunhandledrejection)?n({promise:t,reason:i}):(r=u.console)&&r.error&&r.error("Unhandled promise rejection",i)}),t._h=F||R(t)?2:1),t._a=void 0,s&&e.e)throw e.v})},R=function(t){return 1!==t._h&&0===(t._a||t._c).length},D=function(t){v.call(u,function(){var e;F?E.emit("rejectionHandled",t):(e=u.onrejectionhandled)&&e({promise:t,reason:t._v})})},H=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),j(e,!0))},k=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw x("Promise can't be resolved itself");(e=T(t))?m(function(){var r={_w:n,_d:!1};try{e.call(t,c(k,r,1),c(H,r,1))}catch(t){H.call(r,t)}}):(n._v=t,n._s=1,j(n,!1))}catch(t){H.call({_w:n,_d:!1},t)}}};C||(A=function(t){p(this,A,_,"_h"),d(t),r.call(this);try{t(c(k,this,1),c(H,this,1))}catch(t){H.call(this,t)}},r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},r.prototype=n(214)(A.prototype,{then:function(t,e){var n=O(y(this,A));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=F?E.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&j(this,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),s=function(){var t=new r;this.promise=t,this.resolve=c(k,t,1),this.reject=c(H,t,1)},S.f=O=function(t){return t===A||t===o?new s(t):i(t)}),h(h.G+h.W+h.F*!C,{Promise:A}),n(24)(A,_),n(193)(_),o=n(9)[_],h(h.S+h.F*!C,_,{reject:function(t){var e=O(this),n=e.reject;return n(t),e.promise}}),h(h.S+h.F*(a||!C),_,{resolve:function(t){return w(a&&this===o?A:this,t)}}),h(h.S+h.F*!(C&&n(166)(function(t){A.all(t).catch(P)})),_,{all:function(t){var e=this,n=O(e),r=n.resolve,i=n.reject,s=b(function(){var n=[],s=0,o=1;g(t,!1,function(t){var a=s++,u=!1;n.push(void 0),o++,e.resolve(t).then(function(t){u||(u=!0,n[a]=t,--o||r(n))},i)}),--o||r(n)});return s.e&&i(s.v),n.promise},race:function(t){var e=this,n=O(e),r=n.reject,i=b(function(){g(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return i.e&&r(i.v),n.promise}})},function(t,e){t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){var r=n(20),i=n(162),s=n(163),o=n(12),a=n(37),u=n(165),c={},f={},e=t.exports=function(t,e,n,h,l){var d,p,g,y,v=l?function(){return t}:u(t),m=r(n,h,e?2:1),S=0;if("function"!=typeof v)throw TypeError(t+" is not iterable!");if(s(v)){for(d=a(t.length);d>S;S++)if(y=e?m(o(p=t[S])[0],p[1]):m(t[S]),y===c||y===f)return y}else for(g=v.call(t);!(p=g.next()).done;)if(y=i(g,m,p.value,e),y===c||y===f)return y};e.BREAK=c,e.RETURN=f},function(t,e,n){var r=n(12),i=n(21),s=n(25)("species");t.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[s])?e:i(n)}},function(t,e,n){var r,i,s,o=n(20),a=n(77),u=n(47),c=n(15),f=n(4),h=f.process,l=f.setImmediate,d=f.clearImmediate,p=f.MessageChannel,g=f.Dispatch,y=0,v={},m="onreadystatechange",S=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},b=function(t){S.call(t.data)};l&&d||(l=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++y]=function(){a("function"==typeof t?t:Function(t),e)},r(y),y},d=function(t){delete v[t]},"process"==n(34)(h)?r=function(t){h.nextTick(o(S,t,1))}:g&&g.now?r=function(t){g.now(o(S,t,1))}:p?(i=new p,s=i.port2,i.port1.onmessage=b,r=o(s.postMessage,s,1)):f.addEventListener&&"function"==typeof postMessage&&!f.importScripts?(r=function(t){f.postMessage(t+"","*")},f.addEventListener("message",b,!1)):r=m in c("script")?function(t){u.appendChild(c("script"))[m]=function(){u.removeChild(this),S.call(t)}}:function(t){setTimeout(o(S,t,1),0)}),t.exports={set:l,clear:d}},function(t,e,n){var r=n(4),i=n(209).set,s=r.MutationObserver||r.WebKitMutationObserver,o=r.process,a=r.Promise,u="process"==n(34)(o);t.exports=function(){var t,e,n,c=function(){var r,i;for(u&&(r=o.domain)&&r.exit();t;){i=t.fn,t=t.next;try{i()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(u)n=function(){o.nextTick(c)};else if(!s||r.navigator&&r.navigator.standalone)if(a&&a.resolve){var f=a.resolve();n=function(){f.then(c)}}else n=function(){i.call(r,c)};else{var h=!0,l=document.createTextNode("");new s(c).observe(l,{characterData:!0}),n=function(){l.data=h=!h}}return function(r){var i={fn:r,next:void 0};e&&(e.next=i),t||(t=i,n()),e=i}}},function(t,e,n){"use strict";function r(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=i(e),this.reject=i(n)}var i=n(21);t.exports.f=function(t){return new r(t)}},function(t,e){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},function(t,e,n){var r=n(12),i=n(13),s=n(211);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=s.f(t),o=n.resolve;return o(e),n.promise}},function(t,e,n){var r=n(18);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(216),i=n(217),s="Map";t.exports=n(218)(s,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=r.getEntry(i(this,s),t);return e&&e.v},set:function(t,e){return r.def(i(this,s),0===t?0:t,e)}},r,!0)},function(t,e,n){"use strict";var r=n(11).f,i=n(45),s=n(214),o=n(20),a=n(206),u=n(207),c=n(128),f=n(195),h=n(193),l=n(6),d=n(22).fastKey,p=n(217),g=l?"_s":"size",y=function(t,e){var n,r=d(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};t.exports={getConstructor:function(t,e,n,c){var f=t(function(t,r){a(t,f,e,"_i"),t._t=e,t._i=i(null),t._f=void 0,t._l=void 0,t[g]=0,void 0!=r&&u(r,n,t[c],t)});return s(f.prototype,{clear:function(){for(var t=p(this,e),n=t._i,r=t._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete n[r.i];t._f=t._l=void 0,t[g]=0},delete:function(t){var n=p(this,e),r=y(n,t);if(r){var i=r.n,s=r.p;delete n._i[r.i],r.r=!0,s&&(s.n=i),i&&(i.p=s),n._f==r&&(n._f=i),n._l==r&&(n._l=s),n[g]--}return!!r},forEach:function(t){p(this,e);for(var n,r=o(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(r(n.v,n.k,this);n&&n.r;)n=n.p},has:function(t){return!!y(p(this,e),t)}}),l&&r(f.prototype,"size",{get:function(){return p(this,e)[g]}}),f},def:function(t,e,n){var r,i,s=y(t,e);return s?s.v=n:(t._l=s={i:i=d(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=s),r&&(r.n=s),t[g]++,"F"!==i&&(t._i[i]=s)),t},getEntry:y,setStrong:function(t,e,n){c(t,e,function(t,n){this._t=p(t,e),this._k=n,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?f(0,n.k):"values"==e?f(0,n.v):f(0,[n.k,n.v]):(t._t=void 0,f(1))},n?"entries":"values",!n,!0),h(e)}}},function(t,e,n){var r=n(13);t.exports=function(t,e){if(!r(t)||t._t!==e)throw TypeError("Incompatible receiver, "+e+" required!");return t}},function(t,e,n){"use strict";var r=n(4),i=n(8),s=n(18),o=n(214),a=n(22),u=n(207),c=n(206),f=n(13),h=n(7),l=n(166),d=n(24),p=n(87);t.exports=function(t,e,n,g,y,v){var m=r[t],S=m,b=y?"set":"add",w=S&&S.prototype,_={},x=function(t){var e=w[t];s(w,t,"delete"==t?function(t){return!(v&&!f(t))&&e.call(this,0===t?0:t)}:"has"==t?function(t){return!(v&&!f(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return v&&!f(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof S&&(v||w.forEach&&!h(function(){(new S).entries().next()}))){var E=new S,A=E[b](v?{}:-0,1)!=E,F=h(function(){E.has(1)}),P=l(function(t){new S(t)}),O=!v&&h(function(){for(var t=new S,e=5;e--;)t[b](e,e);return!t.has(-0)});P||(S=e(function(e,n){c(e,S,t);var r=p(new m,e,S);return void 0!=n&&u(n,y,r[b],r),r}),S.prototype=w,w.constructor=S),(F||O)&&(x("delete"),x("has"),y&&x("get")),(O||A)&&x(b),v&&w.clear&&delete w.clear}else S=g.getConstructor(e,t,y,b),o(S.prototype,n),a.NEED=!0;return d(S,t),_[t]=S,i(i.G+i.W+i.F*(S!=m),_),v||g.setStrong(S,t,y),S}},function(t,e,n){"use strict";var r=n(216),i=n(217),s="Set";t.exports=n(218)(s,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(i(this,s),t=0===t?0:t,t)}},r)},function(t,e,n){"use strict";var r,i=n(173)(0),s=n(18),o=n(22),a=n(68),u=n(221),c=n(13),f=n(7),h=n(217),l="WeakMap",d=o.getWeak,p=Object.isExtensible,g=u.ufstore,y={},v=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},m={get:function(t){if(c(t)){var e=d(t);return e===!0?g(h(this,l)).get(t):e?e[this._i]:void 0}},set:function(t,e){return u.def(h(this,l),t,e)}},S=t.exports=n(218)(l,v,m,u,!0,!0);f(function(){return 7!=(new S).set((Object.freeze||Object)(y),7).get(y)})&&(r=u.getConstructor(v,l),a(r.prototype,m),o.NEED=!0,i(["delete","has","get","set"],function(t){var e=S.prototype,n=e[t];s(e,t,function(e,i){if(c(e)&&!p(e)){this._f||(this._f=new r);var s=this._f[t](e,i);return"set"==t?this:s}return n.call(this,e,i)})}))},function(t,e,n){"use strict";var r=n(214),i=n(22).getWeak,s=n(12),o=n(13),a=n(206),u=n(207),c=n(173),f=n(5),h=n(217),l=c(5),d=c(6),p=0,g=function(t){return t._l||(t._l=new y)},y=function(){this.a=[]},v=function(t,e){return l(t.a,function(t){return t[0]===e})};y.prototype={get:function(t){var e=v(this,t);if(e)return e[1]},has:function(t){return!!v(this,t)},set:function(t,e){var n=v(this,t);n?n[1]=e:this.a.push([t,e])},delete:function(t){var e=d(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},t.exports={getConstructor:function(t,e,n,s){var c=t(function(t,r){a(t,c,e,"_i"),t._t=e,t._i=p++,t._l=void 0,void 0!=r&&u(r,n,t[s],t)});return r(c.prototype,{delete:function(t){if(!o(t))return!1;var n=i(t);return n===!0?g(h(this,e)).delete(t):n&&f(n,this._i)&&delete n[this._i]},has:function(t){if(!o(t))return!1;var n=i(t);return n===!0?g(h(this,e)).has(t):n&&f(n,this._i)}}),c},def:function(t,e,n){var r=i(s(e),!0);return r===!0?g(t).set(e,n):r[t._i]=n,t},ufstore:g}},function(t,e,n){"use strict";var r=n(221),i=n(217),s="WeakSet";n(218)(s,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(i(this,s),t,!0)}},r,!1,!0)},function(t,e,n){"use strict";var r=n(8),i=n(224),s=n(225),o=n(12),a=n(39),u=n(37),c=n(13),f=n(4).ArrayBuffer,h=n(208),l=s.ArrayBuffer,d=s.DataView,p=i.ABV&&f.isView,g=l.prototype.slice,y=i.VIEW,v="ArrayBuffer";r(r.G+r.W+r.F*(f!==l),{ArrayBuffer:l}),r(r.S+r.F*!i.CONSTR,v,{isView:function(t){return p&&p(t)||c(t)&&y in t}}),r(r.P+r.U+r.F*n(7)(function(){return!new l(2).slice(1,void 0).byteLength}),v,{slice:function(t,e){if(void 0!==g&&void 0===e)return g.call(o(this),t);for(var n=o(this).byteLength,r=a(t,n),i=a(void 0===e?n:e,n),s=new(h(this,l))(u(i-r)),c=new d(this),f=new d(s),p=0;r>1,f=23===e?L(2,-24)-L(2,-77):0,h=0,l=t<0||0===t&&1/t<0?1:0;for(t=V(t),t!=t||t===B?(i=t!=t?1:0,r=u):(r=K(U(t)/q),t*(s=L(2,-r))<1&&(r--,s*=2),t+=r+c>=1?f/s:f*L(2,1-c),t*s>=2&&(r++,s/=2),r+c>=u?(i=0,r=u):r+c>=1?(i=(t*s-1)*L(2,e),r+=c):(i=t*L(2,c-1)*L(2,e),r=0));e>=8;o[h++]=255&i,i/=256,e-=8);for(r=r<0;o[h++]=255&r,r/=256,a-=8);return o[--h]|=128*l,o}function i(t,e,n){var r,i=8*n-e-1,s=(1<>1,a=i-7,u=n-1,c=t[u--],f=127&c;for(c>>=7;a>0;f=256*f+t[u],u--,a-=8);for(r=f&(1<<-a)-1,f>>=-a,a+=e;a>0;r=256*r+t[u],u--,a-=8);if(0===f)f=1-o;else{if(f===s)return r?NaN:c?-B:B;r+=L(2,e),f-=o}return(c?-1:1)*r*L(2,f-e)}function s(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function o(t){return[255&t]}function a(t){return[255&t,t>>8&255]}function u(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function c(t){return r(t,52,8)}function f(t){return r(t,23,4)}function h(t,e,n){F(t[j],e,{get:function(){return this[n]}})}function l(t,e,n,r){var i=+n,s=E(i);if(s+e>t[G])throw N(R);var o=t[Y]._b,a=s+t[X],u=o.slice(a,a+e);return r?u:u.reverse()}function d(t,e,n,r,i,s){var o=+n,a=E(o);if(a+e>t[G])throw N(R);for(var u=t[Y]._b,c=a+t[X],f=r(+i),h=0;htt;)($=Z[tt++])in D||m(D,$,M[$]);y||(Q.constructor=D)}var et=new H(new D(2)),nt=H[j].setInt8;et.setInt8(0,2147483648),et.setInt8(1,2147483649),!et.getInt8(0)&&et.getInt8(1)||S(H[j],{setInt8:function(t,e){nt.call(this,t,e<<24>>24)},setUint8:function(t,e){nt.call(this,t,e<<24>>24)}},!0)}else D=function(t){w(this,D,C);var e=E(t);this._b=P.call(new Array(e),0),this[G]=e},H=function(t,e,n){w(this,H,T),w(t,D,T);var r=t[G],i=_(e);if(i<0||i>r)throw N("Wrong offset!");if(n=void 0===n?r-i:x(n),i+n>r)throw N(I);this[Y]=t,this[X]=i,this[G]=n},g&&(h(D,z,"_l"),h(H,W,"_b"),h(H,z,"_l"),h(H,J,"_o")),S(H[j],{getInt8:function(t){return l(this,1,t)[0]<<24>>24},getUint8:function(t){return l(this,1,t)[0]},getInt16:function(t){var e=l(this,2,t,arguments[1]);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=l(this,2,t,arguments[1]);return e[1]<<8|e[0]},getInt32:function(t){return s(l(this,4,t,arguments[1]))},getUint32:function(t){return s(l(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return i(l(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return i(l(this,8,t,arguments[1]),52,8)},setInt8:function(t,e){d(this,1,t,o,e)},setUint8:function(t,e){d(this,1,t,o,e)},setInt16:function(t,e){d(this,2,t,a,e,arguments[2])},setUint16:function(t,e){d(this,2,t,a,e,arguments[2])},setInt32:function(t,e){d(this,4,t,u,e,arguments[2])},setUint32:function(t,e){d(this,4,t,u,e,arguments[2])},setFloat32:function(t,e){d(this,4,t,f,e,arguments[2])},setFloat64:function(t,e){d(this,8,t,c,e,arguments[2])}});O(D,C),O(H,T),m(H[j],v.VIEW,!0),e[C]=D,e[T]=H},function(t,e,n){var r=n(38),i=n(37);t.exports=function(t){if(void 0===t)return 0;var e=r(t),n=i(e);if(e!==n)throw RangeError("Wrong length!");return n}},function(t,e,n){var r=n(8);r(r.G+r.W+r.F*!n(224).ABV,{DataView:n(225).DataView})},function(t,e,n){n(229)("Int8",1,function(t){return function(e,n,r){return t(this,e,n,r)}})},function(t,e,n){"use strict";if(n(6)){var r=n(28),i=n(4),s=n(7),o=n(8),a=n(224),u=n(225),c=n(20),f=n(206),h=n(17),l=n(10),d=n(214),p=n(38),g=n(37),y=n(226),v=n(39),m=n(16),S=n(5),b=n(74),w=n(13),_=n(57),x=n(163),E=n(45),A=n(58),F=n(49).f,P=n(165),O=n(19),C=n(25),T=n(173),j=n(36),I=n(208),R=n(194),D=n(129),H=n(166),k=n(193),N=n(189),B=n(186),M=n(11),V=n(50),L=M.f,K=V.f,U=i.RangeError,q=i.TypeError,W=i.Uint8Array,z="ArrayBuffer",J="Shared"+z,Y="BYTES_PER_ELEMENT",G="prototype",X=Array[G],$=u.ArrayBuffer,Q=u.DataView,Z=T(0),tt=T(2),et=T(3),nt=T(4),rt=T(5),it=T(6),st=j(!0),ot=j(!1),at=R.values,ut=R.keys,ct=R.entries,ft=X.lastIndexOf,ht=X.reduce,lt=X.reduceRight,dt=X.join,pt=X.sort,gt=X.slice,yt=X.toString,vt=X.toLocaleString,mt=C("iterator"),St=C("toStringTag"),bt=O("typed_constructor"),wt=O("def_constructor"),_t=a.CONSTR,xt=a.TYPED,Et=a.VIEW,At="Wrong length!",Ft=T(1,function(t,e){return jt(I(t,t[wt]),e)}),Pt=s(function(){return 1===new W(new Uint16Array([1]).buffer)[0]}),Ot=!!W&&!!W[G].set&&s(function(){new W(1).set({})}),Ct=function(t,e){var n=p(t);if(n<0||n%e)throw U("Wrong offset!");return n},Tt=function(t){if(w(t)&&xt in t)return t;throw q(t+" is not a typed array!")},jt=function(t,e){if(!(w(t)&&bt in t))throw q("It is not a typed array constructor!");return new t(e)},It=function(t,e){return Rt(I(t,t[wt]),e)},Rt=function(t,e){for(var n=0,r=e.length,i=jt(t,r);r>n;)i[n]=e[n++];return i},Dt=function(t,e,n){L(t,e,{get:function(){return this._d[n]}})},Ht=function(t){var e,n,r,i,s,o,a=_(t),u=arguments.length,f=u>1?arguments[1]:void 0,h=void 0!==f,l=P(a);if(void 0!=l&&!x(l)){for(o=l.call(a),r=[],e=0;!(s=o.next()).done;e++)r.push(s.value);a=r}for(h&&u>2&&(f=c(f,arguments[2],2)),e=0,n=g(a.length),i=jt(this,n);n>e;e++)i[e]=h?f(a[e],e):a[e];return i},kt=function(){for(var t=0,e=arguments.length,n=jt(this,e);e>t;)n[t]=arguments[t++];return n},Nt=!!W&&s(function(){vt.call(new W(1))}),Bt=function(){return vt.apply(Nt?gt.call(Tt(this)):Tt(this),arguments)},Mt={copyWithin:function(t,e){return B.call(Tt(this),t,e,arguments.length>2?arguments[2]:void 0)},every:function(t){return nt(Tt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return N.apply(Tt(this),arguments)},filter:function(t){return It(this,tt(Tt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return rt(Tt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return it(Tt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){Z(Tt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return ot(Tt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return st(Tt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return dt.apply(Tt(this),arguments)},lastIndexOf:function(t){return ft.apply(Tt(this),arguments)},map:function(t){return Ft(Tt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return ht.apply(Tt(this),arguments)},reduceRight:function(t){return lt.apply(Tt(this),arguments)},reverse:function(){for(var t,e=this,n=Tt(e).length,r=Math.floor(n/2),i=0;i1?arguments[1]:void 0)},sort:function(t){return pt.call(Tt(this),t)},subarray:function(t,e){var n=Tt(this),r=n.length,i=v(t,r);return new(I(n,n[wt]))(n.buffer,n.byteOffset+i*n.BYTES_PER_ELEMENT,g((void 0===e?r:v(e,r))-i))}},Vt=function(t,e){return It(this,gt.call(Tt(this),t,e))},Lt=function(t){Tt(this);var e=Ct(arguments[1],1),n=this.length,r=_(t),i=g(r.length),s=0;if(i+e>n)throw U(At);for(;s255?255:255&r),i.v[d](n*e+i.o,r,Pt)},C=function(t,e){L(t,e,{get:function(){return P(this,e)},set:function(t){return O(this,e,t)},enumerable:!0 -})};S?(p=n(function(t,n,r,i){f(t,p,c,"_d");var s,o,a,u,h=0,d=0;if(w(n)){if(!(n instanceof $||(u=b(n))==z||u==J))return xt in n?Rt(p,n):Ht.call(p,n);s=n,d=Ct(r,e);var v=n.byteLength;if(void 0===i){if(v%e)throw U(At);if(o=v-d,o<0)throw U(At)}else if(o=g(i)*e,o+d>v)throw U(At);a=o/e}else a=y(n),o=a*e,s=new $(o);for(l(t,"_d",{b:s,o:d,l:o,e:a,v:new Q(s)});h=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),r(r.S,"Reflect",{enumerate:function(t){return new s(t)}})},function(t,e,n){function r(t,e){var n,a,f=arguments.length<3?t:arguments[2];return c(t)===f?t[e]:(n=i.f(t,e))?o(n,"value")?n.value:void 0!==n.get?n.get.call(f):void 0:u(a=s(t))?r(a,e,f):void 0}var i=n(50),s=n(58),o=n(5),a=n(8),u=n(13),c=n(12);a(a.S,"Reflect",{get:r})},function(t,e,n){var r=n(50),i=n(8),s=n(12);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return r.f(s(t),e)}})},function(t,e,n){var r=n(8),i=n(58),s=n(12);r(r.S,"Reflect",{getPrototypeOf:function(t){return i(s(t))}})},function(t,e,n){var r=n(8);r(r.S,"Reflect",{has:function(t,e){return e in t}})},function(t,e,n){var r=n(8),i=n(12),s=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(t){return i(t),!s||s(t)}})},function(t,e,n){var r=n(8);r(r.S,"Reflect",{ownKeys:n(249)})},function(t,e,n){var r=n(49),i=n(42),s=n(12),o=n(4).Reflect;t.exports=o&&o.ownKeys||function(t){var e=r.f(s(t)),n=i.f;return n?e.concat(n(t)):e}},function(t,e,n){var r=n(8),i=n(12),s=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(t){i(t);try{return s&&s(t),!0}catch(t){return!1}}})},function(t,e,n){function r(t,e,n){var u,l,d=arguments.length<4?t:arguments[3],p=s.f(f(t),e);if(!p){if(h(l=o(t)))return r(l,e,n,d);p=c(0)}return a(p,"value")?!(p.writable===!1||!h(d))&&(u=s.f(d,e)||c(0),u.value=n,i.f(d,e,u),!0):void 0!==p.set&&(p.set.call(d,n),!0)}var i=n(11),s=n(50),o=n(58),a=n(5),u=n(8),c=n(17),f=n(12),h=n(13);u(u.S,"Reflect",{set:r})},function(t,e,n){var r=n(8),i=n(72);i&&r(r.S,"Reflect",{setPrototypeOf:function(t,e){i.check(t,e);try{return i.set(t,e),!0}catch(t){return!1}}})},function(t,e,n){"use strict";var r=n(8),i=n(36)(!0);r(r.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n(187)("includes")},function(t,e,n){"use strict";var r=n(8),i=n(255),s=n(57),o=n(37),a=n(21),u=n(174);r(r.P,"Array",{flatMap:function(t){var e,n,r=s(this);return a(t),e=o(r.length),n=u(r,0),i(n,r,r,e,0,1,t,arguments[1]),n}}),n(187)("flatMap")},function(t,e,n){"use strict";function r(t,e,n,c,f,h,l,d){for(var p,g,y=f,v=0,m=!!l&&a(l,d,3);v0)y=r(t,e,p,o(p.length),y,h-1)-1;else{if(y>=9007199254740991)throw TypeError();t[y]=p}y++}v++}return y}var i=n(44),s=n(13),o=n(37),a=n(20),u=n(25)("isConcatSpreadable");t.exports=r},function(t,e,n){"use strict";var r=n(8),i=n(255),s=n(57),o=n(37),a=n(38),u=n(174);r(r.P,"Array",{flatten:function(){var t=arguments[0],e=s(this),n=o(e.length),r=u(e,0);return i(r,e,e,n,0,void 0===t?1:a(t)),r}}),n(187)("flatten")},function(t,e,n){"use strict";var r=n(8),i=n(127)(!0);r(r.P,"String",{at:function(t){return i(this,t)}})},function(t,e,n){"use strict";var r=n(8),i=n(259),s=n(260);r(r.P+r.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(s),"String",{padStart:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},function(t,e,n){var r=n(37),i=n(90),s=n(35);t.exports=function(t,e,n,o){var a=String(s(t)),u=a.length,c=void 0===n?" ":String(n),f=r(e);if(f<=u||""==c)return a;var h=f-u,l=i.call(c,Math.ceil(h/c.length));return l.length>h&&(l=l.slice(0,h)),o?l+a:a+l}},function(t,e,n){var r=n(4),i=r.navigator;t.exports=i&&i.userAgent||""},function(t,e,n){"use strict";var r=n(8),i=n(259),s=n(260);r(r.P+r.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(s),"String",{padEnd:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},function(t,e,n){"use strict";n(82)("trimLeft",function(t){return function(){return t(this,1)}},"trimStart")},function(t,e,n){"use strict";n(82)("trimRight",function(t){return function(){return t(this,2)}},"trimEnd")},function(t,e,n){"use strict";var r=n(8),i=n(35),s=n(37),o=n(134),a=n(197),u=RegExp.prototype,c=function(t,e){this._r=t,this._s=e};n(130)(c,"RegExp String",function(){var t=this._r.exec(this._s);return{value:t,done:null===t}}),r(r.P,"String",{matchAll:function(t){if(i(this),!o(t))throw TypeError(t+" is not a regexp!");var e=String(this),n="flags"in u?String(t.flags):a.call(t),r=new RegExp(t.source,~n.indexOf("g")?n:"g"+n);return r.lastIndex=s(t.lastIndex),new c(r,e)}})},function(t,e,n){n(27)("asyncIterator")},function(t,e,n){n(27)("observable")},function(t,e,n){var r=n(8),i=n(249),s=n(32),o=n(50),a=n(164);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=s(t),u=o.f,c=i(r),f={},h=0;c.length>h;)n=u(r,e=c[h++]),void 0!==n&&a(f,e,n);return f}})},function(t,e,n){var r=n(8),i=n(269)(!1);r(r.S,"Object",{values:function(t){return i(t)}})},function(t,e,n){var r=n(30),i=n(32),s=n(43).f;t.exports=function(t){return function(e){for(var n,o=i(e),a=r(o),u=a.length,c=0,f=[];u>c;)s.call(o,n=a[c++])&&f.push(t?[n,o[n]]:o[n]);return f}}},function(t,e,n){var r=n(8),i=n(269)(!0);r(r.S,"Object",{entries:function(t){return i(t)}})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(21),o=n(11);n(6)&&r(r.P+n(272),"Object",{__defineGetter__:function(t,e){o.f(i(this),t,{get:s(e),enumerable:!0,configurable:!0})}})},function(t,e,n){"use strict";t.exports=n(28)||!n(7)(function(){var t=Math.random();__defineSetter__.call(null,t,function(){}),delete n(4)[t]})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(21),o=n(11);n(6)&&r(r.P+n(272),"Object",{__defineSetter__:function(t,e){o.f(i(this),t,{set:s(e),enumerable:!0,configurable:!0})}})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(16),o=n(58),a=n(50).f;n(6)&&r(r.P+n(272),"Object",{__lookupGetter__:function(t){var e,n=i(this),r=s(t,!0);do if(e=a(n,r))return e.get;while(n=o(n))}})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(16),o=n(58),a=n(50).f;n(6)&&r(r.P+n(272),"Object",{__lookupSetter__:function(t){var e,n=i(this),r=s(t,!0);do if(e=a(n,r))return e.set;while(n=o(n))}})},function(t,e,n){var r=n(8);r(r.P+r.R,"Map",{toJSON:n(277)("Map")})},function(t,e,n){var r=n(74),i=n(278);t.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");return i(this)}}},function(t,e,n){var r=n(207);t.exports=function(t,e){var n=[];return r(t,!1,n.push,n,e),n}},function(t,e,n){var r=n(8);r(r.P+r.R,"Set",{toJSON:n(277)("Set")})},function(t,e,n){n(281)("Map")},function(t,e,n){"use strict";var r=n(8);t.exports=function(t){r(r.S,t,{of:function(){for(var t=arguments.length,e=new Array(t);t--;)e[t]=arguments[t];return new this(e)}})}},function(t,e,n){n(281)("Set")},function(t,e,n){n(281)("WeakMap")},function(t,e,n){n(281)("WeakSet")},function(t,e,n){n(286)("Map")},function(t,e,n){"use strict";var r=n(8),i=n(21),s=n(20),o=n(207);t.exports=function(t){r(r.S,t,{from:function(t){var e,n,r,a,u=arguments[1];return i(this),e=void 0!==u,e&&i(u),void 0==t?new this:(n=[],e?(r=0,a=s(u,arguments[2],2),o(t,!1,function(t){n.push(a(t,r++))})):o(t,!1,n.push,n),new this(n))}})}},function(t,e,n){n(286)("Set")},function(t,e,n){n(286)("WeakMap")},function(t,e,n){n(286)("WeakSet")},function(t,e,n){var r=n(8);r(r.G,{global:n(4)})},function(t,e,n){var r=n(8);r(r.S,"System",{global:n(4)})},function(t,e,n){var r=n(8),i=n(34);r(r.S,"Error",{isError:function(t){return"Error"===i(t)}})},function(t,e,n){var r=n(8);r(r.S,"Math",{clamp:function(t,e,n){return Math.min(n,Math.max(e,t))}})},function(t,e,n){var r=n(8);r(r.S,"Math",{DEG_PER_RAD:Math.PI/180})},function(t,e,n){var r=n(8),i=180/Math.PI;r(r.S,"Math",{degrees:function(t){return t*i}})},function(t,e,n){var r=n(8),i=n(297),s=n(113);r(r.S,"Math",{fscale:function(t,e,n,r,o){return s(i(t,e,n,r,o))}})},function(t,e){t.exports=Math.scale||function(t,e,n,r,i){return 0===arguments.length||t!=t||e!=e||n!=n||r!=r||i!=i?NaN:t===1/0||t===-(1/0)?t:(t-e)*(i-r)/(n-e)+r}},function(t,e,n){var r=n(8);r(r.S,"Math",{iaddh:function(t,e,n,r){var i=t>>>0,s=e>>>0,o=n>>>0;return s+(r>>>0)+((i&o|(i|o)&~(i+o>>>0))>>>31)|0}})},function(t,e,n){var r=n(8);r(r.S,"Math",{isubh:function(t,e,n,r){var i=t>>>0,s=e>>>0,o=n>>>0;return s-(r>>>0)-((~i&o|~(i^o)&i-o>>>0)>>>31)|0}})},function(t,e,n){var r=n(8);r(r.S,"Math",{imulh:function(t,e){var n=65535,r=+t,i=+e,s=r&n,o=i&n,a=r>>16,u=i>>16,c=(a*o>>>0)+(s*o>>>16);return a*u+(c>>16)+((s*u>>>0)+(c&n)>>16)}})},function(t,e,n){var r=n(8);r(r.S,"Math",{RAD_PER_DEG:180/Math.PI})},function(t,e,n){var r=n(8),i=Math.PI/180;r(r.S,"Math",{radians:function(t){return t*i}})},function(t,e,n){var r=n(8);r(r.S,"Math",{scale:n(297)})},function(t,e,n){var r=n(8);r(r.S,"Math",{umulh:function(t,e){var n=65535,r=+t,i=+e,s=r&n,o=i&n,a=r>>>16,u=i>>>16,c=(a*o>>>0)+(s*o>>>16);return a*u+(c>>>16)+((s*u>>>0)+(c&n)>>>16)}})},function(t,e,n){var r=n(8);r(r.S,"Math",{signbit:function(t){return(t=+t)!=t?t:0==t?1/t==1/0:t>0}})},function(t,e,n){"use strict";var r=n(8),i=n(9),s=n(4),o=n(208),a=n(213);r(r.P+r.R,"Promise",{finally:function(t){var e=o(this,i.Promise||s.Promise),n="function"==typeof t;return this.then(n?function(n){return a(e,t()).then(function(){return n})}:t,n?function(n){return a(e,t()).then(function(){throw n})}:t)}})},function(t,e,n){"use strict";var r=n(8),i=n(211),s=n(212);r(r.S,"Promise",{try:function(t){var e=i.f(this),n=s(t);return(n.e?e.reject:e.resolve)(n.v),e.promise}})},function(t,e,n){var r=n(309),i=n(12),s=r.key,o=r.set;r.exp({defineMetadata:function(t,e,n,r){o(t,e,i(n),s(r))}})},function(t,e,n){var r=n(215),i=n(8),s=n(23)("metadata"),o=s.store||(s.store=new(n(220))),a=function(t,e,n){var i=o.get(t);if(!i){if(!n)return;o.set(t,i=new r)}var s=i.get(e);if(!s){if(!n)return;i.set(e,s=new r)}return s},u=function(t,e,n){var r=a(e,n,!1);return void 0!==r&&r.has(t)},c=function(t,e,n){var r=a(e,n,!1);return void 0===r?void 0:r.get(t)},f=function(t,e,n,r){a(n,r,!0).set(t,e)},h=function(t,e){var n=a(t,e,!1),r=[];return n&&n.forEach(function(t,e){r.push(e)}),r},l=function(t){return void 0===t||"symbol"==typeof t?t:String(t)},d=function(t){i(i.S,"Reflect",t)};t.exports={store:o,map:a,has:u,get:c,set:f,keys:h,key:l,exp:d}},function(t,e,n){var r=n(309),i=n(12),s=r.key,o=r.map,a=r.store;r.exp({deleteMetadata:function(t,e){var n=arguments.length<3?void 0:s(arguments[2]),r=o(i(e),n,!1);if(void 0===r||!r.delete(t))return!1;if(r.size)return!0;var u=a.get(e);return u.delete(n),!!u.size||a.delete(e)}})},function(t,e,n){var r=n(309),i=n(12),s=n(58),o=r.has,a=r.get,u=r.key,c=function(t,e,n){var r=o(t,e,n);if(r)return a(t,e,n);var i=s(e);return null!==i?c(t,i,n):void 0};r.exp({getMetadata:function(t,e){return c(t,i(e),arguments.length<3?void 0:u(arguments[2]))}})},function(t,e,n){var r=n(219),i=n(278),s=n(309),o=n(12),a=n(58),u=s.keys,c=s.key,f=function(t,e){var n=u(t,e),s=a(t);if(null===s)return n;var o=f(s,e);return o.length?n.length?i(new r(n.concat(o))):o:n};s.exp({getMetadataKeys:function(t){return f(o(t),arguments.length<2?void 0:c(arguments[1]))}})},function(t,e,n){var r=n(309),i=n(12),s=r.get,o=r.key;r.exp({getOwnMetadata:function(t,e){return s(t,i(e),arguments.length<3?void 0:o(arguments[2]))}})},function(t,e,n){var r=n(309),i=n(12),s=r.keys,o=r.key;r.exp({getOwnMetadataKeys:function(t){return s(i(t),arguments.length<2?void 0:o(arguments[1]))}})},function(t,e,n){var r=n(309),i=n(12),s=n(58),o=r.has,a=r.key,u=function(t,e,n){var r=o(t,e,n);if(r)return!0;var i=s(e);return null!==i&&u(t,i,n)};r.exp({hasMetadata:function(t,e){return u(t,i(e),arguments.length<3?void 0:a(arguments[2]))}})},function(t,e,n){var r=n(309),i=n(12),s=r.has,o=r.key;r.exp({hasOwnMetadata:function(t,e){return s(t,i(e),arguments.length<3?void 0:o(arguments[2]))}})},function(t,e,n){var r=n(309),i=n(12),s=n(21),o=r.key,a=r.set;r.exp({metadata:function(t,e){return function(n,r){a(t,e,(void 0!==r?i:s)(n),o(r))}}})},function(t,e,n){var r=n(8),i=n(210)(),s=n(4).process,o="process"==n(34)(s);r(r.G,{asap:function(t){var e=o&&s.domain;i(e?e.bind(t):t)}})},function(t,e,n){"use strict";var r=n(8),i=n(4),s=n(9),o=n(210)(),a=n(25)("observable"),u=n(21),c=n(12),f=n(206),h=n(214),l=n(10),d=n(207),p=d.RETURN,g=function(t){return null==t?void 0:u(t)},y=function(t){var e=t._c;e&&(t._c=void 0,e())},v=function(t){return void 0===t._o},m=function(t){v(t)||(t._o=void 0,y(t))},S=function(t,e){c(t),this._c=void 0,this._o=t,t=new b(this);try{var n=e(t),r=n;null!=n&&("function"==typeof n.unsubscribe?n=function(){r.unsubscribe()}:u(n),this._c=n)}catch(e){return void t.error(e)}v(this)&&y(this)};S.prototype=h({},{unsubscribe:function(){m(this)}});var b=function(t){this._s=t};b.prototype=h({},{next:function(t){var e=this._s;if(!v(e)){var n=e._o;try{var r=g(n.next);if(r)return r.call(n,t)}catch(t){try{m(e)}finally{throw t}}}},error:function(t){var e=this._s;if(v(e))throw t;var n=e._o;e._o=void 0;try{var r=g(n.error);if(!r)throw t;t=r.call(n,t)}catch(t){try{y(e)}finally{throw t}}return y(e),t},complete:function(t){var e=this._s;if(!v(e)){var n=e._o;e._o=void 0;try{var r=g(n.complete);t=r?r.call(n,t):void 0}catch(t){try{y(e)}finally{throw t}}return y(e),t}}});var w=function(t){f(this,w,"Observable","_f")._f=u(t)};h(w.prototype,{subscribe:function(t){return new S(t,this._f)},forEach:function(t){var e=this;return new(s.Promise||i.Promise)(function(n,r){u(t);var i=e.subscribe({next:function(e){try{return t(e)}catch(t){r(t),i.unsubscribe()}},error:r,complete:n})})}}),h(w,{from:function(t){var e="function"==typeof this?this:w,n=g(c(t)[a]);if(n){var r=c(n.call(t));return r.constructor===e?r:new e(function(t){return r.subscribe(t)})}return new e(function(e){var n=!1;return o(function(){if(!n){try{if(d(t,!1,function(t){if(e.next(t),n)return p})===p)return}catch(t){if(n)throw t;return void e.error(t)}e.complete()}}),function(){n=!0}})},of:function(){for(var t=0,e=arguments.length,n=new Array(e);t2,i=!!r&&o.call(arguments,2);return t(r?function(){("function"==typeof e?e:Function(e)).apply(this,i)}:e,n)}};i(i.G+i.B+i.F*a,{setTimeout:u(r.setTimeout),setInterval:u(r.setInterval)})},function(t,e,n){var r=n(8),i=n(209);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,e,n){for(var r=n(194),i=n(30),s=n(18),o=n(4),a=n(10),u=n(129),c=n(25),f=c("iterator"),h=c("toStringTag"),l=u.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},p=i(d),g=0;g=0;--r){var i=this.tryEntries[r],s=i.completion;if("root"===i.tryLoc)return e("end");if(i.tryLoc<=this.prev){var o=m.call(i,"catchLoc"),a=m.call(i,"finallyLoc");if(o&&a){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&m.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),l(n),C}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;l(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:p(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=y),C}}}("object"==typeof e?e:"object"==typeof window?window:"object"==typeof self?self:this)}).call(e,function(){return this}())},function(t,e,n){n(325),t.exports=n(9).RegExp.escape},function(t,e,n){var r=n(8),i=n(326)(/[\\^$*+?.()|[\]{}]/g,"\\$&");r(r.S,"RegExp",{escape:function(t){return i(t)}})},function(t,e){t.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return String(e).replace(t,n)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=e.Log=n(328),i=e.OidcClient=n(329),s=e.OidcClientSettings=n(330),o=e.WebStorageStateStore=n(331),a=e.InMemoryWebStorage=n(353),u=e.UserManager=n(354),c=e.AccessTokenEvents=n(363),f=e.MetadataService=n(334),h=e.CordovaPopupNavigator=n(370),l=e.CordovaIFrameNavigator=n(372),d=e.CheckSessionIFrame=n(368),p=e.TokenRevocationClient=n(369),g=e.SessionMonitor=n(367),y=e.Global=n(332),v=e.User=n(361);e.default={Log:r,OidcClient:i,OidcClientSettings:s,WebStorageStateStore:o,InMemoryWebStorage:a,UserManager:u,AccessTokenEvents:c,MetadataService:f,CordovaPopupNavigator:h,CordovaIFrameNavigator:l,CheckSessionIFrame:d,TokenRevocationClient:p,SessionMonitor:g,Global:y,User:v}},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n=c){for(var t=arguments.length,e=Array(t),n=0;n=u){for(var t=arguments.length,e=Array(t),n=0;n=a){for(var t=arguments.length,e=Array(t),n=0;n=o){for(var t=arguments.length,e=Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),e instanceof c.default?this._settings=e:this._settings=new c.default(e)}return t.prototype.createSigninRequest=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.response_type,r=e.scope,i=e.redirect_uri,s=e.data,o=e.state,u=e.prompt,c=e.display,f=e.max_age,h=e.ui_locales,l=e.id_token_hint,p=e.login_hint,g=e.acr_values,y=e.resource,v=e.request,m=e.request_uri,S=e.extraQueryParams,b=arguments[1];a.default.debug("OidcClient.createSigninRequest");var w=this._settings.client_id;n=n||this._settings.response_type,r=r||this._settings.scope,i=i||this._settings.redirect_uri,u=u||this._settings.prompt,c=c||this._settings.display,f=f||this._settings.max_age,h=h||this._settings.ui_locales,g=g||this._settings.acr_values,y=y||this._settings.resource,S=S||this._settings.extraQueryParams;var _=this._settings.authority;return this._metadataService.getAuthorizationEndpoint().then(function(e){a.default.debug("Received authorization endpoint",e);var x=new d.default({url:e,client_id:w,redirect_uri:i,response_type:n,scope:r,data:s||o,authority:_,prompt:u,display:c,max_age:f,ui_locales:h,id_token_hint:l,login_hint:p,acr_values:g,resource:y,request:v,request_uri:m,extraQueryParams:S}),E=x.state;return b=b||t._stateStore,b.set(E.id,E.toStorageString()).then(function(){return x})})},t.prototype.processSigninResponse=function(t,e){var n=this;a.default.debug("OidcClient.processSigninResponse");var r=new g.default(t);return r.state?(e=e||this._stateStore,e.remove(r.state).then(function(t){if(!t)throw a.default.error("No matching state found in storage"),new Error("No matching state found in storage");var e=w.default.fromStorageString(t);return a.default.debug("Received state from storage; validating response"),n._validator.validateSigninResponse(e,r)})):(a.default.error("No state in response"),Promise.reject(new Error("No state in response")))},t.prototype.createSignoutRequest=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.id_token_hint,r=e.data,i=e.state,s=e.post_logout_redirect_uri,o=arguments[1];return a.default.debug("OidcClient.createSignoutRequest"),s=s||this._settings.post_logout_redirect_uri,this._metadataService.getEndSessionEndpoint().then(function(e){if(!e)throw a.default.error("No end session endpoint url returned"),new Error("no end session endpoint");a.default.debug("Received end session endpoint",e);var u=new v.default({url:e,id_token_hint:n,post_logout_redirect_uri:s,data:r||i}),c=u.state;return c&&(a.default.debug("Signout request has state to persist"),o=o||t._stateStore,o.set(c.id,c.toStorageString())),u})},t.prototype.processSignoutResponse=function(t,e){var n=this;a.default.debug("OidcClient.processSignoutResponse");var r=new S.default(t);if(!r.state)return a.default.debug("No state in response"),r.error?(a.default.warn("Response was error",r.error),Promise.reject(new h.default(r))):Promise.resolve(r);var i=r.state;return e=e||this._stateStore,e.remove(i).then(function(t){if(!t)throw a.default.error("No matching state found in storage"),new Error("No matching state found in storage");var e=x.default.fromStorageString(t);return a.default.debug("Received state from storage; validating response"),n._validator.validateSignoutResponse(e,r)})},t.prototype.clearStaleState=function(t){return a.default.debug("OidcClient.clearStaleState"),t=t||this._stateStore, -x.default.clearStaleState(t,this.settings.staleStateAge)},s(t,[{key:"_stateStore",get:function(){return this.settings.stateStore}},{key:"_validator",get:function(){return this.settings.validator}},{key:"_metadataService",get:function(){return this.settings.metadataService}},{key:"settings",get:function(){return this._settings}},{key:"metadataService",get:function(){return this._metadataService}}]),t}();e.default=E,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=e.authority,r=e.metadataUrl,o=e.metadata,a=e.signingKeys,u=e.client_id,c=e.client_secret,h=e.response_type,d=void 0===h?y:h,g=e.scope,b=void 0===g?v:g,w=e.redirect_uri,_=e.post_logout_redirect_uri,x=e.prompt,E=e.display,A=e.max_age,F=e.ui_locales,P=e.acr_values,O=e.resource,C=e.filterProtocolClaims,T=void 0===C||C,j=e.loadUserInfo,I=void 0===j||j,R=e.staleStateAge,D=void 0===R?m:R,H=e.clockSkew,k=void 0===H?S:H,N=e.stateStore,B=void 0===N?new f.default:N,M=e.ResponseValidatorCtor,V=void 0===M?l.default:M,L=e.MetadataServiceCtor,K=void 0===L?p.default:L,U=e.extraQueryParams,q=void 0===U?{}:U;i(this,t),this._authority=n,this._metadataUrl=r,this._metadata=o,this._signingKeys=a,this._client_id=u,this._client_secret=c,this._response_type=d,this._scope=b,this._redirect_uri=w,this._post_logout_redirect_uri=_,this._prompt=x,this._display=E,this._max_age=A,this._ui_locales=F,this._acr_values=P,this._resource=O,this._filterProtocolClaims=!!T,this._loadUserInfo=!!I,this._staleStateAge=D,this._clockSkew=k,this._stateStore=B,this._validator=new V(this),this._metadataService=new K(this),this._extraQueryParams="object"===("undefined"==typeof q?"undefined":s(q))?q:{}}return o(t,[{key:"client_id",get:function(){return this._client_id},set:function(t){if(this._client_id)throw u.default.error("client_id has already been assigned."),new Error("client_id has already been assigned.");this._client_id=t}},{key:"client_secret",get:function(){return this._client_secret}},{key:"response_type",get:function(){return this._response_type}},{key:"scope",get:function(){return this._scope}},{key:"redirect_uri",get:function(){return this._redirect_uri}},{key:"post_logout_redirect_uri",get:function(){return this._post_logout_redirect_uri}},{key:"prompt",get:function(){return this._prompt}},{key:"display",get:function(){return this._display}},{key:"max_age",get:function(){return this._max_age}},{key:"ui_locales",get:function(){return this._ui_locales}},{key:"acr_values",get:function(){return this._acr_values}},{key:"resource",get:function(){return this._resource}},{key:"authority",get:function(){return this._authority},set:function(t){if(this._authority)throw u.default.error("authority has already been assigned."),new Error("authority has already been assigned.");this._authority=t}},{key:"metadataUrl",get:function(){return this._metadataUrl||(this._metadataUrl=this.authority,this._metadataUrl&&this._metadataUrl.indexOf(g)<0&&("/"!==this._metadataUrl[this._metadataUrl.length-1]&&(this._metadataUrl+="/"),this._metadataUrl+=g)),this._metadataUrl}},{key:"metadata",get:function(){return this._metadata},set:function(t){this._metadata=t}},{key:"signingKeys",get:function(){return this._signingKeys},set:function(t){this._signingKeys=t}},{key:"filterProtocolClaims",get:function(){return this._filterProtocolClaims}},{key:"loadUserInfo",get:function(){return this._loadUserInfo}},{key:"staleStateAge",get:function(){return this._staleStateAge}},{key:"clockSkew",get:function(){return this._clockSkew}},{key:"stateStore",get:function(){return this._stateStore}},{key:"validator",get:function(){return this._validator}},{key:"metadataService",get:function(){return this._metadataService}},{key:"extraQueryParams",get:function(){return this._extraQueryParams},set:function(t){"object"===("undefined"==typeof t?"undefined":s(t))?this._extraQueryParams=t:this._extraQueryParams={}}}]),t}();e.default=b,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=r(s),a=n(332),u=r(a),c=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.prefix,r=void 0===n?"oidc.":n,s=e.store,o=void 0===s?u.default.localStorage:s;i(this,t),this._store=o,this._prefix=r}return t.prototype.set=function(t,e){return o.default.debug("WebStorageStateStore.set",t),t=this._prefix+t,this._store.setItem(t,e),Promise.resolve()},t.prototype.get=function(t){o.default.debug("WebStorageStateStore.get",t),t=this._prefix+t;var e=this._store.getItem(t);return Promise.resolve(e)},t.prototype.remove=function(t){o.default.debug("WebStorageStateStore.remove",t),t=this._prefix+t;var e=this._store.getItem(t);return this._store.removeItem(t),Promise.resolve(e)},t.prototype.getAllKeys=function(){o.default.debug("WebStorageStateStore.getAllKeys");for(var t=[],e=0;e1&&void 0!==arguments[1]?arguments[1]:u.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:f.default,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:p.default;if(i(this,t),!e)throw o.default.error("No settings passed to ResponseValidator"),new Error("settings");this._settings=e,this._metadataService=new n(this._settings),this._userInfoService=new r(this._settings),this._joseUtil=s}return t.prototype.validateSigninResponse=function(t,e){var n=this;return o.default.debug("ResponseValidator.validateSigninResponse"),this._processSigninParams(t,e).then(function(e){return o.default.debug("state processed"),n._validateTokens(t,e).then(function(t){return o.default.debug("tokens validated"),n._processClaims(t).then(function(t){return o.default.debug("claims processed"),t})})})},t.prototype.validateSignoutResponse=function(t,e){return o.default.debug("ResponseValidator.validateSignoutResponse"),t.id!==e.state?(o.default.error("State does not match"),Promise.reject(new Error("State does not match"))):(o.default.debug("state validated"),e.state=t.data,e.error?(o.default.warn("Response was error",e.error),Promise.reject(new l.default(e))):Promise.resolve(e))},t.prototype._processSigninParams=function(t,e){if(o.default.debug("ResponseValidator._processSigninParams"),t.id!==e.state)return o.default.error("State does not match"),Promise.reject(new Error("State does not match"));if(!t.client_id)return o.default.error("No client_id on state"),Promise.reject(new Error("No client_id on state"));if(!t.authority)return o.default.error("No authority on state"),Promise.reject(new Error("No authority on state"));if(this._settings.authority){if(this._settings.authority&&this._settings.authority!==t.authority)return o.default.error("authority mismatch on settings vs. signin state"),Promise.reject(new Error("authority mismatch on settings vs. signin state"))}else this._settings.authority=t.authority;if(this._settings.client_id){if(this._settings.client_id&&this._settings.client_id!==t.client_id)return o.default.error("client_id mismatch on settings vs. signin state"),Promise.reject(new Error("client_id mismatch on settings vs. signin state"))}else this._settings.client_id=t.client_id;return o.default.debug("state validated"),e.state=t.data,e.error?(o.default.warn("Response was error",e.error),Promise.reject(new l.default(e))):t.nonce&&!e.id_token?(o.default.error("Expecting id_token in response"),Promise.reject(new Error("No id_token in response"))):!t.nonce&&e.id_token?(o.default.error("Not expecting id_token in response"),Promise.reject(new Error("Unexpected id_token in response"))):Promise.resolve(e)},t.prototype._processClaims=function(t){var e=this;if(o.default.debug("ResponseValidator._processClaims"),t.isOpenIdConnect){if(o.default.debug("response is OIDC, processing claims"),t.profile=this._filterProtocolClaims(t.profile),this._settings.loadUserInfo&&t.access_token)return o.default.debug("loading user info"),this._userInfoService.getClaims(t.access_token).then(function(n){return o.default.debug("user info claims received from user info endpoint"),n.sub!==t.profile.sub?(o.default.error("sub from user info endpoint does not match sub in access_token"),Promise.reject(new Error("sub from user info endpoint does not match sub in access_token"))):(t.profile=e._mergeClaims(t.profile,n),o.default.debug("user info claims received, updated profile:",t.profile),t)});o.default.debug("not loading user info")}else o.default.debug("response is not OIDC, not processing claims");return Promise.resolve(t)},t.prototype._mergeClaims=function(t,e){var n=Object.assign({},t);for(var r in e){var i=e[r];Array.isArray(i)||(i=[i]);var s=!0,o=!1,a=void 0;try{for(var u,c=i[Symbol.iterator]();!(s=(u=c.next()).done);s=!0){var f=u.value;n[r]?Array.isArray(n[r])?n[r].indexOf(f)<0&&n[r].push(f):n[r]!==f&&(n[r]=[n[r],f]):n[r]=f}}catch(t){o=!0,a=t}finally{try{!s&&c.return&&c.return()}finally{if(o)throw a}}}return n},t.prototype._filterProtocolClaims=function(t){o.default.debug("ResponseValidator._filterProtocolClaims, incoming claims:",t);var e=Object.assign({},t);return this._settings._filterProtocolClaims?(g.forEach(function(t){delete e[t]}),o.default.debug("protocol claims filtered",e)):o.default.debug("protocol claims not filtered"),e},t.prototype._validateTokens=function(t,e){return o.default.debug("ResponseValidator._validateTokens"),e.id_token?e.access_token?(o.default.debug("Validating id_token and access_token"),this._validateIdTokenAndAccessToken(t,e)):(o.default.debug("Validating id_token"),this._validateIdToken(t,e)):(o.default.debug("No id_token to validate"),Promise.resolve(e))},t.prototype._validateIdTokenAndAccessToken=function(t,e){var n=this;return o.default.debug("ResponseValidator._validateIdTokenAndAccessToken"),this._validateIdToken(t,e).then(function(t){return n._validateAccessToken(t)})},t.prototype._validateIdToken=function(t,e){var n=this;if(o.default.debug("ResponseValidator._validateIdToken"),!t.nonce)return o.default.error("No nonce on state"),Promise.reject(new Error("No nonce on state"));var r=this._joseUtil.parseJwt(e.id_token);if(!r||!r.header||!r.payload)return o.default.error("Failed to parse id_token",r),Promise.reject(new Error("Failed to parse id_token"));if(t.nonce!==r.payload.nonce)return o.default.error("Invalid nonce in id_token"),Promise.reject(new Error("Invalid nonce in id_token"));var i=r.header.kid;return this._metadataService.getIssuer().then(function(s){return o.default.debug("Received issuer"),n._metadataService.getSigningKeys().then(function(a){if(!a)return o.default.error("No signing keys from metadata"),Promise.reject(new Error("No signing keys from metadata"));o.default.debug("Received signing keys");var u=void 0;if(i)u=a.filter(function(t){return t.kid===i})[0];else{if(a=n._filterByAlg(a,r.header.alg),a.length>1)return o.default.error("No kid found in id_token and more than one key found in metadata"),Promise.reject(new Error("No kid found in id_token and more than one key found in metadata"));u=a[0]}if(!u)return o.default.error("No key matching kid or alg found in signing keys"),Promise.reject(new Error("No key matching kid or alg found in signing keys"));var c=t.client_id,f=n._settings.clockSkew;return o.default.debug("Validaing JWT; using clock skew (in seconds) of: ",f),n._joseUtil.validateJwt(e.id_token,u,s,c,f).then(function(){return o.default.debug("JWT validation successful"),r.payload.sub?(e.profile=r.payload,e):(o.default.error("No sub present in id_token"),Promise.reject(new Error("No sub present in id_token")))})})})},t.prototype._filterByAlg=function(t,e){o.default.debug("ResponseValidator._filterByAlg",e);var n=null;if(e.startsWith("RS"))n="RSA";else if(e.startsWith("PS"))n="PS";else{if(!e.startsWith("ES"))return o.default.debug("alg not supported: ",e),[];n="EC"}return o.default.debug("Looking for keys that match kty: ",n),t=t.filter(function(t){return t.kty===n}),o.default.debug("Number of keys that match kty: ",n,t.length),t},t.prototype._validateAccessToken=function(t){if(o.default.debug("ResponseValidator._validateAccessToken"),!t.profile)return o.default.error("No profile loaded from id_token"),Promise.reject(new Error("No profile loaded from id_token"));if(!t.profile.at_hash)return o.default.error("No at_hash in id_token"),Promise.reject(new Error("No at_hash in id_token"));if(!t.id_token)return o.default.error("No id_token"),Promise.reject(new Error("No id_token"));var e=this._joseUtil.parseJwt(t.id_token);if(!e||!e.header)return o.default.error("Failed to parse id_token",e),Promise.reject(new Error("Failed to parse id_token"));var n=e.header.alg;if(!n||5!==n.length)return o.default.error("Unsupported alg:",n),Promise.reject(new Error("Unsupported alg: "+n));var r=n.substr(2,3);if(!r)return o.default.error("Unsupported alg:",n,r),Promise.reject(new Error("Unsupported alg: "+n));if(r=parseInt(r),256!==r&&384!==r&&512!==r)return o.default.error("Unsupported alg:",n,r),Promise.reject(new Error("Unsupported alg: "+n));var i="sha"+r,s=this._joseUtil.hashString(t.access_token,i);if(!s)return o.default.error("access_token hash failed:",i),Promise.reject(new Error("Failed to validate at_hash"));var a=s.substr(0,s.length/2),u=this._joseUtil.hexToBase64Url(a);return u!==t.profile.at_hash?(o.default.error("Failed to validate at_hash",u,t.profile.at_hash),Promise.reject(new Error("Failed to validate at_hash"))):Promise.resolve(t)},t}();e.default=y,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:c.default;if(i(this,t),!e)throw a.default.error("No settings passed to MetadataService"),new Error("settings");this._settings=e,this._jsonService=new n}return t.prototype.getMetadata=function(){var t=this;return a.default.debug("MetadataService.getMetadata"),this._settings.metadata?(a.default.debug("Returning metadata from settings"),Promise.resolve(this._settings.metadata)):this.metadataUrl?(a.default.debug("getting metadata from",this.metadataUrl),this._jsonService.getJson(this.metadataUrl).then(function(e){return a.default.debug("json received"),t._settings.metadata=e,e})):(a.default.error("No authority or metadataUrl configured on settings"),Promise.reject(new Error("No authority or metadataUrl configured on settings")))},t.prototype.getIssuer=function(){return a.default.debug("MetadataService.getIssuer"),this._getMetadataProperty("issuer")},t.prototype.getAuthorizationEndpoint=function(){return a.default.debug("MetadataService.getAuthorizationEndpoint"),this._getMetadataProperty("authorization_endpoint")},t.prototype.getUserInfoEndpoint=function(){return a.default.debug("MetadataService.getUserInfoEndpoint"),this._getMetadataProperty("userinfo_endpoint")},t.prototype.getTokenEndpoint=function(){return a.default.debug("MetadataService.getTokenEndpoint"),this._getMetadataProperty("token_endpoint",!0)},t.prototype.getCheckSessionIframe=function(){return a.default.debug("MetadataService.getCheckSessionIframe"),this._getMetadataProperty("check_session_iframe",!0)},t.prototype.getEndSessionEndpoint=function(){return a.default.debug("MetadataService.getEndSessionEndpoint"),this._getMetadataProperty("end_session_endpoint",!0)},t.prototype.getRevocationEndpoint=function(){return a.default.debug("MetadataService.getRevocationEndpoint"),this._getMetadataProperty("revocation_endpoint",!0)},t.prototype._getMetadataProperty=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return a.default.debug("MetadataService._getMetadataProperty",t),this.getMetadata().then(function(n){if(a.default.debug("metadata recieved"),void 0===n[t]){if(e===!0)return void a.default.warn("Metadata does not contain optional property "+t);throw a.default.error("Metadata does not contain property "+t),new Error("Metadata does not contain property "+t)}return n[t]})},t.prototype.getSigningKeys=function(){var t=this;return a.default.debug("MetadataService.getSigningKeys"),this._settings.signingKeys?(a.default.debug("Returning signingKeys from settings"),Promise.resolve(this._settings.signingKeys)):this._getMetadataProperty("jwks_uri").then(function(e){return a.default.debug("jwks_uri received",e),t._jsonService.getJson(e).then(function(e){if(a.default.debug("key set received",e),!e.keys)throw a.default.error("Missing keys on keyset"),new Error("Missing keys on keyset");return t._settings.signingKeys=e.keys,t._settings.signingKeys})})},s(t,[{key:"metadataUrl",get:function(){return this._metadataUrl||(this._settings.metadataUrl?this._metadataUrl=this._settings.metadataUrl:(this._metadataUrl=this._settings.authority,this._metadataUrl&&this._metadataUrl.indexOf(f)<0&&("/"!==this._metadataUrl[this._metadataUrl.length-1]&&(this._metadataUrl+="/"),this._metadataUrl+=f))),this._metadataUrl}}]),t}();e.default=h,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=r(s),a=n(332),u=r(a),c=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:u.default.XMLHttpRequest;i(this,t),this._XMLHttpRequest=e}return t.prototype.getJson=function(t,e){var n=this;if(o.default.debug("JsonService.getJson",t),!t)throw o.default.error("No url passed"),new Error("url");return new Promise(function(r,i){var s=new n._XMLHttpRequest;s.open("GET",t),s.onload=function(){if(o.default.debug("HTTP response received, status",s.status),200===s.status)try{r(JSON.parse(s.responseText))}catch(t){o.default.error("Error parsing JSON response",t.message),i(t)}else i(Error(s.statusText+" ("+s.status+")"))},s.onerror=function(){o.default.error("network error"),i(Error("Network Error"))},e&&(o.default.debug("token passed, setting Authorization header"),s.setRequestHeader("Authorization","Bearer "+e)),s.send()})},t}();e.default=c,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(335),o=r(s),a=n(334),u=r(a),c=n(328),f=r(c),h=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;if(i(this,t),!e)throw f.default.error("No settings passed to UserInfoService"),new Error("settings");this._settings=e,this._jsonService=new n,this._metadataService=new r(this._settings)}return t.prototype.getClaims=function(t){var e=this;return f.default.debug("UserInfoService.getClaims"),t?this._metadataService.getUserInfoEndpoint().then(function(n){return f.default.debug("received userinfo url",n),e._jsonService.getJson(n,t).then(function(t){return f.default.debug("claims received",t),t})}):(f.default.error("No token passed"),Promise.reject(new Error("A token is required")))},t}();e.default=h,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=n(328),u=r(a),c=function(t){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.error,o=n.error_description,a=n.error_uri,c=n.state;if(i(this,e),!r)throw u.default.error("No error passed to ErrorResponse"),new Error("error");var f=s(this,t.call(this,o||r));return f.name="ErrorResponse",f.error=r,f.error_description=o,f.error_uri=a,f.state=c,f}return o(e,t),e}(Error);e.default=c,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(339),o=n(328),a=r(o),u=["RS256","RS384","RS512","PS256","PS384","PS512","ES256","ES384","ES512"],c=function(){function t(){i(this,t)}return t.parseJwt=function(t){a.default.debug("JoseUtil.parseJwt");try{var e=s.jws.JWS.parse(t);return{header:e.headerObj,payload:e.payloadObj}}catch(t){a.default.error(t)}},t.validateJwt=function(e,n,r,i,o,u){a.default.debug("JoseUtil.validateJwt");try{if("RSA"===n.kty)if(n.e&&n.n)n=s.KEYUTIL.getKey(n);else{if(!n.x5c||!n.x5c.length)return a.default.error("RSA key missing key material",n),Promise.reject(new Error("RSA key missing key material"));n=s.KEYUTIL.getKey(s.X509.getPublicKeyFromCertPEM(n.x5c[0]))}else{if("EC"!==n.kty)return a.default.error("Unsupported key type",n&&n.kty),Promise.reject(new Error("Unsupported key type: "+n&&n.kty));if(!(n.crv&&n.x&&n.y))return a.default.error("EC key missing key material",n),Promise.reject(new Error("EC key missing key material"));n=s.KEYUTIL.getKey(n)}return t._validateJwt(e,n,r,i,o,u)}catch(t){return a.default.error(t&&t.message||t),Promise.reject("JWT validation failed")}},t._validateJwt=function(e,n,r,i,o,c){a.default.debug("JoseUtil._validateJwt"),o||(o=0),c||(c=parseInt(Date.now()/1e3));var f=t.parseJwt(e).payload;if(!f.iss)return a.default.error("issuer was not provided"),Promise.reject(new Error("issuer was not provided"));if(f.iss!==r)return a.default.error("Invalid issuer in token",f.iss),Promise.reject(new Error("Invalid issuer in token: "+f.iss));if(!f.aud)return a.default.error("aud was not provided"),Promise.reject(new Error("aud was not provided"));var h=f.aud===i||Array.isArray(f.aud)&&f.aud.indexOf(i)>=0;if(!h)return a.default.error("Invalid audience in token",f.aud),Promise.reject(new Error("Invalid audience in token: "+f.aud));var l=c+o,d=c-o;if(!f.iat)return a.default.error("iat was not provided"),Promise.reject(new Error("iat was not provided"));if(l>6)+ur.charAt(63&n);if(e+1==t.length?(n=parseInt(t.substring(e,e+1),16),r+=ur.charAt(n<<2)):e+2==t.length&&(n=parseInt(t.substring(e,e+2),16),r+=ur.charAt(n>>2)+ur.charAt((3&n)<<4)),cr)for(;(3&r.length)>0;)r+=cr;return r}function i(t){var e,n,r,i="",s=0;for(e=0;e>2),n=3&r,s=1):1==s?(i+=h(n<<2|r>>4),n=15&r,s=2):2==s?(i+=h(n),i+=h(r>>2),n=3&r,s=3):(i+=h(n<<2|r>>4),i+=h(15&r),s=0));return 1==s&&(i+=h(n<<2)),i}function s(t){var e,n=i(t),r=new Array;for(e=0;2*e=0;){var o=e*this[t++]+n[r]+i;i=Math.floor(o/67108864),n[r++]=67108863&o}return i}function c(t,e,n,r,i,s){for(var o=32767&e,a=e>>15;--s>=0;){var u=32767&this[t],c=this[t++]>>15,f=a*u+c*o;u=o*u+((32767&f)<<15)+n[r]+(1073741823&i),i=(u>>>30)+(f>>>15)+a*c+(i>>>30),n[r++]=1073741823&u}return i}function f(t,e,n,r,i,s){for(var o=16383&e,a=e>>14;--s>=0;){var u=16383&this[t],c=this[t++]>>14,f=a*u+c*o;u=o*u+((16383&f)<<14)+n[r]+i,i=(u>>28)+(f>>14)+a*c,n[r++]=268435455&u}return i}function h(t){return gr.charAt(t)}function l(t,e){var n=yr[t.charCodeAt(e)];return null==n?-1:n}function d(t){for(var e=this.t-1;e>=0;--e)t[e]=this[e];t.t=this.t,t.s=this.s}function p(t){this.t=1,this.s=t<0?-1:0,t>0?this[0]=t:t<-1?this[0]=t+this.DV:this.t=0}function g(t){var e=a();return e.fromInt(t),e}function y(t,e){var n;if(16==e)n=4;else if(8==e)n=3;else if(256==e)n=8;else if(2==e)n=1;else if(32==e)n=5;else{if(4!=e)return void this.fromRadix(t,e);n=2}this.t=0,this.s=0;for(var r=t.length,i=!1,s=0;--r>=0;){var a=8==n?255&t[r]:l(t,r);a<0?"-"==t.charAt(r)&&(i=!0):(i=!1,0==s?this[this.t++]=a:s+n>this.DB?(this[this.t-1]|=(a&(1<>this.DB-s):this[this.t-1]|=a<=this.DB&&(s-=this.DB))}8==n&&0!=(128&t[0])&&(this.s=-1,s>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==t;)--this.t}function m(t){if(this.s<0)return"-"+this.negate().toString(t);var e;if(16==t)e=4;else if(8==t)e=3;else if(2==t)e=1;else if(32==t)e=5;else{if(4!=t)return this.toRadix(t);e=2}var n,r=(1<0)for(a>a)>0&&(i=!0,s=h(n));o>=0;)a>(a+=this.DB-e)):(n=this[o]>>(a-=e)&r,a<=0&&(a+=this.DB,--o)),n>0&&(i=!0),i&&(s+=h(n));return i?s:"0"}function S(){var t=a();return o.ZERO.subTo(this,t),t}function b(){return this.s<0?this.negate():this}function w(t){var e=this.s-t.s;if(0!=e)return e;var n=this.t;if(e=n-t.t,0!=e)return this.s<0?-e:e;for(;--n>=0;)if(0!=(e=this[n]-t[n]))return e;return 0}function _(t){var e,n=1;return 0!=(e=t>>>16)&&(t=e,n+=16),0!=(e=t>>8)&&(t=e,n+=8),0!=(e=t>>4)&&(t=e,n+=4),0!=(e=t>>2)&&(t=e,n+=2),0!=(e=t>>1)&&(t=e,n+=1),n}function x(){return this.t<=0?0:this.DB*(this.t-1)+_(this[this.t-1]^this.s&this.DM)}function E(t,e){var n;for(n=this.t-1;n>=0;--n)e[n+t]=this[n];for(n=t-1;n>=0;--n)e[n]=0;e.t=this.t+t,e.s=this.s}function A(t,e){for(var n=t;n=0;--n)e[n+o+1]=this[n]>>i|a,a=(this[n]&s)<=0;--n)e[n]=0;e[o]=a,e.t=this.t+o+1,e.s=this.s,e.clamp()}function P(t,e){e.s=this.s;var n=Math.floor(t/this.DB);if(n>=this.t)return void(e.t=0);var r=t%this.DB,i=this.DB-r,s=(1<>r;for(var o=n+1;o>r;r>0&&(e[this.t-n-1]|=(this.s&s)<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r-=t.s}e.s=r<0?-1:0,r<-1?e[n++]=this.DV+r:r>0&&(e[n++]=r),e.t=n,e.clamp()}function C(t,e){var n=this.abs(),r=t.abs(),i=n.t;for(e.t=i+r.t;--i>=0;)e[i]=0;for(i=0;i=0;)t[n]=0;for(n=0;n=e.DV&&(t[n+e.t]-=e.DV,t[n+e.t+1]=1)}t.t>0&&(t[t.t-1]+=e.am(n,e[n],t,2*n,0,1)),t.s=0,t.clamp()}function j(t,e,n){var r=t.abs();if(!(r.t<=0)){var i=this.abs();if(i.t0?(r.lShiftTo(f,s),i.lShiftTo(f,n)):(r.copyTo(s),i.copyTo(n));var h=s.t,l=s[h-1];if(0!=l){var d=l*(1<1?s[h-2]>>this.F2:0),p=this.FV/d,g=(1<=0&&(n[n.t++]=1,n.subTo(S,n)),o.ONE.dlShiftTo(h,S),S.subTo(s,s);s.t=0;){var b=n[--v]==l?this.DM:Math.floor(n[v]*p+(n[v-1]+y)*g);if((n[v]+=s.am(0,b,n,m,0,h))0&&n.rShiftTo(f,n),u<0&&o.ZERO.subTo(n,n); -}}}function I(t){var e=a();return this.abs().divRemTo(t,null,e),this.s<0&&e.compareTo(o.ZERO)>0&&t.subTo(e,e),e}function R(t){this.m=t}function D(t){return t.s<0||t.compareTo(this.m)>=0?t.mod(this.m):t}function H(t){return t}function k(t){t.divRemTo(this.m,null,t)}function N(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function B(t,e){t.squareTo(e),this.reduce(e)}function M(){if(this.t<1)return 0;var t=this[0];if(0==(1&t))return 0;var e=3&t;return e=e*(2-(15&t)*e)&15,e=e*(2-(255&t)*e)&255,e=e*(2-((65535&t)*e&65535))&65535,e=e*(2-t*e%this.DV)%this.DV,e>0?this.DV-e:-e}function V(t){this.m=t,this.mp=t.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(e,e),e}function K(t){var e=a();return t.copyTo(e),this.reduce(e),e}function U(t){for(;t.t<=this.mt2;)t[t.t++]=0;for(var e=0;e>15)*this.mpl&this.um)<<15)&t.DM;for(n=e+this.m.t,t[n]+=this.m.am(0,r,t,e,0,this.m.t);t[n]>=t.DV;)t[n]-=t.DV,t[++n]++}t.clamp(),t.drShiftTo(this.m.t,t),t.compareTo(this.m)>=0&&t.subTo(this.m,t)}function q(t,e){t.squareTo(e),this.reduce(e)}function W(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function z(){return 0==(this.t>0?1&this[0]:this.s)}function J(t,e){if(t>4294967295||t<1)return o.ONE;var n=a(),r=a(),i=e.convert(this),s=_(t)-1;for(i.copyTo(n);--s>=0;)if(e.sqrTo(n,r),(t&1<0)e.mulTo(r,i,n);else{var u=n;n=r,r=u}return e.revert(n)}function Y(t,e){var n;return n=t<256||e.isEven()?new R(e):new V(e),this.exp(t,n)}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ +var Oidc=function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){n(1),t.exports=n(327)},function(t,e,n){(function(t){"use strict";function e(t,e,n){t[e]||Object[r](t,e,{writable:!0,configurable:!0,value:n})}if(n(2),n(323),n(324),t._babelPolyfill)throw new Error("only one instance of babel-polyfill is allowed");t._babelPolyfill=!0;var r="defineProperty";e(String.prototype,"padLeft","".padStart),e(String.prototype,"padRight","".padEnd),"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function(t){[][t]&&e(Array,t,Function.call.bind([][t]))})}).call(e,function(){return this}())},function(t,e,n){n(3),n(51),n(52),n(53),n(54),n(56),n(59),n(60),n(61),n(62),n(63),n(64),n(65),n(66),n(67),n(69),n(71),n(73),n(75),n(78),n(79),n(80),n(84),n(86),n(88),n(91),n(92),n(93),n(94),n(96),n(97),n(98),n(99),n(100),n(101),n(102),n(104),n(105),n(106),n(108),n(109),n(110),n(112),n(114),n(115),n(116),n(117),n(118),n(119),n(120),n(121),n(122),n(123),n(124),n(125),n(126),n(131),n(132),n(136),n(137),n(138),n(139),n(141),n(142),n(143),n(144),n(145),n(146),n(147),n(148),n(149),n(150),n(151),n(152),n(153),n(154),n(155),n(157),n(158),n(160),n(161),n(167),n(168),n(170),n(171),n(172),n(176),n(177),n(178),n(179),n(180),n(182),n(183),n(184),n(185),n(188),n(190),n(191),n(192),n(194),n(196),n(198),n(199),n(200),n(202),n(203),n(204),n(205),n(215),n(219),n(220),n(222),n(223),n(227),n(228),n(230),n(231),n(232),n(233),n(234),n(235),n(236),n(237),n(238),n(239),n(240),n(241),n(242),n(243),n(244),n(245),n(246),n(247),n(248),n(250),n(251),n(252),n(253),n(254),n(256),n(257),n(258),n(261),n(262),n(263),n(264),n(265),n(266),n(267),n(268),n(270),n(271),n(273),n(274),n(275),n(276),n(279),n(280),n(282),n(283),n(284),n(285),n(287),n(288),n(289),n(290),n(291),n(292),n(293),n(294),n(295),n(296),n(298),n(299),n(300),n(301),n(302),n(303),n(304),n(305),n(306),n(307),n(308),n(310),n(311),n(312),n(313),n(314),n(315),n(316),n(317),n(318),n(319),n(320),n(321),n(322),t.exports=n(9)},function(t,e,n){"use strict";var r=n(4),i=n(5),s=n(6),o=n(8),a=n(18),u=n(22).KEY,c=n(7),f=n(23),h=n(24),l=n(19),d=n(25),p=n(26),g=n(27),y=n(29),v=n(44),m=n(12),S=n(13),b=n(32),w=n(16),x=n(17),_=n(45),E=n(48),F=n(50),A=n(11),P=n(30),O=F.f,C=A.f,j=E.f,I=r.Symbol,T=r.JSON,D=T&&T.stringify,R="prototype",H=d("_hidden"),k=d("toPrimitive"),N={}.propertyIsEnumerable,B=f("symbol-registry"),M=f("symbols"),V=f("op-symbols"),K=Object[R],L="function"==typeof I,U=r.QObject,q=!U||!U[R]||!U[R].findChild,W=s&&c(function(){return 7!=_(C({},"a",{get:function(){return C(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=O(K,e);r&&delete K[e],C(t,e,n),r&&t!==K&&C(K,e,r)}:C,J=function(t){var e=M[t]=_(I[R]);return e._k=t,e},z=L&&"symbol"==typeof I.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof I},G=function(t,e,n){return t===K&&G(V,e,n),m(t),e=w(e,!0),m(n),i(M,e)?(n.enumerable?(i(t,H)&&t[H][e]&&(t[H][e]=!1),n=_(n,{enumerable:x(0,!1)})):(i(t,H)||C(t,H,x(1,{})),t[H][e]=!0),W(t,e,n)):C(t,e,n)},Y=function(t,e){m(t);for(var n,r=y(e=b(e)),i=0,s=r.length;s>i;)G(t,n=r[i++],e[n]);return t},X=function(t,e){return void 0===e?_(t):Y(_(t),e)},$=function(t){var e=N.call(this,t=w(t,!0));return!(this===K&&i(M,t)&&!i(V,t))&&(!(e||!i(this,t)||!i(M,t)||i(this,H)&&this[H][t])||e)},Q=function(t,e){if(t=b(t),e=w(e,!0),t!==K||!i(M,e)||i(V,e)){var n=O(t,e);return!n||!i(M,e)||i(t,H)&&t[H][e]||(n.enumerable=!0),n}},Z=function(t){for(var e,n=j(b(t)),r=[],s=0;n.length>s;)i(M,e=n[s++])||e==H||e==u||r.push(e);return r},tt=function(t){for(var e,n=t===K,r=j(n?V:b(t)),s=[],o=0;r.length>o;)!i(M,e=r[o++])||n&&!i(K,e)||s.push(M[e]);return s};L||(I=function(){if(this instanceof I)throw TypeError("Symbol is not a constructor!");var t=l(arguments.length>0?arguments[0]:void 0),e=function(n){this===K&&e.call(V,n),i(this,H)&&i(this[H],t)&&(this[H][t]=!1),W(this,t,x(1,n))};return s&&q&&W(K,t,{configurable:!0,set:e}),J(t)},a(I[R],"toString",function(){return this._k}),F.f=Q,A.f=G,n(49).f=E.f=Z,n(43).f=$,n(42).f=tt,s&&!n(28)&&a(K,"propertyIsEnumerable",$,!0),p.f=function(t){return J(d(t))}),o(o.G+o.W+o.F*!L,{Symbol:I});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)d(et[nt++]);for(var rt=P(d.store),it=0;rt.length>it;)g(rt[it++]);o(o.S+o.F*!L,"Symbol",{for:function(t){return i(B,t+="")?B[t]:B[t]=I(t)},keyFor:function(t){if(!z(t))throw TypeError(t+" is not a symbol!");for(var e in B)if(B[e]===t)return e},useSetter:function(){q=!0},useSimple:function(){q=!1}}),o(o.S+o.F*!L,"Object",{create:X,defineProperty:G,defineProperties:Y,getOwnPropertyDescriptor:Q,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),T&&o(o.S+o.F*(!L||c(function(){var t=I();return"[null]"!=D([t])||"{}"!=D({a:t})||"{}"!=D(Object(t))})),"JSON",{stringify:function(t){for(var e,n,r=[t],i=1;arguments.length>i;)r.push(arguments[i++]);if(n=e=r[1],(S(e)||void 0!==t)&&!z(t))return v(e)||(e=function(t,e){if("function"==typeof n&&(e=n.call(this,t,e)),!z(e))return e}),r[1]=e,D.apply(T,r)}}),I[R][k]||n(10)(I[R],k,I[R].valueOf),h(I,"Symbol"),h(Math,"Math",!0),h(r.JSON,"JSON",!0)},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){t.exports=!n(7)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(4),i=n(9),s=n(10),o=n(18),a=n(20),u="prototype",c=function(t,e,n){var f,h,l,d,p=t&c.F,g=t&c.G,y=t&c.S,v=t&c.P,m=t&c.B,S=g?r:y?r[e]||(r[e]={}):(r[e]||{})[u],b=g?i:i[e]||(i[e]={}),w=b[u]||(b[u]={});g&&(n=e);for(f in n)h=!p&&S&&void 0!==S[f],l=(h?S:n)[f],d=m&&h?a(l,r):v&&"function"==typeof l?a(Function.call,l):l,S&&o(S,f,l,t&c.U),b[f]!=l&&s(b,f,d),v&&w[f]!=l&&(w[f]=l)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,e){var n=t.exports={version:"2.5.3"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(11),i=n(17);t.exports=n(6)?function(t,e,n){return r.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(12),i=n(14),s=n(16),o=Object.defineProperty;e.f=n(6)?Object.defineProperty:function(t,e,n){if(r(t),e=s(e,!0),r(n),i)try{return o(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(13);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){t.exports=!n(6)&&!n(7)(function(){return 7!=Object.defineProperty(n(15)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(13),i=n(4).document,s=r(i)&&r(i.createElement);t.exports=function(t){return s?i.createElement(t):{}}},function(t,e,n){var r=n(13);t.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(4),i=n(10),s=n(5),o=n(19)("src"),a="toString",u=Function[a],c=(""+u).split(a);n(9).inspectSource=function(t){return u.call(t)},(t.exports=function(t,e,n,a){var u="function"==typeof n;u&&(s(n,"name")||i(n,"name",e)),t[e]!==n&&(u&&(s(n,o)||i(n,o,t[e]?""+t[e]:c.join(String(e)))),t===r?t[e]=n:a?t[e]?t[e]=n:i(t,e,n):(delete t[e],i(t,e,n)))})(Function.prototype,a,function(){return"function"==typeof this&&this[o]||u.call(this)})},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e,n){var r=n(21);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,n){var r=n(19)("meta"),i=n(13),s=n(5),o=n(11).f,a=0,u=Object.isExtensible||function(){return!0},c=!n(7)(function(){return u(Object.preventExtensions({}))}),f=function(t){o(t,r,{value:{i:"O"+ ++a,w:{}}})},h=function(t,e){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!s(t,r)){if(!u(t))return"F";if(!e)return"E";f(t)}return t[r].i},l=function(t,e){if(!s(t,r)){if(!u(t))return!0;if(!e)return!1;f(t)}return t[r].w},d=function(t){return c&&p.NEED&&u(t)&&!s(t,r)&&f(t),t},p=t.exports={KEY:r,NEED:!1,fastKey:h,getWeak:l,onFreeze:d}},function(t,e,n){var r=n(4),i="__core-js_shared__",s=r[i]||(r[i]={});t.exports=function(t){return s[t]||(s[t]={})}},function(t,e,n){var r=n(11).f,i=n(5),s=n(25)("toStringTag");t.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,s)&&r(t,s,{configurable:!0,value:e})}},function(t,e,n){var r=n(23)("wks"),i=n(19),s=n(4).Symbol,o="function"==typeof s,a=t.exports=function(t){return r[t]||(r[t]=o&&s[t]||(o?s:i)("Symbol."+t))};a.store=r},function(t,e,n){e.f=n(25)},function(t,e,n){var r=n(4),i=n(9),s=n(28),o=n(26),a=n(11).f;t.exports=function(t){var e=i.Symbol||(i.Symbol=s?{}:r.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:o.f(t)})}},function(t,e){t.exports=!1},function(t,e,n){var r=n(30),i=n(42),s=n(43);t.exports=function(t){var e=r(t),n=i.f;if(n)for(var o,a=n(t),u=s.f,c=0;a.length>c;)u.call(t,o=a[c++])&&e.push(o);return e}},function(t,e,n){var r=n(31),i=n(41);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(5),i=n(32),s=n(36)(!1),o=n(40)("IE_PROTO");t.exports=function(t,e){var n,a=i(t),u=0,c=[];for(n in a)n!=o&&r(a,n)&&c.push(n);for(;e.length>u;)r(a,n=e[u++])&&(~s(c,n)||c.push(n));return c}},function(t,e,n){var r=n(33),i=n(35);t.exports=function(t){return r(i(t))}},function(t,e,n){var r=n(34);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(32),i=n(37),s=n(39);t.exports=function(t){return function(e,n,o){var a,u=r(e),c=i(u.length),f=s(o,c);if(t&&n!=n){for(;c>f;)if(a=u[f++],a!=a)return!0}else for(;c>f;f++)if((t||f in u)&&u[f]===n)return t||f||0;return!t&&-1}}},function(t,e,n){var r=n(38),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(38),i=Math.max,s=Math.min;t.exports=function(t,e){return t=r(t),t<0?i(t+e,0):s(t,e)}},function(t,e,n){var r=n(23)("keys"),i=n(19);t.exports=function(t){return r[t]||(r[t]=i(t))}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var r=n(34);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){var r=n(12),i=n(46),s=n(41),o=n(40)("IE_PROTO"),a=function(){},u="prototype",c=function(){var t,e=n(15)("iframe"),r=s.length,i="<",o=">";for(e.style.display="none",n(47).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(i+"script"+o+"document.F=Object"+i+"/script"+o),t.close(),c=t.F;r--;)delete c[u][s[r]];return c()};t.exports=Object.create||function(t,e){var n;return null!==t?(a[u]=r(t),n=new a,a[u]=null,n[o]=t):n=c(),void 0===e?n:i(n,e)}},function(t,e,n){var r=n(11),i=n(12),s=n(30);t.exports=n(6)?Object.defineProperties:function(t,e){i(t);for(var n,o=s(e),a=o.length,u=0;a>u;)r.f(t,n=o[u++],e[n]);return t}},function(t,e,n){var r=n(4).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(32),i=n(49).f,s={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return i(t)}catch(t){return o.slice()}};t.exports.f=function(t){return o&&"[object Window]"==s.call(t)?a(t):i(r(t))}},function(t,e,n){var r=n(31),i=n(41).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},function(t,e,n){var r=n(43),i=n(17),s=n(32),o=n(16),a=n(5),u=n(14),c=Object.getOwnPropertyDescriptor;e.f=n(6)?c:function(t,e){if(t=s(t),e=o(e,!0),u)try{return c(t,e)}catch(t){}if(a(t,e))return i(!r.f.call(t,e),t[e])}},function(t,e,n){var r=n(8);r(r.S,"Object",{create:n(45)})},function(t,e,n){var r=n(8);r(r.S+r.F*!n(6),"Object",{defineProperty:n(11).f})},function(t,e,n){var r=n(8);r(r.S+r.F*!n(6),"Object",{defineProperties:n(46)})},function(t,e,n){var r=n(32),i=n(50).f;n(55)("getOwnPropertyDescriptor",function(){return function(t,e){return i(r(t),e)}})},function(t,e,n){var r=n(8),i=n(9),s=n(7);t.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*s(function(){n(1)}),"Object",o)}},function(t,e,n){var r=n(57),i=n(58);n(55)("getPrototypeOf",function(){return function(t){return i(r(t))}})},function(t,e,n){var r=n(35);t.exports=function(t){return Object(r(t))}},function(t,e,n){var r=n(5),i=n(57),s=n(40)("IE_PROTO"),o=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,s)?t[s]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?o:null}},function(t,e,n){var r=n(57),i=n(30);n(55)("keys",function(){return function(t){return i(r(t))}})},function(t,e,n){n(55)("getOwnPropertyNames",function(){return n(48).f})},function(t,e,n){var r=n(13),i=n(22).onFreeze;n(55)("freeze",function(t){return function(e){return t&&r(e)?t(i(e)):e}})},function(t,e,n){var r=n(13),i=n(22).onFreeze;n(55)("seal",function(t){return function(e){return t&&r(e)?t(i(e)):e}})},function(t,e,n){var r=n(13),i=n(22).onFreeze;n(55)("preventExtensions",function(t){return function(e){return t&&r(e)?t(i(e)):e}})},function(t,e,n){var r=n(13);n(55)("isFrozen",function(t){return function(e){return!r(e)||!!t&&t(e)}})},function(t,e,n){var r=n(13);n(55)("isSealed",function(t){return function(e){return!r(e)||!!t&&t(e)}})},function(t,e,n){var r=n(13);n(55)("isExtensible",function(t){return function(e){return!!r(e)&&(!t||t(e))}})},function(t,e,n){var r=n(8);r(r.S+r.F,"Object",{assign:n(68)})},function(t,e,n){"use strict";var r=n(30),i=n(42),s=n(43),o=n(57),a=n(33),u=Object.assign;t.exports=!u||n(7)(function(){var t={},e={},n=Symbol(),r="abcdefghijklmnopqrst";return t[n]=7,r.split("").forEach(function(t){e[t]=t}),7!=u({},t)[n]||Object.keys(u({},e)).join("")!=r})?function(t,e){for(var n=o(t),u=arguments.length,c=1,f=i.f,h=s.f;u>c;)for(var l,d=a(arguments[c++]),p=f?r(d).concat(f(d)):r(d),g=p.length,y=0;g>y;)h.call(d,l=p[y++])&&(n[l]=d[l]);return n}:u},function(t,e,n){var r=n(8);r(r.S,"Object",{is:n(70)})},function(t,e){t.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},function(t,e,n){var r=n(8);r(r.S,"Object",{setPrototypeOf:n(72).set})},function(t,e,n){var r=n(13),i=n(12),s=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,r){try{r=n(20)(Function.call,n(50).f(Object.prototype,"__proto__").set,2),r(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,n){return s(t,n),e?t.__proto__=n:r(t,n),t}}({},!1):void 0),check:s}},function(t,e,n){"use strict";var r=n(74),i={};i[n(25)("toStringTag")]="z",i+""!="[object z]"&&n(18)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},function(t,e,n){var r=n(34),i=n(25)("toStringTag"),s="Arguments"==r(function(){return arguments}()),o=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,n,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=o(e=Object(t),i))?n:s?r(e):"Object"==(a=r(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,n){var r=n(8);r(r.P,"Function",{bind:n(76)})},function(t,e,n){"use strict";var r=n(21),i=n(13),s=n(77),o=[].slice,a={},u=function(t,e,n){if(!(e in a)){for(var r=[],i=0;i>>0||(o.test(n)?16:10))}:r},function(t,e,n){var r=n(8),i=n(35),s=n(7),o=n(83),a="["+o+"]",u="​…",c=RegExp("^"+a+a+"*"),f=RegExp(a+a+"*$"),h=function(t,e,n){var i={},a=s(function(){return!!o[t]()||u[t]()!=u}),c=i[t]=a?e(l):o[t];n&&(i[n]=c),r(r.P+r.F*a,"String",i)},l=h.trim=function(t,e){return t=String(i(t)),1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(f,"")),t};t.exports=h},function(t,e){t.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},function(t,e,n){var r=n(8),i=n(85);r(r.G+r.F*(parseFloat!=i),{parseFloat:i})},function(t,e,n){var r=n(4).parseFloat,i=n(82).trim;t.exports=1/r(n(83)+"-0")!==-(1/0)?function(t){var e=i(String(t),3),n=r(e);return 0===n&&"-"==e.charAt(0)?-0:n}:r},function(t,e,n){"use strict";var r=n(4),i=n(5),s=n(34),o=n(87),a=n(16),u=n(7),c=n(49).f,f=n(50).f,h=n(11).f,l=n(82).trim,d="Number",p=r[d],g=p,y=p.prototype,v=s(n(45)(y))==d,m="trim"in String.prototype,S=function(t){var e=a(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():l(e,3);var n,r,i,s=e.charCodeAt(0);if(43===s||45===s){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===s){switch(e.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+e}for(var o,u=e.slice(2),c=0,f=u.length;ci)return NaN;return parseInt(u,r)}}return+e};if(!p(" 0o1")||!p("0b1")||p("+0x1")){p=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof p&&(v?u(function(){y.valueOf.call(n)}):s(n)!=d)?o(new g(S(e)),n,p):S(e)};for(var b,w=n(6)?c(g):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),x=0;w.length>x;x++)i(g,b=w[x])&&!i(p,b)&&h(p,b,f(g,b));p.prototype=y,y.constructor=p,n(18)(r,d,p)}},function(t,e,n){var r=n(13),i=n(72).set;t.exports=function(t,e,n){var s,o=e.constructor;return o!==n&&"function"==typeof o&&(s=o.prototype)!==n.prototype&&r(s)&&i&&i(t,s),t}},function(t,e,n){"use strict";var r=n(8),i=n(38),s=n(89),o=n(90),a=1..toFixed,u=Math.floor,c=[0,0,0,0,0,0],f="Number.toFixed: incorrect invocation!",h="0",l=function(t,e){for(var n=-1,r=e;++n<6;)r+=t*c[n],c[n]=r%1e7,r=u(r/1e7)},d=function(t){for(var e=6,n=0;--e>=0;)n+=c[e],c[e]=u(n/t),n=n%t*1e7},p=function(){for(var t=6,e="";--t>=0;)if(""!==e||0===t||0!==c[t]){var n=String(c[t]);e=""===e?n:e+o.call(h,7-n.length)+n}return e},g=function(t,e,n){return 0===e?n:e%2===1?g(t,e-1,n*t):g(t*t,e/2,n)},y=function(t){for(var e=0,n=t;n>=4096;)e+=12,n/=4096;for(;n>=2;)e+=1,n/=2;return e};r(r.P+r.F*(!!a&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!n(7)(function(){a.call({})})),"Number",{toFixed:function(t){var e,n,r,a,u=s(this,f),c=i(t),v="",m=h;if(c<0||c>20)throw RangeError(f);if(u!=u)return"NaN";if(u<=-1e21||u>=1e21)return String(u);if(u<0&&(v="-",u=-u),u>1e-21)if(e=y(u*g(2,69,1))-69,n=e<0?u*g(2,-e,1):u/g(2,e,1),n*=4503599627370496,e=52-e,e>0){for(l(0,n),r=c;r>=7;)l(1e7,0),r-=7;for(l(g(10,r,1),0),r=e-1;r>=23;)d(1<<23),r-=23;d(1<0?(a=m.length,m=v+(a<=c?"0."+o.call(h,c-a)+m:m.slice(0,a-c)+"."+m.slice(a-c))):m=v+m,m}})},function(t,e,n){var r=n(34);t.exports=function(t,e){if("number"!=typeof t&&"Number"!=r(t))throw TypeError(e);return+t}},function(t,e,n){"use strict";var r=n(38),i=n(35);t.exports=function(t){var e=String(i(this)),n="",s=r(t);if(s<0||s==1/0)throw RangeError("Count can't be negative");for(;s>0;(s>>>=1)&&(e+=e))1&s&&(n+=e);return n}},function(t,e,n){"use strict";var r=n(8),i=n(7),s=n(89),o=1..toPrecision;r(r.P+r.F*(i(function(){return"1"!==o.call(1,void 0)})||!i(function(){o.call({})})),"Number",{toPrecision:function(t){var e=s(this,"Number#toPrecision: incorrect invocation!");return void 0===t?o.call(e):o.call(e,t)}})},function(t,e,n){var r=n(8);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},function(t,e,n){var r=n(8),i=n(4).isFinite;r(r.S,"Number",{isFinite:function(t){return"number"==typeof t&&i(t)}})},function(t,e,n){var r=n(8);r(r.S,"Number",{isInteger:n(95)})},function(t,e,n){var r=n(13),i=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&i(t)===t}},function(t,e,n){var r=n(8);r(r.S,"Number",{isNaN:function(t){return t!=t}})},function(t,e,n){var r=n(8),i=n(95),s=Math.abs;r(r.S,"Number",{isSafeInteger:function(t){return i(t)&&s(t)<=9007199254740991}})},function(t,e,n){var r=n(8);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(t,e,n){var r=n(8);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,e,n){var r=n(8),i=n(85);r(r.S+r.F*(Number.parseFloat!=i),"Number",{parseFloat:i})},function(t,e,n){var r=n(8),i=n(81);r(r.S+r.F*(Number.parseInt!=i),"Number",{parseInt:i})},function(t,e,n){var r=n(8),i=n(103),s=Math.sqrt,o=Math.acosh;r(r.S+r.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))&&o(1/0)==1/0),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+s(t-1)*s(t+1))}})},function(t,e){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,e,n){function r(t){return isFinite(t=+t)&&0!=t?t<0?-r(-t):Math.log(t+Math.sqrt(t*t+1)):t}var i=n(8),s=Math.asinh;i(i.S+i.F*!(s&&1/s(0)>0),"Math",{asinh:r})},function(t,e,n){var r=n(8),i=Math.atanh;r(r.S+r.F*!(i&&1/i(-0)<0),"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,e,n){var r=n(8),i=n(107);r(r.S,"Math",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,e){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,e,n){var r=n(8);r(r.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,e,n){var r=n(8),i=Math.exp;r(r.S,"Math",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},function(t,e,n){var r=n(8),i=n(111);r(r.S+r.F*(i!=Math.expm1),"Math",{expm1:i})},function(t,e){var n=Math.expm1;t.exports=!n||n(10)>22025.465794806718||n(10)<22025.465794806718||n(-2e-17)!=-2e-17?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:n},function(t,e,n){var r=n(8);r(r.S,"Math",{fround:n(113)})},function(t,e,n){var r=n(107),i=Math.pow,s=i(2,-52),o=i(2,-23),a=i(2,127)*(2-o),u=i(2,-126),c=function(t){return t+1/s-1/s};t.exports=Math.fround||function(t){var e,n,i=Math.abs(t),f=r(t);return ia||n!=n?f*(1/0):f*n)}},function(t,e,n){var r=n(8),i=Math.abs;r(r.S,"Math",{hypot:function(t,e){for(var n,r,s=0,o=0,a=arguments.length,u=0;o0?(r=n/u,s+=r*r):s+=n;return u===1/0?1/0:u*Math.sqrt(s)}})},function(t,e,n){var r=n(8),i=Math.imul;r(r.S+r.F*n(7)(function(){return i(4294967295,5)!=-5||2!=i.length}),"Math",{imul:function(t,e){var n=65535,r=+t,i=+e,s=n&r,o=n&i;return 0|s*o+((n&r>>>16)*o+s*(n&i>>>16)<<16>>>0)}})},function(t,e,n){var r=n(8);r(r.S,"Math",{log10:function(t){return Math.log(t)*Math.LOG10E}})},function(t,e,n){var r=n(8);r(r.S,"Math",{log1p:n(103)})},function(t,e,n){var r=n(8);r(r.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,e,n){var r=n(8);r(r.S,"Math",{sign:n(107)})},function(t,e,n){var r=n(8),i=n(111),s=Math.exp;r(r.S+r.F*n(7)(function(){return!Math.sinh(-2e-17)!=-2e-17}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(s(t-1)-s(-t-1))*(Math.E/2)}})},function(t,e,n){var r=n(8),i=n(111),s=Math.exp;r(r.S,"Math",{tanh:function(t){var e=i(t=+t),n=i(-t);return e==1/0?1:n==1/0?-1:(e-n)/(s(t)+s(-t))}})},function(t,e,n){var r=n(8);r(r.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,e,n){var r=n(8),i=n(39),s=String.fromCharCode,o=String.fromCodePoint;r(r.S+r.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],r=arguments.length,o=0;r>o;){if(e=+arguments[o++],i(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(e<65536?s(e):s(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},function(t,e,n){var r=n(8),i=n(32),s=n(37);r(r.S,"String",{raw:function(t){for(var e=i(t.raw),n=s(e.length),r=arguments.length,o=[],a=0;n>a;)o.push(String(e[a++])),a=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){var r=n(38),i=n(35);t.exports=function(t){return function(e,n){var s,o,a=String(i(e)),u=r(n),c=a.length;return u<0||u>=c?t?"":void 0:(s=a.charCodeAt(u),s<55296||s>56319||u+1===c||(o=a.charCodeAt(u+1))<56320||o>57343?t?a.charAt(u):s:t?a.slice(u,u+2):(s-55296<<10)+(o-56320)+65536)}}},function(t,e,n){"use strict";var r=n(28),i=n(8),s=n(18),o=n(10),a=n(5),u=n(129),c=n(130),f=n(24),h=n(58),l=n(25)("iterator"),d=!([].keys&&"next"in[].keys()),p="@@iterator",g="keys",y="values",v=function(){return this};t.exports=function(t,e,n,m,S,b,w){c(n,e,m);var x,_,E,F=function(t){if(!d&&t in C)return C[t];switch(t){case g:return function(){return new n(this,t)};case y:return function(){return new n(this,t)}}return function(){return new n(this,t)}},A=e+" Iterator",P=S==y,O=!1,C=t.prototype,j=C[l]||C[p]||S&&C[S],I=!d&&j||F(S),T=S?P?F("entries"):I:void 0,D="Array"==e?C.entries||j:j;if(D&&(E=h(D.call(new t)),E!==Object.prototype&&E.next&&(f(E,A,!0),r||a(E,l)||o(E,l,v))),P&&j&&j.name!==y&&(O=!0,I=function(){return j.call(this)}),r&&!w||!d&&!O&&C[l]||o(C,l,I),u[e]=I,u[A]=v,S)if(x={values:P?I:F(y),keys:b?I:F(g),entries:T},w)for(_ in x)_ in C||s(C,_,x[_]);else i(i.P+i.F*(d||O),e,x);return x}},function(t,e){t.exports={}},function(t,e,n){"use strict";var r=n(45),i=n(17),s=n(24),o={};n(10)(o,n(25)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(o,{next:i(1,n)}),s(t,e+" Iterator")}},function(t,e,n){"use strict";var r=n(8),i=n(127)(!1);r(r.P,"String",{codePointAt:function(t){return i(this,t)}})},function(t,e,n){"use strict";var r=n(8),i=n(37),s=n(133),o="endsWith",a=""[o];r(r.P+r.F*n(135)(o),"String",{endsWith:function(t){var e=s(this,t,o),n=arguments.length>1?arguments[1]:void 0,r=i(e.length),u=void 0===n?r:Math.min(i(n),r),c=String(t);return a?a.call(e,c,u):e.slice(u-c.length,u)===c}})},function(t,e,n){var r=n(134),i=n(35);t.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return String(i(t))}},function(t,e,n){var r=n(13),i=n(34),s=n(25)("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[s])?!!e:"RegExp"==i(t))}},function(t,e,n){var r=n(25)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(t){}}return!0}},function(t,e,n){"use strict";var r=n(8),i=n(133),s="includes";r(r.P+r.F*n(135)(s),"String",{includes:function(t){return!!~i(this,t,s).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(8);r(r.P,"String",{repeat:n(90)})},function(t,e,n){"use strict";var r=n(8),i=n(37),s=n(133),o="startsWith",a=""[o];r(r.P+r.F*n(135)(o),"String",{startsWith:function(t){var e=s(this,t,o),n=i(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return a?a.call(e,r,n):e.slice(n,n+r.length)===r}})},function(t,e,n){"use strict";n(140)("anchor",function(t){return function(e){return t(this,"a","name",e)}})},function(t,e,n){var r=n(8),i=n(7),s=n(35),o=/"/g,a=function(t,e,n,r){var i=String(s(t)),a="<"+e;return""!==n&&(a+=" "+n+'="'+String(r).replace(o,""")+'"'),a+">"+i+""};t.exports=function(t,e){var n={};n[t]=e(a),r(r.P+r.F*i(function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}),"String",n)}},function(t,e,n){"use strict";n(140)("big",function(t){return function(){return t(this,"big","","")}})},function(t,e,n){"use strict";n(140)("blink",function(t){return function(){return t(this,"blink","","")}})},function(t,e,n){"use strict";n(140)("bold",function(t){return function(){return t(this,"b","","")}})},function(t,e,n){"use strict";n(140)("fixed",function(t){return function(){return t(this,"tt","","")}})},function(t,e,n){"use strict";n(140)("fontcolor",function(t){return function(e){return t(this,"font","color",e)}})},function(t,e,n){"use strict";n(140)("fontsize",function(t){return function(e){return t(this,"font","size",e)}})},function(t,e,n){"use strict";n(140)("italics",function(t){return function(){return t(this,"i","","")}})},function(t,e,n){"use strict";n(140)("link",function(t){return function(e){return t(this,"a","href",e)}})},function(t,e,n){"use strict";n(140)("small",function(t){return function(){return t(this,"small","","")}})},function(t,e,n){"use strict";n(140)("strike",function(t){return function(){return t(this,"strike","","")}})},function(t,e,n){"use strict";n(140)("sub",function(t){return function(){return t(this,"sub","","")}})},function(t,e,n){"use strict";n(140)("sup",function(t){return function(){return t(this,"sup","","")}})},function(t,e,n){var r=n(8);r(r.S,"Date",{now:function(){return(new Date).getTime()}})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(16);r(r.P+r.F*n(7)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(t){var e=i(this),n=s(e);return"number"!=typeof n||isFinite(n)?e.toISOString():null}})},function(t,e,n){var r=n(8),i=n(156);r(r.P+r.F*(Date.prototype.toISOString!==i),"Date",{toISOString:i})},function(t,e,n){"use strict";var r=n(7),i=Date.prototype.getTime,s=Date.prototype.toISOString,o=function(t){return t>9?t:"0"+t};t.exports=r(function(){return"0385-07-25T07:06:39.999Z"!=s.call(new Date(-5e13-1))})||!r(function(){s.call(new Date(NaN))})?function(){if(!isFinite(i.call(this)))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),r=e<0?"-":e>9999?"+":""; +return r+("00000"+Math.abs(e)).slice(r?-6:-4)+"-"+o(t.getUTCMonth()+1)+"-"+o(t.getUTCDate())+"T"+o(t.getUTCHours())+":"+o(t.getUTCMinutes())+":"+o(t.getUTCSeconds())+"."+(n>99?n:"0"+o(n))+"Z"}:s},function(t,e,n){var r=Date.prototype,i="Invalid Date",s="toString",o=r[s],a=r.getTime;new Date(NaN)+""!=i&&n(18)(r,s,function(){var t=a.call(this);return t===t?o.call(this):i})},function(t,e,n){var r=n(25)("toPrimitive"),i=Date.prototype;r in i||n(10)(i,r,n(159))},function(t,e,n){"use strict";var r=n(12),i=n(16),s="number";t.exports=function(t){if("string"!==t&&t!==s&&"default"!==t)throw TypeError("Incorrect hint");return i(r(this),t!=s)}},function(t,e,n){var r=n(8);r(r.S,"Array",{isArray:n(44)})},function(t,e,n){"use strict";var r=n(20),i=n(8),s=n(57),o=n(162),a=n(163),u=n(37),c=n(164),f=n(165);i(i.S+i.F*!n(166)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,i,h,l=s(t),d="function"==typeof this?this:Array,p=arguments.length,g=p>1?arguments[1]:void 0,y=void 0!==g,v=0,m=f(l);if(y&&(g=r(g,p>2?arguments[2]:void 0,2)),void 0==m||d==Array&&a(m))for(e=u(l.length),n=new d(e);e>v;v++)c(n,v,y?g(l[v],v):l[v]);else for(h=m.call(l),n=new d;!(i=h.next()).done;v++)c(n,v,y?o(h,g,[i.value,v],!0):i.value);return n.length=v,n}})},function(t,e,n){var r=n(12);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var s=t.return;throw void 0!==s&&r(s.call(t)),e}}},function(t,e,n){var r=n(129),i=n(25)("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||s[i]===t)}},function(t,e,n){"use strict";var r=n(11),i=n(17);t.exports=function(t,e,n){e in t?r.f(t,e,i(0,n)):t[e]=n}},function(t,e,n){var r=n(74),i=n(25)("iterator"),s=n(129);t.exports=n(9).getIteratorMethod=function(t){if(void 0!=t)return t[i]||t["@@iterator"]||s[r(t)]}},function(t,e,n){var r=n(25)("iterator"),i=!1;try{var s=[7][r]();s.return=function(){i=!0},Array.from(s,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var s=[7],o=s[r]();o.next=function(){return{done:n=!0}},s[r]=function(){return o},t(s)}catch(t){}return n}},function(t,e,n){"use strict";var r=n(8),i=n(164);r(r.S+r.F*n(7)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments.length,n=new("function"==typeof this?this:Array)(e);e>t;)i(n,t,arguments[t++]);return n.length=e,n}})},function(t,e,n){"use strict";var r=n(8),i=n(32),s=[].join;r(r.P+r.F*(n(33)!=Object||!n(169)(s)),"Array",{join:function(t){return s.call(i(this),void 0===t?",":t)}})},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e){return!!t&&r(function(){e?t.call(null,function(){},1):t.call(null)})}},function(t,e,n){"use strict";var r=n(8),i=n(47),s=n(34),o=n(39),a=n(37),u=[].slice;r(r.P+r.F*n(7)(function(){i&&u.call(i)}),"Array",{slice:function(t,e){var n=a(this.length),r=s(this);if(e=void 0===e?n:e,"Array"==r)return u.call(this,t,e);for(var i=o(t,n),c=o(e,n),f=a(c-i),h=new Array(f),l=0;lw;w++)if((l||w in m)&&(g=m[w],y=S(g,w,v),t))if(n)x[w]=y;else if(y)switch(t){case 3:return!0;case 5:return g;case 6:return w;case 2:x.push(g)}else if(f)return!1;return h?-1:c||f?f:x}}},function(t,e,n){var r=n(175);t.exports=function(t,e){return new(r(t))(e)}},function(t,e,n){var r=n(13),i=n(44),s=n(25)("species");t.exports=function(t){var e;return i(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!i(e.prototype)||(e=void 0),r(e)&&(e=e[s],null===e&&(e=void 0))),void 0===e?Array:e}},function(t,e,n){"use strict";var r=n(8),i=n(173)(1);r(r.P+r.F*!n(169)([].map,!0),"Array",{map:function(t){return i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(173)(2);r(r.P+r.F*!n(169)([].filter,!0),"Array",{filter:function(t){return i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(173)(3);r(r.P+r.F*!n(169)([].some,!0),"Array",{some:function(t){return i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(173)(4);r(r.P+r.F*!n(169)([].every,!0),"Array",{every:function(t){return i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(181);r(r.P+r.F*!n(169)([].reduce,!0),"Array",{reduce:function(t){return i(this,t,arguments.length,arguments[1],!1)}})},function(t,e,n){var r=n(21),i=n(57),s=n(33),o=n(37);t.exports=function(t,e,n,a,u){r(e);var c=i(t),f=s(c),h=o(c.length),l=u?h-1:0,d=u?-1:1;if(n<2)for(;;){if(l in f){a=f[l],l+=d;break}if(l+=d,u?l<0:h<=l)throw TypeError("Reduce of empty array with no initial value")}for(;u?l>=0:h>l;l+=d)l in f&&(a=e(a,f[l],l,c));return a}},function(t,e,n){"use strict";var r=n(8),i=n(181);r(r.P+r.F*!n(169)([].reduceRight,!0),"Array",{reduceRight:function(t){return i(this,t,arguments.length,arguments[1],!0)}})},function(t,e,n){"use strict";var r=n(8),i=n(36)(!1),s=[].indexOf,o=!!s&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(o||!n(169)(s)),"Array",{indexOf:function(t){return o?s.apply(this,arguments)||0:i(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(8),i=n(32),s=n(38),o=n(37),a=[].lastIndexOf,u=!!a&&1/[1].lastIndexOf(1,-0)<0;r(r.P+r.F*(u||!n(169)(a)),"Array",{lastIndexOf:function(t){if(u)return a.apply(this,arguments)||0;var e=i(this),n=o(e.length),r=n-1;for(arguments.length>1&&(r=Math.min(r,s(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in e&&e[r]===t)return r||0;return-1}})},function(t,e,n){var r=n(8);r(r.P,"Array",{copyWithin:n(186)}),n(187)("copyWithin")},function(t,e,n){"use strict";var r=n(57),i=n(39),s=n(37);t.exports=[].copyWithin||function(t,e){var n=r(this),o=s(n.length),a=i(t,o),u=i(e,o),c=arguments.length>2?arguments[2]:void 0,f=Math.min((void 0===c?o:i(c,o))-u,o-a),h=1;for(u0;)u in n?n[a]=n[u]:delete n[a],a+=h,u+=h;return n}},function(t,e,n){var r=n(25)("unscopables"),i=Array.prototype;void 0==i[r]&&n(10)(i,r,{}),t.exports=function(t){i[r][t]=!0}},function(t,e,n){var r=n(8);r(r.P,"Array",{fill:n(189)}),n(187)("fill")},function(t,e,n){"use strict";var r=n(57),i=n(39),s=n(37);t.exports=function(t){for(var e=r(this),n=s(e.length),o=arguments.length,a=i(o>1?arguments[1]:void 0,n),u=o>2?arguments[2]:void 0,c=void 0===u?n:i(u,n);c>a;)e[a++]=t;return e}},function(t,e,n){"use strict";var r=n(8),i=n(173)(5),s="find",o=!0;s in[]&&Array(1)[s](function(){o=!1}),r(r.P+r.F*o,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n(187)(s)},function(t,e,n){"use strict";var r=n(8),i=n(173)(6),s="findIndex",o=!0;s in[]&&Array(1)[s](function(){o=!1}),r(r.P+r.F*o,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n(187)(s)},function(t,e,n){n(193)("Array")},function(t,e,n){"use strict";var r=n(4),i=n(11),s=n(6),o=n(25)("species");t.exports=function(t){var e=r[t];s&&e&&!e[o]&&i.f(e,o,{configurable:!0,get:function(){return this}})}},function(t,e,n){"use strict";var r=n(187),i=n(195),s=n(129),o=n(32);t.exports=n(128)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,i(1)):"keys"==e?i(0,n):"values"==e?i(0,t[n]):i(0,[n,t[n]])},"values"),s.Arguments=s.Array,r("keys"),r("values"),r("entries")},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){var r=n(4),i=n(87),s=n(11).f,o=n(49).f,a=n(134),u=n(197),c=r.RegExp,f=c,h=c.prototype,l=/a/g,d=/a/g,p=new c(l)!==l;if(n(6)&&(!p||n(7)(function(){return d[n(25)("match")]=!1,c(l)!=l||c(d)==d||"/a/i"!=c(l,"i")}))){c=function(t,e){var n=this instanceof c,r=a(t),s=void 0===e;return!n&&r&&t.constructor===c&&s?t:i(p?new f(r&&!s?t.source:t,e):f((r=t instanceof c)?t.source:t,r&&s?u.call(t):e),n?this:h,c)};for(var g=(function(t){t in c||s(c,t,{configurable:!0,get:function(){return f[t]},set:function(e){f[t]=e}})}),y=o(f),v=0;y.length>v;)g(y[v++]);h.constructor=c,c.prototype=h,n(18)(r,"RegExp",c)}n(193)("RegExp")},function(t,e,n){"use strict";var r=n(12);t.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},function(t,e,n){"use strict";n(199);var r=n(12),i=n(197),s=n(6),o="toString",a=/./[o],u=function(t){n(18)(RegExp.prototype,o,t,!0)};n(7)(function(){return"/a/b"!=a.call({source:"a",flags:"b"})})?u(function(){var t=r(this);return"/".concat(t.source,"/","flags"in t?t.flags:!s&&t instanceof RegExp?i.call(t):void 0)}):a.name!=o&&u(function(){return a.call(this)})},function(t,e,n){n(6)&&"g"!=/./g.flags&&n(11).f(RegExp.prototype,"flags",{configurable:!0,get:n(197)})},function(t,e,n){n(201)("match",1,function(t,e,n){return[function(n){"use strict";var r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):new RegExp(n)[e](String(r))},n]})},function(t,e,n){"use strict";var r=n(10),i=n(18),s=n(7),o=n(35),a=n(25);t.exports=function(t,e,n){var u=a(t),c=n(o,u,""[t]),f=c[0],h=c[1];s(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(i(String.prototype,t,f),r(RegExp.prototype,u,2==e?function(t,e){return h.call(t,this,e)}:function(t){return h.call(t,this)}))}},function(t,e,n){n(201)("replace",2,function(t,e,n){return[function(r,i){"use strict";var s=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,s,i):n.call(String(s),r,i)},n]})},function(t,e,n){n(201)("search",1,function(t,e,n){return[function(n){"use strict";var r=t(this),i=void 0==n?void 0:n[e];return void 0!==i?i.call(n,r):new RegExp(n)[e](String(r))},n]})},function(t,e,n){n(201)("split",2,function(t,e,r){"use strict";var i=n(134),s=r,o=[].push,a="split",u="length",c="lastIndex";if("c"=="abbc"[a](/(b)*/)[1]||4!="test"[a](/(?:)/,-1)[u]||2!="ab"[a](/(?:ab)*/)[u]||4!="."[a](/(.?)(.?)/)[u]||"."[a](/()()/)[u]>1||""[a](/.?/)[u]){var f=void 0===/()??/.exec("")[1];r=function(t,e){var n=String(this);if(void 0===t&&0===e)return[];if(!i(t))return s.call(n,t,e);var r,a,h,l,d,p=[],g=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),y=0,v=void 0===e?4294967295:e>>>0,m=new RegExp(t.source,g+"g");for(f||(r=new RegExp("^"+m.source+"$(?!\\s)",g));(a=m.exec(n))&&(h=a.index+a[0][u],!(h>y&&(p.push(n.slice(y,a.index)),!f&&a[u]>1&&a[0].replace(r,function(){for(d=1;d1&&a.index=v)));)m[c]===a.index&&m[c]++;return y===n[u]?!l&&m.test("")||p.push(""):p.push(n.slice(y)),p[u]>v?p.slice(0,v):p}}else"0"[a](void 0,0)[u]&&(r=function(t,e){return void 0===t&&0===e?[]:s.call(this,t,e)});return[function(n,i){var s=t(this),o=void 0==n?void 0:n[e];return void 0!==o?o.call(n,s,i):r.call(String(s),n,i)},r]})},function(t,e,n){"use strict";var r,i,s,o,a=n(28),u=n(4),c=n(20),f=n(74),h=n(8),l=n(13),d=n(21),p=n(206),g=n(207),y=n(208),v=n(209).set,m=n(210)(),S=n(211),b=n(212),w=n(213),x="Promise",_=u.TypeError,E=u.process,F=u[x],A="process"==f(E),P=function(){},O=i=S.f,C=!!function(){try{var t=F.resolve(1),e=(t.constructor={})[n(25)("species")]=function(t){t(P,P)};return(A||"function"==typeof PromiseRejectionEvent)&&t.then(P)instanceof e}catch(t){}}(),j=function(t){var e;return!(!l(t)||"function"!=typeof(e=t.then))&&e},I=function(t,e){if(!t._n){t._n=!0;var n=t._c;m(function(){for(var r=t._v,i=1==t._s,s=0,o=function(e){var n,s,o=i?e.ok:e.fail,a=e.resolve,u=e.reject,c=e.domain;try{o?(i||(2==t._h&&R(t),t._h=1),o===!0?n=r:(c&&c.enter(),n=o(r),c&&c.exit()),n===e.promise?u(_("Promise-chain cycle")):(s=j(n))?s.call(n,a,u):a(n)):u(r)}catch(t){u(t)}};n.length>s;)o(n[s++]);t._c=[],t._n=!1,e&&!t._h&&T(t)})}},T=function(t){v.call(u,function(){var e,n,r,i=t._v,s=D(t);if(s&&(e=b(function(){A?E.emit("unhandledRejection",i,t):(n=u.onunhandledrejection)?n({promise:t,reason:i}):(r=u.console)&&r.error&&r.error("Unhandled promise rejection",i)}),t._h=A||D(t)?2:1),t._a=void 0,s&&e.e)throw e.v})},D=function(t){return 1!==t._h&&0===(t._a||t._c).length},R=function(t){v.call(u,function(){var e;A?E.emit("rejectionHandled",t):(e=u.onrejectionhandled)&&e({promise:t,reason:t._v})})},H=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),I(e,!0))},k=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw _("Promise can't be resolved itself");(e=j(t))?m(function(){var r={_w:n,_d:!1};try{e.call(t,c(k,r,1),c(H,r,1))}catch(t){H.call(r,t)}}):(n._v=t,n._s=1,I(n,!1))}catch(t){H.call({_w:n,_d:!1},t)}}};C||(F=function(t){p(this,F,x,"_h"),d(t),r.call(this);try{t(c(k,this,1),c(H,this,1))}catch(t){H.call(this,t)}},r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},r.prototype=n(214)(F.prototype,{then:function(t,e){var n=O(y(this,F));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=A?E.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&I(this,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),s=function(){var t=new r;this.promise=t,this.resolve=c(k,t,1),this.reject=c(H,t,1)},S.f=O=function(t){return t===F||t===o?new s(t):i(t)}),h(h.G+h.W+h.F*!C,{Promise:F}),n(24)(F,x),n(193)(x),o=n(9)[x],h(h.S+h.F*!C,x,{reject:function(t){var e=O(this),n=e.reject;return n(t),e.promise}}),h(h.S+h.F*(a||!C),x,{resolve:function(t){return w(a&&this===o?F:this,t)}}),h(h.S+h.F*!(C&&n(166)(function(t){F.all(t).catch(P)})),x,{all:function(t){var e=this,n=O(e),r=n.resolve,i=n.reject,s=b(function(){var n=[],s=0,o=1;g(t,!1,function(t){var a=s++,u=!1;n.push(void 0),o++,e.resolve(t).then(function(t){u||(u=!0,n[a]=t,--o||r(n))},i)}),--o||r(n)});return s.e&&i(s.v),n.promise},race:function(t){var e=this,n=O(e),r=n.reject,i=b(function(){g(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return i.e&&r(i.v),n.promise}})},function(t,e){t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){var r=n(20),i=n(162),s=n(163),o=n(12),a=n(37),u=n(165),c={},f={},e=t.exports=function(t,e,n,h,l){var d,p,g,y,v=l?function(){return t}:u(t),m=r(n,h,e?2:1),S=0;if("function"!=typeof v)throw TypeError(t+" is not iterable!");if(s(v)){for(d=a(t.length);d>S;S++)if(y=e?m(o(p=t[S])[0],p[1]):m(t[S]),y===c||y===f)return y}else for(g=v.call(t);!(p=g.next()).done;)if(y=i(g,m,p.value,e),y===c||y===f)return y};e.BREAK=c,e.RETURN=f},function(t,e,n){var r=n(12),i=n(21),s=n(25)("species");t.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[s])?e:i(n)}},function(t,e,n){var r,i,s,o=n(20),a=n(77),u=n(47),c=n(15),f=n(4),h=f.process,l=f.setImmediate,d=f.clearImmediate,p=f.MessageChannel,g=f.Dispatch,y=0,v={},m="onreadystatechange",S=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},b=function(t){S.call(t.data)};l&&d||(l=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++y]=function(){a("function"==typeof t?t:Function(t),e)},r(y),y},d=function(t){delete v[t]},"process"==n(34)(h)?r=function(t){h.nextTick(o(S,t,1))}:g&&g.now?r=function(t){g.now(o(S,t,1))}:p?(i=new p,s=i.port2,i.port1.onmessage=b,r=o(s.postMessage,s,1)):f.addEventListener&&"function"==typeof postMessage&&!f.importScripts?(r=function(t){f.postMessage(t+"","*")},f.addEventListener("message",b,!1)):r=m in c("script")?function(t){u.appendChild(c("script"))[m]=function(){u.removeChild(this),S.call(t)}}:function(t){setTimeout(o(S,t,1),0)}),t.exports={set:l,clear:d}},function(t,e,n){var r=n(4),i=n(209).set,s=r.MutationObserver||r.WebKitMutationObserver,o=r.process,a=r.Promise,u="process"==n(34)(o);t.exports=function(){var t,e,n,c=function(){var r,i;for(u&&(r=o.domain)&&r.exit();t;){i=t.fn,t=t.next;try{i()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(u)n=function(){o.nextTick(c)};else if(!s||r.navigator&&r.navigator.standalone)if(a&&a.resolve){var f=a.resolve();n=function(){f.then(c)}}else n=function(){i.call(r,c)};else{var h=!0,l=document.createTextNode("");new s(c).observe(l,{characterData:!0}),n=function(){l.data=h=!h}}return function(r){var i={fn:r,next:void 0};e&&(e.next=i),t||(t=i,n()),e=i}}},function(t,e,n){"use strict";function r(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=i(e),this.reject=i(n)}var i=n(21);t.exports.f=function(t){return new r(t)}},function(t,e){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},function(t,e,n){var r=n(12),i=n(13),s=n(211);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=s.f(t),o=n.resolve;return o(e),n.promise}},function(t,e,n){var r=n(18);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(216),i=n(217),s="Map";t.exports=n(218)(s,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=r.getEntry(i(this,s),t);return e&&e.v},set:function(t,e){return r.def(i(this,s),0===t?0:t,e)}},r,!0)},function(t,e,n){"use strict";var r=n(11).f,i=n(45),s=n(214),o=n(20),a=n(206),u=n(207),c=n(128),f=n(195),h=n(193),l=n(6),d=n(22).fastKey,p=n(217),g=l?"_s":"size",y=function(t,e){var n,r=d(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};t.exports={getConstructor:function(t,e,n,c){var f=t(function(t,r){a(t,f,e,"_i"),t._t=e,t._i=i(null),t._f=void 0,t._l=void 0,t[g]=0,void 0!=r&&u(r,n,t[c],t)});return s(f.prototype,{clear:function(){for(var t=p(this,e),n=t._i,r=t._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete n[r.i];t._f=t._l=void 0,t[g]=0},delete:function(t){var n=p(this,e),r=y(n,t);if(r){var i=r.n,s=r.p;delete n._i[r.i],r.r=!0,s&&(s.n=i),i&&(i.p=s),n._f==r&&(n._f=i),n._l==r&&(n._l=s),n[g]--}return!!r},forEach:function(t){p(this,e);for(var n,r=o(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(r(n.v,n.k,this);n&&n.r;)n=n.p},has:function(t){return!!y(p(this,e),t)}}),l&&r(f.prototype,"size",{get:function(){return p(this,e)[g]}}),f},def:function(t,e,n){var r,i,s=y(t,e);return s?s.v=n:(t._l=s={i:i=d(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=s),r&&(r.n=s),t[g]++,"F"!==i&&(t._i[i]=s)),t},getEntry:y,setStrong:function(t,e,n){c(t,e,function(t,n){this._t=p(t,e),this._k=n,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?f(0,n.k):"values"==e?f(0,n.v):f(0,[n.k,n.v]):(t._t=void 0,f(1))},n?"entries":"values",!n,!0),h(e)}}},function(t,e,n){var r=n(13);t.exports=function(t,e){if(!r(t)||t._t!==e)throw TypeError("Incompatible receiver, "+e+" required!");return t}},function(t,e,n){"use strict";var r=n(4),i=n(8),s=n(18),o=n(214),a=n(22),u=n(207),c=n(206),f=n(13),h=n(7),l=n(166),d=n(24),p=n(87);t.exports=function(t,e,n,g,y,v){var m=r[t],S=m,b=y?"set":"add",w=S&&S.prototype,x={},_=function(t){var e=w[t];s(w,t,"delete"==t?function(t){return!(v&&!f(t))&&e.call(this,0===t?0:t)}:"has"==t?function(t){return!(v&&!f(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return v&&!f(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof S&&(v||w.forEach&&!h(function(){(new S).entries().next()}))){var E=new S,F=E[b](v?{}:-0,1)!=E,A=h(function(){E.has(1)}),P=l(function(t){new S(t)}),O=!v&&h(function(){for(var t=new S,e=5;e--;)t[b](e,e);return!t.has(-0)});P||(S=e(function(e,n){c(e,S,t);var r=p(new m,e,S);return void 0!=n&&u(n,y,r[b],r),r}),S.prototype=w,w.constructor=S),(A||O)&&(_("delete"),_("has"),y&&_("get")),(O||F)&&_(b),v&&w.clear&&delete w.clear}else S=g.getConstructor(e,t,y,b),o(S.prototype,n),a.NEED=!0;return d(S,t),x[t]=S,i(i.G+i.W+i.F*(S!=m),x),v||g.setStrong(S,t,y),S}},function(t,e,n){"use strict";var r=n(216),i=n(217),s="Set";t.exports=n(218)(s,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(i(this,s),t=0===t?0:t,t)}},r)},function(t,e,n){"use strict";var r,i=n(173)(0),s=n(18),o=n(22),a=n(68),u=n(221),c=n(13),f=n(7),h=n(217),l="WeakMap",d=o.getWeak,p=Object.isExtensible,g=u.ufstore,y={},v=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},m={get:function(t){if(c(t)){var e=d(t);return e===!0?g(h(this,l)).get(t):e?e[this._i]:void 0}},set:function(t,e){return u.def(h(this,l),t,e)}},S=t.exports=n(218)(l,v,m,u,!0,!0);f(function(){return 7!=(new S).set((Object.freeze||Object)(y),7).get(y)})&&(r=u.getConstructor(v,l),a(r.prototype,m),o.NEED=!0,i(["delete","has","get","set"],function(t){var e=S.prototype,n=e[t];s(e,t,function(e,i){if(c(e)&&!p(e)){this._f||(this._f=new r);var s=this._f[t](e,i);return"set"==t?this:s}return n.call(this,e,i)})}))},function(t,e,n){"use strict";var r=n(214),i=n(22).getWeak,s=n(12),o=n(13),a=n(206),u=n(207),c=n(173),f=n(5),h=n(217),l=c(5),d=c(6),p=0,g=function(t){return t._l||(t._l=new y)},y=function(){this.a=[]},v=function(t,e){return l(t.a,function(t){return t[0]===e})};y.prototype={get:function(t){var e=v(this,t);if(e)return e[1]},has:function(t){return!!v(this,t)},set:function(t,e){var n=v(this,t);n?n[1]=e:this.a.push([t,e])},delete:function(t){var e=d(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},t.exports={getConstructor:function(t,e,n,s){var c=t(function(t,r){a(t,c,e,"_i"),t._t=e,t._i=p++,t._l=void 0,void 0!=r&&u(r,n,t[s],t)});return r(c.prototype,{delete:function(t){if(!o(t))return!1;var n=i(t);return n===!0?g(h(this,e)).delete(t):n&&f(n,this._i)&&delete n[this._i]},has:function(t){if(!o(t))return!1;var n=i(t);return n===!0?g(h(this,e)).has(t):n&&f(n,this._i)}}),c},def:function(t,e,n){var r=i(s(e),!0);return r===!0?g(t).set(e,n):r[t._i]=n,t},ufstore:g}},function(t,e,n){"use strict";var r=n(221),i=n(217),s="WeakSet";n(218)(s,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(i(this,s),t,!0)}},r,!1,!0)},function(t,e,n){"use strict";var r=n(8),i=n(224),s=n(225),o=n(12),a=n(39),u=n(37),c=n(13),f=n(4).ArrayBuffer,h=n(208),l=s.ArrayBuffer,d=s.DataView,p=i.ABV&&f.isView,g=l.prototype.slice,y=i.VIEW,v="ArrayBuffer";r(r.G+r.W+r.F*(f!==l),{ArrayBuffer:l}),r(r.S+r.F*!i.CONSTR,v,{isView:function(t){return p&&p(t)||c(t)&&y in t}}),r(r.P+r.U+r.F*n(7)(function(){return!new l(2).slice(1,void 0).byteLength}),v,{slice:function(t,e){if(void 0!==g&&void 0===e)return g.call(o(this),t);for(var n=o(this).byteLength,r=a(t,n),i=a(void 0===e?n:e,n),s=new(h(this,l))(u(i-r)),c=new d(this),f=new d(s),p=0;r>1,f=23===e?K(2,-24)-K(2,-77):0,h=0,l=t<0||0===t&&1/t<0?1:0;for(t=V(t),t!=t||t===B?(i=t!=t?1:0,r=u):(r=L(U(t)/q),t*(s=K(2,-r))<1&&(r--,s*=2),t+=r+c>=1?f/s:f*K(2,1-c),t*s>=2&&(r++,s/=2),r+c>=u?(i=0,r=u):r+c>=1?(i=(t*s-1)*K(2,e),r+=c):(i=t*K(2,c-1)*K(2,e),r=0));e>=8;o[h++]=255&i,i/=256,e-=8);for(r=r<0;o[h++]=255&r,r/=256,a-=8);return o[--h]|=128*l,o}function i(t,e,n){var r,i=8*n-e-1,s=(1<>1,a=i-7,u=n-1,c=t[u--],f=127&c;for(c>>=7;a>0;f=256*f+t[u],u--,a-=8);for(r=f&(1<<-a)-1,f>>=-a,a+=e;a>0;r=256*r+t[u],u--,a-=8);if(0===f)f=1-o;else{if(f===s)return r?NaN:c?-B:B;r+=K(2,e),f-=o}return(c?-1:1)*r*K(2,f-e)}function s(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function o(t){return[255&t]}function a(t){return[255&t,t>>8&255]}function u(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function c(t){return r(t,52,8)}function f(t){return r(t,23,4)}function h(t,e,n){A(t[I],e,{get:function(){return this[n]}})}function l(t,e,n,r){var i=+n,s=E(i);if(s+e>t[Y])throw N(D);var o=t[G]._b,a=s+t[X],u=o.slice(a,a+e);return r?u:u.reverse()}function d(t,e,n,r,i,s){var o=+n,a=E(o);if(a+e>t[Y])throw N(D);for(var u=t[G]._b,c=a+t[X],f=r(+i),h=0;htt;)($=Z[tt++])in R||m(R,$,M[$]);y||(Q.constructor=R)}var et=new H(new R(2)),nt=H[I].setInt8;et.setInt8(0,2147483648),et.setInt8(1,2147483649),!et.getInt8(0)&&et.getInt8(1)||S(H[I],{setInt8:function(t,e){nt.call(this,t,e<<24>>24)},setUint8:function(t,e){nt.call(this,t,e<<24>>24)}},!0)}else R=function(t){w(this,R,C);var e=E(t);this._b=P.call(new Array(e),0),this[Y]=e},H=function(t,e,n){w(this,H,j),w(t,R,j);var r=t[Y],i=x(e);if(i<0||i>r)throw N("Wrong offset!");if(n=void 0===n?r-i:_(n),i+n>r)throw N(T);this[G]=t,this[X]=i,this[Y]=n},g&&(h(R,J,"_l"),h(H,W,"_b"),h(H,J,"_l"),h(H,z,"_o")),S(H[I],{getInt8:function(t){return l(this,1,t)[0]<<24>>24},getUint8:function(t){return l(this,1,t)[0]},getInt16:function(t){var e=l(this,2,t,arguments[1]);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=l(this,2,t,arguments[1]);return e[1]<<8|e[0]},getInt32:function(t){return s(l(this,4,t,arguments[1]))},getUint32:function(t){return s(l(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return i(l(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return i(l(this,8,t,arguments[1]),52,8)},setInt8:function(t,e){d(this,1,t,o,e)},setUint8:function(t,e){d(this,1,t,o,e)},setInt16:function(t,e){d(this,2,t,a,e,arguments[2])},setUint16:function(t,e){d(this,2,t,a,e,arguments[2])},setInt32:function(t,e){d(this,4,t,u,e,arguments[2])},setUint32:function(t,e){d(this,4,t,u,e,arguments[2])},setFloat32:function(t,e){d(this,4,t,f,e,arguments[2])},setFloat64:function(t,e){d(this,8,t,c,e,arguments[2])}});O(R,C),O(H,j),m(H[I],v.VIEW,!0),e[C]=R,e[j]=H},function(t,e,n){var r=n(38),i=n(37);t.exports=function(t){if(void 0===t)return 0;var e=r(t),n=i(e);if(e!==n)throw RangeError("Wrong length!");return n}},function(t,e,n){var r=n(8);r(r.G+r.W+r.F*!n(224).ABV,{DataView:n(225).DataView})},function(t,e,n){n(229)("Int8",1,function(t){return function(e,n,r){return t(this,e,n,r)}})},function(t,e,n){"use strict";if(n(6)){var r=n(28),i=n(4),s=n(7),o=n(8),a=n(224),u=n(225),c=n(20),f=n(206),h=n(17),l=n(10),d=n(214),p=n(38),g=n(37),y=n(226),v=n(39),m=n(16),S=n(5),b=n(74),w=n(13),x=n(57),_=n(163),E=n(45),F=n(58),A=n(49).f,P=n(165),O=n(19),C=n(25),j=n(173),I=n(36),T=n(208),D=n(194),R=n(129),H=n(166),k=n(193),N=n(189),B=n(186),M=n(11),V=n(50),K=M.f,L=V.f,U=i.RangeError,q=i.TypeError,W=i.Uint8Array,J="ArrayBuffer",z="Shared"+J,G="BYTES_PER_ELEMENT",Y="prototype",X=Array[Y],$=u.ArrayBuffer,Q=u.DataView,Z=j(0),tt=j(2),et=j(3),nt=j(4),rt=j(5),it=j(6),st=I(!0),ot=I(!1),at=D.values,ut=D.keys,ct=D.entries,ft=X.lastIndexOf,ht=X.reduce,lt=X.reduceRight,dt=X.join,pt=X.sort,gt=X.slice,yt=X.toString,vt=X.toLocaleString,mt=C("iterator"),St=C("toStringTag"),bt=O("typed_constructor"),wt=O("def_constructor"),xt=a.CONSTR,_t=a.TYPED,Et=a.VIEW,Ft="Wrong length!",At=j(1,function(t,e){return It(T(t,t[wt]),e)}),Pt=s(function(){return 1===new W(new Uint16Array([1]).buffer)[0]}),Ot=!!W&&!!W[Y].set&&s(function(){new W(1).set({})}),Ct=function(t,e){var n=p(t);if(n<0||n%e)throw U("Wrong offset!");return n},jt=function(t){if(w(t)&&_t in t)return t;throw q(t+" is not a typed array!")},It=function(t,e){if(!(w(t)&&bt in t))throw q("It is not a typed array constructor!");return new t(e)},Tt=function(t,e){return Dt(T(t,t[wt]),e)},Dt=function(t,e){for(var n=0,r=e.length,i=It(t,r);r>n;)i[n]=e[n++];return i},Rt=function(t,e,n){K(t,e,{get:function(){return this._d[n]}})},Ht=function(t){var e,n,r,i,s,o,a=x(t),u=arguments.length,f=u>1?arguments[1]:void 0,h=void 0!==f,l=P(a);if(void 0!=l&&!_(l)){for(o=l.call(a),r=[],e=0;!(s=o.next()).done;e++)r.push(s.value);a=r}for(h&&u>2&&(f=c(f,arguments[2],2)),e=0,n=g(a.length),i=It(this,n);n>e;e++)i[e]=h?f(a[e],e):a[e];return i},kt=function(){for(var t=0,e=arguments.length,n=It(this,e);e>t;)n[t]=arguments[t++];return n},Nt=!!W&&s(function(){vt.call(new W(1))}),Bt=function(){return vt.apply(Nt?gt.call(jt(this)):jt(this),arguments)},Mt={copyWithin:function(t,e){return B.call(jt(this),t,e,arguments.length>2?arguments[2]:void 0)},every:function(t){return nt(jt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return N.apply(jt(this),arguments)},filter:function(t){return Tt(this,tt(jt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return rt(jt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return it(jt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){Z(jt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return ot(jt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return st(jt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return dt.apply(jt(this),arguments)},lastIndexOf:function(t){return ft.apply(jt(this),arguments)},map:function(t){return At(jt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return ht.apply(jt(this),arguments)},reduceRight:function(t){return lt.apply(jt(this),arguments)},reverse:function(){for(var t,e=this,n=jt(e).length,r=Math.floor(n/2),i=0;i1?arguments[1]:void 0)},sort:function(t){return pt.call(jt(this),t)},subarray:function(t,e){var n=jt(this),r=n.length,i=v(t,r);return new(T(n,n[wt]))(n.buffer,n.byteOffset+i*n.BYTES_PER_ELEMENT,g((void 0===e?r:v(e,r))-i))}},Vt=function(t,e){return Tt(this,gt.call(jt(this),t,e))},Kt=function(t){jt(this);var e=Ct(arguments[1],1),n=this.length,r=x(t),i=g(r.length),s=0;if(i+e>n)throw U(Ft);for(;s255?255:255&r),i.v[d](n*e+i.o,r,Pt)},C=function(t,e){K(t,e,{get:function(){return P(this,e)},set:function(t){return O(this,e,t)},enumerable:!0 +})};S?(p=n(function(t,n,r,i){f(t,p,c,"_d");var s,o,a,u,h=0,d=0;if(w(n)){if(!(n instanceof $||(u=b(n))==J||u==z))return _t in n?Dt(p,n):Ht.call(p,n);s=n,d=Ct(r,e);var v=n.byteLength;if(void 0===i){if(v%e)throw U(Ft);if(o=v-d,o<0)throw U(Ft)}else if(o=g(i)*e,o+d>v)throw U(Ft);a=o/e}else a=y(n),o=a*e,s=new $(o);for(l(t,"_d",{b:s,o:d,l:o,e:a,v:new Q(s)});h=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),r(r.S,"Reflect",{enumerate:function(t){return new s(t)}})},function(t,e,n){function r(t,e){var n,a,f=arguments.length<3?t:arguments[2];return c(t)===f?t[e]:(n=i.f(t,e))?o(n,"value")?n.value:void 0!==n.get?n.get.call(f):void 0:u(a=s(t))?r(a,e,f):void 0}var i=n(50),s=n(58),o=n(5),a=n(8),u=n(13),c=n(12);a(a.S,"Reflect",{get:r})},function(t,e,n){var r=n(50),i=n(8),s=n(12);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return r.f(s(t),e)}})},function(t,e,n){var r=n(8),i=n(58),s=n(12);r(r.S,"Reflect",{getPrototypeOf:function(t){return i(s(t))}})},function(t,e,n){var r=n(8);r(r.S,"Reflect",{has:function(t,e){return e in t}})},function(t,e,n){var r=n(8),i=n(12),s=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(t){return i(t),!s||s(t)}})},function(t,e,n){var r=n(8);r(r.S,"Reflect",{ownKeys:n(249)})},function(t,e,n){var r=n(49),i=n(42),s=n(12),o=n(4).Reflect;t.exports=o&&o.ownKeys||function(t){var e=r.f(s(t)),n=i.f;return n?e.concat(n(t)):e}},function(t,e,n){var r=n(8),i=n(12),s=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(t){i(t);try{return s&&s(t),!0}catch(t){return!1}}})},function(t,e,n){function r(t,e,n){var u,l,d=arguments.length<4?t:arguments[3],p=s.f(f(t),e);if(!p){if(h(l=o(t)))return r(l,e,n,d);p=c(0)}return a(p,"value")?!(p.writable===!1||!h(d))&&(u=s.f(d,e)||c(0),u.value=n,i.f(d,e,u),!0):void 0!==p.set&&(p.set.call(d,n),!0)}var i=n(11),s=n(50),o=n(58),a=n(5),u=n(8),c=n(17),f=n(12),h=n(13);u(u.S,"Reflect",{set:r})},function(t,e,n){var r=n(8),i=n(72);i&&r(r.S,"Reflect",{setPrototypeOf:function(t,e){i.check(t,e);try{return i.set(t,e),!0}catch(t){return!1}}})},function(t,e,n){"use strict";var r=n(8),i=n(36)(!0);r(r.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n(187)("includes")},function(t,e,n){"use strict";var r=n(8),i=n(255),s=n(57),o=n(37),a=n(21),u=n(174);r(r.P,"Array",{flatMap:function(t){var e,n,r=s(this);return a(t),e=o(r.length),n=u(r,0),i(n,r,r,e,0,1,t,arguments[1]),n}}),n(187)("flatMap")},function(t,e,n){"use strict";function r(t,e,n,c,f,h,l,d){for(var p,g,y=f,v=0,m=!!l&&a(l,d,3);v0)y=r(t,e,p,o(p.length),y,h-1)-1;else{if(y>=9007199254740991)throw TypeError();t[y]=p}y++}v++}return y}var i=n(44),s=n(13),o=n(37),a=n(20),u=n(25)("isConcatSpreadable");t.exports=r},function(t,e,n){"use strict";var r=n(8),i=n(255),s=n(57),o=n(37),a=n(38),u=n(174);r(r.P,"Array",{flatten:function(){var t=arguments[0],e=s(this),n=o(e.length),r=u(e,0);return i(r,e,e,n,0,void 0===t?1:a(t)),r}}),n(187)("flatten")},function(t,e,n){"use strict";var r=n(8),i=n(127)(!0);r(r.P,"String",{at:function(t){return i(this,t)}})},function(t,e,n){"use strict";var r=n(8),i=n(259),s=n(260);r(r.P+r.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(s),"String",{padStart:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},function(t,e,n){var r=n(37),i=n(90),s=n(35);t.exports=function(t,e,n,o){var a=String(s(t)),u=a.length,c=void 0===n?" ":String(n),f=r(e);if(f<=u||""==c)return a;var h=f-u,l=i.call(c,Math.ceil(h/c.length));return l.length>h&&(l=l.slice(0,h)),o?l+a:a+l}},function(t,e,n){var r=n(4),i=r.navigator;t.exports=i&&i.userAgent||""},function(t,e,n){"use strict";var r=n(8),i=n(259),s=n(260);r(r.P+r.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(s),"String",{padEnd:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},function(t,e,n){"use strict";n(82)("trimLeft",function(t){return function(){return t(this,1)}},"trimStart")},function(t,e,n){"use strict";n(82)("trimRight",function(t){return function(){return t(this,2)}},"trimEnd")},function(t,e,n){"use strict";var r=n(8),i=n(35),s=n(37),o=n(134),a=n(197),u=RegExp.prototype,c=function(t,e){this._r=t,this._s=e};n(130)(c,"RegExp String",function(){var t=this._r.exec(this._s);return{value:t,done:null===t}}),r(r.P,"String",{matchAll:function(t){if(i(this),!o(t))throw TypeError(t+" is not a regexp!");var e=String(this),n="flags"in u?String(t.flags):a.call(t),r=new RegExp(t.source,~n.indexOf("g")?n:"g"+n);return r.lastIndex=s(t.lastIndex),new c(r,e)}})},function(t,e,n){n(27)("asyncIterator")},function(t,e,n){n(27)("observable")},function(t,e,n){var r=n(8),i=n(249),s=n(32),o=n(50),a=n(164);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=s(t),u=o.f,c=i(r),f={},h=0;c.length>h;)n=u(r,e=c[h++]),void 0!==n&&a(f,e,n);return f}})},function(t,e,n){var r=n(8),i=n(269)(!1);r(r.S,"Object",{values:function(t){return i(t)}})},function(t,e,n){var r=n(30),i=n(32),s=n(43).f;t.exports=function(t){return function(e){for(var n,o=i(e),a=r(o),u=a.length,c=0,f=[];u>c;)s.call(o,n=a[c++])&&f.push(t?[n,o[n]]:o[n]);return f}}},function(t,e,n){var r=n(8),i=n(269)(!0);r(r.S,"Object",{entries:function(t){return i(t)}})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(21),o=n(11);n(6)&&r(r.P+n(272),"Object",{__defineGetter__:function(t,e){o.f(i(this),t,{get:s(e),enumerable:!0,configurable:!0})}})},function(t,e,n){"use strict";t.exports=n(28)||!n(7)(function(){var t=Math.random();__defineSetter__.call(null,t,function(){}),delete n(4)[t]})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(21),o=n(11);n(6)&&r(r.P+n(272),"Object",{__defineSetter__:function(t,e){o.f(i(this),t,{set:s(e),enumerable:!0,configurable:!0})}})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(16),o=n(58),a=n(50).f;n(6)&&r(r.P+n(272),"Object",{__lookupGetter__:function(t){var e,n=i(this),r=s(t,!0);do if(e=a(n,r))return e.get;while(n=o(n))}})},function(t,e,n){"use strict";var r=n(8),i=n(57),s=n(16),o=n(58),a=n(50).f;n(6)&&r(r.P+n(272),"Object",{__lookupSetter__:function(t){var e,n=i(this),r=s(t,!0);do if(e=a(n,r))return e.set;while(n=o(n))}})},function(t,e,n){var r=n(8);r(r.P+r.R,"Map",{toJSON:n(277)("Map")})},function(t,e,n){var r=n(74),i=n(278);t.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");return i(this)}}},function(t,e,n){var r=n(207);t.exports=function(t,e){var n=[];return r(t,!1,n.push,n,e),n}},function(t,e,n){var r=n(8);r(r.P+r.R,"Set",{toJSON:n(277)("Set")})},function(t,e,n){n(281)("Map")},function(t,e,n){"use strict";var r=n(8);t.exports=function(t){r(r.S,t,{of:function(){for(var t=arguments.length,e=new Array(t);t--;)e[t]=arguments[t];return new this(e)}})}},function(t,e,n){n(281)("Set")},function(t,e,n){n(281)("WeakMap")},function(t,e,n){n(281)("WeakSet")},function(t,e,n){n(286)("Map")},function(t,e,n){"use strict";var r=n(8),i=n(21),s=n(20),o=n(207);t.exports=function(t){r(r.S,t,{from:function(t){var e,n,r,a,u=arguments[1];return i(this),e=void 0!==u,e&&i(u),void 0==t?new this:(n=[],e?(r=0,a=s(u,arguments[2],2),o(t,!1,function(t){n.push(a(t,r++))})):o(t,!1,n.push,n),new this(n))}})}},function(t,e,n){n(286)("Set")},function(t,e,n){n(286)("WeakMap")},function(t,e,n){n(286)("WeakSet")},function(t,e,n){var r=n(8);r(r.G,{global:n(4)})},function(t,e,n){var r=n(8);r(r.S,"System",{global:n(4)})},function(t,e,n){var r=n(8),i=n(34);r(r.S,"Error",{isError:function(t){return"Error"===i(t)}})},function(t,e,n){var r=n(8);r(r.S,"Math",{clamp:function(t,e,n){return Math.min(n,Math.max(e,t))}})},function(t,e,n){var r=n(8);r(r.S,"Math",{DEG_PER_RAD:Math.PI/180})},function(t,e,n){var r=n(8),i=180/Math.PI;r(r.S,"Math",{degrees:function(t){return t*i}})},function(t,e,n){var r=n(8),i=n(297),s=n(113);r(r.S,"Math",{fscale:function(t,e,n,r,o){return s(i(t,e,n,r,o))}})},function(t,e){t.exports=Math.scale||function(t,e,n,r,i){return 0===arguments.length||t!=t||e!=e||n!=n||r!=r||i!=i?NaN:t===1/0||t===-(1/0)?t:(t-e)*(i-r)/(n-e)+r}},function(t,e,n){var r=n(8);r(r.S,"Math",{iaddh:function(t,e,n,r){var i=t>>>0,s=e>>>0,o=n>>>0;return s+(r>>>0)+((i&o|(i|o)&~(i+o>>>0))>>>31)|0}})},function(t,e,n){var r=n(8);r(r.S,"Math",{isubh:function(t,e,n,r){var i=t>>>0,s=e>>>0,o=n>>>0;return s-(r>>>0)-((~i&o|~(i^o)&i-o>>>0)>>>31)|0}})},function(t,e,n){var r=n(8);r(r.S,"Math",{imulh:function(t,e){var n=65535,r=+t,i=+e,s=r&n,o=i&n,a=r>>16,u=i>>16,c=(a*o>>>0)+(s*o>>>16);return a*u+(c>>16)+((s*u>>>0)+(c&n)>>16)}})},function(t,e,n){var r=n(8);r(r.S,"Math",{RAD_PER_DEG:180/Math.PI})},function(t,e,n){var r=n(8),i=Math.PI/180;r(r.S,"Math",{radians:function(t){return t*i}})},function(t,e,n){var r=n(8);r(r.S,"Math",{scale:n(297)})},function(t,e,n){var r=n(8);r(r.S,"Math",{umulh:function(t,e){var n=65535,r=+t,i=+e,s=r&n,o=i&n,a=r>>>16,u=i>>>16,c=(a*o>>>0)+(s*o>>>16);return a*u+(c>>>16)+((s*u>>>0)+(c&n)>>>16)}})},function(t,e,n){var r=n(8);r(r.S,"Math",{signbit:function(t){return(t=+t)!=t?t:0==t?1/t==1/0:t>0}})},function(t,e,n){"use strict";var r=n(8),i=n(9),s=n(4),o=n(208),a=n(213);r(r.P+r.R,"Promise",{finally:function(t){var e=o(this,i.Promise||s.Promise),n="function"==typeof t;return this.then(n?function(n){return a(e,t()).then(function(){return n})}:t,n?function(n){return a(e,t()).then(function(){throw n})}:t)}})},function(t,e,n){"use strict";var r=n(8),i=n(211),s=n(212);r(r.S,"Promise",{try:function(t){var e=i.f(this),n=s(t);return(n.e?e.reject:e.resolve)(n.v),e.promise}})},function(t,e,n){var r=n(309),i=n(12),s=r.key,o=r.set;r.exp({defineMetadata:function(t,e,n,r){o(t,e,i(n),s(r))}})},function(t,e,n){var r=n(215),i=n(8),s=n(23)("metadata"),o=s.store||(s.store=new(n(220))),a=function(t,e,n){var i=o.get(t);if(!i){if(!n)return;o.set(t,i=new r)}var s=i.get(e);if(!s){if(!n)return;i.set(e,s=new r)}return s},u=function(t,e,n){var r=a(e,n,!1);return void 0!==r&&r.has(t)},c=function(t,e,n){var r=a(e,n,!1);return void 0===r?void 0:r.get(t)},f=function(t,e,n,r){a(n,r,!0).set(t,e)},h=function(t,e){var n=a(t,e,!1),r=[];return n&&n.forEach(function(t,e){r.push(e)}),r},l=function(t){return void 0===t||"symbol"==typeof t?t:String(t)},d=function(t){i(i.S,"Reflect",t)};t.exports={store:o,map:a,has:u,get:c,set:f,keys:h,key:l,exp:d}},function(t,e,n){var r=n(309),i=n(12),s=r.key,o=r.map,a=r.store;r.exp({deleteMetadata:function(t,e){var n=arguments.length<3?void 0:s(arguments[2]),r=o(i(e),n,!1);if(void 0===r||!r.delete(t))return!1;if(r.size)return!0;var u=a.get(e);return u.delete(n),!!u.size||a.delete(e)}})},function(t,e,n){var r=n(309),i=n(12),s=n(58),o=r.has,a=r.get,u=r.key,c=function(t,e,n){var r=o(t,e,n);if(r)return a(t,e,n);var i=s(e);return null!==i?c(t,i,n):void 0};r.exp({getMetadata:function(t,e){return c(t,i(e),arguments.length<3?void 0:u(arguments[2]))}})},function(t,e,n){var r=n(219),i=n(278),s=n(309),o=n(12),a=n(58),u=s.keys,c=s.key,f=function(t,e){var n=u(t,e),s=a(t);if(null===s)return n;var o=f(s,e);return o.length?n.length?i(new r(n.concat(o))):o:n};s.exp({getMetadataKeys:function(t){return f(o(t),arguments.length<2?void 0:c(arguments[1]))}})},function(t,e,n){var r=n(309),i=n(12),s=r.get,o=r.key;r.exp({getOwnMetadata:function(t,e){return s(t,i(e),arguments.length<3?void 0:o(arguments[2]))}})},function(t,e,n){var r=n(309),i=n(12),s=r.keys,o=r.key;r.exp({getOwnMetadataKeys:function(t){return s(i(t),arguments.length<2?void 0:o(arguments[1]))}})},function(t,e,n){var r=n(309),i=n(12),s=n(58),o=r.has,a=r.key,u=function(t,e,n){var r=o(t,e,n);if(r)return!0;var i=s(e);return null!==i&&u(t,i,n)};r.exp({hasMetadata:function(t,e){return u(t,i(e),arguments.length<3?void 0:a(arguments[2]))}})},function(t,e,n){var r=n(309),i=n(12),s=r.has,o=r.key;r.exp({hasOwnMetadata:function(t,e){return s(t,i(e),arguments.length<3?void 0:o(arguments[2]))}})},function(t,e,n){var r=n(309),i=n(12),s=n(21),o=r.key,a=r.set;r.exp({metadata:function(t,e){return function(n,r){a(t,e,(void 0!==r?i:s)(n),o(r))}}})},function(t,e,n){var r=n(8),i=n(210)(),s=n(4).process,o="process"==n(34)(s);r(r.G,{asap:function(t){var e=o&&s.domain;i(e?e.bind(t):t)}})},function(t,e,n){"use strict";var r=n(8),i=n(4),s=n(9),o=n(210)(),a=n(25)("observable"),u=n(21),c=n(12),f=n(206),h=n(214),l=n(10),d=n(207),p=d.RETURN,g=function(t){return null==t?void 0:u(t)},y=function(t){var e=t._c;e&&(t._c=void 0,e())},v=function(t){return void 0===t._o},m=function(t){v(t)||(t._o=void 0,y(t))},S=function(t,e){c(t),this._c=void 0,this._o=t,t=new b(this);try{var n=e(t),r=n;null!=n&&("function"==typeof n.unsubscribe?n=function(){r.unsubscribe()}:u(n),this._c=n)}catch(e){return void t.error(e)}v(this)&&y(this)};S.prototype=h({},{unsubscribe:function(){m(this)}});var b=function(t){this._s=t};b.prototype=h({},{next:function(t){var e=this._s;if(!v(e)){var n=e._o;try{var r=g(n.next);if(r)return r.call(n,t)}catch(t){try{m(e)}finally{throw t}}}},error:function(t){var e=this._s;if(v(e))throw t;var n=e._o;e._o=void 0;try{var r=g(n.error);if(!r)throw t;t=r.call(n,t)}catch(t){try{y(e)}finally{throw t}}return y(e),t},complete:function(t){var e=this._s;if(!v(e)){var n=e._o;e._o=void 0;try{var r=g(n.complete);t=r?r.call(n,t):void 0}catch(t){try{y(e)}finally{throw t}}return y(e),t}}});var w=function(t){f(this,w,"Observable","_f")._f=u(t)};h(w.prototype,{subscribe:function(t){return new S(t,this._f)},forEach:function(t){var e=this;return new(s.Promise||i.Promise)(function(n,r){u(t);var i=e.subscribe({next:function(e){try{return t(e)}catch(t){r(t),i.unsubscribe()}},error:r,complete:n})})}}),h(w,{from:function(t){var e="function"==typeof this?this:w,n=g(c(t)[a]);if(n){var r=c(n.call(t));return r.constructor===e?r:new e(function(t){return r.subscribe(t)})}return new e(function(e){var n=!1;return o(function(){if(!n){try{if(d(t,!1,function(t){if(e.next(t),n)return p})===p)return}catch(t){if(n)throw t;return void e.error(t)}e.complete()}}),function(){n=!0}})},of:function(){for(var t=0,e=arguments.length,n=new Array(e);t2,i=!!r&&o.call(arguments,2);return t(r?function(){("function"==typeof e?e:Function(e)).apply(this,i)}:e,n)}};i(i.G+i.B+i.F*a,{setTimeout:u(r.setTimeout),setInterval:u(r.setInterval)})},function(t,e,n){var r=n(8),i=n(209);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,e,n){for(var r=n(194),i=n(30),s=n(18),o=n(4),a=n(10),u=n(129),c=n(25),f=c("iterator"),h=c("toStringTag"),l=u.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},p=i(d),g=0;g=0;--r){var i=this.tryEntries[r],s=i.completion;if("root"===i.tryLoc)return e("end");if(i.tryLoc<=this.prev){var o=m.call(i,"catchLoc"),a=m.call(i,"finallyLoc");if(o&&a){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&m.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),l(n),C}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;l(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:p(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=y),C}}}("object"==typeof e?e:"object"==typeof window?window:"object"==typeof self?self:this)}).call(e,function(){return this}())},function(t,e,n){n(325),t.exports=n(9).RegExp.escape},function(t,e,n){var r=n(8),i=n(326)(/[\\^$*+?.()|[\]{}]/g,"\\$&");r(r.S,"RegExp",{escape:function(t){return i(t)}})},function(t,e){t.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return String(e).replace(t,n)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=e.Log=n(328).Log,i=e.OidcClient=n(329).OidcClient,s=e.OidcClientSettings=n(330).OidcClientSettings,o=e.WebStorageStateStore=n(331).WebStorageStateStore,a=e.InMemoryWebStorage=n(349).InMemoryWebStorage,u=e.UserManager=n(350).UserManager,c=e.AccessTokenEvents=n(359).AccessTokenEvents,f=e.MetadataService=n(334).MetadataService,h=e.CordovaPopupNavigator=n(366).CordovaPopupNavigator,l=e.CordovaIFrameNavigator=n(368).CordovaIFrameNavigator,d=e.CheckSessionIFrame=n(364).CheckSessionIFrame,p=e.TokenRevocationClient=n(365).TokenRevocationClient,g=e.SessionMonitor=n(363).SessionMonitor,y=e.Global=n(332).Global,v=e.User=n(357).User;e.default={Log:r,OidcClient:i,OidcClientSettings:s,WebStorageStateStore:o,InMemoryWebStorage:a,UserManager:u,AccessTokenEvents:c,MetadataService:f,CordovaPopupNavigator:h,CordovaIFrameNavigator:l,CheckSessionIFrame:d,TokenRevocationClient:p,SessionMonitor:g,Global:y,User:v}},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n=c){for(var t=arguments.length,e=Array(t),n=0;n=u){for(var t=arguments.length,e=Array(t),n=0;n=a){for(var t=arguments.length,e=Array(t),n=0;n=o){for(var t=arguments.length,e=Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),e instanceof c.default?this._settings=e:this._settings=new c.default(e)}return t.prototype.createSigninRequest=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.response_type,r=e.scope,i=e.redirect_uri,s=e.data,o=e.state,u=e.prompt,c=e.display,f=e.max_age,h=e.ui_locales,l=e.id_token_hint,p=e.login_hint,g=e.acr_values,y=e.resource,v=e.request,m=e.request_uri,S=e.extraQueryParams,b=arguments[1];a.default.debug("OidcClient.createSigninRequest");var w=this._settings.client_id;n=n||this._settings.response_type,r=r||this._settings.scope,i=i||this._settings.redirect_uri,u=u||this._settings.prompt,c=c||this._settings.display,f=f||this._settings.max_age,h=h||this._settings.ui_locales,g=g||this._settings.acr_values,y=y||this._settings.resource,S=S||this._settings.extraQueryParams;var x=this._settings.authority;return this._metadataService.getAuthorizationEndpoint().then(function(e){a.default.debug("Received authorization endpoint",e);var _=new d.default({url:e,client_id:w,redirect_uri:i,response_type:n,scope:r,data:s||o,authority:x,prompt:u,display:c,max_age:f,ui_locales:h,id_token_hint:l,login_hint:p,acr_values:g,resource:y,request:v,request_uri:m,extraQueryParams:S}),E=_.state;return b=b||t._stateStore,b.set(E.id,E.toStorageString()).then(function(){return _})})},t.prototype.processSigninResponse=function(t,e){var n=this;a.default.debug("OidcClient.processSigninResponse");var r=new g.default(t);return r.state?(e=e||this._stateStore,e.remove(r.state).then(function(t){if(!t)throw a.default.error("No matching state found in storage"),new Error("No matching state found in storage");var e=w.default.fromStorageString(t);return a.default.debug("Received state from storage; validating response"),n._validator.validateSigninResponse(e,r)})):(a.default.error("No state in response"),Promise.reject(new Error("No state in response")))},t.prototype.createSignoutRequest=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.id_token_hint,r=e.data,i=e.state,s=e.post_logout_redirect_uri,o=arguments[1];return a.default.debug("OidcClient.createSignoutRequest"),s=s||this._settings.post_logout_redirect_uri,this._metadataService.getEndSessionEndpoint().then(function(e){if(!e)throw a.default.error("No end session endpoint url returned"),new Error("no end session endpoint");a.default.debug("Received end session endpoint",e);var u=new v.default({url:e,id_token_hint:n,post_logout_redirect_uri:s,data:r||i}),c=u.state;return c&&(a.default.debug("Signout request has state to persist"),o=o||t._stateStore,o.set(c.id,c.toStorageString())),u})},t.prototype.processSignoutResponse=function(t,e){var n=this;a.default.debug("OidcClient.processSignoutResponse");var r=new S.default(t);if(!r.state)return a.default.debug("No state in response"),r.error?(a.default.warn("Response was error",r.error),Promise.reject(new h.default(r))):Promise.resolve(r);var i=r.state;return e=e||this._stateStore,e.remove(i).then(function(t){if(!t)throw a.default.error("No matching state found in storage"),new Error("No matching state found in storage");var e=_.default.fromStorageString(t); +return a.default.debug("Received state from storage; validating response"),n._validator.validateSignoutResponse(e,r)})},t.prototype.clearStaleState=function(t){return a.default.debug("OidcClient.clearStaleState"),t=t||this._stateStore,_.default.clearStaleState(t,this.settings.staleStateAge)},s(t,[{key:"_stateStore",get:function(){return this.settings.stateStore}},{key:"_validator",get:function(){return this.settings.validator}},{key:"_metadataService",get:function(){return this.settings.metadataService}},{key:"settings",get:function(){return this._settings}},{key:"metadataService",get:function(){return this._metadataService}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.OidcClientSettings=void 0;var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=e.authority,r=e.metadataUrl,o=e.metadata,a=e.signingKeys,u=e.client_id,c=e.client_secret,h=e.response_type,d=void 0===h?y:h,g=e.scope,b=void 0===g?v:g,w=e.redirect_uri,x=e.post_logout_redirect_uri,_=e.prompt,E=e.display,F=e.max_age,A=e.ui_locales,P=e.acr_values,O=e.resource,C=e.filterProtocolClaims,j=void 0===C||C,I=e.loadUserInfo,T=void 0===I||I,D=e.staleStateAge,R=void 0===D?m:D,H=e.clockSkew,k=void 0===H?S:H,N=e.stateStore,B=void 0===N?new f.default:N,M=e.ResponseValidatorCtor,V=void 0===M?l.default:M,K=e.MetadataServiceCtor,L=void 0===K?p.default:K,U=e.extraQueryParams,q=void 0===U?{}:U;i(this,t),this._authority=n,this._metadataUrl=r,this._metadata=o,this._signingKeys=a,this._client_id=u,this._client_secret=c,this._response_type=d,this._scope=b,this._redirect_uri=w,this._post_logout_redirect_uri=x,this._prompt=_,this._display=E,this._max_age=F,this._ui_locales=A,this._acr_values=P,this._resource=O,this._filterProtocolClaims=!!j,this._loadUserInfo=!!T,this._staleStateAge=R,this._clockSkew=k,this._stateStore=B,this._validator=new V(this),this._metadataService=new L(this),this._extraQueryParams="object"===("undefined"==typeof q?"undefined":s(q))?q:{}}return o(t,[{key:"client_id",get:function(){return this._client_id},set:function(t){if(this._client_id)throw u.default.error("client_id has already been assigned."),new Error("client_id has already been assigned.");this._client_id=t}},{key:"client_secret",get:function(){return this._client_secret}},{key:"response_type",get:function(){return this._response_type}},{key:"scope",get:function(){return this._scope}},{key:"redirect_uri",get:function(){return this._redirect_uri}},{key:"post_logout_redirect_uri",get:function(){return this._post_logout_redirect_uri}},{key:"prompt",get:function(){return this._prompt}},{key:"display",get:function(){return this._display}},{key:"max_age",get:function(){return this._max_age}},{key:"ui_locales",get:function(){return this._ui_locales}},{key:"acr_values",get:function(){return this._acr_values}},{key:"resource",get:function(){return this._resource}},{key:"authority",get:function(){return this._authority},set:function(t){if(this._authority)throw u.default.error("authority has already been assigned."),new Error("authority has already been assigned.");this._authority=t}},{key:"metadataUrl",get:function(){return this._metadataUrl||(this._metadataUrl=this.authority,this._metadataUrl&&this._metadataUrl.indexOf(g)<0&&("/"!==this._metadataUrl[this._metadataUrl.length-1]&&(this._metadataUrl+="/"),this._metadataUrl+=g)),this._metadataUrl}},{key:"metadata",get:function(){return this._metadata},set:function(t){this._metadata=t}},{key:"signingKeys",get:function(){return this._signingKeys},set:function(t){this._signingKeys=t}},{key:"filterProtocolClaims",get:function(){return this._filterProtocolClaims}},{key:"loadUserInfo",get:function(){return this._loadUserInfo}},{key:"staleStateAge",get:function(){return this._staleStateAge}},{key:"clockSkew",get:function(){return this._clockSkew}},{key:"stateStore",get:function(){return this._stateStore}},{key:"validator",get:function(){return this._validator}},{key:"metadataService",get:function(){return this._metadataService}},{key:"extraQueryParams",get:function(){return this._extraQueryParams},set:function(t){"object"===("undefined"==typeof t?"undefined":s(t))?this._extraQueryParams=t:this._extraQueryParams={}}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.WebStorageStateStore=void 0;var s=n(328),o=r(s),a=n(332),u=r(a);e.WebStorageStateStore=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.prefix,r=void 0===n?"oidc.":n,s=e.store,o=void 0===s?u.default.localStorage:s;i(this,t),this._store=o,this._prefix=r}return t.prototype.set=function(t,e){return o.default.debug("WebStorageStateStore.set",t),t=this._prefix+t,this._store.setItem(t,e),Promise.resolve()},t.prototype.get=function(t){o.default.debug("WebStorageStateStore.get",t),t=this._prefix+t;var e=this._store.getItem(t);return Promise.resolve(e)},t.prototype.remove=function(t){o.default.debug("WebStorageStateStore.remove",t),t=this._prefix+t;var e=this._store.getItem(t);return this._store.removeItem(t),Promise.resolve(e)},t.prototype.getAllKeys=function(){o.default.debug("WebStorageStateStore.getAllKeys");for(var t=[],e=0;e1&&void 0!==arguments[1]?arguments[1]:u.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:f.default,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:p.default;if(i(this,t),!e)throw o.default.error("No settings passed to ResponseValidator"),new Error("settings");this._settings=e,this._metadataService=new n(this._settings),this._userInfoService=new r(this._settings),this._joseUtil=s}return t.prototype.validateSigninResponse=function(t,e){var n=this;return o.default.debug("ResponseValidator.validateSigninResponse"),this._processSigninParams(t,e).then(function(e){return o.default.debug("state processed"),n._validateTokens(t,e).then(function(t){return o.default.debug("tokens validated"),n._processClaims(t).then(function(t){return o.default.debug("claims processed"),t})})})},t.prototype.validateSignoutResponse=function(t,e){return o.default.debug("ResponseValidator.validateSignoutResponse"),t.id!==e.state?(o.default.error("State does not match"),Promise.reject(new Error("State does not match"))):(o.default.debug("state validated"),e.state=t.data,e.error?(o.default.warn("Response was error",e.error),Promise.reject(new l.default(e))):Promise.resolve(e))},t.prototype._processSigninParams=function(t,e){if(o.default.debug("ResponseValidator._processSigninParams"),t.id!==e.state)return o.default.error("State does not match"),Promise.reject(new Error("State does not match"));if(!t.client_id)return o.default.error("No client_id on state"),Promise.reject(new Error("No client_id on state"));if(!t.authority)return o.default.error("No authority on state"),Promise.reject(new Error("No authority on state"));if(this._settings.authority){if(this._settings.authority&&this._settings.authority!==t.authority)return o.default.error("authority mismatch on settings vs. signin state"),Promise.reject(new Error("authority mismatch on settings vs. signin state"))}else this._settings.authority=t.authority;if(this._settings.client_id){if(this._settings.client_id&&this._settings.client_id!==t.client_id)return o.default.error("client_id mismatch on settings vs. signin state"),Promise.reject(new Error("client_id mismatch on settings vs. signin state"))}else this._settings.client_id=t.client_id;return o.default.debug("state validated"),e.state=t.data,e.error?(o.default.warn("Response was error",e.error),Promise.reject(new l.default(e))):t.nonce&&!e.id_token?(o.default.error("Expecting id_token in response"),Promise.reject(new Error("No id_token in response"))):!t.nonce&&e.id_token?(o.default.error("Not expecting id_token in response"),Promise.reject(new Error("Unexpected id_token in response"))):Promise.resolve(e)},t.prototype._processClaims=function(t){var e=this;if(o.default.debug("ResponseValidator._processClaims"),t.isOpenIdConnect){if(o.default.debug("response is OIDC, processing claims"),t.profile=this._filterProtocolClaims(t.profile),this._settings.loadUserInfo&&t.access_token)return o.default.debug("loading user info"),this._userInfoService.getClaims(t.access_token).then(function(n){return o.default.debug("user info claims received from user info endpoint"),n.sub!==t.profile.sub?(o.default.error("sub from user info endpoint does not match sub in access_token"),Promise.reject(new Error("sub from user info endpoint does not match sub in access_token"))):(t.profile=e._mergeClaims(t.profile,n),o.default.debug("user info claims received, updated profile:",t.profile),t)});o.default.debug("not loading user info")}else o.default.debug("response is not OIDC, not processing claims");return Promise.resolve(t)},t.prototype._mergeClaims=function(t,e){var n=Object.assign({},t);for(var r in e){var i=e[r];Array.isArray(i)||(i=[i]);for(var s=0;s1)return o.default.error("No kid found in id_token and more than one key found in metadata"),Promise.reject(new Error("No kid found in id_token and more than one key found in metadata"));u=a[0]}if(!u)return o.default.error("No key matching kid or alg found in signing keys"),Promise.reject(new Error("No key matching kid or alg found in signing keys"));var c=t.client_id,f=n._settings.clockSkew;return o.default.debug("Validaing JWT; using clock skew (in seconds) of: ",f),n._joseUtil.validateJwt(e.id_token,u,s,c,f).then(function(){return o.default.debug("JWT validation successful"),r.payload.sub?(e.profile=r.payload,e):(o.default.error("No sub present in id_token"),Promise.reject(new Error("No sub present in id_token")))})})})},t.prototype._filterByAlg=function(t,e){o.default.debug("ResponseValidator._filterByAlg",e);var n=null;if(e.startsWith("RS"))n="RSA";else if(e.startsWith("PS"))n="PS";else{if(!e.startsWith("ES"))return o.default.debug("alg not supported: ",e),[];n="EC"}return o.default.debug("Looking for keys that match kty: ",n),t=t.filter(function(t){return t.kty===n}),o.default.debug("Number of keys that match kty: ",n,t.length),t},t.prototype._validateAccessToken=function(t){if(o.default.debug("ResponseValidator._validateAccessToken"),!t.profile)return o.default.error("No profile loaded from id_token"),Promise.reject(new Error("No profile loaded from id_token"));if(!t.profile.at_hash)return o.default.error("No at_hash in id_token"),Promise.reject(new Error("No at_hash in id_token"));if(!t.id_token)return o.default.error("No id_token"),Promise.reject(new Error("No id_token"));var e=this._joseUtil.parseJwt(t.id_token);if(!e||!e.header)return o.default.error("Failed to parse id_token",e),Promise.reject(new Error("Failed to parse id_token"));var n=e.header.alg;if(!n||5!==n.length)return o.default.error("Unsupported alg:",n),Promise.reject(new Error("Unsupported alg: "+n));var r=n.substr(2,3);if(!r)return o.default.error("Unsupported alg:",n,r),Promise.reject(new Error("Unsupported alg: "+n));if(r=parseInt(r),256!==r&&384!==r&&512!==r)return o.default.error("Unsupported alg:",n,r),Promise.reject(new Error("Unsupported alg: "+n));var i="sha"+r,s=this._joseUtil.hashString(t.access_token,i);if(!s)return o.default.error("access_token hash failed:",i),Promise.reject(new Error("Failed to validate at_hash"));var a=s.substr(0,s.length/2),u=this._joseUtil.hexToBase64Url(a);return u!==t.profile.at_hash?(o.default.error("Failed to validate at_hash",u,t.profile.at_hash),Promise.reject(new Error("Failed to validate at_hash"))):Promise.resolve(t)},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.MetadataService=void 0;var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:c.default;if(i(this,t),!e)throw a.default.error("No settings passed to MetadataService"),new Error("settings");this._settings=e,this._jsonService=new n}return t.prototype.getMetadata=function(){var t=this;return a.default.debug("MetadataService.getMetadata"),this._settings.metadata?(a.default.debug("Returning metadata from settings"),Promise.resolve(this._settings.metadata)):this.metadataUrl?(a.default.debug("getting metadata from",this.metadataUrl),this._jsonService.getJson(this.metadataUrl).then(function(e){return a.default.debug("json received"),t._settings.metadata=e,e})):(a.default.error("No authority or metadataUrl configured on settings"),Promise.reject(new Error("No authority or metadataUrl configured on settings")))},t.prototype.getIssuer=function(){return a.default.debug("MetadataService.getIssuer"),this._getMetadataProperty("issuer")},t.prototype.getAuthorizationEndpoint=function(){return a.default.debug("MetadataService.getAuthorizationEndpoint"),this._getMetadataProperty("authorization_endpoint")},t.prototype.getUserInfoEndpoint=function(){return a.default.debug("MetadataService.getUserInfoEndpoint"),this._getMetadataProperty("userinfo_endpoint")},t.prototype.getTokenEndpoint=function(){return a.default.debug("MetadataService.getTokenEndpoint"),this._getMetadataProperty("token_endpoint",!0)},t.prototype.getCheckSessionIframe=function(){return a.default.debug("MetadataService.getCheckSessionIframe"),this._getMetadataProperty("check_session_iframe",!0)},t.prototype.getEndSessionEndpoint=function(){return a.default.debug("MetadataService.getEndSessionEndpoint"),this._getMetadataProperty("end_session_endpoint",!0)},t.prototype.getRevocationEndpoint=function(){return a.default.debug("MetadataService.getRevocationEndpoint"),this._getMetadataProperty("revocation_endpoint",!0)},t.prototype._getMetadataProperty=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return a.default.debug("MetadataService._getMetadataProperty",t),this.getMetadata().then(function(n){if(a.default.debug("metadata recieved"),void 0===n[t]){if(e===!0)return void a.default.warn("Metadata does not contain optional property "+t);throw a.default.error("Metadata does not contain property "+t),new Error("Metadata does not contain property "+t)}return n[t]})},t.prototype.getSigningKeys=function(){var t=this;return a.default.debug("MetadataService.getSigningKeys"),this._settings.signingKeys?(a.default.debug("Returning signingKeys from settings"),Promise.resolve(this._settings.signingKeys)):this._getMetadataProperty("jwks_uri").then(function(e){return a.default.debug("jwks_uri received",e),t._jsonService.getJson(e).then(function(e){if(a.default.debug("key set received",e),!e.keys)throw a.default.error("Missing keys on keyset"),new Error("Missing keys on keyset");return t._settings.signingKeys=e.keys,t._settings.signingKeys})})},s(t,[{key:"metadataUrl",get:function(){return this._metadataUrl||(this._settings.metadataUrl?this._metadataUrl=this._settings.metadataUrl:(this._metadataUrl=this._settings.authority,this._metadataUrl&&this._metadataUrl.indexOf(f)<0&&("/"!==this._metadataUrl[this._metadataUrl.length-1]&&(this._metadataUrl+="/"),this._metadataUrl+=f))),this._metadataUrl}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.JsonService=void 0;var s=n(328),o=r(s),a=n(332),u=r(a);e.JsonService=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:u.default.XMLHttpRequest;i(this,t),this._XMLHttpRequest=e}return t.prototype.getJson=function(t,e){var n=this;if(o.default.debug("JsonService.getJson",t),!t)throw o.default.error("No url passed"),new Error("url");return new Promise(function(r,i){var s=new n._XMLHttpRequest;s.open("GET",t),s.onload=function(){if(o.default.debug("HTTP response received, status",s.status),200===s.status)try{r(JSON.parse(s.responseText))}catch(t){o.default.error("Error parsing JSON response",t.message),i(t)}else i(Error(s.statusText+" ("+s.status+")"))},s.onerror=function(){o.default.error("network error"),i(Error("Network Error"))},e&&(o.default.debug("token passed, setting Authorization header"),s.setRequestHeader("Authorization","Bearer "+e)),s.send()})},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.UserInfoService=void 0;var s=n(335),o=r(s),a=n(334),u=r(a),c=n(328),f=r(c);e.UserInfoService=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;if(i(this,t),!e)throw f.default.error("No settings passed to UserInfoService"),new Error("settings");this._settings=e,this._jsonService=new n,this._metadataService=new r(this._settings)}return t.prototype.getClaims=function(t){var e=this;return f.default.debug("UserInfoService.getClaims"),t?this._metadataService.getUserInfoEndpoint().then(function(n){return f.default.debug("received userinfo url",n),e._jsonService.getJson(n,t).then(function(t){return f.default.debug("claims received",t),t})}):(f.default.error("No token passed"),Promise.reject(new Error("A token is required")))},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.ErrorResponse=void 0;var a=n(328),u=r(a);e.ErrorResponse=function(t){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.error,o=n.error_description,a=n.error_uri,c=n.state;if(i(this,e),!r)throw u.default.error("No error passed to ErrorResponse"),new Error("error");var f=s(this,t.call(this,o||r));return f.name="ErrorResponse",f.error=r,f.error_description=o,f.error_uri=a,f.state=c,f}return o(e,t),e}(Error)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.JoseUtil=void 0;var s=n(339),o=n(328),a=r(o),u=["RS256","RS384","RS512","PS256","PS384","PS512","ES256","ES384","ES512"];e.JoseUtil=function(){function t(){i(this,t)}return t.parseJwt=function(t){a.default.debug("JoseUtil.parseJwt");try{var e=s.jws.JWS.parse(t);return{header:e.headerObj,payload:e.payloadObj}}catch(t){a.default.error(t)}},t.validateJwt=function(e,n,r,i,o,u){a.default.debug("JoseUtil.validateJwt");try{if("RSA"===n.kty)if(n.e&&n.n)n=s.KEYUTIL.getKey(n);else{if(!n.x5c||!n.x5c.length)return a.default.error("RSA key missing key material",n),Promise.reject(new Error("RSA key missing key material"));n=s.KEYUTIL.getKey(s.X509.getPublicKeyFromCertPEM(n.x5c[0]))}else{if("EC"!==n.kty)return a.default.error("Unsupported key type",n&&n.kty),Promise.reject(new Error("Unsupported key type: "+n&&n.kty));if(!(n.crv&&n.x&&n.y))return a.default.error("EC key missing key material",n),Promise.reject(new Error("EC key missing key material"));n=s.KEYUTIL.getKey(n)}return t._validateJwt(e,n,r,i,o,u)}catch(t){return a.default.error(t&&t.message||t),Promise.reject("JWT validation failed")}},t._validateJwt=function(e,n,r,i,o,c){a.default.debug("JoseUtil._validateJwt"),o||(o=0),c||(c=parseInt(Date.now()/1e3));var f=t.parseJwt(e).payload;if(!f.iss)return a.default.error("issuer was not provided"),Promise.reject(new Error("issuer was not provided"));if(f.iss!==r)return a.default.error("Invalid issuer in token",f.iss),Promise.reject(new Error("Invalid issuer in token: "+f.iss));if(!f.aud)return a.default.error("aud was not provided"),Promise.reject(new Error("aud was not provided"));var h=f.aud===i||Array.isArray(f.aud)&&f.aud.indexOf(i)>=0;if(!h)return a.default.error("Invalid audience in token",f.aud),Promise.reject(new Error("Invalid audience in token: "+f.aud));var l=c+o,d=c-o;if(!f.iat)return a.default.error("iat was not provided"),Promise.reject(new Error("iat was not provided"));if(l>6)+ur.charAt(63&n);if(e+1==t.length?(n=parseInt(t.substring(e,e+1),16),r+=ur.charAt(n<<2)):e+2==t.length&&(n=parseInt(t.substring(e,e+2),16),r+=ur.charAt(n>>2)+ur.charAt((3&n)<<4)),cr)for(;(3&r.length)>0;)r+=cr;return r}function i(t){var e,n,r,i="",s=0;for(e=0;e>2),n=3&r,s=1):1==s?(i+=h(n<<2|r>>4),n=15&r,s=2):2==s?(i+=h(n),i+=h(r>>2),n=3&r,s=3):(i+=h(n<<2|r>>4),i+=h(15&r),s=0));return 1==s&&(i+=h(n<<2)),i}function s(t){var e,n=i(t),r=new Array;for(e=0;2*e=0;){var o=e*this[t++]+n[r]+i;i=Math.floor(o/67108864),n[r++]=67108863&o}return i}function c(t,e,n,r,i,s){for(var o=32767&e,a=e>>15;--s>=0;){var u=32767&this[t],c=this[t++]>>15,f=a*u+c*o;u=o*u+((32767&f)<<15)+n[r]+(1073741823&i),i=(u>>>30)+(f>>>15)+a*c+(i>>>30),n[r++]=1073741823&u}return i}function f(t,e,n,r,i,s){for(var o=16383&e,a=e>>14;--s>=0;){var u=16383&this[t],c=this[t++]>>14,f=a*u+c*o;u=o*u+((16383&f)<<14)+n[r]+i,i=(u>>28)+(f>>14)+a*c,n[r++]=268435455&u}return i}function h(t){return gr.charAt(t)}function l(t,e){var n=yr[t.charCodeAt(e)];return null==n?-1:n}function d(t){for(var e=this.t-1;e>=0;--e)t[e]=this[e];t.t=this.t,t.s=this.s}function p(t){this.t=1,this.s=t<0?-1:0,t>0?this[0]=t:t<-1?this[0]=t+this.DV:this.t=0}function g(t){var e=a();return e.fromInt(t),e}function y(t,e){var n;if(16==e)n=4;else if(8==e)n=3;else if(256==e)n=8;else if(2==e)n=1;else if(32==e)n=5;else{if(4!=e)return void this.fromRadix(t,e);n=2}this.t=0,this.s=0;for(var r=t.length,i=!1,s=0;--r>=0;){var a=8==n?255&t[r]:l(t,r);a<0?"-"==t.charAt(r)&&(i=!0):(i=!1,0==s?this[this.t++]=a:s+n>this.DB?(this[this.t-1]|=(a&(1<>this.DB-s):this[this.t-1]|=a<=this.DB&&(s-=this.DB))}8==n&&0!=(128&t[0])&&(this.s=-1,s>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==t;)--this.t}function m(t){if(this.s<0)return"-"+this.negate().toString(t);var e;if(16==t)e=4;else if(8==t)e=3;else if(2==t)e=1;else if(32==t)e=5;else{if(4!=t)return this.toRadix(t);e=2}var n,r=(1<0)for(a>a)>0&&(i=!0,s=h(n));o>=0;)a>(a+=this.DB-e)):(n=this[o]>>(a-=e)&r,a<=0&&(a+=this.DB,--o)),n>0&&(i=!0),i&&(s+=h(n));return i?s:"0"}function S(){var t=a();return o.ZERO.subTo(this,t),t}function b(){return this.s<0?this.negate():this}function w(t){var e=this.s-t.s;if(0!=e)return e;var n=this.t;if(e=n-t.t,0!=e)return this.s<0?-e:e;for(;--n>=0;)if(0!=(e=this[n]-t[n]))return e;return 0}function x(t){var e,n=1;return 0!=(e=t>>>16)&&(t=e,n+=16),0!=(e=t>>8)&&(t=e,n+=8),0!=(e=t>>4)&&(t=e,n+=4),0!=(e=t>>2)&&(t=e,n+=2),0!=(e=t>>1)&&(t=e,n+=1),n}function _(){return this.t<=0?0:this.DB*(this.t-1)+x(this[this.t-1]^this.s&this.DM)}function E(t,e){var n;for(n=this.t-1;n>=0;--n)e[n+t]=this[n];for(n=t-1;n>=0;--n)e[n]=0;e.t=this.t+t,e.s=this.s}function F(t,e){for(var n=t;n=0;--n)e[n+o+1]=this[n]>>i|a,a=(this[n]&s)<=0;--n)e[n]=0;e[o]=a,e.t=this.t+o+1,e.s=this.s,e.clamp()}function P(t,e){e.s=this.s;var n=Math.floor(t/this.DB);if(n>=this.t)return void(e.t=0);var r=t%this.DB,i=this.DB-r,s=(1<>r;for(var o=n+1;o>r;r>0&&(e[this.t-n-1]|=(this.s&s)<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r-=t.s}e.s=r<0?-1:0,r<-1?e[n++]=this.DV+r:r>0&&(e[n++]=r),e.t=n,e.clamp()}function C(t,e){var n=this.abs(),r=t.abs(),i=n.t;for(e.t=i+r.t;--i>=0;)e[i]=0;for(i=0;i=0;)t[n]=0;for(n=0;n=e.DV&&(t[n+e.t]-=e.DV,t[n+e.t+1]=1)}t.t>0&&(t[t.t-1]+=e.am(n,e[n],t,2*n,0,1)),t.s=0,t.clamp()}function I(t,e,n){var r=t.abs();if(!(r.t<=0)){var i=this.abs();if(i.t0?(r.lShiftTo(f,s),i.lShiftTo(f,n)):(r.copyTo(s),i.copyTo(n));var h=s.t,l=s[h-1];if(0!=l){var d=l*(1<1?s[h-2]>>this.F2:0),p=this.FV/d,g=(1<=0&&(n[n.t++]=1,n.subTo(S,n)),o.ONE.dlShiftTo(h,S),S.subTo(s,s);s.t=0;){var b=n[--v]==l?this.DM:Math.floor(n[v]*p+(n[v-1]+y)*g);if((n[v]+=s.am(0,b,n,m,0,h))0&&n.rShiftTo(f,n),u<0&&o.ZERO.subTo(n,n)}}}function T(t){var e=a();return this.abs().divRemTo(t,null,e),this.s<0&&e.compareTo(o.ZERO)>0&&t.subTo(e,e),e}function D(t){this.m=t}function R(t){return t.s<0||t.compareTo(this.m)>=0?t.mod(this.m):t}function H(t){return t}function k(t){t.divRemTo(this.m,null,t)}function N(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function B(t,e){t.squareTo(e),this.reduce(e)}function M(){if(this.t<1)return 0;var t=this[0];if(0==(1&t))return 0;var e=3&t;return e=e*(2-(15&t)*e)&15,e=e*(2-(255&t)*e)&255,e=e*(2-((65535&t)*e&65535))&65535,e=e*(2-t*e%this.DV)%this.DV,e>0?this.DV-e:-e}function V(t){this.m=t,this.mp=t.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(e,e),e}function L(t){var e=a();return t.copyTo(e),this.reduce(e),e}function U(t){for(;t.t<=this.mt2;)t[t.t++]=0;for(var e=0;e>15)*this.mpl&this.um)<<15)&t.DM;for(n=e+this.m.t,t[n]+=this.m.am(0,r,t,e,0,this.m.t);t[n]>=t.DV;)t[n]-=t.DV,t[++n]++}t.clamp(),t.drShiftTo(this.m.t,t),t.compareTo(this.m)>=0&&t.subTo(this.m,t)}function q(t,e){t.squareTo(e),this.reduce(e)}function W(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function J(){return 0==(this.t>0?1&this[0]:this.s)}function z(t,e){if(t>4294967295||t<1)return o.ONE;var n=a(),r=a(),i=e.convert(this),s=x(t)-1;for(i.copyTo(n);--s>=0;)if(e.sqrTo(n,r),(t&1<0)e.mulTo(r,i,n);else{var u=n;n=r,r=u}return e.revert(n)}function G(t,e){var n;return n=t<256||e.isEven()?new D(e):new V(e),this.exp(t,n)}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ -function G(){var t=a();return this.copyTo(t),t}function X(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>24}function Q(){return 0==this.t?this.s:this[0]<<16>>16}function Z(t){return Math.floor(Math.LN2*this.DB/Math.log(t))}function tt(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function et(t){if(null==t&&(t=10),0==this.signum()||t<2||t>36)return"0";var e=this.chunkSize(t),n=Math.pow(t,e),r=g(n),i=a(),s=a(),o="";for(this.divRemTo(r,i,s);i.signum()>0;)o=(n+s.intValue()).toString(t).substr(1)+o,i.divRemTo(r,i,s);return s.intValue().toString(t)+o}function nt(t,e){this.fromInt(0),null==e&&(e=10);for(var n=this.chunkSize(e),r=Math.pow(e,n),i=!1,s=0,a=0,u=0;u=n&&(this.dMultiply(r),this.dAddOffset(a,0),s=0,a=0))}s>0&&(this.dMultiply(Math.pow(e,s)),this.dAddOffset(a,0)),i&&o.ZERO.subTo(this,this)}function rt(t,e,n){if("number"==typeof e)if(t<2)this.fromInt(1);else for(this.fromNumber(t,n),this.testBit(t-1)||this.bitwiseTo(o.ONE.shiftLeft(t-1),ht,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(e);)this.dAddOffset(2,0),this.bitLength()>t&&this.subTo(o.ONE.shiftLeft(t-1),this);else{var r=new Array,i=7&t;r.length=(t>>3)+1,e.nextBytes(r),i>0?r[0]&=(1<0)for(r>r)!=(this.s&this.DM)>>r&&(e[i++]=n|this.s<=0;)r<8?(n=(this[t]&(1<>(r+=this.DB-8)):(n=this[t]>>(r-=8)&255,r<=0&&(r+=this.DB,--t)),0!=(128&n)&&(n|=-256),0==i&&(128&this.s)!=(128&n)&&++i,(i>0||n!=this.s)&&(e[i++]=n);return e}function st(t){return 0==this.compareTo(t)}function ot(t){return this.compareTo(t)<0?this:t}function at(t){return this.compareTo(t)>0?this:t}function ut(t,e,n){var r,i,s=Math.min(t.t,this.t);for(r=0;r>=16,e+=16),0==(255&t)&&(t>>=8,e+=8),0==(15&t)&&(t>>=4,e+=4),0==(3&t)&&(t>>=2,e+=2),0==(1&t)&&++e,e}function wt(){for(var t=0;t=this.t?0!=this.s:0!=(this[e]&1<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r+=t.s}e.s=r<0?-1:0,r>0?e[n++]=r:r<-1&&(e[n++]=this.DV+r),e.t=n,e.clamp()}function Tt(t){var e=a();return this.addTo(t,e),e}function jt(t){var e=a();return this.subTo(t,e),e}function It(t){var e=a();return this.multiplyTo(t,e),e}function Rt(){var t=a();return this.squareTo(t),t}function Dt(t){var e=a();return this.divRemTo(t,e,null),e}function Ht(t){var e=a();return this.divRemTo(t,null,e),e}function kt(t){var e=a(),n=a();return this.divRemTo(t,e,n),new Array(e,n)}function Nt(t){this[this.t]=this.am(0,t-1,this,0,0,this.t),++this.t,this.clamp()}function Bt(t,e){if(0!=t){for(;this.t<=e;)this[this.t++]=0;for(this[e]+=t;this[e]>=this.DV;)this[e]-=this.DV,++e>=this.t&&(this[this.t++]=0),++this[e]}}function Mt(){}function Vt(t){return t}function Lt(t,e,n){t.multiplyTo(e,n)}function Kt(t,e){t.squareTo(e)}function Ut(t){return this.exp(t,new Mt)}function qt(t,e,n){var r=Math.min(this.t+t.t,e);for(n.s=0,n.t=r;r>0;)n[--r]=0;var i;for(i=n.t-this.t;r=0;)n[r]=0;for(r=Math.max(e-this.t,0);r2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var e=a();return t.copyTo(e),this.reduce(e),e}function Yt(t){return t}function Gt(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);t.compareTo(this.m)>=0;)t.subTo(this.m,t)}function Xt(t,e){t.squareTo(e),this.reduce(e)}function $t(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function Qt(t,e){var n,r,i=t.bitLength(),s=g(1);if(i<=0)return s;n=i<18?1:i<48?3:i<144?4:i<768?5:6,r=i<8?new R(e):e.isEven()?new zt(e):new V(e);var o=new Array,u=3,c=n-1,f=(1<1){var h=a();for(r.sqrTo(o[1],h);u<=f;)o[u]=a(),r.mulTo(h,o[u-2],o[u]),u+=2}var l,d,p=t.t-1,y=!0,v=a();for(i=_(t[p])-1;p>=0;){for(i>=c?l=t[p]>>i-c&f:(l=(t[p]&(1<0&&(l|=t[p-1]>>this.DB+i-c)),u=n;0==(1&l);)l>>=1,--u;if((i-=u)<0&&(i+=this.DB,--p),y)o[l].copyTo(s),y=!1;else{for(;u>1;)r.sqrTo(s,v),r.sqrTo(v,s),u-=2;u>0?r.sqrTo(s,v):(d=s,s=v,v=d),r.mulTo(v,o[l],s)}for(;p>=0&&0==(t[p]&1<0&&(e.rShiftTo(s,e),n.rShiftTo(s,n));e.signum()>0;)(i=e.getLowestSetBit())>0&&e.rShiftTo(i,e),(i=n.getLowestSetBit())>0&&n.rShiftTo(i,n),e.compareTo(n)>=0?(e.subTo(n,e),e.rShiftTo(1,e)):(n.subTo(e,n),n.rShiftTo(1,n));return s>0&&n.lShiftTo(s,n),n}function te(t){if(t<=0)return 0;var e=this.DV%t,n=this.s<0?t-1:0;if(this.t>0)if(0==e)n=this[0]%t;else for(var r=this.t-1;r>=0;--r)n=(e*n+this[r])%t;return n}function ee(t){var e=t.isEven();if(this.isEven()&&e||0==t.signum())return o.ZERO;for(var n=t.clone(),r=this.clone(),i=g(1),s=g(0),a=g(0),u=g(1);0!=n.signum();){for(;n.isEven();)n.rShiftTo(1,n),e?(i.isEven()&&s.isEven()||(i.addTo(this,i),s.subTo(t,s)),i.rShiftTo(1,i)):s.isEven()||s.subTo(t,s),s.rShiftTo(1,s);for(;r.isEven();)r.rShiftTo(1,r),e?(a.isEven()&&u.isEven()||(a.addTo(this,a),u.subTo(t,u)),a.rShiftTo(1,a)):u.isEven()||u.subTo(t,u),u.rShiftTo(1,u);n.compareTo(r)>=0?(n.subTo(r,n),e&&i.subTo(a,i),s.subTo(u,s)):(r.subTo(n,r),e&&a.subTo(i,a),u.subTo(s,u))}return 0!=r.compareTo(o.ONE)?o.ZERO:u.compareTo(t)>=0?u.subtract(t):u.signum()<0?(u.addTo(t,u),u.signum()<0?u.add(t):u):u}function ne(t){var e,n=this.abs();if(1==n.t&&n[0]<=vr[vr.length-1]){for(e=0;e>1,t>vr.length&&(t=vr.length);for(var i=a(),s=0;s>24}function Q(){return 0==this.t?this.s:this[0]<<16>>16}function Z(t){return Math.floor(Math.LN2*this.DB/Math.log(t))}function tt(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function et(t){if(null==t&&(t=10),0==this.signum()||t<2||t>36)return"0";var e=this.chunkSize(t),n=Math.pow(t,e),r=g(n),i=a(),s=a(),o="";for(this.divRemTo(r,i,s);i.signum()>0;)o=(n+s.intValue()).toString(t).substr(1)+o,i.divRemTo(r,i,s);return s.intValue().toString(t)+o}function nt(t,e){this.fromInt(0),null==e&&(e=10);for(var n=this.chunkSize(e),r=Math.pow(e,n),i=!1,s=0,a=0,u=0;u=n&&(this.dMultiply(r),this.dAddOffset(a,0),s=0,a=0))}s>0&&(this.dMultiply(Math.pow(e,s)),this.dAddOffset(a,0)),i&&o.ZERO.subTo(this,this)}function rt(t,e,n){if("number"==typeof e)if(t<2)this.fromInt(1);else for(this.fromNumber(t,n),this.testBit(t-1)||this.bitwiseTo(o.ONE.shiftLeft(t-1),ht,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(e);)this.dAddOffset(2,0),this.bitLength()>t&&this.subTo(o.ONE.shiftLeft(t-1),this);else{var r=new Array,i=7&t;r.length=(t>>3)+1,e.nextBytes(r),i>0?r[0]&=(1<0)for(r>r)!=(this.s&this.DM)>>r&&(e[i++]=n|this.s<=0;)r<8?(n=(this[t]&(1<>(r+=this.DB-8)):(n=this[t]>>(r-=8)&255,r<=0&&(r+=this.DB,--t)),0!=(128&n)&&(n|=-256),0==i&&(128&this.s)!=(128&n)&&++i,(i>0||n!=this.s)&&(e[i++]=n);return e}function st(t){return 0==this.compareTo(t)}function ot(t){return this.compareTo(t)<0?this:t}function at(t){return this.compareTo(t)>0?this:t}function ut(t,e,n){var r,i,s=Math.min(t.t,this.t);for(r=0;r>=16,e+=16),0==(255&t)&&(t>>=8,e+=8),0==(15&t)&&(t>>=4,e+=4),0==(3&t)&&(t>>=2,e+=2),0==(1&t)&&++e,e}function wt(){for(var t=0;t=this.t?0!=this.s:0!=(this[e]&1<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r+=t.s}e.s=r<0?-1:0,r>0?e[n++]=r:r<-1&&(e[n++]=this.DV+r),e.t=n,e.clamp()}function jt(t){var e=a();return this.addTo(t,e),e}function It(t){var e=a();return this.subTo(t,e),e}function Tt(t){var e=a();return this.multiplyTo(t,e),e}function Dt(){var t=a();return this.squareTo(t),t}function Rt(t){var e=a();return this.divRemTo(t,e,null),e}function Ht(t){var e=a();return this.divRemTo(t,null,e),e}function kt(t){var e=a(),n=a();return this.divRemTo(t,e,n),new Array(e,n)}function Nt(t){this[this.t]=this.am(0,t-1,this,0,0,this.t),++this.t,this.clamp()}function Bt(t,e){if(0!=t){for(;this.t<=e;)this[this.t++]=0;for(this[e]+=t;this[e]>=this.DV;)this[e]-=this.DV,++e>=this.t&&(this[this.t++]=0),++this[e]}}function Mt(){}function Vt(t){return t}function Kt(t,e,n){t.multiplyTo(e,n)}function Lt(t,e){t.squareTo(e)}function Ut(t){return this.exp(t,new Mt)}function qt(t,e,n){var r=Math.min(this.t+t.t,e);for(n.s=0,n.t=r;r>0;)n[--r]=0;var i;for(i=n.t-this.t;r=0;)n[r]=0;for(r=Math.max(e-this.t,0);r2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var e=a();return t.copyTo(e),this.reduce(e),e}function Gt(t){return t}function Yt(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);t.compareTo(this.m)>=0;)t.subTo(this.m,t)}function Xt(t,e){t.squareTo(e),this.reduce(e)}function $t(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function Qt(t,e){var n,r,i=t.bitLength(),s=g(1);if(i<=0)return s;n=i<18?1:i<48?3:i<144?4:i<768?5:6,r=i<8?new D(e):e.isEven()?new Jt(e):new V(e);var o=new Array,u=3,c=n-1,f=(1<1){var h=a();for(r.sqrTo(o[1],h);u<=f;)o[u]=a(),r.mulTo(h,o[u-2],o[u]),u+=2}var l,d,p=t.t-1,y=!0,v=a();for(i=x(t[p])-1;p>=0;){for(i>=c?l=t[p]>>i-c&f:(l=(t[p]&(1<0&&(l|=t[p-1]>>this.DB+i-c)),u=n;0==(1&l);)l>>=1,--u;if((i-=u)<0&&(i+=this.DB,--p),y)o[l].copyTo(s),y=!1;else{for(;u>1;)r.sqrTo(s,v),r.sqrTo(v,s),u-=2;u>0?r.sqrTo(s,v):(d=s,s=v,v=d),r.mulTo(v,o[l],s)}for(;p>=0&&0==(t[p]&1<0&&(e.rShiftTo(s,e),n.rShiftTo(s,n));e.signum()>0;)(i=e.getLowestSetBit())>0&&e.rShiftTo(i,e),(i=n.getLowestSetBit())>0&&n.rShiftTo(i,n),e.compareTo(n)>=0?(e.subTo(n,e),e.rShiftTo(1,e)):(n.subTo(e,n),n.rShiftTo(1,n));return s>0&&n.lShiftTo(s,n),n}function te(t){if(t<=0)return 0;var e=this.DV%t,n=this.s<0?t-1:0;if(this.t>0)if(0==e)n=this[0]%t;else for(var r=this.t-1;r>=0;--r)n=(e*n+this[r])%t;return n}function ee(t){var e=t.isEven();if(this.isEven()&&e||0==t.signum())return o.ZERO;for(var n=t.clone(),r=this.clone(),i=g(1),s=g(0),a=g(0),u=g(1);0!=n.signum();){for(;n.isEven();)n.rShiftTo(1,n),e?(i.isEven()&&s.isEven()||(i.addTo(this,i),s.subTo(t,s)),i.rShiftTo(1,i)):s.isEven()||s.subTo(t,s),s.rShiftTo(1,s);for(;r.isEven();)r.rShiftTo(1,r),e?(a.isEven()&&u.isEven()||(a.addTo(this,a),u.subTo(t,u)),a.rShiftTo(1,a)):u.isEven()||u.subTo(t,u),u.rShiftTo(1,u);n.compareTo(r)>=0?(n.subTo(r,n),e&&i.subTo(a,i),s.subTo(u,s)):(r.subTo(n,r),e&&a.subTo(i,a),u.subTo(s,u))}return 0!=r.compareTo(o.ONE)?o.ZERO:u.compareTo(t)>=0?u.subtract(t):u.signum()<0?(u.addTo(t,u),u.signum()<0?u.add(t):u):u}function ne(t){var e,n=this.abs();if(1==n.t&&n[0]<=vr[vr.length-1]){for(e=0;e>1,t>vr.length&&(t=vr.length);for(var i=a(),s=0;s>8&255,br[wr++]^=t>>16&255,br[wr++]^=t>>24&255,wr>=_r&&(wr-=_r)}function ce(){ue((new Date).getTime())}function fe(){if(null==Sr){for(ce(),Sr=ae(),Sr.init(br),wr=0;wr>8&255,br[wr++]^=t>>16&255,br[wr++]^=t>>24&255,wr>=xr&&(wr-=xr)}function ce(){ue((new Date).getTime())}function fe(){if(null==Sr){for(ce(),Sr=ae(),Sr.init(br),wr=0;wr=0&&e>0;){var i=t.charCodeAt(r--);i<128?n[--e]=i:i>127&&i<2048?(n[--e]=63&i|128,n[--e]=i>>6|192):(n[--e]=63&i|128,n[--e]=i>>6&63|128,n[--e]=i>>12|224)}n[--e]=0;for(var s=new le,a=new Array;e>2;){for(a[0]=0;0==a[0];)s.nextBytes(a);n[--e]=a[0]}return n[--e]=2,n[--e]=0,new o(n)}function ge(t,e,n){for(var r="",i=0;r.length>24,(16711680&i)>>16,(65280&i)>>8,255&i]))),i+=1;return r}function ye(t,e,n){if(t.length+2*Fr+2>e)throw"Message too long for RSA";var r,i="";for(r=0;r0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16)):alert("Invalid RSA public key")}function Se(t){return t.modPowInt(this.e,this.n)}function be(t){var e=pe(t,this.n.bitLength()+7>>3);if(null==e)return null;var n=this.doPublic(e);if(null==n)return null;var r=n.toString(16);return 0==(1&r.length)?r:"0"+r}function we(t,e){var n=ye(t,this.n.bitLength()+7>>3,e);if(null==n)return null;var r=this.doPublic(n);if(null==r)return null;var i=r.toString(16);return 0==(1&i.length)?i:"0"+i}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ +function de(t,e){return new o(t,e)}function pe(t,e){if(e=0&&e>0;){var i=t.charCodeAt(r--);i<128?n[--e]=i:i>127&&i<2048?(n[--e]=63&i|128,n[--e]=i>>6|192):(n[--e]=63&i|128,n[--e]=i>>6&63|128,n[--e]=i>>12|224)}n[--e]=0;for(var s=new le,a=new Array;e>2;){for(a[0]=0;0==a[0];)s.nextBytes(a);n[--e]=a[0]}return n[--e]=2,n[--e]=0,new o(n)}function ge(t,e,n){for(var r="",i=0;r.length>24,(16711680&i)>>16,(65280&i)>>8,255&i]))),i+=1;return r}function ye(t,e,n){if(t.length+2*Ar+2>e)throw"Message too long for RSA";var r,i="";for(r=0;r0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16)):alert("Invalid RSA public key")}function Se(t){return t.modPowInt(this.e,this.n)}function be(t){var e=pe(t,this.n.bitLength()+7>>3);if(null==e)return null;var n=this.doPublic(e);if(null==n)return null;var r=n.toString(16);return 0==(1&r.length)?r:"0"+r}function we(t,e){var n=ye(t,this.n.bitLength()+7>>3,e);if(null==n)return null;var r=this.doPublic(n);if(null==r)return null;var i=r.toString(16);return 0==(1&i.length)?i:"0"+i}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ -function _e(t,e){for(var n=t.toByteArray(),r=0;r=n.length)return null;for(var i="";++r191&&s<224?(i+=String.fromCharCode((31&s)<<6|63&n[r+1]),++r):(i+=String.fromCharCode((15&s)<<12|(63&n[r+1])<<6|63&n[r+2]),r+=2)}return i}function xe(t,e,n){for(var r="",i=0;r.length>24,(16711680&i)>>16,(65280&i)>>8,255&i])),i+=1;return r}function Ee(t,e,n){t=t.toByteArray();var r;for(r=0;r0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16),this.d=de(n,16)):alert("Invalid RSA private key")}function Fe(t,e,n,r,i,s,o,a){if(this.isPrivate=!0,null==t)throw"RSASetPrivateEx N == null";if(null==e)throw"RSASetPrivateEx E == null";if(0==t.length)throw"RSASetPrivateEx N.length == 0";if(0==e.length)throw"RSASetPrivateEx E.length == 0";null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16),this.d=de(n,16),this.p=de(r,16),this.q=de(i,16),this.dmp1=de(s,16),this.dmq1=de(o,16),this.coeff=de(a,16)):alert("Invalid RSA private key in RSASetPrivateEx")}function Pe(t,e){var n=new le,r=t>>1;this.e=parseInt(e,16);for(var i=new o(e,16);;){for(;this.p=new o(t-r,1,n),0!=this.p.subtract(o.ONE).gcd(i).compareTo(o.ONE)||!this.p.isProbablePrime(10););for(;this.q=new o(r,1,n),0!=this.q.subtract(o.ONE).gcd(i).compareTo(o.ONE)||!this.q.isProbablePrime(10););if(this.p.compareTo(this.q)<=0){var s=this.p;this.p=this.q,this.q=s}var a=this.p.subtract(o.ONE),u=this.q.subtract(o.ONE),c=a.multiply(u);if(0==c.gcd(i).compareTo(o.ONE)){this.n=this.p.multiply(this.q),this.d=i.modInverse(c),this.dmp1=this.d.mod(a),this.dmq1=this.d.mod(u),this.coeff=this.q.modInverse(this.p);break}}}function Oe(t){if(null==this.p||null==this.q)return t.modPow(this.d,this.n);for(var e=t.mod(this.p).modPow(this.dmp1,this.p),n=t.mod(this.q).modPow(this.dmq1,this.q);e.compareTo(n)<0;)e=e.add(this.p);return e.subtract(n).multiply(this.coeff).mod(this.p).multiply(this.q).add(n)}function Ce(t){var e=de(t,16),n=this.doPrivate(e);return null==n?null:_e(n,this.n.bitLength()+7>>3)}function Te(t,e){var n=de(t,16),r=this.doPrivate(n);return null==r?null:Ee(r,this.n.bitLength()+7>>3,e)}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ +function xe(t,e){for(var n=t.toByteArray(),r=0;r=n.length)return null;for(var i="";++r191&&s<224?(i+=String.fromCharCode((31&s)<<6|63&n[r+1]),++r):(i+=String.fromCharCode((15&s)<<12|(63&n[r+1])<<6|63&n[r+2]),r+=2)}return i}function _e(t,e,n){for(var r="",i=0;r.length>24,(16711680&i)>>16,(65280&i)>>8,255&i])),i+=1;return r}function Ee(t,e,n){t=t.toByteArray();var r;for(r=0;r0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16),this.d=de(n,16)):alert("Invalid RSA private key")}function Ae(t,e,n,r,i,s,o,a){if(this.isPrivate=!0,null==t)throw"RSASetPrivateEx N == null";if(null==e)throw"RSASetPrivateEx E == null";if(0==t.length)throw"RSASetPrivateEx N.length == 0";if(0==e.length)throw"RSASetPrivateEx E.length == 0";null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16),this.d=de(n,16),this.p=de(r,16),this.q=de(i,16),this.dmp1=de(s,16),this.dmq1=de(o,16),this.coeff=de(a,16)):alert("Invalid RSA private key in RSASetPrivateEx")}function Pe(t,e){var n=new le,r=t>>1;this.e=parseInt(e,16);for(var i=new o(e,16);;){for(;this.p=new o(t-r,1,n),0!=this.p.subtract(o.ONE).gcd(i).compareTo(o.ONE)||!this.p.isProbablePrime(10););for(;this.q=new o(r,1,n),0!=this.q.subtract(o.ONE).gcd(i).compareTo(o.ONE)||!this.q.isProbablePrime(10););if(this.p.compareTo(this.q)<=0){var s=this.p;this.p=this.q,this.q=s}var a=this.p.subtract(o.ONE),u=this.q.subtract(o.ONE),c=a.multiply(u);if(0==c.gcd(i).compareTo(o.ONE)){this.n=this.p.multiply(this.q),this.d=i.modInverse(c),this.dmp1=this.d.mod(a),this.dmq1=this.d.mod(u),this.coeff=this.q.modInverse(this.p);break}}}function Oe(t){if(null==this.p||null==this.q)return t.modPow(this.d,this.n);for(var e=t.mod(this.p).modPow(this.dmp1,this.p),n=t.mod(this.q).modPow(this.dmq1,this.q);e.compareTo(n)<0;)e=e.add(this.p);return e.subtract(n).multiply(this.coeff).mod(this.p).multiply(this.q).add(n)}function Ce(t){var e=de(t,16),n=this.doPrivate(e);return null==n?null:xe(n,this.n.bitLength()+7>>3)}function je(t,e){var n=de(t,16),r=this.doPrivate(n);return null==r?null:Ee(r,this.n.bitLength()+7>>3,e)}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ -function je(t,e){this.x=e,this.q=t}function Ie(t){return t==this||this.q.equals(t.q)&&this.x.equals(t.x)}function Re(){return this.x}function De(){return new je(this.q,this.x.negate().mod(this.q))}function He(t){return new je(this.q,this.x.add(t.toBigInteger()).mod(this.q))}function ke(t){return new je(this.q,this.x.subtract(t.toBigInteger()).mod(this.q))}function Ne(t){return new je(this.q,this.x.multiply(t.toBigInteger()).mod(this.q))}function Be(){return new je(this.q,this.x.square().mod(this.q))}function Me(t){return new je(this.q,this.x.multiply(t.toBigInteger().modInverse(this.q)).mod(this.q))}function Ve(t,e,n,r){this.curve=t,this.x=e,this.y=n,null==r?this.z=o.ONE:this.z=r,this.zinv=null}function Le(){return null==this.zinv&&(this.zinv=this.z.modInverse(this.curve.q)),this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function Ke(){return null==this.zinv&&(this.zinv=this.z.modInverse(this.curve.q)),this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function Ue(t){if(t==this)return!0;if(this.isInfinity())return t.isInfinity();if(t.isInfinity())return this.isInfinity();var e,n;return e=t.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(t.z)).mod(this.curve.q),!!e.equals(o.ZERO)&&(n=t.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(t.z)).mod(this.curve.q),n.equals(o.ZERO))}function qe(){return null==this.x&&null==this.y||this.z.equals(o.ZERO)&&!this.y.toBigInteger().equals(o.ZERO)}function We(){return new Ve(this.curve,this.x,this.y.negate(),this.z)}function ze(t){if(this.isInfinity())return t;if(t.isInfinity())return this;var e=t.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(t.z)).mod(this.curve.q),n=t.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(t.z)).mod(this.curve.q);if(o.ZERO.equals(n))return o.ZERO.equals(e)?this.twice():this.curve.getInfinity();var r=new o("3"),i=this.x.toBigInteger(),s=this.y.toBigInteger(),a=(t.x.toBigInteger(),t.y.toBigInteger(),n.square()),u=a.multiply(n),c=i.multiply(a),f=e.square().multiply(this.z),h=f.subtract(c.shiftLeft(1)).multiply(t.z).subtract(u).multiply(n).mod(this.curve.q),l=c.multiply(r).multiply(e).subtract(s.multiply(u)).subtract(f.multiply(e)).multiply(t.z).add(e.multiply(u)).mod(this.curve.q),d=u.multiply(this.z).multiply(t.z).mod(this.curve.q);return new Ve(this.curve,this.curve.fromBigInteger(h),this.curve.fromBigInteger(l),d)}function Je(){if(this.isInfinity())return this;if(0==this.y.toBigInteger().signum())return this.curve.getInfinity();var t=new o("3"),e=this.x.toBigInteger(),n=this.y.toBigInteger(),r=n.multiply(this.z),i=r.multiply(n).mod(this.curve.q),s=this.curve.a.toBigInteger(),a=e.square().multiply(t);o.ZERO.equals(s)||(a=a.add(this.z.square().multiply(s))),a=a.mod(this.curve.q);var u=a.square().subtract(e.shiftLeft(3).multiply(i)).shiftLeft(1).multiply(r).mod(this.curve.q),c=a.multiply(t).multiply(e).subtract(i.shiftLeft(1)).shiftLeft(2).multiply(i).subtract(a.square().multiply(a)).mod(this.curve.q),f=r.square().multiply(r).shiftLeft(3).mod(this.curve.q);return new Ve(this.curve,this.curve.fromBigInteger(u),this.curve.fromBigInteger(c),f)}function Ye(t){if(this.isInfinity())return this;if(0==t.signum())return this.curve.getInfinity();var e,n=t,r=n.multiply(new o("3")),i=this.negate(),s=this;for(e=r.bitLength()-2;e>0;--e){s=s.twice();var a=r.testBit(e),u=n.testBit(e);a!=u&&(s=s.add(a?this:i))}return s}function Ge(t,e,n){var r;r=t.bitLength()>n.bitLength()?t.bitLength()-1:n.bitLength()-1;for(var i=this.curve.getInfinity(),s=this.add(e);r>=0;)i=i.twice(),t.testBit(r)?i=n.testBit(r)?i.add(s):i.add(this):n.testBit(r)&&(i=i.add(e)),--r;return i}function Xe(t,e,n){this.q=t,this.a=this.fromBigInteger(e),this.b=this.fromBigInteger(n),this.infinity=new Ve(this,null,null)}function $e(){return this.q}function Qe(){return this.a}function Ze(){return this.b}function tn(t){return t==this||this.q.equals(t.q)&&this.a.equals(t.a)&&this.b.equals(t.b)}function en(){return this.infinity}function nn(t){return new je(this.q,t)}function rn(t){switch(parseInt(t.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var e=(t.length-2)/2,n=t.substr(2,e),r=t.substr(e+2,e);return new Ve(this,this.fromBigInteger(new o(n,16)),this.fromBigInteger(new o(r,16)));default:return null}}function sn(t){for(var e=new Array,n=0;n0;--e){s=s.twice();var a=r.testBit(e),u=n.testBit(e);a!=u&&(s=s.add(a?this:i))}return s}function Ye(t,e,n){var r;r=t.bitLength()>n.bitLength()?t.bitLength()-1:n.bitLength()-1;for(var i=this.curve.getInfinity(),s=this.add(e);r>=0;)i=i.twice(),t.testBit(r)?i=n.testBit(r)?i.add(s):i.add(this):n.testBit(r)&&(i=i.add(e)),--r;return i}function Xe(t,e,n){this.q=t,this.a=this.fromBigInteger(e),this.b=this.fromBigInteger(n),this.infinity=new Ve(this,null,null)}function $e(){return this.q}function Qe(){return this.a}function Ze(){return this.b}function tn(t){return t==this||this.q.equals(t.q)&&this.a.equals(t.a)&&this.b.equals(t.b)}function en(){return this.infinity}function nn(t){return new Ie(this.q,t)}function rn(t){switch(parseInt(t.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var e=(t.length-2)/2,n=t.substr(2,e),r=t.substr(e+2,e);return new Ve(this,this.fromBigInteger(new o(n,16)),this.fromBigInteger(new o(r,16)));default:return null}}function sn(t){for(var e=new Array,n=0;n>24,(16711680&i)>>16,(65280&i)>>8,255&i])))),i+=1;return r}function Vn(t,e,n){var r=function(t){return Cr.crypto.Util.hashHex(t,e)},i=r(wn(t));return void 0===n&&(n=-1),this.signWithMessageHashPSS(i,e,n)}function Ln(t,e,n){var r,i=bn(t),s=i.length,a=this.n.bitLength()-1,u=Math.ceil(a/8),c=function(t){return Cr.crypto.Util.hashHex(t,e)};if(n===-1||void 0===n)n=s;else if(n===-2)n=u-s-2;else if(n<-2)throw"invalid salt length";if(u0&&(f=new Array(n),(new le).nextBytes(f),f=String.fromCharCode.apply(String,f));var h=bn(c(wn("\0\0\0\0\0\0\0\0"+i+f))),l=[];for(r=0;r>8*u-a&255;for(g[0]&=~y,r=0;rthis.n.bitLength())return 0;var r=this.doPublic(n),i=r.toString(16).replace(/^1f+00/,""),s=qn(i);if(0==s.length)return!1;var o=s[0],a=s[1],u=function(t){return Cr.crypto.Util.hashString(t,o)},c=u(t);return a==c}function Yn(t,e){e=e.replace(Hr,""),e=e.replace(/[ \n]+/g,"");var n=de(e,16);if(n.bitLength()>this.n.bitLength())return 0;var r=this.doPublic(n),i=r.toString(16).replace(/^1f+00/,""),s=qn(i);if(0==s.length)return!1;var o=(s[0],s[1]);return o==t}function Gn(t,e,n,r){var i=function(t){return Cr.crypto.Util.hashHex(t,n)},s=i(wn(t));return void 0===r&&(r=-1),this.verifyWithMessageHashPSS(s,e,n,r)}function Xn(t,e,n,r){var i=new o(e,16);if(i.bitLength()>this.n.bitLength())return!1;var s,a=function(t){return Cr.crypto.Util.hashHex(t,n)},u=bn(t),c=u.length,f=this.n.bitLength()-1,h=Math.ceil(f/8);if(r===-1||void 0===r)r=c;else if(r===-2)r=h-c-2;else if(r<-2)throw"invalid salt length";if(h>8*h-f&255;if(0!==(d.charCodeAt(0)&g))throw"bits beyond keysize not zero";var y=Mn(p,d.length,a),v=[];for(s=0;s>24,(16711680&i)>>16,(65280&i)>>8,255&i])))),i+=1;return r}function Vn(t,e,n){var r=function(t){return Cr.crypto.Util.hashHex(t,e)},i=r(wn(t));return void 0===n&&(n=-1),this.signWithMessageHashPSS(i,e,n)}function Kn(t,e,n){var r,i=bn(t),s=i.length,a=this.n.bitLength()-1,u=Math.ceil(a/8),c=function(t){return Cr.crypto.Util.hashHex(t,e)};if(n===-1||void 0===n)n=s;else if(n===-2)n=u-s-2;else if(n<-2)throw"invalid salt length";if(u0&&(f=new Array(n),(new le).nextBytes(f),f=String.fromCharCode.apply(String,f));var h=bn(c(wn("\0\0\0\0\0\0\0\0"+i+f))),l=[];for(r=0;r>8*u-a&255;for(g[0]&=~y,r=0;rthis.n.bitLength())return 0;var r=this.doPublic(n),i=r.toString(16).replace(/^1f+00/,""),s=qn(i);if(0==s.length)return!1;var o=s[0],a=s[1],u=function(t){return Cr.crypto.Util.hashString(t,o)},c=u(t);return a==c}function Gn(t,e){e=e.replace(Hr,""),e=e.replace(/[ \n]+/g,"");var n=de(e,16);if(n.bitLength()>this.n.bitLength())return 0;var r=this.doPublic(n),i=r.toString(16).replace(/^1f+00/,""),s=qn(i);if(0==s.length)return!1;var o=(s[0],s[1]);return o==t}function Yn(t,e,n,r){var i=function(t){return Cr.crypto.Util.hashHex(t,n)},s=i(wn(t));return void 0===r&&(r=-1),this.verifyWithMessageHashPSS(s,e,n,r)}function Xn(t,e,n,r){var i=new o(e,16);if(i.bitLength()>this.n.bitLength())return!1;var s,a=function(t){return Cr.crypto.Util.hashHex(t,n)},u=bn(t),c=u.length,f=this.n.bitLength()-1,h=Math.ceil(f/8);if(r===-1||void 0===r)r=c;else if(r===-2)r=h-c-2;else if(r<-2)throw"invalid salt length";if(h>8*h-f&255;if(0!==(d.charCodeAt(0)&g))throw"bits beyond keysize not zero";var y=Mn(p,d.length,a),v=[];for(s=0;s":">",'"':""","'":"'","/":"/","`":"`"},a=["toString","valueOf"],u={isArray:function(t){return e.toString.apply(t)===n},isBoolean:function(t){return"boolean"==typeof t},isFunction:function(t){return"function"==typeof t||e.toString.apply(t)===r},isNull:function(t){return null===t},isNumber:function(t){return"number"==typeof t&&isFinite(t)},isObject:function(e){return e&&("object"==typeof e||t.isFunction(e))||!1},isString:function(t){return"string"==typeof t},isUndefined:function(t){return"undefined"==typeof t},_IEEnumFix:sr.env.ua.ie?function(n,r){var i,s,o;for(i=0;i"'\/`]/g,function(t){return o[t]})},extend:function(n,r,i){if(!r||!n)throw new Error("extend failed, please check that all dependencies are included.");var s,o=function(){};if(o.prototype=r.prototype,n.prototype=new o,n.prototype.constructor=n,n.superclass=r.prototype,r.prototype.constructor==e.constructor&&(r.prototype.constructor=r),i){for(s in i)t.hasOwnProperty(i,s)&&(n.prototype[s]=i[s]);t._IEEnumFix(n.prototype,i)}},augmentObject:function(e,n){if(!n||!e)throw new Error("Absorb failed, verify dependencies.");var r,i,s=arguments,o=s[2];if(o&&o!==!0)for(r=2;r0?t.dump(e[r],n-1):o):s.push(e[r]),s.push(u);s.length>1&&s.pop(),s.push("]")}else{s.push("{");for(r in e)t.hasOwnProperty(e,r)&&(s.push(r+c),t.isObject(e[r])?s.push(n>0?t.dump(e[r],n-1):o):s.push(e[r]),s.push(u));s.length>1&&s.pop(),s.push("}")}return s.join("")},substitute:function(e,n,r,s){for(var o,a,u,c,f,h,l,d,p,g=[],y=e.length,v="dump",m=" ",S="{",b="}";(o=e.lastIndexOf(S,y),!(o<0))&&(a=e.indexOf(b,o),!(o+1>a));)l=e.substring(o+1,a),c=l,h=null,u=c.indexOf(m),u>-1&&(h=c.substring(u+1),c=c.substring(0,u)),f=n[c],r&&(f=r(c,f,h)),t.isObject(f)?t.isArray(f)?f=t.dump(f,parseInt(h,10)):(h=h||"",d=h.indexOf(v),d>-1&&(h=h.substring(4)),p=f.toString(),f=p===i||d>-1?t.dump(f,parseInt(h,10)):p):t.isString(f)||t.isNumber(f)||(f="~-"+g.length+"-~",g[g.length]=l),e=e.substring(0,o)+f+e.substring(a+1),s===!1&&(y=o-1);for(o=g.length-1;o>=0;o-=1)e=e.replace(new RegExp("~-"+o+"-~"),"{"+g[o]+"}","g");return e},trim:function(t){try{return t.replace(/^\s+|\s+$/g,"")}catch(e){return t}},merge:function(){var e,n={},r=arguments,i=r.length;for(e=0;e":">",'"':""","'":"'","/":"/","`":"`"},a=["toString","valueOf"],u={isArray:function(t){return e.toString.apply(t)===n},isBoolean:function(t){return"boolean"==typeof t},isFunction:function(t){return"function"==typeof t||e.toString.apply(t)===r},isNull:function(t){return null===t},isNumber:function(t){return"number"==typeof t&&isFinite(t)},isObject:function(e){return e&&("object"==typeof e||t.isFunction(e))||!1},isString:function(t){return"string"==typeof t},isUndefined:function(t){return"undefined"==typeof t},_IEEnumFix:sr.env.ua.ie?function(n,r){var i,s,o;for(i=0;i"'\/`]/g,function(t){return o[t]})},extend:function(n,r,i){if(!r||!n)throw new Error("extend failed, please check that all dependencies are included.");var s,o=function(){};if(o.prototype=r.prototype,n.prototype=new o,n.prototype.constructor=n,n.superclass=r.prototype,r.prototype.constructor==e.constructor&&(r.prototype.constructor=r),i){for(s in i)t.hasOwnProperty(i,s)&&(n.prototype[s]=i[s]);t._IEEnumFix(n.prototype,i)}},augmentObject:function(e,n){if(!n||!e)throw new Error("Absorb failed, verify dependencies.");var r,i,s=arguments,o=s[2];if(o&&o!==!0)for(r=2;r0?t.dump(e[r],n-1):o):s.push(e[r]),s.push(u);s.length>1&&s.pop(),s.push("]")}else{s.push("{");for(r in e)t.hasOwnProperty(e,r)&&(s.push(r+c),t.isObject(e[r])?s.push(n>0?t.dump(e[r],n-1):o):s.push(e[r]),s.push(u));s.length>1&&s.pop(),s.push("}")}return s.join("")},substitute:function(e,n,r,s){for(var o,a,u,c,f,h,l,d,p,g=[],y=e.length,v="dump",m=" ",S="{",b="}";(o=e.lastIndexOf(S,y),!(o<0))&&(a=e.indexOf(b,o),!(o+1>a));)l=e.substring(o+1,a),c=l,h=null,u=c.indexOf(m),u>-1&&(h=c.substring(u+1),c=c.substring(0,u)),f=n[c],r&&(f=r(c,f,h)),t.isObject(f)?t.isArray(f)?f=t.dump(f,parseInt(h,10)):(h=h||"",d=h.indexOf(v),d>-1&&(h=h.substring(4)),p=f.toString(),f=p===i||d>-1?t.dump(f,parseInt(h,10)):p):t.isString(f)||t.isNumber(f)||(f="~-"+g.length+"-~",g[g.length]=l),e=e.substring(0,o)+f+e.substring(a+1),s===!1&&(y=o-1);for(o=g.length-1;o>=0;o-=1)e=e.replace(new RegExp("~-"+o+"-~"),"{"+g[o]+"}","g");return e},trim:function(t){try{return t.replace(/^\s+|\s+$/g,"")}catch(e){return t}},merge:function(){var e,n={},r=arguments,i=r.length;for(e=0;e>>2]>>>24-s%4*8&255;e[r+s>>>2]|=o<<24-(r+s)%4*8}else for(var s=0;s>>2]=n[s>>>2];return this.sigBytes+=i,this},clamp:function(){var e=this.words,n=this.sigBytes;e[n>>>2]&=4294967295<<32-n%4*8,e.length=t.ceil(n/4)},clone:function(){var t=i.clone.call(this);return t.words=this.words.slice(0),t},random:function(e){for(var n=[],r=0;r>>2]>>>24-i%4*8&255;r.push((s>>>4).toString(16)),r.push((15&s).toString(16))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r>>3]|=parseInt(t.substr(r,2),16)<<24-r%8*4;return new s.init(n,e/2)}},u=o.Latin1={stringify:function(t){for(var e=t.words,n=t.sigBytes,r=[],i=0;i>>2]>>>24-i%4*8&255;r.push(String.fromCharCode(s))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r>>2]|=(255&t.charCodeAt(r))<<24-r%4*8;return new s.init(n,e)}},c=o.Utf8={stringify:function(t){try{return decodeURIComponent(escape(u.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return u.parse(unescape(encodeURIComponent(t)))}},f=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=c.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,a=4*o,u=i/a;u=e?t.ceil(u):t.max((0|u)-this._minBufferSize,0);var c=u*o,f=t.min(4*c,i);if(c){for(var h=0;h>>2]}},n.BlockCipher=u.extend({cfg:u.cfg.extend({mode:c,padding:h}),reset:function(){u.reset.call(this);var t=this.cfg,e=t.iv,t=t.mode;if(this._xformMode==this._ENC_XFORM_MODE)var n=t.createEncryptor;else n=t.createDecryptor,this._minBufferSize=1;this._mode=n.call(t,this,e&&e.words)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){t.pad(this._data,this.blockSize);var e=this._process(!0)}else e=this._process(!0),t.unpad(e);return e},blockSize:4});var l=n.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}}),c=(e.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext;return t=t.salt,(t?i.create([1398893684,1701076831]).concat(t).concat(e):e).toString(o)},parse:function(t){t=o.parse(t);var e=t.words;if(1398893684==e[0]&&1701076831==e[1]){var n=i.create(e.slice(2,4));e.splice(0,4),t.sigBytes-=16}return l.create({ciphertext:t,salt:n})}},d=n.SerializableCipher=r.extend({cfg:r.extend({format:c}),encrypt:function(t,e,n,r){r=this.cfg.extend(r);var i=t.createEncryptor(n,r);return e=i.finalize(e),i=i.cfg,l.create({ciphertext:e,key:n,iv:i.iv,algorithm:t,mode:i.mode,padding:i.padding,blockSize:t.blockSize,formatter:r.format})},decrypt:function(t,e,n,r){return r=this.cfg.extend(r),e=this._parse(e,r.format),t.createDecryptor(n,r).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),e=(e.kdf={}).OpenSSL={execute:function(t,e,n,r){return r||(r=i.random(8)),t=a.create({keySize:e+n}).compute(t,r),n=i.create(t.words.slice(e),4*n),t.sigBytes=4*e,l.create({key:t,iv:n,salt:r})}},p=n.PasswordBasedCipher=d.extend({cfg:d.cfg.extend({kdf:e}),encrypt:function(t,e,n,r){return r=this.cfg.extend(r),n=r.kdf.execute(n,t.keySize,t.ivSize),r.iv=n.iv,t=d.encrypt.call(this,t,e,n.key,r),t.mixIn(n),t},decrypt:function(t,e,n,r){return r=this.cfg.extend(r),e=this._parse(e,r.format),n=r.kdf.execute(n,t.keySize,t.ivSize,e.salt),r.iv=n.iv,d.decrypt.call(this,t,e,n.key,r)}})}(),function(){for(var t=or,e=t.lib.BlockCipher,n=t.algo,r=[],i=[],s=[],o=[],a=[],u=[],c=[],f=[],h=[],l=[],d=[],p=0;256>p;p++)d[p]=128>p?p<<1:p<<1^283;for(var g=0,y=0,p=0;256>p;p++){var v=y^y<<1^y<<2^y<<3^y<<4,v=v>>>8^255&v^99;r[g]=v,i[v]=g;var m=d[g],S=d[m],b=d[S],w=257*d[v]^16843008*v;s[g]=w<<24|w>>>8,o[g]=w<<16|w>>>16,a[g]=w<<8|w>>>24,u[g]=w,w=16843009*b^65537*S^257*m^16843008*g,c[v]=w<<24|w>>>8,f[v]=w<<16|w>>>16,h[v]=w<<8|w>>>24,l[v]=w,g?(g=m^d[d[d[b^m]]],y^=d[d[y]]):g=y=1}var _=[0,1,2,4,8,16,32,64,128,27,54],n=n.AES=e.extend({_doReset:function(){for(var t=this._key,e=t.words,n=t.sigBytes/4,t=4*((this._nRounds=n+6)+1),i=this._keySchedule=[],s=0;s>>24]<<24|r[o>>>16&255]<<16|r[o>>>8&255]<<8|r[255&o]):(o=o<<8|o>>>24,o=r[o>>>24]<<24|r[o>>>16&255]<<16|r[o>>>8&255]<<8|r[255&o],o^=_[s/n|0]<<24),i[s]=i[s-n]^o}for(e=this._invKeySchedule=[],n=0;nn||4>=s?o:c[r[o>>>24]]^f[r[o>>>16&255]]^h[r[o>>>8&255]]^l[r[255&o]]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,s,o,a,u,r)},decryptBlock:function(t,e){var n=t[e+1];t[e+1]=t[e+3],t[e+3]=n,this._doCryptBlock(t,e,this._invKeySchedule,c,f,h,l,i),n=t[e+1],t[e+1]=t[e+3],t[e+3]=n},_doCryptBlock:function(t,e,n,r,i,s,o,a){for(var u=this._nRounds,c=t[e]^n[0],f=t[e+1]^n[1],h=t[e+2]^n[2],l=t[e+3]^n[3],d=4,p=1;p>>24]^i[f>>>16&255]^s[h>>>8&255]^o[255&l]^n[d++],y=r[f>>>24]^i[h>>>16&255]^s[l>>>8&255]^o[255&c]^n[d++],v=r[h>>>24]^i[l>>>16&255]^s[c>>>8&255]^o[255&f]^n[d++],l=r[l>>>24]^i[c>>>16&255]^s[f>>>8&255]^o[255&h]^n[d++],c=g,f=y,h=v;g=(a[c>>>24]<<24|a[f>>>16&255]<<16|a[h>>>8&255]<<8|a[255&l])^n[d++],y=(a[f>>>24]<<24|a[h>>>16&255]<<16|a[l>>>8&255]<<8|a[255&c])^n[d++],v=(a[h>>>24]<<24|a[l>>>16&255]<<16|a[c>>>8&255]<<8|a[255&f])^n[d++],l=(a[l>>>24]<<24|a[c>>>16&255]<<16|a[f>>>8&255]<<8|a[255&h])^n[d++],t[e]=g,t[e+1]=y,t[e+2]=v,t[e+3]=l},keySize:8});t.AES=e._createHelper(n)}(),function(){function t(t,e){var n=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=n,this._lBlock^=n<>>t^this._lBlock)&e;this._lBlock^=n,this._rBlock^=n<n;n++){var r=o[n]-1;e[n]=t[r>>>5]>>>31-r%32&1}for(t=this._subKeys=[],r=0;16>r;r++){for(var i=t[r]=[],s=u[r],n=0;24>n;n++)i[n/6|0]|=e[(a[n]-1+s)%28]<<31-n%6,i[4+(n/6|0)]|=e[28+(a[n+24]-1+s)%28]<<31-n%6;for(i[0]=i[0]<<1|i[0]>>>31,n=1;7>n;n++)i[n]>>>=4*(n-1)+3;i[7]=i[7]<<5|i[7]>>>27}for(e=this._invSubKeys=[],n=0;16>n;n++)e[n]=t[15-n]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(n,r,i){this._lBlock=n[r],this._rBlock=n[r+1],t.call(this,4,252645135),t.call(this,16,65535),e.call(this,2,858993459),e.call(this,8,16711935),t.call(this,1,1431655765);for(var s=0;16>s;s++){for(var o=i[s],a=this._lBlock,u=this._rBlock,h=0,l=0;8>l;l++)h|=c[l][((u^o[l])&f[l])>>>0];this._lBlock=u,this._rBlock=a^h}i=this._lBlock,this._lBlock=this._rBlock,this._rBlock=i,t.call(this,1,1431655765),e.call(this,8,16711935),e.call(this,2,858993459),t.call(this,16,65535),t.call(this,4,252645135),n[r]=this._lBlock,n[r+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});n.DES=r._createHelper(h),s=s.TripleDES=r.extend({_doReset:function(){var t=this._key.words;this._des1=h.createEncryptor(i.create(t.slice(0,2))),this._des2=h.createEncryptor(i.create(t.slice(2,4))),this._des3=h.createEncryptor(i.create(t.slice(4,6)))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2}),n.TripleDES=r._createHelper(s)}(),function(){var t=or,e=t.lib.WordArray;t.enc.Base64={stringify:function(t){var e=t.words,n=t.sigBytes,r=this._map;t.clamp(),t=[];for(var i=0;i>>2]>>>24-8*(i%4)&255)<<16|(e[i+1>>>2]>>>24-8*((i+1)%4)&255)<<8|e[i+2>>>2]>>>24-8*((i+2)%4)&255,o=0;4>o&&i+.75*o>>6*(3-o)&63));if(e=r.charAt(64))for(;t.length%4;)t.push(e);return t.join("")},parse:function(t){var n=t.length,r=this._map,i=r.charAt(64);i&&(i=t.indexOf(i),-1!=i&&(n=i));for(var i=[],s=0,o=0;o>>6-2*(o%4);i[s>>>2]|=(a|u)<<24-8*(s%4),s++}return e.create(i,s)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),function(t){function e(t,e,n,r,i,s,o){return t=t+(e&n|~e&r)+i+o,(t<>>32-s)+e}function n(t,e,n,r,i,s,o){return t=t+(e&r|n&~r)+i+o,(t<>>32-s)+e}function r(t,e,n,r,i,s,o){return t=t+(e^n^r)+i+o,(t<>>32-s)+e}function i(t,e,n,r,i,s,o){return t=t+(n^(e|~r))+i+o,(t<>>32-s)+e}for(var s=or,o=s.lib,a=o.WordArray,u=o.Hasher,o=s.algo,c=[],f=0;64>f;f++)c[f]=4294967296*t.abs(t.sin(f+1))|0;o=o.MD5=u.extend({_doReset:function(){this._hash=new a.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,s){for(var o=0;16>o;o++){var a=s+o,u=t[a];t[a]=16711935&(u<<8|u>>>24)|4278255360&(u<<24|u>>>8)}var o=this._hash.words,a=t[s+0],u=t[s+1],f=t[s+2],h=t[s+3],l=t[s+4],d=t[s+5],p=t[s+6],g=t[s+7],y=t[s+8],v=t[s+9],m=t[s+10],S=t[s+11],b=t[s+12],w=t[s+13],_=t[s+14],x=t[s+15],E=o[0],A=o[1],F=o[2],P=o[3],E=e(E,A,F,P,a,7,c[0]),P=e(P,E,A,F,u,12,c[1]),F=e(F,P,E,A,f,17,c[2]),A=e(A,F,P,E,h,22,c[3]),E=e(E,A,F,P,l,7,c[4]),P=e(P,E,A,F,d,12,c[5]),F=e(F,P,E,A,p,17,c[6]),A=e(A,F,P,E,g,22,c[7]),E=e(E,A,F,P,y,7,c[8]),P=e(P,E,A,F,v,12,c[9]),F=e(F,P,E,A,m,17,c[10]),A=e(A,F,P,E,S,22,c[11]),E=e(E,A,F,P,b,7,c[12]),P=e(P,E,A,F,w,12,c[13]),F=e(F,P,E,A,_,17,c[14]),A=e(A,F,P,E,x,22,c[15]),E=n(E,A,F,P,u,5,c[16]),P=n(P,E,A,F,p,9,c[17]),F=n(F,P,E,A,S,14,c[18]),A=n(A,F,P,E,a,20,c[19]),E=n(E,A,F,P,d,5,c[20]),P=n(P,E,A,F,m,9,c[21]),F=n(F,P,E,A,x,14,c[22]),A=n(A,F,P,E,l,20,c[23]),E=n(E,A,F,P,v,5,c[24]),P=n(P,E,A,F,_,9,c[25]),F=n(F,P,E,A,h,14,c[26]),A=n(A,F,P,E,y,20,c[27]),E=n(E,A,F,P,w,5,c[28]),P=n(P,E,A,F,f,9,c[29]),F=n(F,P,E,A,g,14,c[30]),A=n(A,F,P,E,b,20,c[31]),E=r(E,A,F,P,d,4,c[32]),P=r(P,E,A,F,y,11,c[33]),F=r(F,P,E,A,S,16,c[34]),A=r(A,F,P,E,_,23,c[35]),E=r(E,A,F,P,u,4,c[36]),P=r(P,E,A,F,l,11,c[37]),F=r(F,P,E,A,g,16,c[38]),A=r(A,F,P,E,m,23,c[39]),E=r(E,A,F,P,w,4,c[40]),P=r(P,E,A,F,a,11,c[41]),F=r(F,P,E,A,h,16,c[42]),A=r(A,F,P,E,p,23,c[43]),E=r(E,A,F,P,v,4,c[44]),P=r(P,E,A,F,b,11,c[45]),F=r(F,P,E,A,x,16,c[46]),A=r(A,F,P,E,f,23,c[47]),E=i(E,A,F,P,a,6,c[48]),P=i(P,E,A,F,g,10,c[49]),F=i(F,P,E,A,_,15,c[50]),A=i(A,F,P,E,d,21,c[51]),E=i(E,A,F,P,b,6,c[52]),P=i(P,E,A,F,h,10,c[53]),F=i(F,P,E,A,m,15,c[54]),A=i(A,F,P,E,u,21,c[55]),E=i(E,A,F,P,y,6,c[56]),P=i(P,E,A,F,x,10,c[57]),F=i(F,P,E,A,p,15,c[58]),A=i(A,F,P,E,w,21,c[59]),E=i(E,A,F,P,l,6,c[60]),P=i(P,E,A,F,S,10,c[61]),F=i(F,P,E,A,f,15,c[62]),A=i(A,F,P,E,v,21,c[63]);o[0]=o[0]+E|0,o[1]=o[1]+A|0,o[2]=o[2]+F|0,o[3]=o[3]+P|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;n[i>>>5]|=128<<24-i%32;var s=t.floor(r/4294967296);for(n[(i+64>>>9<<4)+15]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),n[(i+64>>>9<<4)+14]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),e.sigBytes=4*(n.length+1),this._process(),e=this._hash,n=e.words,r=0;4>r;r++)i=n[r],n[r]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8);return e},clone:function(){var t=u.clone.call(this);return t._hash=this._hash.clone(),t}}),s.MD5=u._createHelper(o),s.HmacMD5=u._createHmacHelper(o)}(Math),function(){var t=or,e=t.lib,n=e.WordArray,r=e.Hasher,i=[],e=t.algo.SHA1=r.extend({_doReset:function(){this._hash=new n.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],s=n[1],o=n[2],a=n[3],u=n[4],c=0;80>c;c++){if(16>c)i[c]=0|t[e+c];else{var f=i[c-3]^i[c-8]^i[c-14]^i[c-16];i[c]=f<<1|f>>>31}f=(r<<5|r>>>27)+u+i[c],f=20>c?f+((s&o|~s&a)+1518500249):40>c?f+((s^o^a)+1859775393):60>c?f+((s&o|s&a|o&a)-1894007588):f+((s^o^a)-899497514),u=a,a=o,o=s<<30|s>>>2,s=r,r=f}n[0]=n[0]+r|0,n[1]=n[1]+s|0,n[2]=n[2]+o|0,n[3]=n[3]+a|0,n[4]=n[4]+u|0},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;return e[r>>>5]|=128<<24-r%32,e[(r+64>>>9<<4)+14]=Math.floor(n/4294967296),e[(r+64>>>9<<4)+15]=n,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=r.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA1=r._createHelper(e),t.HmacSHA1=r._createHmacHelper(e)}(),function(t){for(var e=or,n=e.lib,r=n.WordArray,i=n.Hasher,n=e.algo,s=[],o=[],a=function(t){return 4294967296*(t-(0|t))|0},u=2,c=0;64>c;){var f;t:{f=u;for(var h=t.sqrt(f),l=2;l<=h;l++)if(!(f%l)){f=!1;break t}f=!0}f&&(8>c&&(s[c]=a(t.pow(u,.5))),o[c]=a(t.pow(u,1/3)),c++),u++}var d=[],n=n.SHA256=i.extend({_doReset:function(){this._hash=new r.init(s.slice(0))},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],i=n[1],s=n[2],a=n[3],u=n[4],c=n[5],f=n[6],h=n[7],l=0;64>l;l++){if(16>l)d[l]=0|t[e+l];else{var p=d[l-15],g=d[l-2];d[l]=((p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3)+d[l-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+d[l-16]}p=h+((u<<26|u>>>6)^(u<<21|u>>>11)^(u<<7|u>>>25))+(u&c^~u&f)+o[l]+d[l],g=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&i^r&s^i&s),h=f,f=c,c=u,u=a+p|0,a=s,s=i,i=r,r=p+g|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+s|0,n[3]=n[3]+a|0,n[4]=n[4]+u|0,n[5]=n[5]+c|0,n[6]=n[6]+f|0,n[7]=n[7]+h|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;return n[i>>>5]|=128<<24-i%32,n[(i+64>>>9<<4)+14]=t.floor(r/4294967296),n[(i+64>>>9<<4)+15]=r,e.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});e.SHA256=i._createHelper(n),e.HmacSHA256=i._createHmacHelper(n)}(Math),function(){var t=or,e=t.lib.WordArray,n=t.algo,r=n.SHA256,n=n.SHA224=r.extend({_doReset:function(){this._hash=new e.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=r._doFinalize.call(this);return t.sigBytes-=4,t}});t.SHA224=r._createHelper(n),t.HmacSHA224=r._createHmacHelper(n)}(),function(){function t(){return i.create.apply(i,arguments)}for(var e=or,n=e.lib.Hasher,r=e.x64,i=r.Word,s=r.WordArray,r=e.algo,o=[t(1116352408,3609767458),t(1899447441,602891725),t(3049323471,3964484399),t(3921009573,2173295548),t(961987163,4081628472),t(1508970993,3053834265),t(2453635748,2937671579),t(2870763221,3664609560),t(3624381080,2734883394),t(310598401,1164996542),t(607225278,1323610764),t(1426881987,3590304994),t(1925078388,4068182383),t(2162078206,991336113),t(2614888103,633803317),t(3248222580,3479774868),t(3835390401,2666613458),t(4022224774,944711139),t(264347078,2341262773),t(604807628,2007800933),t(770255983,1495990901),t(1249150122,1856431235),t(1555081692,3175218132),t(1996064986,2198950837),t(2554220882,3999719339),t(2821834349,766784016),t(2952996808,2566594879),t(3210313671,3203337956),t(3336571891,1034457026),t(3584528711,2466948901),t(113926993,3758326383),t(338241895,168717936),t(666307205,1188179964),t(773529912,1546045734),t(1294757372,1522805485),t(1396182291,2643833823),t(1695183700,2343527390),t(1986661051,1014477480),t(2177026350,1206759142),t(2456956037,344077627),t(2730485921,1290863460),t(2820302411,3158454273),t(3259730800,3505952657),t(3345764771,106217008),t(3516065817,3606008344),t(3600352804,1432725776),t(4094571909,1467031594),t(275423344,851169720),t(430227734,3100823752),t(506948616,1363258195),t(659060556,3750685593),t(883997877,3785050280),t(958139571,3318307427),t(1322822218,3812723403),t(1537002063,2003034995),t(1747873779,3602036899),t(1955562222,1575990012),t(2024104815,1125592928),t(2227730452,2716904306),t(2361852424,442776044),t(2428436474,593698344),t(2756734187,3733110249),t(3204031479,2999351573),t(3329325298,3815920427),t(3391569614,3928383900),t(3515267271,566280711),t(3940187606,3454069534),t(4118630271,4000239992),t(116418474,1914138554),t(174292421,2731055270),t(289380356,3203993006),t(460393269,320620315),t(685471733,587496836),t(852142971,1086792851),t(1017036298,365543100),t(1126000580,2618297676),t(1288033470,3409855158),t(1501505948,4234509866),t(1607167915,987167468),t(1816402316,1246189591)],a=[],u=0;80>u;u++)a[u]=t();r=r.SHA512=n.extend({_doReset:function(){this._hash=new s.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],i=n[1],s=n[2],u=n[3],c=n[4],f=n[5],h=n[6],n=n[7],l=r.high,d=r.low,p=i.high,g=i.low,y=s.high,v=s.low,m=u.high,S=u.low,b=c.high,w=c.low,_=f.high,x=f.low,E=h.high,A=h.low,F=n.high,P=n.low,O=l,C=d,T=p,j=g,I=y,R=v,D=m,H=S,k=b,N=w,B=_,M=x,V=E,L=A,K=F,U=P,q=0;80>q;q++){var W=a[q];if(16>q)var z=W.high=0|t[e+2*q],J=W.low=0|t[e+2*q+1];else{var z=a[q-15],J=z.high,Y=z.low,z=(J>>>1|Y<<31)^(J>>>8|Y<<24)^J>>>7,Y=(Y>>>1|J<<31)^(Y>>>8|J<<24)^(Y>>>7|J<<25),G=a[q-2],J=G.high,X=G.low,G=(J>>>19|X<<13)^(J<<3|X>>>29)^J>>>6,X=(X>>>19|J<<13)^(X<<3|J>>>29)^(X>>>6|J<<26),J=a[q-7],$=J.high,Q=a[q-16],Z=Q.high,Q=Q.low,J=Y+J.low,z=z+$+(J>>>0>>0?1:0),J=J+X,z=z+G+(J>>>0>>0?1:0),J=J+Q,z=z+Z+(J>>>0>>0?1:0);W.high=z,W.low=J}var $=k&B^~k&V,Q=N&M^~N&L,W=O&T^O&I^T&I,tt=C&j^C&R^j&R,Y=(O>>>28|C<<4)^(O<<30|C>>>2)^(O<<25|C>>>7),G=(C>>>28|O<<4)^(C<<30|O>>>2)^(C<<25|O>>>7),X=o[q],et=X.high,nt=X.low,X=U+((N>>>14|k<<18)^(N>>>18|k<<14)^(N<<23|k>>>9)),Z=K+((k>>>14|N<<18)^(k>>>18|N<<14)^(k<<23|N>>>9))+(X>>>0>>0?1:0),X=X+Q,Z=Z+$+(X>>>0>>0?1:0),X=X+nt,Z=Z+et+(X>>>0>>0?1:0),X=X+J,Z=Z+z+(X>>>0>>0?1:0),J=G+tt,W=Y+W+(J>>>0>>0?1:0),K=V,U=L,V=B,L=M,B=k,M=N,N=H+X|0,k=D+Z+(N>>>0>>0?1:0)|0,D=I,H=R,I=T,R=j,T=O,j=C,C=X+J|0,O=Z+W+(C>>>0>>0?1:0)|0}d=r.low=d+C,r.high=l+O+(d>>>0>>0?1:0),g=i.low=g+j,i.high=p+T+(g>>>0>>0?1:0),v=s.low=v+R,s.high=y+I+(v>>>0>>0?1:0),S=u.low=S+H,u.high=m+D+(S>>>0>>0?1:0),w=c.low=w+N,c.high=b+k+(w>>>0>>0?1:0),x=f.low=x+M,f.high=_+B+(x>>>0>>0?1:0),A=h.low=A+L,h.high=E+V+(A>>>0>>0?1:0),P=n.low=P+U,n.high=F+K+(P>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;return e[r>>>5]|=128<<24-r%32,e[(r+128>>>10<<5)+30]=Math.floor(n/4294967296),e[(r+128>>>10<<5)+31]=n,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=n.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32}),e.SHA512=n._createHelper(r),e.HmacSHA512=n._createHmacHelper(r)}(),function(){var t=or,e=t.x64,n=e.Word,r=e.WordArray,e=t.algo,i=e.SHA512,e=e.SHA384=i.extend({_doReset:function(){this._hash=new r.init([new n.init(3418070365,3238371032),new n.init(1654270250,914150663),new n.init(2438529370,812702999),new n.init(355462360,4144912697),new n.init(1731405415,4290775857),new n.init(2394180231,1750603025),new n.init(3675008525,1694076839),new n.init(1203062813,3204075428)])},_doFinalize:function(){var t=i._doFinalize.call(this);return t.sigBytes-=16,t}});t.SHA384=i._createHelper(e),t.HmacSHA384=i._createHmacHelper(e)}(),function(){var t=or,e=t.lib,n=e.WordArray,r=e.Hasher,e=t.algo,i=n.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),s=n.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),o=n.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),a=n.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),u=n.create([0,1518500249,1859775393,2400959708,2840853838]),c=n.create([1352829926,1548603684,1836072691,2053994217,0]),e=e.RIPEMD160=r.extend({_doReset:function(){this._hash=n.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var n=0;16>n;n++){var r=e+n,f=t[r]; -t[r]=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8)}var h,l,d,p,g,y,v,m,S,b,r=this._hash.words,f=u.words,w=c.words,_=i.words,x=s.words,E=o.words,A=a.words;y=h=r[0],v=l=r[1],m=d=r[2],S=p=r[3],b=g=r[4];for(var F,n=0;80>n;n+=1)F=h+t[e+_[n]]|0,F=16>n?F+((l^d^p)+f[0]):32>n?F+((l&d|~l&p)+f[1]):48>n?F+(((l|~d)^p)+f[2]):64>n?F+((l&p|d&~p)+f[3]):F+((l^(d|~p))+f[4]),F|=0,F=F<>>32-E[n],F=F+g|0,h=g,g=p,p=d<<10|d>>>22,d=l,l=F,F=y+t[e+x[n]]|0,F=16>n?F+((v^(m|~S))+w[0]):32>n?F+((v&S|m&~S)+w[1]):48>n?F+(((v|~m)^S)+w[2]):64>n?F+((v&m|~v&S)+w[3]):F+((v^m^S)+w[4]),F|=0,F=F<>>32-A[n],F=F+b|0,y=b,b=S,S=m<<10|m>>>22,m=v,v=F;F=r[1]+d+S|0,r[1]=r[2]+p+b|0,r[2]=r[3]+g+y|0,r[3]=r[4]+h+v|0,r[4]=r[0]+l+m|0,r[0]=F},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;for(e[r>>>5]|=128<<24-r%32,e[(r+64>>>9<<4)+14]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),t.sigBytes=4*(e.length+1),this._process(),t=this._hash,e=t.words,n=0;5>n;n++)r=e[n],e[n]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8);return t},clone:function(){var t=r.clone.call(this);return t._hash=this._hash.clone(),t}});t.RIPEMD160=r._createHelper(e),t.HmacRIPEMD160=r._createHmacHelper(e)}(Math),function(){var t=or,e=t.enc.Utf8;t.algo.HMAC=t.lib.Base.extend({init:function(t,n){t=this._hasher=new t.init,"string"==typeof n&&(n=e.parse(n));var r=t.blockSize,i=4*r;n.sigBytes>i&&(n=t.finalize(n)),n.clamp();for(var s=this._oKey=n.clone(),o=this._iKey=n.clone(),a=s.words,u=o.words,c=0;c>>2]>>>24-s%4*8&255;e[r+s>>>2]|=o<<24-(r+s)%4*8}else for(var s=0;s>>2]=n[s>>>2];return this.sigBytes+=i,this},clamp:function(){var e=this.words,n=this.sigBytes;e[n>>>2]&=4294967295<<32-n%4*8,e.length=t.ceil(n/4)},clone:function(){var t=i.clone.call(this);return t.words=this.words.slice(0),t},random:function(e){for(var n=[],r=0;r>>2]>>>24-i%4*8&255;r.push((s>>>4).toString(16)),r.push((15&s).toString(16))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r>>3]|=parseInt(t.substr(r,2),16)<<24-r%8*4;return new s.init(n,e/2)}},u=o.Latin1={stringify:function(t){for(var e=t.words,n=t.sigBytes,r=[],i=0;i>>2]>>>24-i%4*8&255;r.push(String.fromCharCode(s))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r>>2]|=(255&t.charCodeAt(r))<<24-r%4*8;return new s.init(n,e)}},c=o.Utf8={stringify:function(t){try{return decodeURIComponent(escape(u.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return u.parse(unescape(encodeURIComponent(t)))}},f=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=c.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,a=4*o,u=i/a;u=e?t.ceil(u):t.max((0|u)-this._minBufferSize,0);var c=u*o,f=t.min(4*c,i);if(c){for(var h=0;h>>2]}},n.BlockCipher=u.extend({cfg:u.cfg.extend({mode:c,padding:h}),reset:function(){u.reset.call(this);var t=this.cfg,e=t.iv,t=t.mode;if(this._xformMode==this._ENC_XFORM_MODE)var n=t.createEncryptor;else n=t.createDecryptor,this._minBufferSize=1;this._mode=n.call(t,this,e&&e.words)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){t.pad(this._data,this.blockSize);var e=this._process(!0)}else e=this._process(!0),t.unpad(e);return e},blockSize:4});var l=n.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}}),c=(e.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext;return t=t.salt,(t?i.create([1398893684,1701076831]).concat(t).concat(e):e).toString(o)},parse:function(t){t=o.parse(t);var e=t.words;if(1398893684==e[0]&&1701076831==e[1]){var n=i.create(e.slice(2,4));e.splice(0,4),t.sigBytes-=16}return l.create({ciphertext:t,salt:n})}},d=n.SerializableCipher=r.extend({cfg:r.extend({format:c}),encrypt:function(t,e,n,r){r=this.cfg.extend(r);var i=t.createEncryptor(n,r);return e=i.finalize(e),i=i.cfg,l.create({ciphertext:e,key:n,iv:i.iv,algorithm:t,mode:i.mode,padding:i.padding,blockSize:t.blockSize,formatter:r.format})},decrypt:function(t,e,n,r){return r=this.cfg.extend(r),e=this._parse(e,r.format),t.createDecryptor(n,r).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),e=(e.kdf={}).OpenSSL={execute:function(t,e,n,r){return r||(r=i.random(8)),t=a.create({keySize:e+n}).compute(t,r),n=i.create(t.words.slice(e),4*n),t.sigBytes=4*e,l.create({key:t,iv:n,salt:r})}},p=n.PasswordBasedCipher=d.extend({cfg:d.cfg.extend({kdf:e}),encrypt:function(t,e,n,r){return r=this.cfg.extend(r),n=r.kdf.execute(n,t.keySize,t.ivSize),r.iv=n.iv,t=d.encrypt.call(this,t,e,n.key,r),t.mixIn(n),t},decrypt:function(t,e,n,r){return r=this.cfg.extend(r),e=this._parse(e,r.format),n=r.kdf.execute(n,t.keySize,t.ivSize,e.salt),r.iv=n.iv,d.decrypt.call(this,t,e,n.key,r)}})}(),function(){for(var t=or,e=t.lib.BlockCipher,n=t.algo,r=[],i=[],s=[],o=[],a=[],u=[],c=[],f=[],h=[],l=[],d=[],p=0;256>p;p++)d[p]=128>p?p<<1:p<<1^283;for(var g=0,y=0,p=0;256>p;p++){var v=y^y<<1^y<<2^y<<3^y<<4,v=v>>>8^255&v^99;r[g]=v,i[v]=g;var m=d[g],S=d[m],b=d[S],w=257*d[v]^16843008*v;s[g]=w<<24|w>>>8,o[g]=w<<16|w>>>16,a[g]=w<<8|w>>>24,u[g]=w,w=16843009*b^65537*S^257*m^16843008*g,c[v]=w<<24|w>>>8,f[v]=w<<16|w>>>16,h[v]=w<<8|w>>>24,l[v]=w,g?(g=m^d[d[d[b^m]]],y^=d[d[y]]):g=y=1}var x=[0,1,2,4,8,16,32,64,128,27,54],n=n.AES=e.extend({_doReset:function(){for(var t=this._key,e=t.words,n=t.sigBytes/4,t=4*((this._nRounds=n+6)+1),i=this._keySchedule=[],s=0;s>>24]<<24|r[o>>>16&255]<<16|r[o>>>8&255]<<8|r[255&o]):(o=o<<8|o>>>24,o=r[o>>>24]<<24|r[o>>>16&255]<<16|r[o>>>8&255]<<8|r[255&o],o^=x[s/n|0]<<24),i[s]=i[s-n]^o}for(e=this._invKeySchedule=[],n=0;nn||4>=s?o:c[r[o>>>24]]^f[r[o>>>16&255]]^h[r[o>>>8&255]]^l[r[255&o]]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,s,o,a,u,r)},decryptBlock:function(t,e){var n=t[e+1];t[e+1]=t[e+3],t[e+3]=n,this._doCryptBlock(t,e,this._invKeySchedule,c,f,h,l,i),n=t[e+1],t[e+1]=t[e+3],t[e+3]=n},_doCryptBlock:function(t,e,n,r,i,s,o,a){for(var u=this._nRounds,c=t[e]^n[0],f=t[e+1]^n[1],h=t[e+2]^n[2],l=t[e+3]^n[3],d=4,p=1;p>>24]^i[f>>>16&255]^s[h>>>8&255]^o[255&l]^n[d++],y=r[f>>>24]^i[h>>>16&255]^s[l>>>8&255]^o[255&c]^n[d++],v=r[h>>>24]^i[l>>>16&255]^s[c>>>8&255]^o[255&f]^n[d++],l=r[l>>>24]^i[c>>>16&255]^s[f>>>8&255]^o[255&h]^n[d++],c=g,f=y,h=v;g=(a[c>>>24]<<24|a[f>>>16&255]<<16|a[h>>>8&255]<<8|a[255&l])^n[d++],y=(a[f>>>24]<<24|a[h>>>16&255]<<16|a[l>>>8&255]<<8|a[255&c])^n[d++],v=(a[h>>>24]<<24|a[l>>>16&255]<<16|a[c>>>8&255]<<8|a[255&f])^n[d++],l=(a[l>>>24]<<24|a[c>>>16&255]<<16|a[f>>>8&255]<<8|a[255&h])^n[d++],t[e]=g,t[e+1]=y,t[e+2]=v,t[e+3]=l},keySize:8});t.AES=e._createHelper(n)}(),function(){function t(t,e){var n=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=n,this._lBlock^=n<>>t^this._lBlock)&e;this._lBlock^=n,this._rBlock^=n<n;n++){var r=o[n]-1;e[n]=t[r>>>5]>>>31-r%32&1}for(t=this._subKeys=[],r=0;16>r;r++){for(var i=t[r]=[],s=u[r],n=0;24>n;n++)i[n/6|0]|=e[(a[n]-1+s)%28]<<31-n%6,i[4+(n/6|0)]|=e[28+(a[n+24]-1+s)%28]<<31-n%6;for(i[0]=i[0]<<1|i[0]>>>31,n=1;7>n;n++)i[n]>>>=4*(n-1)+3;i[7]=i[7]<<5|i[7]>>>27}for(e=this._invSubKeys=[],n=0;16>n;n++)e[n]=t[15-n]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(n,r,i){this._lBlock=n[r],this._rBlock=n[r+1],t.call(this,4,252645135),t.call(this,16,65535),e.call(this,2,858993459),e.call(this,8,16711935),t.call(this,1,1431655765);for(var s=0;16>s;s++){for(var o=i[s],a=this._lBlock,u=this._rBlock,h=0,l=0;8>l;l++)h|=c[l][((u^o[l])&f[l])>>>0];this._lBlock=u,this._rBlock=a^h}i=this._lBlock,this._lBlock=this._rBlock,this._rBlock=i,t.call(this,1,1431655765),e.call(this,8,16711935),e.call(this,2,858993459),t.call(this,16,65535),t.call(this,4,252645135),n[r]=this._lBlock,n[r+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});n.DES=r._createHelper(h),s=s.TripleDES=r.extend({_doReset:function(){var t=this._key.words;this._des1=h.createEncryptor(i.create(t.slice(0,2))),this._des2=h.createEncryptor(i.create(t.slice(2,4))),this._des3=h.createEncryptor(i.create(t.slice(4,6)))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2}),n.TripleDES=r._createHelper(s)}(),function(){var t=or,e=t.lib.WordArray;t.enc.Base64={stringify:function(t){var e=t.words,n=t.sigBytes,r=this._map;t.clamp(),t=[];for(var i=0;i>>2]>>>24-8*(i%4)&255)<<16|(e[i+1>>>2]>>>24-8*((i+1)%4)&255)<<8|e[i+2>>>2]>>>24-8*((i+2)%4)&255,o=0;4>o&&i+.75*o>>6*(3-o)&63));if(e=r.charAt(64))for(;t.length%4;)t.push(e);return t.join("")},parse:function(t){var n=t.length,r=this._map,i=r.charAt(64);i&&(i=t.indexOf(i),-1!=i&&(n=i));for(var i=[],s=0,o=0;o>>6-2*(o%4);i[s>>>2]|=(a|u)<<24-8*(s%4),s++}return e.create(i,s)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),function(t){function e(t,e,n,r,i,s,o){return t=t+(e&n|~e&r)+i+o,(t<>>32-s)+e}function n(t,e,n,r,i,s,o){return t=t+(e&r|n&~r)+i+o,(t<>>32-s)+e}function r(t,e,n,r,i,s,o){return t=t+(e^n^r)+i+o,(t<>>32-s)+e}function i(t,e,n,r,i,s,o){return t=t+(n^(e|~r))+i+o,(t<>>32-s)+e}for(var s=or,o=s.lib,a=o.WordArray,u=o.Hasher,o=s.algo,c=[],f=0;64>f;f++)c[f]=4294967296*t.abs(t.sin(f+1))|0;o=o.MD5=u.extend({_doReset:function(){this._hash=new a.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,s){for(var o=0;16>o;o++){var a=s+o,u=t[a];t[a]=16711935&(u<<8|u>>>24)|4278255360&(u<<24|u>>>8)}var o=this._hash.words,a=t[s+0],u=t[s+1],f=t[s+2],h=t[s+3],l=t[s+4],d=t[s+5],p=t[s+6],g=t[s+7],y=t[s+8],v=t[s+9],m=t[s+10],S=t[s+11],b=t[s+12],w=t[s+13],x=t[s+14],_=t[s+15],E=o[0],F=o[1],A=o[2],P=o[3],E=e(E,F,A,P,a,7,c[0]),P=e(P,E,F,A,u,12,c[1]),A=e(A,P,E,F,f,17,c[2]),F=e(F,A,P,E,h,22,c[3]),E=e(E,F,A,P,l,7,c[4]),P=e(P,E,F,A,d,12,c[5]),A=e(A,P,E,F,p,17,c[6]),F=e(F,A,P,E,g,22,c[7]),E=e(E,F,A,P,y,7,c[8]),P=e(P,E,F,A,v,12,c[9]),A=e(A,P,E,F,m,17,c[10]),F=e(F,A,P,E,S,22,c[11]),E=e(E,F,A,P,b,7,c[12]),P=e(P,E,F,A,w,12,c[13]),A=e(A,P,E,F,x,17,c[14]),F=e(F,A,P,E,_,22,c[15]),E=n(E,F,A,P,u,5,c[16]),P=n(P,E,F,A,p,9,c[17]),A=n(A,P,E,F,S,14,c[18]),F=n(F,A,P,E,a,20,c[19]),E=n(E,F,A,P,d,5,c[20]),P=n(P,E,F,A,m,9,c[21]),A=n(A,P,E,F,_,14,c[22]),F=n(F,A,P,E,l,20,c[23]),E=n(E,F,A,P,v,5,c[24]),P=n(P,E,F,A,x,9,c[25]),A=n(A,P,E,F,h,14,c[26]),F=n(F,A,P,E,y,20,c[27]),E=n(E,F,A,P,w,5,c[28]),P=n(P,E,F,A,f,9,c[29]),A=n(A,P,E,F,g,14,c[30]),F=n(F,A,P,E,b,20,c[31]),E=r(E,F,A,P,d,4,c[32]),P=r(P,E,F,A,y,11,c[33]),A=r(A,P,E,F,S,16,c[34]),F=r(F,A,P,E,x,23,c[35]),E=r(E,F,A,P,u,4,c[36]),P=r(P,E,F,A,l,11,c[37]),A=r(A,P,E,F,g,16,c[38]),F=r(F,A,P,E,m,23,c[39]),E=r(E,F,A,P,w,4,c[40]),P=r(P,E,F,A,a,11,c[41]),A=r(A,P,E,F,h,16,c[42]),F=r(F,A,P,E,p,23,c[43]),E=r(E,F,A,P,v,4,c[44]),P=r(P,E,F,A,b,11,c[45]),A=r(A,P,E,F,_,16,c[46]),F=r(F,A,P,E,f,23,c[47]),E=i(E,F,A,P,a,6,c[48]),P=i(P,E,F,A,g,10,c[49]),A=i(A,P,E,F,x,15,c[50]),F=i(F,A,P,E,d,21,c[51]),E=i(E,F,A,P,b,6,c[52]),P=i(P,E,F,A,h,10,c[53]),A=i(A,P,E,F,m,15,c[54]),F=i(F,A,P,E,u,21,c[55]),E=i(E,F,A,P,y,6,c[56]),P=i(P,E,F,A,_,10,c[57]),A=i(A,P,E,F,p,15,c[58]),F=i(F,A,P,E,w,21,c[59]),E=i(E,F,A,P,l,6,c[60]),P=i(P,E,F,A,S,10,c[61]),A=i(A,P,E,F,f,15,c[62]),F=i(F,A,P,E,v,21,c[63]);o[0]=o[0]+E|0,o[1]=o[1]+F|0,o[2]=o[2]+A|0,o[3]=o[3]+P|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;n[i>>>5]|=128<<24-i%32;var s=t.floor(r/4294967296);for(n[(i+64>>>9<<4)+15]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),n[(i+64>>>9<<4)+14]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),e.sigBytes=4*(n.length+1),this._process(),e=this._hash,n=e.words,r=0;4>r;r++)i=n[r],n[r]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8);return e},clone:function(){var t=u.clone.call(this);return t._hash=this._hash.clone(),t}}),s.MD5=u._createHelper(o),s.HmacMD5=u._createHmacHelper(o)}(Math),function(){var t=or,e=t.lib,n=e.WordArray,r=e.Hasher,i=[],e=t.algo.SHA1=r.extend({_doReset:function(){this._hash=new n.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],s=n[1],o=n[2],a=n[3],u=n[4],c=0;80>c;c++){if(16>c)i[c]=0|t[e+c];else{var f=i[c-3]^i[c-8]^i[c-14]^i[c-16];i[c]=f<<1|f>>>31}f=(r<<5|r>>>27)+u+i[c],f=20>c?f+((s&o|~s&a)+1518500249):40>c?f+((s^o^a)+1859775393):60>c?f+((s&o|s&a|o&a)-1894007588):f+((s^o^a)-899497514),u=a,a=o,o=s<<30|s>>>2,s=r,r=f}n[0]=n[0]+r|0,n[1]=n[1]+s|0,n[2]=n[2]+o|0,n[3]=n[3]+a|0,n[4]=n[4]+u|0},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;return e[r>>>5]|=128<<24-r%32,e[(r+64>>>9<<4)+14]=Math.floor(n/4294967296),e[(r+64>>>9<<4)+15]=n,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=r.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA1=r._createHelper(e),t.HmacSHA1=r._createHmacHelper(e)}(),function(t){for(var e=or,n=e.lib,r=n.WordArray,i=n.Hasher,n=e.algo,s=[],o=[],a=function(t){return 4294967296*(t-(0|t))|0},u=2,c=0;64>c;){var f;t:{f=u;for(var h=t.sqrt(f),l=2;l<=h;l++)if(!(f%l)){f=!1;break t}f=!0}f&&(8>c&&(s[c]=a(t.pow(u,.5))),o[c]=a(t.pow(u,1/3)),c++),u++}var d=[],n=n.SHA256=i.extend({_doReset:function(){this._hash=new r.init(s.slice(0))},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],i=n[1],s=n[2],a=n[3],u=n[4],c=n[5],f=n[6],h=n[7],l=0;64>l;l++){if(16>l)d[l]=0|t[e+l];else{var p=d[l-15],g=d[l-2];d[l]=((p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3)+d[l-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+d[l-16]}p=h+((u<<26|u>>>6)^(u<<21|u>>>11)^(u<<7|u>>>25))+(u&c^~u&f)+o[l]+d[l],g=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&i^r&s^i&s),h=f,f=c,c=u,u=a+p|0,a=s,s=i,i=r,r=p+g|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+s|0,n[3]=n[3]+a|0,n[4]=n[4]+u|0,n[5]=n[5]+c|0,n[6]=n[6]+f|0,n[7]=n[7]+h|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;return n[i>>>5]|=128<<24-i%32,n[(i+64>>>9<<4)+14]=t.floor(r/4294967296),n[(i+64>>>9<<4)+15]=r,e.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});e.SHA256=i._createHelper(n),e.HmacSHA256=i._createHmacHelper(n)}(Math),function(){var t=or,e=t.lib.WordArray,n=t.algo,r=n.SHA256,n=n.SHA224=r.extend({_doReset:function(){this._hash=new e.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=r._doFinalize.call(this);return t.sigBytes-=4,t}});t.SHA224=r._createHelper(n),t.HmacSHA224=r._createHmacHelper(n)}(),function(){function t(){return i.create.apply(i,arguments)}for(var e=or,n=e.lib.Hasher,r=e.x64,i=r.Word,s=r.WordArray,r=e.algo,o=[t(1116352408,3609767458),t(1899447441,602891725),t(3049323471,3964484399),t(3921009573,2173295548),t(961987163,4081628472),t(1508970993,3053834265),t(2453635748,2937671579),t(2870763221,3664609560),t(3624381080,2734883394),t(310598401,1164996542),t(607225278,1323610764),t(1426881987,3590304994),t(1925078388,4068182383),t(2162078206,991336113),t(2614888103,633803317),t(3248222580,3479774868),t(3835390401,2666613458),t(4022224774,944711139),t(264347078,2341262773),t(604807628,2007800933),t(770255983,1495990901),t(1249150122,1856431235),t(1555081692,3175218132),t(1996064986,2198950837),t(2554220882,3999719339),t(2821834349,766784016),t(2952996808,2566594879),t(3210313671,3203337956),t(3336571891,1034457026),t(3584528711,2466948901),t(113926993,3758326383),t(338241895,168717936),t(666307205,1188179964),t(773529912,1546045734),t(1294757372,1522805485),t(1396182291,2643833823),t(1695183700,2343527390),t(1986661051,1014477480),t(2177026350,1206759142),t(2456956037,344077627),t(2730485921,1290863460),t(2820302411,3158454273),t(3259730800,3505952657),t(3345764771,106217008),t(3516065817,3606008344),t(3600352804,1432725776),t(4094571909,1467031594),t(275423344,851169720),t(430227734,3100823752),t(506948616,1363258195),t(659060556,3750685593),t(883997877,3785050280),t(958139571,3318307427),t(1322822218,3812723403),t(1537002063,2003034995),t(1747873779,3602036899),t(1955562222,1575990012),t(2024104815,1125592928),t(2227730452,2716904306),t(2361852424,442776044),t(2428436474,593698344),t(2756734187,3733110249),t(3204031479,2999351573),t(3329325298,3815920427),t(3391569614,3928383900),t(3515267271,566280711),t(3940187606,3454069534),t(4118630271,4000239992),t(116418474,1914138554),t(174292421,2731055270),t(289380356,3203993006),t(460393269,320620315),t(685471733,587496836),t(852142971,1086792851),t(1017036298,365543100),t(1126000580,2618297676),t(1288033470,3409855158),t(1501505948,4234509866),t(1607167915,987167468),t(1816402316,1246189591)],a=[],u=0;80>u;u++)a[u]=t();r=r.SHA512=n.extend({_doReset:function(){this._hash=new s.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],i=n[1],s=n[2],u=n[3],c=n[4],f=n[5],h=n[6],n=n[7],l=r.high,d=r.low,p=i.high,g=i.low,y=s.high,v=s.low,m=u.high,S=u.low,b=c.high,w=c.low,x=f.high,_=f.low,E=h.high,F=h.low,A=n.high,P=n.low,O=l,C=d,j=p,I=g,T=y,D=v,R=m,H=S,k=b,N=w,B=x,M=_,V=E,K=F,L=A,U=P,q=0;80>q;q++){var W=a[q];if(16>q)var J=W.high=0|t[e+2*q],z=W.low=0|t[e+2*q+1];else{var J=a[q-15],z=J.high,G=J.low,J=(z>>>1|G<<31)^(z>>>8|G<<24)^z>>>7,G=(G>>>1|z<<31)^(G>>>8|z<<24)^(G>>>7|z<<25),Y=a[q-2],z=Y.high,X=Y.low,Y=(z>>>19|X<<13)^(z<<3|X>>>29)^z>>>6,X=(X>>>19|z<<13)^(X<<3|z>>>29)^(X>>>6|z<<26),z=a[q-7],$=z.high,Q=a[q-16],Z=Q.high,Q=Q.low,z=G+z.low,J=J+$+(z>>>0>>0?1:0),z=z+X,J=J+Y+(z>>>0>>0?1:0),z=z+Q,J=J+Z+(z>>>0>>0?1:0);W.high=J,W.low=z}var $=k&B^~k&V,Q=N&M^~N&K,W=O&j^O&T^j&T,tt=C&I^C&D^I&D,G=(O>>>28|C<<4)^(O<<30|C>>>2)^(O<<25|C>>>7),Y=(C>>>28|O<<4)^(C<<30|O>>>2)^(C<<25|O>>>7),X=o[q],et=X.high,nt=X.low,X=U+((N>>>14|k<<18)^(N>>>18|k<<14)^(N<<23|k>>>9)),Z=L+((k>>>14|N<<18)^(k>>>18|N<<14)^(k<<23|N>>>9))+(X>>>0>>0?1:0),X=X+Q,Z=Z+$+(X>>>0>>0?1:0),X=X+nt,Z=Z+et+(X>>>0>>0?1:0),X=X+z,Z=Z+J+(X>>>0>>0?1:0),z=Y+tt,W=G+W+(z>>>0>>0?1:0),L=V,U=K,V=B,K=M,B=k,M=N,N=H+X|0,k=R+Z+(N>>>0>>0?1:0)|0,R=T,H=D,T=j,D=I,j=O,I=C,C=X+z|0,O=Z+W+(C>>>0>>0?1:0)|0}d=r.low=d+C,r.high=l+O+(d>>>0>>0?1:0),g=i.low=g+I,i.high=p+j+(g>>>0>>0?1:0),v=s.low=v+D,s.high=y+T+(v>>>0>>0?1:0),S=u.low=S+H,u.high=m+R+(S>>>0>>0?1:0),w=c.low=w+N,c.high=b+k+(w>>>0>>0?1:0),_=f.low=_+M,f.high=x+B+(_>>>0>>0?1:0),F=h.low=F+K,h.high=E+V+(F>>>0>>0?1:0),P=n.low=P+U,n.high=A+L+(P>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;return e[r>>>5]|=128<<24-r%32,e[(r+128>>>10<<5)+30]=Math.floor(n/4294967296),e[(r+128>>>10<<5)+31]=n,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=n.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32}),e.SHA512=n._createHelper(r),e.HmacSHA512=n._createHmacHelper(r)}(),function(){var t=or,e=t.x64,n=e.Word,r=e.WordArray,e=t.algo,i=e.SHA512,e=e.SHA384=i.extend({_doReset:function(){this._hash=new r.init([new n.init(3418070365,3238371032),new n.init(1654270250,914150663),new n.init(2438529370,812702999),new n.init(355462360,4144912697),new n.init(1731405415,4290775857),new n.init(2394180231,1750603025),new n.init(3675008525,1694076839),new n.init(1203062813,3204075428)])},_doFinalize:function(){var t=i._doFinalize.call(this);return t.sigBytes-=16,t}});t.SHA384=i._createHelper(e),t.HmacSHA384=i._createHmacHelper(e)}(),function(){var t=or,e=t.lib,n=e.WordArray,r=e.Hasher,e=t.algo,i=n.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),s=n.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),o=n.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),a=n.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),u=n.create([0,1518500249,1859775393,2400959708,2840853838]),c=n.create([1352829926,1548603684,1836072691,2053994217,0]),e=e.RIPEMD160=r.extend({_doReset:function(){this._hash=n.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var n=0;16>n;n++){var r=e+n,f=t[r]; +t[r]=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8)}var h,l,d,p,g,y,v,m,S,b,r=this._hash.words,f=u.words,w=c.words,x=i.words,_=s.words,E=o.words,F=a.words;y=h=r[0],v=l=r[1],m=d=r[2],S=p=r[3],b=g=r[4];for(var A,n=0;80>n;n+=1)A=h+t[e+x[n]]|0,A=16>n?A+((l^d^p)+f[0]):32>n?A+((l&d|~l&p)+f[1]):48>n?A+(((l|~d)^p)+f[2]):64>n?A+((l&p|d&~p)+f[3]):A+((l^(d|~p))+f[4]),A|=0,A=A<>>32-E[n],A=A+g|0,h=g,g=p,p=d<<10|d>>>22,d=l,l=A,A=y+t[e+_[n]]|0,A=16>n?A+((v^(m|~S))+w[0]):32>n?A+((v&S|m&~S)+w[1]):48>n?A+(((v|~m)^S)+w[2]):64>n?A+((v&m|~v&S)+w[3]):A+((v^m^S)+w[4]),A|=0,A=A<>>32-F[n],A=A+b|0,y=b,b=S,S=m<<10|m>>>22,m=v,v=A;A=r[1]+d+S|0,r[1]=r[2]+p+b|0,r[2]=r[3]+g+y|0,r[3]=r[4]+h+v|0,r[4]=r[0]+l+m|0,r[0]=A},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;for(e[r>>>5]|=128<<24-r%32,e[(r+64>>>9<<4)+14]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),t.sigBytes=4*(e.length+1),this._process(),t=this._hash,e=t.words,n=0;5>n;n++)r=e[n],e[n]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8);return t},clone:function(){var t=r.clone.call(this);return t._hash=this._hash.clone(),t}});t.RIPEMD160=r._createHelper(e),t.HmacRIPEMD160=r._createHmacHelper(e)}(Math),function(){var t=or,e=t.enc.Utf8;t.algo.HMAC=t.lib.Base.extend({init:function(t,n){t=this._hasher=new t.init,"string"==typeof n&&(n=e.parse(n));var r=t.blockSize,i=4*r;n.sigBytes>i&&(n=t.finalize(n)),n.clamp();for(var s=this._oKey=n.clone(),o=this._iKey=n.clone(),a=s.words,u=o.words,c=0;c>>8,br[wr++]=255&xr;wr=0,ce()}le.prototype.nextBytes=he;var Fr=20;ve.prototype.doPublic=Se,ve.prototype.setPublic=me,ve.prototype.encrypt=be,ve.prototype.encryptOAEP=we,ve.prototype.type="RSA";var Fr=20;ve.prototype.doPrivate=Oe,ve.prototype.setPrivate=Ae,ve.prototype.setPrivateEx=Fe,ve.prototype.generate=Pe,ve.prototype.decrypt=Ce,ve.prototype.decryptOAEP=Te,je.prototype.equals=Ie,je.prototype.toBigInteger=Re,je.prototype.negate=De,je.prototype.add=He,je.prototype.subtract=ke,je.prototype.multiply=Ne,je.prototype.square=Be,je.prototype.divide=Me,Ve.prototype.getX=Le,Ve.prototype.getY=Ke,Ve.prototype.equals=Ue,Ve.prototype.isInfinity=qe,Ve.prototype.negate=We,Ve.prototype.add=ze,Ve.prototype.twice=Je,Ve.prototype.multiply=Ye,Ve.prototype.multiplyTwo=Ge,Xe.prototype.getQ=$e,Xe.prototype.getA=Qe,Xe.prototype.getB=Ze,Xe.prototype.equals=tn,Xe.prototype.getInfinity=en,Xe.prototype.fromBigInteger=nn,Xe.prototype.decodePointHex=rn,/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib +var ar,ur="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",cr="=",fr=0xdeadbeefcafe,hr=15715070==(16777215&fr);hr&&"Microsoft Internet Explorer"==rr.appName?(o.prototype.am=c,ar=30):hr&&"Netscape"!=rr.appName?(o.prototype.am=u,ar=26):(o.prototype.am=f,ar=28),o.prototype.DB=ar,o.prototype.DM=(1<>>8,br[wr++]=255&_r;wr=0,ce()}le.prototype.nextBytes=he;var Ar=20;ve.prototype.doPublic=Se,ve.prototype.setPublic=me,ve.prototype.encrypt=be,ve.prototype.encryptOAEP=we,ve.prototype.type="RSA";var Ar=20;ve.prototype.doPrivate=Oe,ve.prototype.setPrivate=Fe,ve.prototype.setPrivateEx=Ae,ve.prototype.generate=Pe,ve.prototype.decrypt=Ce,ve.prototype.decryptOAEP=je,Ie.prototype.equals=Te,Ie.prototype.toBigInteger=De,Ie.prototype.negate=Re,Ie.prototype.add=He,Ie.prototype.subtract=ke,Ie.prototype.multiply=Ne,Ie.prototype.square=Be,Ie.prototype.divide=Me,Ve.prototype.getX=Ke,Ve.prototype.getY=Le,Ve.prototype.equals=Ue,Ve.prototype.isInfinity=qe,Ve.prototype.negate=We,Ve.prototype.add=Je,Ve.prototype.twice=ze,Ve.prototype.multiply=Ge,Ve.prototype.multiplyTwo=Ye,Xe.prototype.getQ=$e,Xe.prototype.getA=Qe,Xe.prototype.getB=Ze,Xe.prototype.equals=tn,Xe.prototype.getInfinity=en,Xe.prototype.fromBigInteger=nn,Xe.prototype.decodePointHex=rn,/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib */ -je.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)},Ve.prototype.getEncoded=function(t){var e=function(t,e){var n=t.toByteArrayUnsigned();if(en.length;)n.unshift(0);return n},n=this.getX().toBigInteger(),r=this.getY().toBigInteger(),i=e(n,32);return t?r.isEven()?i.unshift(2):i.unshift(3):(i.unshift(4),i=i.concat(e(r,32))),i},Ve.decodeFrom=function(t,e){var n=(e[0],e.length-1),r=e.slice(1,1+n/2),i=e.slice(1+n/2,1+n);r.unshift(0),i.unshift(0);var s=new o(r),a=new o(i);return new Ve(t,t.fromBigInteger(s),t.fromBigInteger(a))},Ve.decodeFromHex=function(t,e){var n=(e.substr(0,2),e.length-2),r=e.substr(2,n/2),i=e.substr(2+n/2,n/2),s=new o(r,16),a=new o(i,16);return new Ve(t,t.fromBigInteger(s),t.fromBigInteger(a))},Ve.prototype.add2D=function(t){if(this.isInfinity())return t;if(t.isInfinity())return this;if(this.x.equals(t.x))return this.y.equals(t.y)?this.twice():this.curve.getInfinity();var e=t.x.subtract(this.x),n=t.y.subtract(this.y),r=n.divide(e),i=r.square().subtract(this.x).subtract(t.x),s=r.multiply(this.x.subtract(i)).subtract(this.y);return new Ve(this.curve,i,s)},Ve.prototype.twice2D=function(){if(this.isInfinity())return this;if(0==this.y.toBigInteger().signum())return this.curve.getInfinity();var t=this.curve.fromBigInteger(o.valueOf(2)),e=this.curve.fromBigInteger(o.valueOf(3)),n=this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(t)),r=n.square().subtract(this.x.multiply(t)),i=n.multiply(this.x.subtract(r)).subtract(this.y);return new Ve(this.curve,r,i)},Ve.prototype.multiply2D=function(t){if(this.isInfinity())return this;if(0==t.signum())return this.curve.getInfinity();var e,n=t,r=n.multiply(new o("3")),i=this.negate(),s=this;for(e=r.bitLength()-2;e>0;--e){s=s.twice();var a=r.testBit(e),u=n.testBit(e);a!=u&&(s=s.add2D(a?this:i))}return s},Ve.prototype.isOnCurve=function(){var t=this.getX().toBigInteger(),e=this.getY().toBigInteger(),n=this.curve.getA().toBigInteger(),r=this.curve.getB().toBigInteger(),i=this.curve.getQ(),s=e.multiply(e).mod(i),o=t.multiply(t).multiply(t).add(n.multiply(t)).add(r).mod(i);return s.equals(o)},Ve.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"},Ve.prototype.validate=function(){var t=this.curve.getQ();if(this.isInfinity())throw new Error("Point is at infinity.");var e=this.getX().toBigInteger(),n=this.getY().toBigInteger();if(e.compareTo(o.ONE)<0||e.compareTo(t.subtract(o.ONE))>0)throw new Error("x coordinate out of bounds");if(n.compareTo(o.ONE)<0||n.compareTo(t.subtract(o.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(t).isInfinity())throw new Error("Point is not a scalar multiple of G.");return!0};/*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval +Ie.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)},Ve.prototype.getEncoded=function(t){var e=function(t,e){var n=t.toByteArrayUnsigned();if(en.length;)n.unshift(0);return n},n=this.getX().toBigInteger(),r=this.getY().toBigInteger(),i=e(n,32);return t?r.isEven()?i.unshift(2):i.unshift(3):(i.unshift(4),i=i.concat(e(r,32))),i},Ve.decodeFrom=function(t,e){var n=(e[0],e.length-1),r=e.slice(1,1+n/2),i=e.slice(1+n/2,1+n);r.unshift(0),i.unshift(0);var s=new o(r),a=new o(i);return new Ve(t,t.fromBigInteger(s),t.fromBigInteger(a))},Ve.decodeFromHex=function(t,e){var n=(e.substr(0,2),e.length-2),r=e.substr(2,n/2),i=e.substr(2+n/2,n/2),s=new o(r,16),a=new o(i,16);return new Ve(t,t.fromBigInteger(s),t.fromBigInteger(a))},Ve.prototype.add2D=function(t){if(this.isInfinity())return t;if(t.isInfinity())return this;if(this.x.equals(t.x))return this.y.equals(t.y)?this.twice():this.curve.getInfinity();var e=t.x.subtract(this.x),n=t.y.subtract(this.y),r=n.divide(e),i=r.square().subtract(this.x).subtract(t.x),s=r.multiply(this.x.subtract(i)).subtract(this.y);return new Ve(this.curve,i,s)},Ve.prototype.twice2D=function(){if(this.isInfinity())return this;if(0==this.y.toBigInteger().signum())return this.curve.getInfinity();var t=this.curve.fromBigInteger(o.valueOf(2)),e=this.curve.fromBigInteger(o.valueOf(3)),n=this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(t)),r=n.square().subtract(this.x.multiply(t)),i=n.multiply(this.x.subtract(r)).subtract(this.y);return new Ve(this.curve,r,i)},Ve.prototype.multiply2D=function(t){if(this.isInfinity())return this;if(0==t.signum())return this.curve.getInfinity();var e,n=t,r=n.multiply(new o("3")),i=this.negate(),s=this;for(e=r.bitLength()-2;e>0;--e){s=s.twice();var a=r.testBit(e),u=n.testBit(e);a!=u&&(s=s.add2D(a?this:i))}return s},Ve.prototype.isOnCurve=function(){var t=this.getX().toBigInteger(),e=this.getY().toBigInteger(),n=this.curve.getA().toBigInteger(),r=this.curve.getB().toBigInteger(),i=this.curve.getQ(),s=e.multiply(e).mod(i),o=t.multiply(t).multiply(t).add(n.multiply(t)).add(r).mod(i);return s.equals(o)},Ve.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"},Ve.prototype.validate=function(){var t=this.curve.getQ();if(this.isInfinity())throw new Error("Point is at infinity.");var e=this.getX().toBigInteger(),n=this.getY().toBigInteger();if(e.compareTo(o.ONE)<0||e.compareTo(t.subtract(o.ONE))>0)throw new Error("x coordinate out of bounds");if(n.compareTo(o.ONE)<0||n.compareTo(t.subtract(o.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(t).isInfinity())throw new Error("Point is not a scalar multiple of G.");return!0};/*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval */ var Pr=function(){function t(t,e,n){return e?o[e]:String.fromCharCode(parseInt(n,16))}var e="(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)",n='(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))',r='(?:"'+n+'*")',i=new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|"+e+"|"+r+")","g"),s=new RegExp("\\\\(?:([^u])|u(.{4}))","g"),o={'"':'"',"/":"/","\\":"\\",b:"\b",f:"\f",n:"\n",r:"\r",t:"\t"},a=new String(""),u="\\",c=({"{":Object,"[":Array},Object.hasOwnProperty);return function(e,n){var r,o=e.match(i),f=o[0],h=!1;"{"===f?r={}:"["===f?r=[]:(r=[],h=!0);for(var l,d=[r],p=1-h,g=o.length;p=0;)delete r[i[a]]}return n.call(t,e,r)};r=v({"":r},"")}return r}}();/*! asn1-1.0.10.js (c) 2013-2016 Kenji Urushima | kjur.github.com/jsrsasign/license */ -"undefined"!=typeof Cr&&Cr||(Cr={}),"undefined"!=typeof Cr.asn1&&Cr.asn1||(Cr.asn1={}),Cr.asn1.ASN1Util=new function(){this.integerToByteHex=function(t){var e=t.toString(16);return e.length%2==1&&(e="0"+e),e},this.bigIntToMinTwosComplementsHex=function(t){var e=t.toString(16);if("-"!=e.substr(0,1))e.length%2==1?e="0"+e:e.match(/^[0-7]/)||(e="00"+e);else{var n=e.substr(1),r=n.length;r%2==1?r+=1:e.match(/^[0-7]/)||(r+=2);for(var i="",s=0;s15)throw"ASN.1 length too long to represent by 8x: n = "+e.toString(16);var i=128+r;return i.toString(16)+n},this.getEncodedHex=function(){return(null==this.hTLV||this.isModified)&&(this.hV=this.getFreshValueHex(),this.hL=this.getLengthHexFromValue(),this.hTLV=this.hT+this.hL+this.hV,this.isModified=!1),this.hTLV},this.getValueHex=function(){return this.getEncodedHex(),this.hV},this.getFreshValueHex=function(){return""}},Cr.asn1.DERAbstractString=function(t){Cr.asn1.DERAbstractString.superclass.constructor.call(this);this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=un(this.s)},this.setStringHex=function(t){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("string"==typeof t?this.setString(t):"undefined"!=typeof t.str?this.setString(t.str):"undefined"!=typeof t.hex&&this.setStringHex(t.hex))},sr.lang.extend(Cr.asn1.DERAbstractString,Cr.asn1.ASN1Object),Cr.asn1.DERAbstractTime=function(t){Cr.asn1.DERAbstractTime.superclass.constructor.call(this);this.localDateToUTC=function(t){utc=t.getTime()+6e4*t.getTimezoneOffset();var e=new Date(utc);return e},this.formatDate=function(t,e,n){var r=this.zeroPadding,i=this.localDateToUTC(t),s=String(i.getFullYear());"utc"==e&&(s=s.substr(2,2));var o=r(String(i.getMonth()+1),2),a=r(String(i.getDate()),2),u=r(String(i.getHours()),2),c=r(String(i.getMinutes()),2),f=r(String(i.getSeconds()),2),h=s+o+a+u+c+f;if(n===!0){var l=i.getMilliseconds();if(0!=l){var d=r(String(l),3);d=d.replace(/[0]+$/,""),h=h+"."+d}}return h+"Z"},this.zeroPadding=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=un(t)},this.setByDateValue=function(t,e,n,r,i,s){var o=new Date(Date.UTC(t,e-1,n,r,i,s,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},sr.lang.extend(Cr.asn1.DERAbstractTime,Cr.asn1.ASN1Object),Cr.asn1.DERAbstractStructured=function(t){Cr.asn1.DERAbstractString.superclass.constructor.call(this);this.setByASN1ObjectArray=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array=t},this.appendASN1Object=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array.push(t)},this.asn1Array=new Array,"undefined"!=typeof t&&"undefined"!=typeof t.array&&(this.asn1Array=t.array)},sr.lang.extend(Cr.asn1.DERAbstractStructured,Cr.asn1.ASN1Object),Cr.asn1.DERBoolean=function(){Cr.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},sr.lang.extend(Cr.asn1.DERBoolean,Cr.asn1.ASN1Object),Cr.asn1.DERInteger=function(t){Cr.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=Cr.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new o(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("undefined"!=typeof t.bigint?this.setByBigInteger(t.bigint):"undefined"!=typeof t.int?this.setByInteger(t.int):"number"==typeof t?this.setByInteger(t):"undefined"!=typeof t.hex&&this.setValueHex(t.hex))},sr.lang.extend(Cr.asn1.DERInteger,Cr.asn1.ASN1Object),Cr.asn1.DERBitString=function(t){Cr.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(t){this.hTLV=null,this.isModified=!0,this.hV=t},this.setUnusedBitsAndHexValue=function(t,e){if(t<0||715)throw"ASN.1 length too long to represent by 8x: n = "+e.toString(16);var i=128+r;return i.toString(16)+n},this.getEncodedHex=function(){return(null==this.hTLV||this.isModified)&&(this.hV=this.getFreshValueHex(),this.hL=this.getLengthHexFromValue(),this.hTLV=this.hT+this.hL+this.hV,this.isModified=!1),this.hTLV},this.getValueHex=function(){return this.getEncodedHex(),this.hV},this.getFreshValueHex=function(){return""}},Cr.asn1.DERAbstractString=function(t){Cr.asn1.DERAbstractString.superclass.constructor.call(this);this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=un(this.s)},this.setStringHex=function(t){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("string"==typeof t?this.setString(t):"undefined"!=typeof t.str?this.setString(t.str):"undefined"!=typeof t.hex&&this.setStringHex(t.hex))},sr.lang.extend(Cr.asn1.DERAbstractString,Cr.asn1.ASN1Object),Cr.asn1.DERAbstractTime=function(t){Cr.asn1.DERAbstractTime.superclass.constructor.call(this);this.localDateToUTC=function(t){utc=t.getTime()+6e4*t.getTimezoneOffset();var e=new Date(utc);return e},this.formatDate=function(t,e,n){var r=this.zeroPadding,i=this.localDateToUTC(t),s=String(i.getFullYear());"utc"==e&&(s=s.substr(2,2));var o=r(String(i.getMonth()+1),2),a=r(String(i.getDate()),2),u=r(String(i.getHours()),2),c=r(String(i.getMinutes()),2),f=r(String(i.getSeconds()),2),h=s+o+a+u+c+f;if(n===!0){var l=i.getMilliseconds();if(0!=l){var d=r(String(l),3);d=d.replace(/[0]+$/,""),h=h+"."+d}}return h+"Z"},this.zeroPadding=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=un(t)},this.setByDateValue=function(t,e,n,r,i,s){var o=new Date(Date.UTC(t,e-1,n,r,i,s,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},sr.lang.extend(Cr.asn1.DERAbstractTime,Cr.asn1.ASN1Object),Cr.asn1.DERAbstractStructured=function(t){Cr.asn1.DERAbstractString.superclass.constructor.call(this);this.setByASN1ObjectArray=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array=t},this.appendASN1Object=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array.push(t)},this.asn1Array=new Array,"undefined"!=typeof t&&"undefined"!=typeof t.array&&(this.asn1Array=t.array)},sr.lang.extend(Cr.asn1.DERAbstractStructured,Cr.asn1.ASN1Object),Cr.asn1.DERBoolean=function(){Cr.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},sr.lang.extend(Cr.asn1.DERBoolean,Cr.asn1.ASN1Object),Cr.asn1.DERInteger=function(t){Cr.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=Cr.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new o(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("undefined"!=typeof t.bigint?this.setByBigInteger(t.bigint):"undefined"!=typeof t.int?this.setByInteger(t.int):"number"==typeof t?this.setByInteger(t):"undefined"!=typeof t.hex&&this.setValueHex(t.hex))},sr.lang.extend(Cr.asn1.DERInteger,Cr.asn1.ASN1Object),Cr.asn1.DERBitString=function(t){Cr.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(t){this.hTLV=null,this.isModified=!0,this.hV=t},this.setUnusedBitsAndHexValue=function(t,e){if(t<0||7=2*i)break;if(o>=200)break;n.push(a),s=a,o++}return n},this.getNthChildIndex_AtObj=function(t,e,n){var r=this.getPosArrayOfChildren_AtObj(t,e);return r[n]},this.getDecendantIndexByNthList=function(t,e,n){if(0==n.length)return e;var r=n.shift(),i=this.getPosArrayOfChildren_AtObj(t,e);return this.getDecendantIndexByNthList(t,i[r],n)},this.getDecendantHexTLVByNthList=function(t,e,n){var r=this.getDecendantIndexByNthList(t,e,n);return this.getHexOfTLV_AtObj(t,r)},this.getDecendantHexVByNthList=function(t,e,n){var r=this.getDecendantIndexByNthList(t,e,n);return this.getHexOfV_AtObj(t,r)}};Or.getVbyList=function(t,e,n,r){var i=this.getDecendantIndexByNthList(t,e,n);if(void 0===i)throw"can't find nthList object";if(void 0!==r&&t.substr(i,2)!=r)throw"checking tag doesn't match: "+t.substr(i,2)+"!="+r;return this.getHexOfV_AtObj(t,i)},Or.hextooidstr=function(t){var e=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},n=[],r=t.substr(0,2),i=parseInt(r,16);n[0]=new String(Math.floor(i/40)),n[1]=new String(i%40);for(var s=t.substr(2),o=[],a=0;a0&&(f=f+"."+u.join(".")),f},Or.dump=function(t,e,n,r){var i=function(t,e){if(t.length<=2*e)return t;var n=t.substr(0,e)+"..(total "+t.length/2+"bytes).."+t.substr(t.length-e,e);return n};void 0===e&&(e={ommit_long_octet:32}),void 0===n&&(n=0),void 0===r&&(r="");var s=e.ommit_long_octet;if("01"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);return"00"==o?r+"BOOLEAN FALSE\n":r+"BOOLEAN TRUE\n"}if("02"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);return r+"INTEGER "+i(o,s)+"\n"}if("03"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);return r+"BITSTRING "+i(o,s)+"\n"}if("04"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);if(Or.isASN1HEX(o)){var a=r+"OCTETSTRING, encapsulates\n";return a+=Or.dump(o,e,0,r+" ")}return r+"OCTETSTRING "+i(o,s)+"\n"}if("05"==t.substr(n,2))return r+"NULL\n";if("06"==t.substr(n,2)){var u=Or.getHexOfV_AtObj(t,n),c=Cr.asn1.ASN1Util.oidHexToInt(u),f=Cr.asn1.x509.OID.oid2name(c),h=c.replace(/\./g," ");return""!=f?r+"ObjectIdentifier "+f+" ("+h+")\n":r+"ObjectIdentifier ("+h+")\n"}if("0c"==t.substr(n,2))return r+"UTF8String '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("13"==t.substr(n,2))return r+"PrintableString '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("14"==t.substr(n,2))return r+"TeletexString '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("16"==t.substr(n,2))return r+"IA5String '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("17"==t.substr(n,2))return r+"UTCTime "+Sn(Or.getHexOfV_AtObj(t,n))+"\n";if("18"==t.substr(n,2))return r+"GeneralizedTime "+Sn(Or.getHexOfV_AtObj(t,n))+"\n";if("30"==t.substr(n,2)){if("3000"==t.substr(n,4))return r+"SEQUENCE {}\n";var a=r+"SEQUENCE\n",l=Or.getPosArrayOfChildren_AtObj(t,n),d=e;if((2==l.length||3==l.length)&&"06"==t.substr(l[0],2)&&"04"==t.substr(l[l.length-1],2)){var p=Or.getHexOfV_AtObj(t,l[0]),c=Cr.asn1.ASN1Util.oidHexToInt(p),f=Cr.asn1.x509.OID.oid2name(c),g=JSON.parse(JSON.stringify(e));g.x509ExtName=f,d=g}for(var y=0;y0){var e=new Cr.asn1.DERSequence({array:this.extensionsArray}),n=new Cr.asn1.DERTaggedObject({explicit:!0,tag:"a3",obj:e});this.asn1Array.push(n)}var r=new Cr.asn1.DERSequence({array:this.asn1Array});return this.hTLV=r.getEncodedHex(),this.isModified=!1,this.hTLV},this._initialize()},sr.lang.extend(Cr.asn1.x509.TBSCertificate,Cr.asn1.ASN1Object),Cr.asn1.x509.Extension=function(t){Cr.asn1.x509.Extension.superclass.constructor.call(this);this.getEncodedHex=function(){var t=new Cr.asn1.DERObjectIdentifier({oid:this.oid}),e=new Cr.asn1.DEROctetString({hex:this.getExtnValueHex()}),n=new Array;n.push(t),this.critical&&n.push(new Cr.asn1.DERBoolean),n.push(e);var r=new Cr.asn1.DERSequence({array:n});return r.getEncodedHex()},this.critical=!1,"undefined"!=typeof t&&"undefined"!=typeof t.critical&&(this.critical=t.critical)},sr.lang.extend(Cr.asn1.x509.Extension,Cr.asn1.ASN1Object),Cr.asn1.x509.KeyUsage=function(t){Cr.asn1.x509.KeyUsage.superclass.constructor.call(this,t),this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()},this.oid="2.5.29.15","undefined"!=typeof t&&"undefined"!=typeof t.bin&&(this.asn1ExtnValue=new Cr.asn1.DERBitString(t))},sr.lang.extend(Cr.asn1.x509.KeyUsage,Cr.asn1.x509.Extension),Cr.asn1.x509.BasicConstraints=function(t){Cr.asn1.x509.BasicConstraints.superclass.constructor.call(this,t);this.getExtnValueHex=function(){var t=new Array;this.cA&&t.push(new Cr.asn1.DERBoolean),this.pathLen>-1&&t.push(new Cr.asn1.DERInteger({int:this.pathLen}));var e=new Cr.asn1.DERSequence({array:t});return this.asn1ExtnValue=e,this.asn1ExtnValue.getEncodedHex()},this.oid="2.5.29.19",this.cA=!1,this.pathLen=-1,"undefined"!=typeof t&&("undefined"!=typeof t.cA&&(this.cA=t.cA),"undefined"!=typeof t.pathLen&&(this.pathLen=t.pathLen))},sr.lang.extend(Cr.asn1.x509.BasicConstraints,Cr.asn1.x509.Extension),Cr.asn1.x509.CRLDistributionPoints=function(t){Cr.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this,t),this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()},this.setByDPArray=function(t){this.asn1ExtnValue=new Cr.asn1.DERSequence({array:t})},this.setByOneURI=function(t){var e=new Cr.asn1.x509.GeneralNames([{uri:t}]),n=new Cr.asn1.x509.DistributionPointName(e),r=new Cr.asn1.x509.DistributionPoint({dpobj:n});this.setByDPArray([r])},this.oid="2.5.29.31","undefined"!=typeof t&&("undefined"!=typeof t.array?this.setByDPArray(t.array):"undefined"!=typeof t.uri&&this.setByOneURI(t.uri))},sr.lang.extend(Cr.asn1.x509.CRLDistributionPoints,Cr.asn1.x509.Extension),Cr.asn1.x509.ExtKeyUsage=function(t){Cr.asn1.x509.ExtKeyUsage.superclass.constructor.call(this,t),this.setPurposeArray=function(t){this.asn1ExtnValue=new Cr.asn1.DERSequence;for(var e=0;e0){var t=new Cr.asn1.DERSequence({array:this.aRevokedCert});this.asn1Array.push(t)}var e=new Cr.asn1.DERSequence({array:this.asn1Array});return this.hTLV=e.getEncodedHex(),this.isModified=!1,this.hTLV},this._initialize=function(){this.asn1Version=null,this.asn1SignatureAlg=null,this.asn1Issuer=null,this.asn1ThisUpdate=null,this.asn1NextUpdate=null,this.aRevokedCert=new Array},this._initialize()},sr.lang.extend(Cr.asn1.x509.TBSCertList,Cr.asn1.ASN1Object),Cr.asn1.x509.CRLEntry=function(t){Cr.asn1.x509.CRLEntry.superclass.constructor.call(this);this.setCertSerial=function(t){this.sn=new Cr.asn1.DERInteger(t)},this.setRevocationDate=function(t){this.time=new Cr.asn1.x509.Time(t)},this.getEncodedHex=function(){var t=new Cr.asn1.DERSequence({array:[this.sn,this.time]});return this.TLV=t.getEncodedHex(),this.TLV},"undefined"!=typeof t&&("undefined"!=typeof t.time&&this.setRevocationDate(t.time),"undefined"!=typeof t.sn&&this.setCertSerial(t.sn))},sr.lang.extend(Cr.asn1.x509.CRLEntry,Cr.asn1.ASN1Object),Cr.asn1.x509.X500Name=function(t){if(Cr.asn1.x509.X500Name.superclass.constructor.call(this),this.asn1Array=new Array,this.setByString=function(t){var e=t.split("/");e.shift();for(var n=0;n0){var e=new Cr.asn1.DERSequence({array:this.extensionsArray}),n=new Cr.asn1.DERTaggedObject({explicit:!0,tag:"a3",obj:e});this.asn1Array.push(n)}var r=new Cr.asn1.DERSequence({array:this.asn1Array});return this.hTLV=r.getEncodedHex(),this.isModified=!1,this.hTLV},this._initialize()},sr.lang.extend(Cr.asn1.x509.TBSCertificate,Cr.asn1.ASN1Object),Cr.asn1.x509.Extension=function(t){Cr.asn1.x509.Extension.superclass.constructor.call(this);this.getEncodedHex=function(){var t=new Cr.asn1.DERObjectIdentifier({oid:this.oid}),e=new Cr.asn1.DEROctetString({hex:this.getExtnValueHex()}),n=new Array;n.push(t),this.critical&&n.push(new Cr.asn1.DERBoolean),n.push(e);var r=new Cr.asn1.DERSequence({array:n});return r.getEncodedHex()},this.critical=!1,"undefined"!=typeof t&&"undefined"!=typeof t.critical&&(this.critical=t.critical)},sr.lang.extend(Cr.asn1.x509.Extension,Cr.asn1.ASN1Object),Cr.asn1.x509.KeyUsage=function(t){Cr.asn1.x509.KeyUsage.superclass.constructor.call(this,t),this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()},this.oid="2.5.29.15","undefined"!=typeof t&&"undefined"!=typeof t.bin&&(this.asn1ExtnValue=new Cr.asn1.DERBitString(t))},sr.lang.extend(Cr.asn1.x509.KeyUsage,Cr.asn1.x509.Extension),Cr.asn1.x509.BasicConstraints=function(t){Cr.asn1.x509.BasicConstraints.superclass.constructor.call(this,t);this.getExtnValueHex=function(){var t=new Array;this.cA&&t.push(new Cr.asn1.DERBoolean),this.pathLen>-1&&t.push(new Cr.asn1.DERInteger({int:this.pathLen}));var e=new Cr.asn1.DERSequence({array:t});return this.asn1ExtnValue=e,this.asn1ExtnValue.getEncodedHex()},this.oid="2.5.29.19",this.cA=!1,this.pathLen=-1,"undefined"!=typeof t&&("undefined"!=typeof t.cA&&(this.cA=t.cA),"undefined"!=typeof t.pathLen&&(this.pathLen=t.pathLen))},sr.lang.extend(Cr.asn1.x509.BasicConstraints,Cr.asn1.x509.Extension),Cr.asn1.x509.CRLDistributionPoints=function(t){Cr.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this,t),this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()},this.setByDPArray=function(t){this.asn1ExtnValue=new Cr.asn1.DERSequence({array:t})},this.setByOneURI=function(t){var e=new Cr.asn1.x509.GeneralNames([{uri:t}]),n=new Cr.asn1.x509.DistributionPointName(e),r=new Cr.asn1.x509.DistributionPoint({dpobj:n});this.setByDPArray([r])},this.oid="2.5.29.31","undefined"!=typeof t&&("undefined"!=typeof t.array?this.setByDPArray(t.array):"undefined"!=typeof t.uri&&this.setByOneURI(t.uri))},sr.lang.extend(Cr.asn1.x509.CRLDistributionPoints,Cr.asn1.x509.Extension),Cr.asn1.x509.ExtKeyUsage=function(t){Cr.asn1.x509.ExtKeyUsage.superclass.constructor.call(this,t),this.setPurposeArray=function(t){this.asn1ExtnValue=new Cr.asn1.DERSequence;for(var e=0;e0){var t=new Cr.asn1.DERSequence({array:this.aRevokedCert});this.asn1Array.push(t)}var e=new Cr.asn1.DERSequence({array:this.asn1Array});return this.hTLV=e.getEncodedHex(),this.isModified=!1,this.hTLV},this._initialize=function(){this.asn1Version=null,this.asn1SignatureAlg=null,this.asn1Issuer=null,this.asn1ThisUpdate=null,this.asn1NextUpdate=null,this.aRevokedCert=new Array},this._initialize()},sr.lang.extend(Cr.asn1.x509.TBSCertList,Cr.asn1.ASN1Object),Cr.asn1.x509.CRLEntry=function(t){Cr.asn1.x509.CRLEntry.superclass.constructor.call(this);this.setCertSerial=function(t){this.sn=new Cr.asn1.DERInteger(t)},this.setRevocationDate=function(t){this.time=new Cr.asn1.x509.Time(t)},this.getEncodedHex=function(){var t=new Cr.asn1.DERSequence({array:[this.sn,this.time]});return this.TLV=t.getEncodedHex(),this.TLV},"undefined"!=typeof t&&("undefined"!=typeof t.time&&this.setRevocationDate(t.time),"undefined"!=typeof t.sn&&this.setCertSerial(t.sn))},sr.lang.extend(Cr.asn1.x509.CRLEntry,Cr.asn1.ASN1Object),Cr.asn1.x509.X500Name=function(t){if(Cr.asn1.x509.X500Name.superclass.constructor.call(this),this.asn1Array=new Array,this.setByString=function(t){var e=t.split("/");e.shift();for(var n=0;n0&&(n=new e.DERTaggedObject({obj:this.dUnsignedAttrs,tag:"a1",explicit:!1}));var r=[this.dCMSVersion,this.dSignerIdentifier,this.dDigestAlgorithm,t,this.dSigAlg,this.dSig];null!=n&&r.push(n);var i=new e.DERSequence({array:r});return this.hTLV=i.getEncodedHex(),this.hTLV}},sr.lang.extend(Cr.asn1.cms.SignerInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.EncapsulatedContentInfo=function(t){Cr.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);var e=Cr.asn1;Cr.asn1.cms,Cr.asn1.x509;this.dEContentType=new e.DERObjectIdentifier({name:"data"}),this.dEContent=null,this.isDetached=!1,this.eContentValueHex=null,this.setContentType=function(t){t.match(/^[0-2][.][0-9.]+$/)?this.dEContentType=new e.DERObjectIdentifier({oid:t}):this.dEContentType=new e.DERObjectIdentifier({name:t})},this.setContentValue=function(t){"undefined"!=typeof t&&("string"==typeof t.hex?this.eContentValueHex=t.hex:"string"==typeof t.str&&(this.eContentValueHex=mn(t.str)))},this.setContentValueHex=function(t){this.eContentValueHex=t},this.setContentValueStr=function(t){this.eContentValueHex=mn(t)},this.getEncodedHex=function(){if("string"!=typeof this.eContentValueHex)throw"eContentValue not yet set";var t=new e.DEROctetString({hex:this.eContentValueHex});this.dEContent=new e.DERTaggedObject({obj:t,tag:"a0",explicit:!0});var n=[this.dEContentType];this.isDetached||n.push(this.dEContent);var r=new e.DERSequence({array:n});return this.hTLV=r.getEncodedHex(),this.hTLV}},sr.lang.extend(Cr.asn1.cms.EncapsulatedContentInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.ContentInfo=function(t){Cr.asn1.cms.ContentInfo.superclass.constructor.call(this);var e=Cr.asn1,n=(Cr.asn1.cms,Cr.asn1.x509);this.dContentType=null,this.dContent=null,this.setContentType=function(t){"string"==typeof t&&(this.dContentType=n.OID.name2obj(t))},this.getEncodedHex=function(){var t=new e.DERTaggedObject({obj:this.dContent,tag:"a0",explicit:!0}),n=new e.DERSequence({array:[this.dContentType,t]});return this.hTLV=n.getEncodedHex(),this.hTLV},"undefined"!=typeof t&&(t.type&&this.setContentType(t.type),t.obj&&t.obj instanceof e.ASN1Object&&(this.dContent=t.obj))},sr.lang.extend(Cr.asn1.cms.ContentInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.SignedData=function(t){Cr.asn1.cms.SignedData.superclass.constructor.call(this);var e=Cr.asn1,n=Cr.asn1.cms,r=Cr.asn1.x509;this.dCMSVersion=new e.DERInteger({int:1}),this.dDigestAlgs=null,this.digestAlgNameList=[],this.dEncapContentInfo=new n.EncapsulatedContentInfo,this.dCerts=null,this.certificateList=[],this.crlList=[],this.signerInfoList=[new n.SignerInfo],this.addCertificatesByPEM=function(t){var n=Dr.getHexFromPEM(t),r=new e.ASN1Object;r.hTLV=n,this.certificateList.push(r)},this.getEncodedHex=function(){if("string"==typeof this.hTLV)return this.hTLV;if(null==this.dDigestAlgs){for(var t=[],n=0;n0){var a=new e.DERSet({array:this.certificateList});this.dCerts=new e.DERTaggedObject({obj:a,tag:"a0",explicit:!1})}null!=this.dCerts&&o.push(this.dCerts);var u=new e.DERSet({array:this.signerInfoList});o.push(u);var c=new e.DERSequence({array:o});return this.hTLV=c.getEncodedHex(),this.hTLV},this.getContentInfo=function(){this.getEncodedHex();var t=new n.ContentInfo({type:"signed-data",obj:this});return t},this.getContentInfoEncodedHex=function(){var t=this.getContentInfo(),e=t.getEncodedHex();return e},this.getPEM=function(){var t=this.getContentInfoEncodedHex(),n=e.ASN1Util.getPEMStringFromHex(t,"CMS");return n}},sr.lang.extend(Cr.asn1.cms.SignedData,Cr.asn1.ASN1Object),Cr.asn1.cms.CMSUtil=new function(){},Cr.asn1.cms.CMSUtil.newSignedData=function(t){var e=Cr.asn1.cms,n=Cr.asn1.cades,r=new e.SignedData;if(r.dEncapContentInfo.setContentValue(t.content),"object"==typeof t.certs)for(var i=0;i0&&(n=new e.DERTaggedObject({obj:this.dUnsignedAttrs,tag:"a1",explicit:!1}));var r=[this.dCMSVersion,this.dSignerIdentifier,this.dDigestAlgorithm,t,this.dSigAlg,this.dSig];null!=n&&r.push(n);var i=new e.DERSequence({array:r});return this.hTLV=i.getEncodedHex(),this.hTLV}},sr.lang.extend(Cr.asn1.cms.SignerInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.EncapsulatedContentInfo=function(t){Cr.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);var e=Cr.asn1;Cr.asn1.cms,Cr.asn1.x509;this.dEContentType=new e.DERObjectIdentifier({name:"data"}),this.dEContent=null,this.isDetached=!1,this.eContentValueHex=null,this.setContentType=function(t){t.match(/^[0-2][.][0-9.]+$/)?this.dEContentType=new e.DERObjectIdentifier({oid:t}):this.dEContentType=new e.DERObjectIdentifier({name:t})},this.setContentValue=function(t){"undefined"!=typeof t&&("string"==typeof t.hex?this.eContentValueHex=t.hex:"string"==typeof t.str&&(this.eContentValueHex=mn(t.str)))},this.setContentValueHex=function(t){this.eContentValueHex=t},this.setContentValueStr=function(t){this.eContentValueHex=mn(t)},this.getEncodedHex=function(){if("string"!=typeof this.eContentValueHex)throw"eContentValue not yet set";var t=new e.DEROctetString({hex:this.eContentValueHex});this.dEContent=new e.DERTaggedObject({obj:t,tag:"a0",explicit:!0});var n=[this.dEContentType];this.isDetached||n.push(this.dEContent);var r=new e.DERSequence({array:n});return this.hTLV=r.getEncodedHex(),this.hTLV}},sr.lang.extend(Cr.asn1.cms.EncapsulatedContentInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.ContentInfo=function(t){Cr.asn1.cms.ContentInfo.superclass.constructor.call(this);var e=Cr.asn1,n=(Cr.asn1.cms,Cr.asn1.x509);this.dContentType=null,this.dContent=null,this.setContentType=function(t){"string"==typeof t&&(this.dContentType=n.OID.name2obj(t))},this.getEncodedHex=function(){var t=new e.DERTaggedObject({obj:this.dContent,tag:"a0",explicit:!0}),n=new e.DERSequence({array:[this.dContentType,t]});return this.hTLV=n.getEncodedHex(),this.hTLV},"undefined"!=typeof t&&(t.type&&this.setContentType(t.type),t.obj&&t.obj instanceof e.ASN1Object&&(this.dContent=t.obj))},sr.lang.extend(Cr.asn1.cms.ContentInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.SignedData=function(t){Cr.asn1.cms.SignedData.superclass.constructor.call(this);var e=Cr.asn1,n=Cr.asn1.cms,r=Cr.asn1.x509;this.dCMSVersion=new e.DERInteger({int:1}),this.dDigestAlgs=null,this.digestAlgNameList=[],this.dEncapContentInfo=new n.EncapsulatedContentInfo,this.dCerts=null,this.certificateList=[],this.crlList=[],this.signerInfoList=[new n.SignerInfo],this.addCertificatesByPEM=function(t){var n=Rr.getHexFromPEM(t),r=new e.ASN1Object;r.hTLV=n,this.certificateList.push(r)},this.getEncodedHex=function(){if("string"==typeof this.hTLV)return this.hTLV;if(null==this.dDigestAlgs){for(var t=[],n=0;n0){var a=new e.DERSet({array:this.certificateList});this.dCerts=new e.DERTaggedObject({obj:a,tag:"a0",explicit:!1})}null!=this.dCerts&&o.push(this.dCerts);var u=new e.DERSet({array:this.signerInfoList});o.push(u);var c=new e.DERSequence({array:o});return this.hTLV=c.getEncodedHex(),this.hTLV},this.getContentInfo=function(){this.getEncodedHex();var t=new n.ContentInfo({type:"signed-data",obj:this});return t},this.getContentInfoEncodedHex=function(){var t=this.getContentInfo(),e=t.getEncodedHex();return e},this.getPEM=function(){var t=this.getContentInfoEncodedHex(),n=e.ASN1Util.getPEMStringFromHex(t,"CMS");return n}},sr.lang.extend(Cr.asn1.cms.SignedData,Cr.asn1.ASN1Object),Cr.asn1.cms.CMSUtil=new function(){},Cr.asn1.cms.CMSUtil.newSignedData=function(t){var e=Cr.asn1.cms,n=Cr.asn1.cades,r=new e.SignedData;if(r.dEncapContentInfo.setContentValue(t.content),"object"==typeof t.certs)for(var i=0;ie.length&&(n=e.length);for(var r=0;re.length&&(n=e.length);for(var r=0;ri)throw"key is too short for SigAlg: keylen="+n+","+e;for(var s="0001",o="00"+r,a="",u=i-s.length-o.length,c=0;ci)throw"key is too short for SigAlg: keylen="+n+","+e;for(var s="0001",o="00"+r,a="",u=i-s.length-o.length,c=0;c=0)return!1;if(n.compareTo(o.ONE)<0||n.compareTo(i)>=0)return!1;var a=n.modInverse(i),u=t.multiply(a).mod(i),c=e.multiply(a).mod(i),f=s.multiply(u).add(r.multiply(c)),h=f.getX().toBigInteger().mod(i);return h.equals(e)},this.serializeSig=function(t,e){var n=t.toByteArraySigned(),r=e.toByteArraySigned(),i=[];return i.push(2),i.push(n.length),i=i.concat(n),i.push(2),i.push(r.length),i=i.concat(r),i.unshift(i.length),i.unshift(48),i},this.parseSig=function(t){var e;if(48!=t[0])throw new Error("Signature not a valid DERSequence");if(e=2,2!=t[e])throw new Error("First element in signature must be a DERInteger");var n=t.slice(e+2,e+2+t[e+1]);if(e+=2+t[e+1],2!=t[e])throw new Error("Second element in signature must be a DERInteger");var r=t.slice(e+2,e+2+t[e+1]);e+=2+t[e+1];var i=o.fromByteArrayUnsigned(n),s=o.fromByteArrayUnsigned(r);return{r:i,s:s}},this.parseSigCompact=function(t){if(65!==t.length)throw"Signature has the wrong length";var e=t[0]-27;if(e<0||e>7)throw"Invalid signature type";var n=this.ecparams.n,r=o.fromByteArrayUnsigned(t.slice(1,33)).mod(n),i=o.fromByteArrayUnsigned(t.slice(33,65)).mod(n);return{r:r,s:i,i:e}},void 0!==t&&void 0!==t.curve&&(this.curveName=t.curve),void 0===this.curveName&&(this.curveName=e),this.setNamedCurve(this.curveName),void 0!==t&&(void 0!==t.prv&&this.setPrivateKeyHex(t.prv),void 0!==t.pub&&this.setPublicKeyHex(t.pub))},Cr.crypto.ECDSA.parseSigHex=function(t){var e=Cr.crypto.ECDSA.parseSigHexInHexRS(t),n=new o(e.r,16),r=new o(e.s,16);return{r:n,s:r}},Cr.crypto.ECDSA.parseSigHexInHexRS=function(t){if("30"!=t.substr(0,2))throw"signature is not a ASN.1 sequence";var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"number of signature ASN.1 sequence elements seem wrong";var n=e[0],r=e[1];if("02"!=t.substr(n,2))throw"1st item of sequene of signature is not ASN.1 integer";if("02"!=t.substr(r,2))throw"2nd item of sequene of signature is not ASN.1 integer";var i=Or.getHexOfV_AtObj(t,n),s=Or.getHexOfV_AtObj(t,r);return{r:i,s:s}},Cr.crypto.ECDSA.asn1SigToConcatSig=function(t){var e=Cr.crypto.ECDSA.parseSigHexInHexRS(t),n=e.r,r=e.s;if("00"==n.substr(0,2)&&n.length/2*8%128==8&&(n=n.substr(2)),"00"==r.substr(0,2)&&r.length/2*8%128==8&&(r=r.substr(2)),n.length/2*8%128!=0)throw"unknown ECDSA sig r length error";if(r.length/2*8%128!=0)throw"unknown ECDSA sig s length error";return n+r},Cr.crypto.ECDSA.concatSigToASN1Sig=function(t){if(t.length/2*8%128!=0)throw"unknown ECDSA concatinated r-s sig length error";var e=t.substr(0,t.length/2),n=t.substr(t.length/2);return Cr.crypto.ECDSA.hexRSSigToASN1Sig(e,n)},Cr.crypto.ECDSA.hexRSSigToASN1Sig=function(t,e){var n=new o(t,16),r=new o(e,16);return Cr.crypto.ECDSA.biRSSigToASN1Sig(n,r)},Cr.crypto.ECDSA.biRSSigToASN1Sig=function(t,e){var n=new Cr.asn1.DERInteger({bigint:t}),r=new Cr.asn1.DERInteger({bigint:e}),i=new Cr.asn1.DERSequence({array:[n,r]});return i.getEncodedHex()},/*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license */ -"undefined"!=typeof Cr&&Cr||(Cr={}),"undefined"!=typeof Cr.crypto&&Cr.crypto||(Cr.crypto={}),Cr.crypto.ECParameterDB=new function(){function t(t){return new o(t,16)}var e={},n={};this.getByName=function(t){var r=t;if("undefined"!=typeof n[r]&&(r=n[t]),"undefined"!=typeof e[r])return e[r];throw"unregistered EC curve name: "+r},this.regist=function(r,i,s,o,a,u,c,f,h,l,d,p){e[r]={};var g=t(s),y=t(o),v=t(a),m=t(u),S=t(c),b=new Xe(g,y,v),w=b.decodePointHex("04"+f+h);e[r].name=r,e[r].keylen=i,e[r].curve=b,e[r].G=w,e[r].n=m,e[r].h=S,e[r].oid=d,e[r].info=p;for(var _=0;_11&&10!=e&&e<8?2:e;case 28:return e>11&&e<8?11:e;case 32:return e>10&&e<8?8:e;default:return util.print_debug("DSA select hash algorithm: returning null for an unknown length of q"),null}}function n(t,e,n,r,i,s,a,u){var c=Cr.crypto.Util.hashString(r,t.toLowerCase()),c=c.substr(0,s.bitLength()/4),f=new o(c,16);if(o.ZERO.compareTo(e)>0||e.compareTo(s)>0||o.ZERO.compareTo(n)>0||n.compareTo(s)>0)return util.print_error("invalid DSA Signature"),null;var h=n.modInverse(s),l=f.multiply(h).mod(s),d=e.multiply(h).mod(s),p=a.modPow(l,i).multiply(u.modPow(d,i)).mod(i).mod(s);return 0==p.compareTo(e)}function r(t,e){if(!(e.compareTo(t)<=0)){for(var n=e.subtract(t),r=i(n.bitLength());r>n;)r=i(n.bitLength());return t.add(r)}}function i(t){if(t<0)return null;var e=Math.floor((t+7)/8),n=s(e);return t%8>0&&(n=String.fromCharCode(Math.pow(2,t%8)-1&n.charCodeAt(0))+n.substring(1)),new o(u(n),16)}function s(t){for(var e="",n=0;n0||u.compareTo(r)>0||o.ZERO.compareTo(c)>0||c.compareTo(r)>0)throw"invalid DSA signature";var h=c.modInverse(r),l=f.multiply(h).mod(r),d=u.multiply(h).mod(r),p=i.modPow(l,n).multiply(s.modPow(d,n)).mod(n).mod(r);return 0==p.compareTo(u)},this.parseASN1Signature=function(t){try{var e=new o(Or.getVbyList(t,0,[0],"02"),16),n=new o(Or.getVbyList(t,0,[1],"02"),16);return[e,n]}catch(t){throw"malformed DSA signature"}},this.select_hash_algorithm=e,this.sign=t,this.verify=n,this.getRandomBigIntegerInRange=r,this.getRandomBigInteger=i,this.getRandomBytes=s};/*! pkcs5pkey-1.0.6.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license */ -var Rr=function(){var t=function(t,e,r){return n(or.AES,t,e,r)},e=function(t,e,r){return n(or.TripleDES,t,e,r)},n=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a={};a.key=s,a.iv=o,a.ciphertext=i;var u=t.decrypt(a,s,{iv:o});return or.enc.Hex.stringify(u)},r=function(t,e,n){return o(or.AES,t,e,n)},s=function(t,e,n){return o(or.TripleDES,t,e,n)},o=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a=t.encrypt(i,s,{iv:o}),u=or.enc.Hex.parse(a.toString()),c=or.enc.Base64.stringify(u);return c},a={"AES-256-CBC":{proc:t,eproc:r,keylen:32,ivlen:16},"AES-192-CBC":{proc:t,eproc:r,keylen:24,ivlen:16},"AES-128-CBC":{proc:t,eproc:r,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:s,keylen:24,ivlen:8}},u=function(t){return a[t].proc},c=function(t){var e=or.lib.WordArray.random(t),n=or.enc.Hex.stringify(e);return n},f=function(t){var e={};t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))&&(e.cipher=RegExp.$1,e.ivsalt=RegExp.$2),t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))&&(e.type=RegExp.$1);var n=-1,r=0;t.indexOf("\r\n\r\n")!=-1&&(n=t.indexOf("\r\n\r\n"),r=2),t.indexOf("\n\n")!=-1&&(n=t.indexOf("\n\n"),r=1);var i=t.indexOf("-----END");if(n!=-1&&i!=-1){var s=t.substring(n+2*r,i-r);s=s.replace(/\s+/g,""),e.data=s}return e},h=function(t,e,n){for(var r=n.substring(0,16),i=or.enc.Hex.parse(r),s=or.enc.Utf8.parse(e),o=a[t].keylen+a[t].ivlen,u="",c=null;;){var f=or.algo.MD5.create();if(null!=c&&f.update(c),f.update(s),f.update(i),c=f.finalize(),u+=or.enc.Hex.stringify(c),u.length>=2*o)break}var h={};return h.keyhex=u.substr(0,2*a[t].keylen),h.ivhex=u.substr(2*a[t].keylen,2*a[t].ivlen),h},l=function(t,e,n,r){var i=or.enc.Base64.parse(t),s=or.enc.Hex.stringify(i),o=a[e].proc,u=o(s,n,r);return u},d=function(t,e,n,r){var i=a[e].eproc,s=i(t,n,r);return s};return{version:"1.0.5",getHexFromPEM:function(t,e){var n=t;if(n.indexOf("BEGIN "+e)==-1)throw"can't find PEM header: "+e;n=n.replace("-----BEGIN "+e+"-----",""),n=n.replace("-----END "+e+"-----","");var r=n.replace(/\s+/g,""),s=i(r);return s},getDecryptedKeyHexByKeyIV:function(t,e,n,r){var i=u(e);return i(t,n,r)},parsePKCS5PEM:function(t){return f(t)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(t,e,n){return h(t,e,n)},decryptKeyB64:function(t,e,n,r){return l(t,e,n,r)},getDecryptedKeyHex:function(t,e){var n=f(t),r=(n.type,n.cipher),i=n.ivsalt,s=n.data,o=h(r,e,i),a=o.keyhex,u=l(s,r,a,i);return u},getRSAKeyFromEncryptedPKCS5PEM:function(t,e){var n=this.getDecryptedKeyHex(t,e),r=new ve;return r.readPrivateKeyFromASN1HexString(n),r},getEryptedPKCS5PEMFromPrvKeyHex:function(t,e,n,r){var i="";if("undefined"!=typeof n&&null!=n||(n="AES-256-CBC"),"undefined"==typeof a[n])throw"PKCS5PKEY unsupported algorithm: "+n;if("undefined"==typeof r||null==r){var s=a[n].ivlen,o=c(s);r=o.toUpperCase()}var u=h(n,e,r),f=u.keyhex,l=d(t,n,f,r),p=l.replace(/(.{64})/g,"$1\r\n"),i="-----BEGIN RSA PRIVATE KEY-----\r\n";return i+="Proc-Type: 4,ENCRYPTED\r\n",i+="DEK-Info: "+n+","+r+"\r\n",i+="\r\n",i+=p,i+="\r\n-----END RSA PRIVATE KEY-----\r\n"},getEryptedPKCS5PEMFromRSAKey:function(t,e,n,r){var i=new Cr.asn1.DERInteger({int:0}),s=new Cr.asn1.DERInteger({bigint:t.n}),o=new Cr.asn1.DERInteger({int:t.e}),a=new Cr.asn1.DERInteger({bigint:t.d}),u=new Cr.asn1.DERInteger({bigint:t.p}),c=new Cr.asn1.DERInteger({bigint:t.q}),f=new Cr.asn1.DERInteger({bigint:t.dmp1}),h=new Cr.asn1.DERInteger({bigint:t.dmq1}),l=new Cr.asn1.DERInteger({bigint:t.coeff}),d=new Cr.asn1.DERSequence({array:[i,s,o,a,u,c,f,h,l]}),p=d.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(p,e,n,r)},newEncryptedPKCS5PEM:function(t,e,n,r){"undefined"!=typeof e&&null!=e||(e=1024),"undefined"!=typeof n&&null!=n||(n="10001");var i=new ve;i.generate(e,n);var s=null;return s="undefined"==typeof r||null==r?this.getEncryptedPKCS5PEMFromRSAKey(pkey,t):this.getEncryptedPKCS5PEMFromRSAKey(pkey,t,r)},getRSAKeyFromPlainPKCS8PEM:function(t){if(t.match(/ENCRYPTED/))throw"pem shall be not ENCRYPTED";var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getRSAKeyFromPlainPKCS8Hex(e);return n},getRSAKeyFromPlainPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=e.length)throw"outer DERSequence shall have 3 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[1]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+n;var n=Or.getHexOfTLV_AtObj(t,e[1]),r=Or.getHexOfTLV_AtObj(t,e[2]),i=Or.getHexOfV_AtObj(r,0),s=new ve;return s.readPrivateKeyFromASN1HexString(i),s},parseHexOfEncryptedPKCS8:function(t){var e={},n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed format: SEQUENCE(0).items != 2: "+n.length;e.ciphertext=Or.getHexOfV_AtObj(t,n[1]);var r=Or.getPosArrayOfChildren_AtObj(t,n[0]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0).items != 2: "+r.length;if("2a864886f70d01050d"!=Or.getHexOfV_AtObj(t,r[0]))throw"this only supports pkcs5PBES2";var i=Or.getPosArrayOfChildren_AtObj(t,r[1]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0.1).items != 2: "+i.length;var s=Or.getPosArrayOfChildren_AtObj(t,i[1]);if(2!=s.length)throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+s.length;if("2a864886f70d0307"!=Or.getHexOfV_AtObj(t,s[0]))throw"this only supports TripleDES";e.encryptionSchemeAlg="TripleDES",e.encryptionSchemeIV=Or.getHexOfV_AtObj(t,s[1]);var o=Or.getPosArrayOfChildren_AtObj(t,i[0]);if(2!=o.length)throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+o.length;if("2a864886f70d01050c"!=Or.getHexOfV_AtObj(t,o[0]))throw"this only supports pkcs5PBKDF2";var a=Or.getPosArrayOfChildren_AtObj(t,o[1]);if(a.length<2)throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+a.length;e.pbkdf2Salt=Or.getHexOfV_AtObj(t,a[0]);var u=Or.getHexOfV_AtObj(t,a[1]);try{e.pbkdf2Iter=parseInt(u,16)}catch(t){throw"malformed format pbkdf2Iter: "+u}return e},getPBKDF2KeyHexFromParam:function(t,e){var n=or.enc.Hex.parse(t.pbkdf2Salt),r=t.pbkdf2Iter,i=or.PBKDF2(e,n,{keySize:6,iterations:r}),s=or.enc.Hex.stringify(i);return s},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(t,e){var n=this.getHexFromPEM(t,"ENCRYPTED PRIVATE KEY"),r=this.parseHexOfEncryptedPKCS8(n),i=Rr.getPBKDF2KeyHexFromParam(r,e),s={};s.ciphertext=or.enc.Hex.parse(r.ciphertext);var o=or.enc.Hex.parse(i),a=or.enc.Hex.parse(r.encryptionSchemeIV),u=or.TripleDES.decrypt(s,o,{iv:a}),c=or.enc.Hex.stringify(u);return c},getRSAKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getRSAKeyFromPlainPKCS8Hex(n);return r},getKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getKeyFromPlainPrivatePKCS8Hex(n);return r},parsePlainPrivatePKCS8Hex:function(t){var e={};if(e.algparam=null,"30"!=t.substr(0,2))throw"malformed plain PKCS8 private key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=n.length)throw"malformed plain PKCS8 private key(code:002)";if("30"!=t.substr(n[1],2))throw"malformed PKCS8 private key(code:003)";var r=Or.getPosArrayOfChildren_AtObj(t,n[1]);if(2!=r.length)throw"malformed PKCS8 private key(code:004)";if("06"!=t.substr(r[0],2))throw"malformed PKCS8 private key(code:005)";if(e.algoid=Or.getHexOfV_AtObj(t,r[0]),"06"==t.substr(r[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,r[1])),"04"!=t.substr(n[2],2))throw"malformed PKCS8 private key(code:006)";return e.keyidx=Or.getStartPosOfV_AtObj(t,n[2]),e},getKeyFromPlainPrivatePKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getKeyFromPlainPrivatePKCS8Hex(e);return n},getKeyFromPlainPrivatePKCS8Hex:function(t){var e=this.parsePlainPrivatePKCS8Hex(t);if("2a864886f70d010101"==e.algoid){this.parsePrivateRawRSAKeyHexAtObj(t,e);var n=e.key,r=new ve;return r.setPrivateEx(n.n,n.e,n.d,n.p,n.q,n.dp,n.dq,n.co),r}if("2a8648ce3d0201"==e.algoid){if(this.parsePrivateRawECKeyHexAtObj(t,e),void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,prv:e.key});return r}throw"unsupported private key algorithm"},getRSAKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getRSAKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8Hex:function(t){var e=this.parsePublicPKCS8Hex(t);if("2a864886f70d010101"==e.algoid){var n=this.parsePublicRawRSAKeyHex(e.key),r=new ve;return r.setPublic(n.n,n.e),r}if("2a8648ce3d0201"==e.algoid){if(void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,pub:e.key});return r}throw"unsupported public key algorithm"},parsePublicRawRSAKeyHex:function(t){var e={};if("30"!=t.substr(0,2))throw"malformed RSA key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed RSA key(code:002)";if("02"!=t.substr(n[0],2))throw"malformed RSA key(code:003)";if(e.n=Or.getHexOfV_AtObj(t,n[0]),"02"!=t.substr(n[1],2))throw"malformed RSA key(code:004)";return e.e=Or.getHexOfV_AtObj(t,n[1]),e},parsePrivateRawRSAKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed RSA private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(9!=r.length)throw"malformed RSA private key(code:002)";e.key={},e.key.n=Or.getHexOfV_AtObj(t,r[1]),e.key.e=Or.getHexOfV_AtObj(t,r[2]),e.key.d=Or.getHexOfV_AtObj(t,r[3]),e.key.p=Or.getHexOfV_AtObj(t,r[4]),e.key.q=Or.getHexOfV_AtObj(t,r[5]),e.key.dp=Or.getHexOfV_AtObj(t,r[6]),e.key.dq=Or.getHexOfV_AtObj(t,r[7]),e.key.co=Or.getHexOfV_AtObj(t,r[8])},parsePrivateRawECKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed ECC private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(3!=r.length)throw"malformed ECC private key(code:002)";if("04"!=t.substr(r[1],2))throw"malformed ECC private key(code:003)";e.key=Or.getHexOfV_AtObj(t,r[1])},parsePublicPKCS8Hex:function(t){var e={};e.algparam=null;var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"outer DERSequence shall have 2 elements: "+n.length;var r=n[0];if("30"!=t.substr(r,2))throw"malformed PKCS8 public key(code:001)";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"malformed PKCS8 public key(code:002)";if("06"!=t.substr(i[0],2))throw"malformed PKCS8 public key(code:003)";if(e.algoid=Or.getHexOfV_AtObj(t,i[0]),"06"==t.substr(i[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,i[1])),"03"!=t.substr(n[1],2))throw"malformed PKCS8 public key(code:004)";return e.key=Or.getHexOfV_AtObj(t,n[1]).substr(2),e},getRSAKeyFromPublicPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"outer DERSequence shall have 2 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[0]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmId is not rsaEncryption";if("03"!=t.substr(e[1],2))throw"PKCS8 Public Key is not BITSTRING encapslated.";var r=Or.getStartPosOfV_AtObj(t,e[1])+2;if("30"!=t.substr(r,2))throw"PKCS8 Public Key is not SEQUENCE.";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"inner DERSequence shall have 2 elements: "+i.length;if("02"!=t.substr(i[0],2))throw"N is not ASN.1 INTEGER";if("02"!=t.substr(i[1],2))throw"E is not ASN.1 INTEGER";var s=Or.getHexOfV_AtObj(t,i[0]),o=Or.getHexOfV_AtObj(t,i[1]),a=new ve;return a.setPublic(s,o),a}}}(),Dr=function(){var t=function(t,e,n){return r(or.AES,t,e,n)},e=function(t,e,n){return r(or.TripleDES,t,e,n)},n=function(t,e,n){return r(or.DES,t,e,n)},r=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a={};a.key=s,a.iv=o,a.ciphertext=i;var u=t.decrypt(a,s,{iv:o});return or.enc.Hex.stringify(u)},s=function(t,e,n){return c(or.AES,t,e,n)},a=function(t,e,n){return c(or.TripleDES,t,e,n)},u=function(t,e,n){return c(or.DES,t,e,n)},c=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a=t.encrypt(i,s,{iv:o}),u=or.enc.Hex.parse(a.toString()),c=or.enc.Base64.stringify(u);return c},f={"AES-256-CBC":{proc:t,eproc:s,keylen:32,ivlen:16},"AES-192-CBC":{proc:t,eproc:s,keylen:24,ivlen:16},"AES-128-CBC":{proc:t,eproc:s,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:a,keylen:24,ivlen:8},"DES-CBC":{proc:n,eproc:u,keylen:8,ivlen:8}},h=function(t){return f[t].proc},l=function(t){var e=or.lib.WordArray.random(t),n=or.enc.Hex.stringify(e);return n},d=function(t){var e={};t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))&&(e.cipher=RegExp.$1,e.ivsalt=RegExp.$2),t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))&&(e.type=RegExp.$1);var n=-1,r=0;t.indexOf("\r\n\r\n")!=-1&&(n=t.indexOf("\r\n\r\n"),r=2),t.indexOf("\n\n")!=-1&&(n=t.indexOf("\n\n"),r=1);var i=t.indexOf("-----END");if(n!=-1&&i!=-1){var s=t.substring(n+2*r,i-r);s=s.replace(/\s+/g,""),e.data=s}return e},p=function(t,e,n){for(var r=n.substring(0,16),i=or.enc.Hex.parse(r),s=or.enc.Utf8.parse(e),o=f[t].keylen+f[t].ivlen,a="",u=null;;){var c=or.algo.MD5.create();if(null!=u&&c.update(u),c.update(s),c.update(i),u=c.finalize(),a+=or.enc.Hex.stringify(u),a.length>=2*o)break}var h={};return h.keyhex=a.substr(0,2*f[t].keylen),h.ivhex=a.substr(2*f[t].keylen,2*f[t].ivlen),h},g=function(t,e,n,r){var i=or.enc.Base64.parse(t),s=or.enc.Hex.stringify(i),o=f[e].proc,a=o(s,n,r);return a},y=function(t,e,n,r){var i=f[e].eproc,s=i(t,n,r);return s};return{version:"1.0.0",getHexFromPEM:function(t,e){var n=t;if(n.indexOf("-----BEGIN ")==-1)throw"can't find PEM header: "+e;"string"==typeof e&&""!=e?(n=n.replace("-----BEGIN "+e+"-----",""),n=n.replace("-----END "+e+"-----","")):(n=n.replace(/-----BEGIN [^-]+-----/,""),n=n.replace(/-----END [^-]+-----/,""));var r=n.replace(/\s+/g,""),s=i(r);return s},getDecryptedKeyHexByKeyIV:function(t,e,n,r){var i=h(e);return i(t,n,r)},parsePKCS5PEM:function(t){return d(t)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(t,e,n){return p(t,e,n)},decryptKeyB64:function(t,e,n,r){return g(t,e,n,r)},getDecryptedKeyHex:function(t,e){var n=d(t),r=(n.type,n.cipher),i=n.ivsalt,s=n.data,o=p(r,e,i),a=o.keyhex,u=g(s,r,a,i);return u},getRSAKeyFromEncryptedPKCS5PEM:function(t,e){var n=this.getDecryptedKeyHex(t,e),r=new ve;return r.readPrivateKeyFromASN1HexString(n),r},getEncryptedPKCS5PEMFromPrvKeyHex:function(t,e,n,r,i){var s="";if("undefined"!=typeof r&&null!=r||(r="AES-256-CBC"),"undefined"==typeof f[r])throw"KEYUTIL unsupported algorithm: "+r;if("undefined"==typeof i||null==i){var o=f[r].ivlen,a=l(o);i=a.toUpperCase()}var u=p(r,n,i),c=u.keyhex,h=y(e,r,c,i),d=h.replace(/(.{64})/g,"$1\r\n"),s="-----BEGIN "+t+" PRIVATE KEY-----\r\n";return s+="Proc-Type: 4,ENCRYPTED\r\n",s+="DEK-Info: "+r+","+i+"\r\n",s+="\r\n",s+=d,s+="\r\n-----END "+t+" PRIVATE KEY-----\r\n"},getEncryptedPKCS5PEMFromRSAKey:function(t,e,n,r){var i=new Cr.asn1.DERInteger({int:0}),s=new Cr.asn1.DERInteger({bigint:t.n}),o=new Cr.asn1.DERInteger({int:t.e}),a=new Cr.asn1.DERInteger({bigint:t.d}),u=new Cr.asn1.DERInteger({bigint:t.p}),c=new Cr.asn1.DERInteger({bigint:t.q}),f=new Cr.asn1.DERInteger({bigint:t.dmp1}),h=new Cr.asn1.DERInteger({bigint:t.dmq1}),l=new Cr.asn1.DERInteger({bigint:t.coeff}),d=new Cr.asn1.DERSequence({array:[i,s,o,a,u,c,f,h,l]}),p=d.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",p,e,n,r)},newEncryptedPKCS5PEM:function(t,e,n,r){"undefined"!=typeof e&&null!=e||(e=1024),"undefined"!=typeof n&&null!=n||(n="10001");var i=new ve;i.generate(e,n);var s=null;return s="undefined"==typeof r||null==r?this.getEncryptedPKCS5PEMFromRSAKey(i,t):this.getEncryptedPKCS5PEMFromRSAKey(i,t,r)},getRSAKeyFromPlainPKCS8PEM:function(t){if(t.match(/ENCRYPTED/))throw"pem shall be not ENCRYPTED";var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getRSAKeyFromPlainPKCS8Hex(e);return n},getRSAKeyFromPlainPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=e.length)throw"outer DERSequence shall have 3 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[1]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+n;var n=Or.getHexOfTLV_AtObj(t,e[1]),r=Or.getHexOfTLV_AtObj(t,e[2]),i=Or.getHexOfV_AtObj(r,0),s=new ve;return s.readPrivateKeyFromASN1HexString(i),s},parseHexOfEncryptedPKCS8:function(t){var e={},n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed format: SEQUENCE(0).items != 2: "+n.length;e.ciphertext=Or.getHexOfV_AtObj(t,n[1]);var r=Or.getPosArrayOfChildren_AtObj(t,n[0]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0).items != 2: "+r.length;if("2a864886f70d01050d"!=Or.getHexOfV_AtObj(t,r[0]))throw"this only supports pkcs5PBES2";var i=Or.getPosArrayOfChildren_AtObj(t,r[1]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0.1).items != 2: "+i.length;var s=Or.getPosArrayOfChildren_AtObj(t,i[1]);if(2!=s.length)throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+s.length;if("2a864886f70d0307"!=Or.getHexOfV_AtObj(t,s[0]))throw"this only supports TripleDES";e.encryptionSchemeAlg="TripleDES",e.encryptionSchemeIV=Or.getHexOfV_AtObj(t,s[1]);var o=Or.getPosArrayOfChildren_AtObj(t,i[0]);if(2!=o.length)throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+o.length;if("2a864886f70d01050c"!=Or.getHexOfV_AtObj(t,o[0]))throw"this only supports pkcs5PBKDF2";var a=Or.getPosArrayOfChildren_AtObj(t,o[1]);if(a.length<2)throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+a.length;e.pbkdf2Salt=Or.getHexOfV_AtObj(t,a[0]);var u=Or.getHexOfV_AtObj(t,a[1]);try{e.pbkdf2Iter=parseInt(u,16)}catch(t){throw"malformed format pbkdf2Iter: "+u}return e},getPBKDF2KeyHexFromParam:function(t,e){var n=or.enc.Hex.parse(t.pbkdf2Salt),r=t.pbkdf2Iter,i=or.PBKDF2(e,n,{keySize:6,iterations:r}),s=or.enc.Hex.stringify(i);return s},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(t,e){var n=this.getHexFromPEM(t,"ENCRYPTED PRIVATE KEY"),r=this.parseHexOfEncryptedPKCS8(n),i=Dr.getPBKDF2KeyHexFromParam(r,e),s={};s.ciphertext=or.enc.Hex.parse(r.ciphertext);var o=or.enc.Hex.parse(i),a=or.enc.Hex.parse(r.encryptionSchemeIV),u=or.TripleDES.decrypt(s,o,{iv:a}),c=or.enc.Hex.stringify(u);return c},getRSAKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getRSAKeyFromPlainPKCS8Hex(n);return r},getKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getKeyFromPlainPrivatePKCS8Hex(n);return r},parsePlainPrivatePKCS8Hex:function(t){var e={};if(e.algparam=null,"30"!=t.substr(0,2))throw"malformed plain PKCS8 private key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=n.length)throw"malformed plain PKCS8 private key(code:002)";if("30"!=t.substr(n[1],2))throw"malformed PKCS8 private key(code:003)";var r=Or.getPosArrayOfChildren_AtObj(t,n[1]);if(2!=r.length)throw"malformed PKCS8 private key(code:004)";if("06"!=t.substr(r[0],2))throw"malformed PKCS8 private key(code:005)";if(e.algoid=Or.getHexOfV_AtObj(t,r[0]),"06"==t.substr(r[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,r[1])),"04"!=t.substr(n[2],2))throw"malformed PKCS8 private key(code:006)";return e.keyidx=Or.getStartPosOfV_AtObj(t,n[2]),e},getKeyFromPlainPrivatePKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getKeyFromPlainPrivatePKCS8Hex(e);return n},getKeyFromPlainPrivatePKCS8Hex:function(t){var e=this.parsePlainPrivatePKCS8Hex(t);if("2a864886f70d010101"==e.algoid){this.parsePrivateRawRSAKeyHexAtObj(t,e);var n=e.key,r=new ve;return r.setPrivateEx(n.n,n.e,n.d,n.p,n.q,n.dp,n.dq,n.co),r}if("2a8648ce3d0201"==e.algoid){if(this.parsePrivateRawECKeyHexAtObj(t,e),void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i});return r.setPublicKeyHex(e.pubkey),r.setPrivateKeyHex(e.key),r.isPublic=!1,r}if("2a8648ce380401"==e.algoid){var s=Or.getVbyList(t,0,[1,1,0],"02"),a=Or.getVbyList(t,0,[1,1,1],"02"),u=Or.getVbyList(t,0,[1,1,2],"02"),c=Or.getVbyList(t,0,[2,0],"02"),f=new o(s,16),h=new o(a,16),l=new o(u,16),d=new o(c,16),r=new Cr.crypto.DSA;return r.setPrivate(f,h,l,null,d),r}throw"unsupported private key algorithm"},getRSAKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getRSAKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8Hex:function(t){var e=this.parsePublicPKCS8Hex(t);if("2a864886f70d010101"==e.algoid){var n=this.parsePublicRawRSAKeyHex(e.key),r=new ve;return r.setPublic(n.n,n.e),r}if("2a8648ce3d0201"==e.algoid){if(void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,pub:e.key});return r}if("2a8648ce380401"==e.algoid){var s=e.algparam,a=Or.getHexOfV_AtObj(e.key,0),r=new Cr.crypto.DSA;return r.setPublic(new o(s.p,16),new o(s.q,16),new o(s.g,16),new o(a,16)),r}throw"unsupported public key algorithm"},parsePublicRawRSAKeyHex:function(t){var e={};if("30"!=t.substr(0,2))throw"malformed RSA key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed RSA key(code:002)";if("02"!=t.substr(n[0],2))throw"malformed RSA key(code:003)";if(e.n=Or.getHexOfV_AtObj(t,n[0]),"02"!=t.substr(n[1],2))throw"malformed RSA key(code:004)";return e.e=Or.getHexOfV_AtObj(t,n[1]),e},parsePrivateRawRSAKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed RSA private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(9!=r.length)throw"malformed RSA private key(code:002)";e.key={},e.key.n=Or.getHexOfV_AtObj(t,r[1]),e.key.e=Or.getHexOfV_AtObj(t,r[2]),e.key.d=Or.getHexOfV_AtObj(t,r[3]),e.key.p=Or.getHexOfV_AtObj(t,r[4]),e.key.q=Or.getHexOfV_AtObj(t,r[5]),e.key.dp=Or.getHexOfV_AtObj(t,r[6]),e.key.dq=Or.getHexOfV_AtObj(t,r[7]),e.key.co=Or.getHexOfV_AtObj(t,r[8])},parsePrivateRawECKeyHexAtObj:function(t,e){var n=e.keyidx,r=Or.getVbyList(t,n,[1],"04"),i=Or.getVbyList(t,n,[2,0],"03").substr(2);e.key=r,e.pubkey=i},parsePublicPKCS8Hex:function(t){var e={};e.algparam=null;var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"outer DERSequence shall have 2 elements: "+n.length;var r=n[0];if("30"!=t.substr(r,2))throw"malformed PKCS8 public key(code:001)";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"malformed PKCS8 public key(code:002)";if("06"!=t.substr(i[0],2))throw"malformed PKCS8 public key(code:003)";if(e.algoid=Or.getHexOfV_AtObj(t,i[0]),"06"==t.substr(i[1],2)?e.algparam=Or.getHexOfV_AtObj(t,i[1]):"30"==t.substr(i[1],2)&&(e.algparam={},e.algparam.p=Or.getVbyList(t,i[1],[0],"02"),e.algparam.q=Or.getVbyList(t,i[1],[1],"02"),e.algparam.g=Or.getVbyList(t,i[1],[2],"02")),"03"!=t.substr(n[1],2))throw"malformed PKCS8 public key(code:004)";return e.key=Or.getHexOfV_AtObj(t,n[1]).substr(2),e},getRSAKeyFromPublicPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"outer DERSequence shall have 2 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[0]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmId is not rsaEncryption";if("03"!=t.substr(e[1],2))throw"PKCS8 Public Key is not BITSTRING encapslated.";var r=Or.getStartPosOfV_AtObj(t,e[1])+2;if("30"!=t.substr(r,2))throw"PKCS8 Public Key is not SEQUENCE.";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"inner DERSequence shall have 2 elements: "+i.length;if("02"!=t.substr(i[0],2))throw"N is not ASN.1 INTEGER";if("02"!=t.substr(i[1],2))throw"E is not ASN.1 INTEGER";var s=Or.getHexOfV_AtObj(t,i[0]),o=Or.getHexOfV_AtObj(t,i[1]),a=new ve;return a.setPublic(s,o),a}}}();Dr.getKey=function(t,e,n){if("undefined"!=typeof ve&&t instanceof ve)return t;if("undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA)return t;if("undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA)return t;if(void 0!==t.curve&&void 0!==t.xy&&void 0===t.d)return new Cr.crypto.ECDSA({pub:t.xy,curve:t.curve});if(void 0!==t.curve&&void 0!==t.d)return new Cr.crypto.ECDSA({prv:t.d,curve:t.curve});if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0===t.d){var r=new ve;return r.setPublic(t.n,t.e),r}if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0!==t.p&&void 0!==t.q&&void 0!==t.dp&&void 0!==t.dq&&void 0!==t.co&&void 0===t.qi){var r=new ve;return r.setPrivateEx(t.n,t.e,t.d,t.p,t.q,t.dp,t.dq,t.co),r}if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0===t.p){var r=new ve;return r.setPrivate(t.n,t.e,t.d),r}if(void 0!==t.p&&void 0!==t.q&&void 0!==t.g&&void 0!==t.y&&void 0===t.x){var r=new Cr.crypto.DSA;return r.setPublic(t.p,t.q,t.g,t.y),r}if(void 0!==t.p&&void 0!==t.q&&void 0!==t.g&&void 0!==t.y&&void 0!==t.x){var r=new Cr.crypto.DSA;return r.setPrivate(t.p,t.q,t.g,t.y,t.x),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0===t.d){var r=new ve;return r.setPublic(gn(t.n),gn(t.e)),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0!==t.p&&void 0!==t.q&&void 0!==t.dp&&void 0!==t.dq&&void 0!==t.qi){var r=new ve;return r.setPrivateEx(gn(t.n),gn(t.e),gn(t.d),gn(t.p),gn(t.q),gn(t.dp),gn(t.dq),gn(t.qi)),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d){var r=new ve;return r.setPrivate(gn(t.n),gn(t.e),gn(t.d)),r}if("EC"===t.kty&&void 0!==t.crv&&void 0!==t.x&&void 0!==t.y&&void 0===t.d){var i=new Cr.crypto.ECDSA({curve:t.crv}),s=i.ecparams.keylen/4,a=("0000000000"+gn(t.x)).slice(-s),u=("0000000000"+gn(t.y)).slice(-s),c="04"+a+u;return i.setPublicKeyHex(c),i}if("EC"===t.kty&&void 0!==t.crv&&void 0!==t.x&&void 0!==t.y&&void 0!==t.d){var i=new Cr.crypto.ECDSA({curve:t.crv}),s=i.ecparams.keylen/4,a=("0000000000"+gn(t.x)).slice(-s),u=("0000000000"+gn(t.y)).slice(-s),c="04"+a+u,f=("0000000000"+gn(t.d)).slice(-s);return i.setPublicKeyHex(c),i.setPrivateKeyHex(f),i}if(t.indexOf("-END CERTIFICATE-",0)!=-1||t.indexOf("-END X509 CERTIFICATE-",0)!=-1||t.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1)return $n.getPublicKeyFromCertPEM(t);if("pkcs8pub"===n)return Dr.getKeyFromPublicPKCS8Hex(t);if(t.indexOf("-END PUBLIC KEY-")!=-1)return Dr.getKeyFromPublicPKCS8PEM(t);if("pkcs5prv"===n){var r=new ve;return r.readPrivateKeyFromASN1HexString(t),r}if("pkcs5prv"===n){var r=new ve;return r.readPrivateKeyFromASN1HexString(t),r}if(t.indexOf("-END RSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")==-1){var h=Dr.getHexFromPEM(t,"RSA PRIVATE KEY");return Dr.getKey(h,null,"pkcs5prv")}if(t.indexOf("-END DSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")==-1){var l=this.getHexFromPEM(t,"DSA PRIVATE KEY"),d=Or.getVbyList(l,0,[1],"02"),p=Or.getVbyList(l,0,[2],"02"),g=Or.getVbyList(l,0,[3],"02"),y=Or.getVbyList(l,0,[4],"02"),v=Or.getVbyList(l,0,[5],"02"),r=new Cr.crypto.DSA;return r.setPrivate(new o(d,16),new o(p,16),new o(g,16),new o(y,16),new o(v,16)),r}if(t.indexOf("-END PRIVATE KEY-")!=-1)return Dr.getKeyFromPlainPrivatePKCS8PEM(t);if(t.indexOf("-END RSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1)return Dr.getRSAKeyFromEncryptedPKCS5PEM(t,e);if(t.indexOf("-END EC PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1){var l=Dr.getDecryptedKeyHex(t,e),r=Or.getVbyList(l,0,[1],"04"),m=Or.getVbyList(l,0,[2,0],"06"),S=Or.getVbyList(l,0,[3,0],"03").substr(2),b="";if(void 0===Cr.crypto.OID.oidhex2name[m])throw"undefined OID(hex) in KJUR.crypto.OID: "+m;b=Cr.crypto.OID.oidhex2name[m];var i=new Cr.crypto.ECDSA({name:b});return i.setPublicKeyHex(S),i.setPrivateKeyHex(r),i.isPublic=!1,i}if(t.indexOf("-END DSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1){var l=Dr.getDecryptedKeyHex(t,e),d=Or.getVbyList(l,0,[1],"02"),p=Or.getVbyList(l,0,[2],"02"),g=Or.getVbyList(l,0,[3],"02"),y=Or.getVbyList(l,0,[4],"02"),v=Or.getVbyList(l,0,[5],"02"),r=new Cr.crypto.DSA;return r.setPrivate(new o(d,16),new o(p,16),new o(g,16),new o(y,16),new o(v,16)),r}if(t.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1)return Dr.getKeyFromEncryptedPKCS8PEM(t,e);throw"not supported argument"},Dr.generateKeypair=function(t,e){if("RSA"==t){var n=e,r=new ve;r.generate(n,"10001"),r.isPrivate=!0,r.isPublic=!0;var i=new ve,s=r.n.toString(16),o=r.e.toString(16);i.setPublic(s,o),i.isPrivate=!1,i.isPublic=!0;var a={};return a.prvKeyObj=r,a.pubKeyObj=i,a}if("EC"==t){var u=e,c=new Cr.crypto.ECDSA({curve:u}),f=c.generateKeyPairHex(),r=new Cr.crypto.ECDSA({curve:u});r.setPublicKeyHex(f.ecpubhex),r.setPrivateKeyHex(f.ecprvhex),r.isPrivate=!0,r.isPublic=!1;var i=new Cr.crypto.ECDSA({curve:u});i.setPublicKeyHex(f.ecpubhex),i.isPrivate=!1,i.isPublic=!0;var a={};return a.prvKeyObj=r,a.pubKeyObj=i,a}throw"unknown algorithm: "+t},Dr.getPEM=function(t,e,n,r,i){function s(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{int:{bigint:t.n}},{int:t.e},{int:{bigint:t.d}},{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.dmp1}},{int:{bigint:t.dmq1}},{int:{bigint:t.coeff}}]});return e}function o(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:1},{octstr:{hex:t.prvKeyHex}},{tag:["a0",!0,{oid:{name:t.curveName}}]},{tag:["a1",!0,{bitstr:{hex:"00"+t.pubKeyHex}}]}]});return e}function a(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.g}},{int:{bigint:t.y}},{int:{bigint:t.x}}]});return e}var u=Cr.asn1,c=Cr.crypto;if(("undefined"!=typeof ve&&t instanceof ve||"undefined"!=typeof c.DSA&&t instanceof c.DSA||"undefined"!=typeof c.ECDSA&&t instanceof c.ECDSA)&&1==t.isPublic&&(void 0===e||"PKCS8PUB"==e)){var f=new Cr.asn1.x509.SubjectPublicKeyInfo(t),h=f.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(h,"PUBLIC KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&(void 0===n||null==n)&&1==t.isPrivate){var f=s(t),h=f.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(h,"RSA PRIVATE KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof ve&&t instanceof Cr.crypto.ECDSA&&(void 0===n||null==n)&&1==t.isPrivate){var l=new Cr.asn1.DERObjectIdentifier({name:t.curveName}),d=l.getEncodedHex(),p=o(t),g=p.getEncodedHex(),y="";return y+=u.ASN1Util.getPEMStringFromHex(d,"EC PARAMETERS"),y+=u.ASN1Util.getPEMStringFromHex(g,"EC PRIVATE KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&(void 0===n||null==n)&&1==t.isPrivate){var f=a(t),h=f.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(h,"DSA PRIVATE KEY")}if("PKCS5PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&void 0!==n&&null!=n&&1==t.isPrivate){var f=s(t),h=f.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",h,n,r)}if("PKCS5PRV"==e&&"undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA&&void 0!==n&&null!=n&&1==t.isPrivate){var f=o(t),h=f.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",h,n,r)}if("PKCS5PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&void 0!==n&&null!=n&&1==t.isPrivate){var f=a(t),h=f.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",h,n,r)}var v=function(t,e){var n=m(t,e),r=new Cr.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:n.pbkdf2Salt}},{int:n.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:n.encryptionSchemeIV}}]}]}]},{octstr:{hex:n.ciphertext}}]});return r.getEncodedHex()},m=function(t,e){var n=100,r=or.lib.WordArray.random(8),i="DES-EDE3-CBC",s=or.lib.WordArray.random(8),o=or.PBKDF2(e,r,{keySize:6,iterations:n}),a=or.enc.Hex.parse(t),u=or.TripleDES.encrypt(a,o,{iv:s})+"",c={};return c.ciphertext=u,c.pbkdf2Salt=or.enc.Hex.stringify(r),c.pbkdf2Iter=n,c.encryptionSchemeAlg=i,c.encryptionSchemeIV=or.enc.Hex.stringify(s),c};if("PKCS8PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&1==t.isPrivate){var S=s(t),b=S.getEncodedHex(),f=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"rsaEncryption"}},{null:!0}]},{octstr:{hex:b}}]}),h=f.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(h,"PRIVATE KEY");var g=v(h,n);return u.ASN1Util.getPEMStringFromHex(g,"ENCRYPTED PRIVATE KEY"); -}if("PKCS8PRV"==e&&"undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA&&1==t.isPrivate){var S=new Cr.asn1.ASN1Util.newObject({seq:[{int:1},{octstr:{hex:t.prvKeyHex}},{tag:["a1",!0,{bitstr:{hex:"00"+t.pubKeyHex}}]}]}),b=S.getEncodedHex(),f=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:t.curveName}}]},{octstr:{hex:b}}]}),h=f.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(h,"PRIVATE KEY");var g=v(h,n);return u.ASN1Util.getPEMStringFromHex(g,"ENCRYPTED PRIVATE KEY")}if("PKCS8PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&1==t.isPrivate){var S=new Cr.asn1.DERInteger({bigint:t.x}),b=S.getEncodedHex(),f=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"dsa"}},{seq:[{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.g}}]}]},{octstr:{hex:b}}]}),h=f.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(h,"PRIVATE KEY");var g=v(h,n);return u.ASN1Util.getPEMStringFromHex(g,"ENCRYPTED PRIVATE KEY")}throw"unsupported object nor format"},Dr.getKeyFromCSRPEM=function(t){var e=Dr.getHexFromPEM(t,"CERTIFICATE REQUEST"),n=Dr.getKeyFromCSRHex(e);return n},Dr.getKeyFromCSRHex=function(t){var e=Dr.parseCSRHex(t),n=Dr.getKey(e.p8pubkeyhex,null,"pkcs8pub");return n},Dr.parseCSRHex=function(t){var e={},n=t;if("30"!=n.substr(0,2))throw"malformed CSR(code:001)";var r=Or.getPosArrayOfChildren_AtObj(n,0);if(r.length<1)throw"malformed CSR(code:002)";if("30"!=n.substr(r[0],2))throw"malformed CSR(code:003)";var i=Or.getPosArrayOfChildren_AtObj(n,r[0]);if(i.length<3)throw"malformed CSR(code:004)";return e.p8pubkeyhex=Or.getHexOfTLV_AtObj(n,i[2]),e},Dr.getJWKFromKey=function(t){var e={};if(t instanceof ve&&t.isPrivate)return e.kty="RSA",e.n=pn(t.n.toString(16)),e.e=pn(t.e.toString(16)),e.d=pn(t.d.toString(16)),e.p=pn(t.p.toString(16)),e.q=pn(t.q.toString(16)),e.dp=pn(t.dmp1.toString(16)),e.dq=pn(t.dmq1.toString(16)),e.qi=pn(t.coeff.toString(16)),e;if(t instanceof ve&&t.isPublic)return e.kty="RSA",e.n=pn(t.n.toString(16)),e.e=pn(t.e.toString(16)),e;if(t instanceof Cr.crypto.ECDSA&&t.isPrivate){var n=t.getShortNISTPCurveName();if("P-256"!==n&&"P-384"!==n)throw"unsupported curve name for JWT: "+n;var r=t.getPublicKeyXYHex();return e.kty="EC",e.crv=n,e.x=pn(r.x),e.y=pn(r.y),e.d=pn(t.prvKeyHex),e}if(t instanceof Cr.crypto.ECDSA&&t.isPublic){var n=t.getShortNISTPCurveName();if("P-256"!==n&&"P-384"!==n)throw"unsupported curve name for JWT: "+n;var r=t.getPublicKeyXYHex();return e.kty="EC",e.crv=n,e.x=pn(r.x),e.y=pn(r.y),e}throw"not supported key object"},ve.prototype.readPrivateKeyFromPEMString=Rn,ve.prototype.readPrivateKeyFromASN1HexString=In;/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license +var Dr=function(){var t=function(t,e,r){return n(or.AES,t,e,r)},e=function(t,e,r){return n(or.TripleDES,t,e,r)},n=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a={};a.key=s,a.iv=o,a.ciphertext=i;var u=t.decrypt(a,s,{iv:o});return or.enc.Hex.stringify(u)},r=function(t,e,n){return o(or.AES,t,e,n)},s=function(t,e,n){return o(or.TripleDES,t,e,n)},o=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a=t.encrypt(i,s,{iv:o}),u=or.enc.Hex.parse(a.toString()),c=or.enc.Base64.stringify(u);return c},a={"AES-256-CBC":{proc:t,eproc:r,keylen:32,ivlen:16},"AES-192-CBC":{proc:t,eproc:r,keylen:24,ivlen:16},"AES-128-CBC":{proc:t,eproc:r,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:s,keylen:24,ivlen:8}},u=function(t){return a[t].proc},c=function(t){var e=or.lib.WordArray.random(t),n=or.enc.Hex.stringify(e);return n},f=function(t){var e={};t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))&&(e.cipher=RegExp.$1,e.ivsalt=RegExp.$2),t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))&&(e.type=RegExp.$1);var n=-1,r=0;t.indexOf("\r\n\r\n")!=-1&&(n=t.indexOf("\r\n\r\n"),r=2),t.indexOf("\n\n")!=-1&&(n=t.indexOf("\n\n"),r=1);var i=t.indexOf("-----END");if(n!=-1&&i!=-1){var s=t.substring(n+2*r,i-r);s=s.replace(/\s+/g,""),e.data=s}return e},h=function(t,e,n){for(var r=n.substring(0,16),i=or.enc.Hex.parse(r),s=or.enc.Utf8.parse(e),o=a[t].keylen+a[t].ivlen,u="",c=null;;){var f=or.algo.MD5.create();if(null!=c&&f.update(c),f.update(s),f.update(i),c=f.finalize(),u+=or.enc.Hex.stringify(c),u.length>=2*o)break}var h={};return h.keyhex=u.substr(0,2*a[t].keylen),h.ivhex=u.substr(2*a[t].keylen,2*a[t].ivlen),h},l=function(t,e,n,r){var i=or.enc.Base64.parse(t),s=or.enc.Hex.stringify(i),o=a[e].proc,u=o(s,n,r);return u},d=function(t,e,n,r){var i=a[e].eproc,s=i(t,n,r);return s};return{version:"1.0.5",getHexFromPEM:function(t,e){var n=t;if(n.indexOf("BEGIN "+e)==-1)throw"can't find PEM header: "+e;n=n.replace("-----BEGIN "+e+"-----",""),n=n.replace("-----END "+e+"-----","");var r=n.replace(/\s+/g,""),s=i(r);return s},getDecryptedKeyHexByKeyIV:function(t,e,n,r){var i=u(e);return i(t,n,r)},parsePKCS5PEM:function(t){return f(t)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(t,e,n){return h(t,e,n)},decryptKeyB64:function(t,e,n,r){return l(t,e,n,r)},getDecryptedKeyHex:function(t,e){var n=f(t),r=(n.type,n.cipher),i=n.ivsalt,s=n.data,o=h(r,e,i),a=o.keyhex,u=l(s,r,a,i);return u},getRSAKeyFromEncryptedPKCS5PEM:function(t,e){var n=this.getDecryptedKeyHex(t,e),r=new ve;return r.readPrivateKeyFromASN1HexString(n),r},getEryptedPKCS5PEMFromPrvKeyHex:function(t,e,n,r){var i="";if("undefined"!=typeof n&&null!=n||(n="AES-256-CBC"),"undefined"==typeof a[n])throw"PKCS5PKEY unsupported algorithm: "+n;if("undefined"==typeof r||null==r){var s=a[n].ivlen,o=c(s);r=o.toUpperCase()}var u=h(n,e,r),f=u.keyhex,l=d(t,n,f,r),p=l.replace(/(.{64})/g,"$1\r\n"),i="-----BEGIN RSA PRIVATE KEY-----\r\n";return i+="Proc-Type: 4,ENCRYPTED\r\n",i+="DEK-Info: "+n+","+r+"\r\n",i+="\r\n",i+=p,i+="\r\n-----END RSA PRIVATE KEY-----\r\n"},getEryptedPKCS5PEMFromRSAKey:function(t,e,n,r){var i=new Cr.asn1.DERInteger({int:0}),s=new Cr.asn1.DERInteger({bigint:t.n}),o=new Cr.asn1.DERInteger({int:t.e}),a=new Cr.asn1.DERInteger({bigint:t.d}),u=new Cr.asn1.DERInteger({bigint:t.p}),c=new Cr.asn1.DERInteger({bigint:t.q}),f=new Cr.asn1.DERInteger({bigint:t.dmp1}),h=new Cr.asn1.DERInteger({bigint:t.dmq1}),l=new Cr.asn1.DERInteger({bigint:t.coeff}),d=new Cr.asn1.DERSequence({array:[i,s,o,a,u,c,f,h,l]}),p=d.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(p,e,n,r)},newEncryptedPKCS5PEM:function(t,e,n,r){"undefined"!=typeof e&&null!=e||(e=1024),"undefined"!=typeof n&&null!=n||(n="10001");var i=new ve;i.generate(e,n);var s=null;return s="undefined"==typeof r||null==r?this.getEncryptedPKCS5PEMFromRSAKey(pkey,t):this.getEncryptedPKCS5PEMFromRSAKey(pkey,t,r)},getRSAKeyFromPlainPKCS8PEM:function(t){if(t.match(/ENCRYPTED/))throw"pem shall be not ENCRYPTED";var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getRSAKeyFromPlainPKCS8Hex(e);return n},getRSAKeyFromPlainPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=e.length)throw"outer DERSequence shall have 3 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[1]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+n;var n=Or.getHexOfTLV_AtObj(t,e[1]),r=Or.getHexOfTLV_AtObj(t,e[2]),i=Or.getHexOfV_AtObj(r,0),s=new ve;return s.readPrivateKeyFromASN1HexString(i),s},parseHexOfEncryptedPKCS8:function(t){var e={},n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed format: SEQUENCE(0).items != 2: "+n.length;e.ciphertext=Or.getHexOfV_AtObj(t,n[1]);var r=Or.getPosArrayOfChildren_AtObj(t,n[0]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0).items != 2: "+r.length;if("2a864886f70d01050d"!=Or.getHexOfV_AtObj(t,r[0]))throw"this only supports pkcs5PBES2";var i=Or.getPosArrayOfChildren_AtObj(t,r[1]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0.1).items != 2: "+i.length;var s=Or.getPosArrayOfChildren_AtObj(t,i[1]);if(2!=s.length)throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+s.length;if("2a864886f70d0307"!=Or.getHexOfV_AtObj(t,s[0]))throw"this only supports TripleDES";e.encryptionSchemeAlg="TripleDES",e.encryptionSchemeIV=Or.getHexOfV_AtObj(t,s[1]);var o=Or.getPosArrayOfChildren_AtObj(t,i[0]);if(2!=o.length)throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+o.length;if("2a864886f70d01050c"!=Or.getHexOfV_AtObj(t,o[0]))throw"this only supports pkcs5PBKDF2";var a=Or.getPosArrayOfChildren_AtObj(t,o[1]);if(a.length<2)throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+a.length;e.pbkdf2Salt=Or.getHexOfV_AtObj(t,a[0]);var u=Or.getHexOfV_AtObj(t,a[1]);try{e.pbkdf2Iter=parseInt(u,16)}catch(t){throw"malformed format pbkdf2Iter: "+u}return e},getPBKDF2KeyHexFromParam:function(t,e){var n=or.enc.Hex.parse(t.pbkdf2Salt),r=t.pbkdf2Iter,i=or.PBKDF2(e,n,{keySize:6,iterations:r}),s=or.enc.Hex.stringify(i);return s},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(t,e){var n=this.getHexFromPEM(t,"ENCRYPTED PRIVATE KEY"),r=this.parseHexOfEncryptedPKCS8(n),i=Dr.getPBKDF2KeyHexFromParam(r,e),s={};s.ciphertext=or.enc.Hex.parse(r.ciphertext);var o=or.enc.Hex.parse(i),a=or.enc.Hex.parse(r.encryptionSchemeIV),u=or.TripleDES.decrypt(s,o,{iv:a}),c=or.enc.Hex.stringify(u);return c},getRSAKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getRSAKeyFromPlainPKCS8Hex(n);return r},getKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getKeyFromPlainPrivatePKCS8Hex(n);return r},parsePlainPrivatePKCS8Hex:function(t){var e={};if(e.algparam=null,"30"!=t.substr(0,2))throw"malformed plain PKCS8 private key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=n.length)throw"malformed plain PKCS8 private key(code:002)";if("30"!=t.substr(n[1],2))throw"malformed PKCS8 private key(code:003)";var r=Or.getPosArrayOfChildren_AtObj(t,n[1]);if(2!=r.length)throw"malformed PKCS8 private key(code:004)";if("06"!=t.substr(r[0],2))throw"malformed PKCS8 private key(code:005)";if(e.algoid=Or.getHexOfV_AtObj(t,r[0]),"06"==t.substr(r[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,r[1])),"04"!=t.substr(n[2],2))throw"malformed PKCS8 private key(code:006)";return e.keyidx=Or.getStartPosOfV_AtObj(t,n[2]),e},getKeyFromPlainPrivatePKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getKeyFromPlainPrivatePKCS8Hex(e);return n},getKeyFromPlainPrivatePKCS8Hex:function(t){var e=this.parsePlainPrivatePKCS8Hex(t);if("2a864886f70d010101"==e.algoid){this.parsePrivateRawRSAKeyHexAtObj(t,e);var n=e.key,r=new ve;return r.setPrivateEx(n.n,n.e,n.d,n.p,n.q,n.dp,n.dq,n.co),r}if("2a8648ce3d0201"==e.algoid){if(this.parsePrivateRawECKeyHexAtObj(t,e),void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,prv:e.key});return r}throw"unsupported private key algorithm"},getRSAKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getRSAKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8Hex:function(t){var e=this.parsePublicPKCS8Hex(t);if("2a864886f70d010101"==e.algoid){var n=this.parsePublicRawRSAKeyHex(e.key),r=new ve;return r.setPublic(n.n,n.e),r}if("2a8648ce3d0201"==e.algoid){if(void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,pub:e.key});return r}throw"unsupported public key algorithm"},parsePublicRawRSAKeyHex:function(t){var e={};if("30"!=t.substr(0,2))throw"malformed RSA key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed RSA key(code:002)";if("02"!=t.substr(n[0],2))throw"malformed RSA key(code:003)";if(e.n=Or.getHexOfV_AtObj(t,n[0]),"02"!=t.substr(n[1],2))throw"malformed RSA key(code:004)";return e.e=Or.getHexOfV_AtObj(t,n[1]),e},parsePrivateRawRSAKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed RSA private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(9!=r.length)throw"malformed RSA private key(code:002)";e.key={},e.key.n=Or.getHexOfV_AtObj(t,r[1]),e.key.e=Or.getHexOfV_AtObj(t,r[2]),e.key.d=Or.getHexOfV_AtObj(t,r[3]),e.key.p=Or.getHexOfV_AtObj(t,r[4]),e.key.q=Or.getHexOfV_AtObj(t,r[5]),e.key.dp=Or.getHexOfV_AtObj(t,r[6]),e.key.dq=Or.getHexOfV_AtObj(t,r[7]),e.key.co=Or.getHexOfV_AtObj(t,r[8])},parsePrivateRawECKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed ECC private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(3!=r.length)throw"malformed ECC private key(code:002)";if("04"!=t.substr(r[1],2))throw"malformed ECC private key(code:003)";e.key=Or.getHexOfV_AtObj(t,r[1])},parsePublicPKCS8Hex:function(t){var e={};e.algparam=null;var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"outer DERSequence shall have 2 elements: "+n.length;var r=n[0];if("30"!=t.substr(r,2))throw"malformed PKCS8 public key(code:001)";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"malformed PKCS8 public key(code:002)";if("06"!=t.substr(i[0],2))throw"malformed PKCS8 public key(code:003)";if(e.algoid=Or.getHexOfV_AtObj(t,i[0]),"06"==t.substr(i[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,i[1])),"03"!=t.substr(n[1],2))throw"malformed PKCS8 public key(code:004)";return e.key=Or.getHexOfV_AtObj(t,n[1]).substr(2),e},getRSAKeyFromPublicPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"outer DERSequence shall have 2 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[0]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmId is not rsaEncryption";if("03"!=t.substr(e[1],2))throw"PKCS8 Public Key is not BITSTRING encapslated.";var r=Or.getStartPosOfV_AtObj(t,e[1])+2;if("30"!=t.substr(r,2))throw"PKCS8 Public Key is not SEQUENCE.";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"inner DERSequence shall have 2 elements: "+i.length;if("02"!=t.substr(i[0],2))throw"N is not ASN.1 INTEGER";if("02"!=t.substr(i[1],2))throw"E is not ASN.1 INTEGER";var s=Or.getHexOfV_AtObj(t,i[0]),o=Or.getHexOfV_AtObj(t,i[1]),a=new ve;return a.setPublic(s,o),a}}}(),Rr=function(){var t=function(t,e,n){return r(or.AES,t,e,n)},e=function(t,e,n){return r(or.TripleDES,t,e,n)},n=function(t,e,n){return r(or.DES,t,e,n)},r=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a={};a.key=s,a.iv=o,a.ciphertext=i;var u=t.decrypt(a,s,{iv:o});return or.enc.Hex.stringify(u)},s=function(t,e,n){return c(or.AES,t,e,n)},a=function(t,e,n){return c(or.TripleDES,t,e,n)},u=function(t,e,n){return c(or.DES,t,e,n)},c=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a=t.encrypt(i,s,{iv:o}),u=or.enc.Hex.parse(a.toString()),c=or.enc.Base64.stringify(u);return c},f={"AES-256-CBC":{proc:t,eproc:s,keylen:32,ivlen:16},"AES-192-CBC":{proc:t,eproc:s,keylen:24,ivlen:16},"AES-128-CBC":{proc:t,eproc:s,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:a,keylen:24,ivlen:8},"DES-CBC":{proc:n,eproc:u,keylen:8,ivlen:8}},h=function(t){return f[t].proc},l=function(t){var e=or.lib.WordArray.random(t),n=or.enc.Hex.stringify(e);return n},d=function(t){var e={};t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))&&(e.cipher=RegExp.$1,e.ivsalt=RegExp.$2),t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))&&(e.type=RegExp.$1);var n=-1,r=0;t.indexOf("\r\n\r\n")!=-1&&(n=t.indexOf("\r\n\r\n"),r=2),t.indexOf("\n\n")!=-1&&(n=t.indexOf("\n\n"),r=1);var i=t.indexOf("-----END");if(n!=-1&&i!=-1){var s=t.substring(n+2*r,i-r);s=s.replace(/\s+/g,""),e.data=s}return e},p=function(t,e,n){for(var r=n.substring(0,16),i=or.enc.Hex.parse(r),s=or.enc.Utf8.parse(e),o=f[t].keylen+f[t].ivlen,a="",u=null;;){var c=or.algo.MD5.create();if(null!=u&&c.update(u),c.update(s),c.update(i),u=c.finalize(),a+=or.enc.Hex.stringify(u),a.length>=2*o)break}var h={};return h.keyhex=a.substr(0,2*f[t].keylen),h.ivhex=a.substr(2*f[t].keylen,2*f[t].ivlen),h},g=function(t,e,n,r){var i=or.enc.Base64.parse(t),s=or.enc.Hex.stringify(i),o=f[e].proc,a=o(s,n,r);return a},y=function(t,e,n,r){var i=f[e].eproc,s=i(t,n,r);return s};return{version:"1.0.0",getHexFromPEM:function(t,e){var n=t;if(n.indexOf("-----BEGIN ")==-1)throw"can't find PEM header: "+e;"string"==typeof e&&""!=e?(n=n.replace("-----BEGIN "+e+"-----",""),n=n.replace("-----END "+e+"-----","")):(n=n.replace(/-----BEGIN [^-]+-----/,""),n=n.replace(/-----END [^-]+-----/,""));var r=n.replace(/\s+/g,""),s=i(r);return s},getDecryptedKeyHexByKeyIV:function(t,e,n,r){var i=h(e);return i(t,n,r)},parsePKCS5PEM:function(t){return d(t)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(t,e,n){return p(t,e,n)},decryptKeyB64:function(t,e,n,r){return g(t,e,n,r)},getDecryptedKeyHex:function(t,e){var n=d(t),r=(n.type,n.cipher),i=n.ivsalt,s=n.data,o=p(r,e,i),a=o.keyhex,u=g(s,r,a,i);return u},getRSAKeyFromEncryptedPKCS5PEM:function(t,e){var n=this.getDecryptedKeyHex(t,e),r=new ve;return r.readPrivateKeyFromASN1HexString(n),r},getEncryptedPKCS5PEMFromPrvKeyHex:function(t,e,n,r,i){var s="";if("undefined"!=typeof r&&null!=r||(r="AES-256-CBC"),"undefined"==typeof f[r])throw"KEYUTIL unsupported algorithm: "+r;if("undefined"==typeof i||null==i){var o=f[r].ivlen,a=l(o);i=a.toUpperCase()}var u=p(r,n,i),c=u.keyhex,h=y(e,r,c,i),d=h.replace(/(.{64})/g,"$1\r\n"),s="-----BEGIN "+t+" PRIVATE KEY-----\r\n";return s+="Proc-Type: 4,ENCRYPTED\r\n",s+="DEK-Info: "+r+","+i+"\r\n",s+="\r\n",s+=d,s+="\r\n-----END "+t+" PRIVATE KEY-----\r\n"},getEncryptedPKCS5PEMFromRSAKey:function(t,e,n,r){var i=new Cr.asn1.DERInteger({int:0}),s=new Cr.asn1.DERInteger({bigint:t.n}),o=new Cr.asn1.DERInteger({int:t.e}),a=new Cr.asn1.DERInteger({bigint:t.d}),u=new Cr.asn1.DERInteger({bigint:t.p}),c=new Cr.asn1.DERInteger({bigint:t.q}),f=new Cr.asn1.DERInteger({bigint:t.dmp1}),h=new Cr.asn1.DERInteger({bigint:t.dmq1}),l=new Cr.asn1.DERInteger({bigint:t.coeff}),d=new Cr.asn1.DERSequence({array:[i,s,o,a,u,c,f,h,l]}),p=d.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",p,e,n,r)},newEncryptedPKCS5PEM:function(t,e,n,r){"undefined"!=typeof e&&null!=e||(e=1024),"undefined"!=typeof n&&null!=n||(n="10001");var i=new ve;i.generate(e,n);var s=null;return s="undefined"==typeof r||null==r?this.getEncryptedPKCS5PEMFromRSAKey(i,t):this.getEncryptedPKCS5PEMFromRSAKey(i,t,r)},getRSAKeyFromPlainPKCS8PEM:function(t){if(t.match(/ENCRYPTED/))throw"pem shall be not ENCRYPTED";var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getRSAKeyFromPlainPKCS8Hex(e);return n},getRSAKeyFromPlainPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=e.length)throw"outer DERSequence shall have 3 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[1]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+n;var n=Or.getHexOfTLV_AtObj(t,e[1]),r=Or.getHexOfTLV_AtObj(t,e[2]),i=Or.getHexOfV_AtObj(r,0),s=new ve;return s.readPrivateKeyFromASN1HexString(i),s},parseHexOfEncryptedPKCS8:function(t){var e={},n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed format: SEQUENCE(0).items != 2: "+n.length;e.ciphertext=Or.getHexOfV_AtObj(t,n[1]);var r=Or.getPosArrayOfChildren_AtObj(t,n[0]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0).items != 2: "+r.length;if("2a864886f70d01050d"!=Or.getHexOfV_AtObj(t,r[0]))throw"this only supports pkcs5PBES2";var i=Or.getPosArrayOfChildren_AtObj(t,r[1]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0.1).items != 2: "+i.length;var s=Or.getPosArrayOfChildren_AtObj(t,i[1]);if(2!=s.length)throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+s.length;if("2a864886f70d0307"!=Or.getHexOfV_AtObj(t,s[0]))throw"this only supports TripleDES";e.encryptionSchemeAlg="TripleDES",e.encryptionSchemeIV=Or.getHexOfV_AtObj(t,s[1]);var o=Or.getPosArrayOfChildren_AtObj(t,i[0]);if(2!=o.length)throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+o.length;if("2a864886f70d01050c"!=Or.getHexOfV_AtObj(t,o[0]))throw"this only supports pkcs5PBKDF2";var a=Or.getPosArrayOfChildren_AtObj(t,o[1]);if(a.length<2)throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+a.length;e.pbkdf2Salt=Or.getHexOfV_AtObj(t,a[0]);var u=Or.getHexOfV_AtObj(t,a[1]);try{e.pbkdf2Iter=parseInt(u,16)}catch(t){throw"malformed format pbkdf2Iter: "+u}return e},getPBKDF2KeyHexFromParam:function(t,e){var n=or.enc.Hex.parse(t.pbkdf2Salt),r=t.pbkdf2Iter,i=or.PBKDF2(e,n,{keySize:6,iterations:r}),s=or.enc.Hex.stringify(i);return s},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(t,e){var n=this.getHexFromPEM(t,"ENCRYPTED PRIVATE KEY"),r=this.parseHexOfEncryptedPKCS8(n),i=Rr.getPBKDF2KeyHexFromParam(r,e),s={};s.ciphertext=or.enc.Hex.parse(r.ciphertext);var o=or.enc.Hex.parse(i),a=or.enc.Hex.parse(r.encryptionSchemeIV),u=or.TripleDES.decrypt(s,o,{iv:a}),c=or.enc.Hex.stringify(u);return c},getRSAKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getRSAKeyFromPlainPKCS8Hex(n);return r},getKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getKeyFromPlainPrivatePKCS8Hex(n);return r},parsePlainPrivatePKCS8Hex:function(t){var e={};if(e.algparam=null,"30"!=t.substr(0,2))throw"malformed plain PKCS8 private key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=n.length)throw"malformed plain PKCS8 private key(code:002)";if("30"!=t.substr(n[1],2))throw"malformed PKCS8 private key(code:003)";var r=Or.getPosArrayOfChildren_AtObj(t,n[1]);if(2!=r.length)throw"malformed PKCS8 private key(code:004)";if("06"!=t.substr(r[0],2))throw"malformed PKCS8 private key(code:005)";if(e.algoid=Or.getHexOfV_AtObj(t,r[0]),"06"==t.substr(r[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,r[1])),"04"!=t.substr(n[2],2))throw"malformed PKCS8 private key(code:006)";return e.keyidx=Or.getStartPosOfV_AtObj(t,n[2]),e},getKeyFromPlainPrivatePKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getKeyFromPlainPrivatePKCS8Hex(e);return n},getKeyFromPlainPrivatePKCS8Hex:function(t){var e=this.parsePlainPrivatePKCS8Hex(t);if("2a864886f70d010101"==e.algoid){this.parsePrivateRawRSAKeyHexAtObj(t,e);var n=e.key,r=new ve;return r.setPrivateEx(n.n,n.e,n.d,n.p,n.q,n.dp,n.dq,n.co),r}if("2a8648ce3d0201"==e.algoid){if(this.parsePrivateRawECKeyHexAtObj(t,e),void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i});return r.setPublicKeyHex(e.pubkey),r.setPrivateKeyHex(e.key),r.isPublic=!1,r}if("2a8648ce380401"==e.algoid){var s=Or.getVbyList(t,0,[1,1,0],"02"),a=Or.getVbyList(t,0,[1,1,1],"02"),u=Or.getVbyList(t,0,[1,1,2],"02"),c=Or.getVbyList(t,0,[2,0],"02"),f=new o(s,16),h=new o(a,16),l=new o(u,16),d=new o(c,16),r=new Cr.crypto.DSA;return r.setPrivate(f,h,l,null,d),r}throw"unsupported private key algorithm"},getRSAKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getRSAKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8Hex:function(t){var e=this.parsePublicPKCS8Hex(t);if("2a864886f70d010101"==e.algoid){var n=this.parsePublicRawRSAKeyHex(e.key),r=new ve;return r.setPublic(n.n,n.e),r}if("2a8648ce3d0201"==e.algoid){if(void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,pub:e.key});return r}if("2a8648ce380401"==e.algoid){var s=e.algparam,a=Or.getHexOfV_AtObj(e.key,0),r=new Cr.crypto.DSA;return r.setPublic(new o(s.p,16),new o(s.q,16),new o(s.g,16),new o(a,16)),r}throw"unsupported public key algorithm"},parsePublicRawRSAKeyHex:function(t){var e={};if("30"!=t.substr(0,2))throw"malformed RSA key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed RSA key(code:002)";if("02"!=t.substr(n[0],2))throw"malformed RSA key(code:003)";if(e.n=Or.getHexOfV_AtObj(t,n[0]),"02"!=t.substr(n[1],2))throw"malformed RSA key(code:004)";return e.e=Or.getHexOfV_AtObj(t,n[1]),e},parsePrivateRawRSAKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed RSA private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(9!=r.length)throw"malformed RSA private key(code:002)";e.key={},e.key.n=Or.getHexOfV_AtObj(t,r[1]),e.key.e=Or.getHexOfV_AtObj(t,r[2]),e.key.d=Or.getHexOfV_AtObj(t,r[3]),e.key.p=Or.getHexOfV_AtObj(t,r[4]),e.key.q=Or.getHexOfV_AtObj(t,r[5]),e.key.dp=Or.getHexOfV_AtObj(t,r[6]),e.key.dq=Or.getHexOfV_AtObj(t,r[7]),e.key.co=Or.getHexOfV_AtObj(t,r[8])},parsePrivateRawECKeyHexAtObj:function(t,e){var n=e.keyidx,r=Or.getVbyList(t,n,[1],"04"),i=Or.getVbyList(t,n,[2,0],"03").substr(2);e.key=r,e.pubkey=i},parsePublicPKCS8Hex:function(t){var e={};e.algparam=null;var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"outer DERSequence shall have 2 elements: "+n.length;var r=n[0];if("30"!=t.substr(r,2))throw"malformed PKCS8 public key(code:001)";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"malformed PKCS8 public key(code:002)";if("06"!=t.substr(i[0],2))throw"malformed PKCS8 public key(code:003)";if(e.algoid=Or.getHexOfV_AtObj(t,i[0]),"06"==t.substr(i[1],2)?e.algparam=Or.getHexOfV_AtObj(t,i[1]):"30"==t.substr(i[1],2)&&(e.algparam={},e.algparam.p=Or.getVbyList(t,i[1],[0],"02"),e.algparam.q=Or.getVbyList(t,i[1],[1],"02"),e.algparam.g=Or.getVbyList(t,i[1],[2],"02")),"03"!=t.substr(n[1],2))throw"malformed PKCS8 public key(code:004)";return e.key=Or.getHexOfV_AtObj(t,n[1]).substr(2),e},getRSAKeyFromPublicPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"outer DERSequence shall have 2 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[0]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmId is not rsaEncryption";if("03"!=t.substr(e[1],2))throw"PKCS8 Public Key is not BITSTRING encapslated.";var r=Or.getStartPosOfV_AtObj(t,e[1])+2;if("30"!=t.substr(r,2))throw"PKCS8 Public Key is not SEQUENCE.";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"inner DERSequence shall have 2 elements: "+i.length;if("02"!=t.substr(i[0],2))throw"N is not ASN.1 INTEGER";if("02"!=t.substr(i[1],2))throw"E is not ASN.1 INTEGER";var s=Or.getHexOfV_AtObj(t,i[0]),o=Or.getHexOfV_AtObj(t,i[1]),a=new ve;return a.setPublic(s,o),a}}}();Rr.getKey=function(t,e,n){if("undefined"!=typeof ve&&t instanceof ve)return t;if("undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA)return t;if("undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA)return t;if(void 0!==t.curve&&void 0!==t.xy&&void 0===t.d)return new Cr.crypto.ECDSA({pub:t.xy,curve:t.curve});if(void 0!==t.curve&&void 0!==t.d)return new Cr.crypto.ECDSA({prv:t.d,curve:t.curve});if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0===t.d){var r=new ve;return r.setPublic(t.n,t.e),r}if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0!==t.p&&void 0!==t.q&&void 0!==t.dp&&void 0!==t.dq&&void 0!==t.co&&void 0===t.qi){var r=new ve;return r.setPrivateEx(t.n,t.e,t.d,t.p,t.q,t.dp,t.dq,t.co),r}if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0===t.p){var r=new ve;return r.setPrivate(t.n,t.e,t.d),r}if(void 0!==t.p&&void 0!==t.q&&void 0!==t.g&&void 0!==t.y&&void 0===t.x){var r=new Cr.crypto.DSA;return r.setPublic(t.p,t.q,t.g,t.y),r}if(void 0!==t.p&&void 0!==t.q&&void 0!==t.g&&void 0!==t.y&&void 0!==t.x){var r=new Cr.crypto.DSA;return r.setPrivate(t.p,t.q,t.g,t.y,t.x),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0===t.d){var r=new ve;return r.setPublic(gn(t.n),gn(t.e)),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0!==t.p&&void 0!==t.q&&void 0!==t.dp&&void 0!==t.dq&&void 0!==t.qi){var r=new ve;return r.setPrivateEx(gn(t.n),gn(t.e),gn(t.d),gn(t.p),gn(t.q),gn(t.dp),gn(t.dq),gn(t.qi)),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d){var r=new ve;return r.setPrivate(gn(t.n),gn(t.e),gn(t.d)),r}if("EC"===t.kty&&void 0!==t.crv&&void 0!==t.x&&void 0!==t.y&&void 0===t.d){var i=new Cr.crypto.ECDSA({curve:t.crv}),s=i.ecparams.keylen/4,a=("0000000000"+gn(t.x)).slice(-s),u=("0000000000"+gn(t.y)).slice(-s),c="04"+a+u;return i.setPublicKeyHex(c),i}if("EC"===t.kty&&void 0!==t.crv&&void 0!==t.x&&void 0!==t.y&&void 0!==t.d){var i=new Cr.crypto.ECDSA({curve:t.crv}),s=i.ecparams.keylen/4,a=("0000000000"+gn(t.x)).slice(-s),u=("0000000000"+gn(t.y)).slice(-s),c="04"+a+u,f=("0000000000"+gn(t.d)).slice(-s);return i.setPublicKeyHex(c),i.setPrivateKeyHex(f),i}if(t.indexOf("-END CERTIFICATE-",0)!=-1||t.indexOf("-END X509 CERTIFICATE-",0)!=-1||t.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1)return $n.getPublicKeyFromCertPEM(t);if("pkcs8pub"===n)return Rr.getKeyFromPublicPKCS8Hex(t);if(t.indexOf("-END PUBLIC KEY-")!=-1)return Rr.getKeyFromPublicPKCS8PEM(t);if("pkcs5prv"===n){var r=new ve;return r.readPrivateKeyFromASN1HexString(t),r}if("pkcs5prv"===n){var r=new ve;return r.readPrivateKeyFromASN1HexString(t),r}if(t.indexOf("-END RSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")==-1){var h=Rr.getHexFromPEM(t,"RSA PRIVATE KEY");return Rr.getKey(h,null,"pkcs5prv")}if(t.indexOf("-END DSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")==-1){var l=this.getHexFromPEM(t,"DSA PRIVATE KEY"),d=Or.getVbyList(l,0,[1],"02"),p=Or.getVbyList(l,0,[2],"02"),g=Or.getVbyList(l,0,[3],"02"),y=Or.getVbyList(l,0,[4],"02"),v=Or.getVbyList(l,0,[5],"02"),r=new Cr.crypto.DSA;return r.setPrivate(new o(d,16),new o(p,16),new o(g,16),new o(y,16),new o(v,16)),r}if(t.indexOf("-END PRIVATE KEY-")!=-1)return Rr.getKeyFromPlainPrivatePKCS8PEM(t);if(t.indexOf("-END RSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1)return Rr.getRSAKeyFromEncryptedPKCS5PEM(t,e);if(t.indexOf("-END EC PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1){var l=Rr.getDecryptedKeyHex(t,e),r=Or.getVbyList(l,0,[1],"04"),m=Or.getVbyList(l,0,[2,0],"06"),S=Or.getVbyList(l,0,[3,0],"03").substr(2),b="";if(void 0===Cr.crypto.OID.oidhex2name[m])throw"undefined OID(hex) in KJUR.crypto.OID: "+m;b=Cr.crypto.OID.oidhex2name[m];var i=new Cr.crypto.ECDSA({name:b});return i.setPublicKeyHex(S),i.setPrivateKeyHex(r),i.isPublic=!1,i}if(t.indexOf("-END DSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1){var l=Rr.getDecryptedKeyHex(t,e),d=Or.getVbyList(l,0,[1],"02"),p=Or.getVbyList(l,0,[2],"02"),g=Or.getVbyList(l,0,[3],"02"),y=Or.getVbyList(l,0,[4],"02"),v=Or.getVbyList(l,0,[5],"02"),r=new Cr.crypto.DSA;return r.setPrivate(new o(d,16),new o(p,16),new o(g,16),new o(y,16),new o(v,16)),r}if(t.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1)return Rr.getKeyFromEncryptedPKCS8PEM(t,e);throw"not supported argument"},Rr.generateKeypair=function(t,e){if("RSA"==t){var n=e,r=new ve;r.generate(n,"10001"),r.isPrivate=!0,r.isPublic=!0;var i=new ve,s=r.n.toString(16),o=r.e.toString(16);i.setPublic(s,o),i.isPrivate=!1,i.isPublic=!0;var a={};return a.prvKeyObj=r,a.pubKeyObj=i,a}if("EC"==t){var u=e,c=new Cr.crypto.ECDSA({curve:u}),f=c.generateKeyPairHex(),r=new Cr.crypto.ECDSA({curve:u});r.setPublicKeyHex(f.ecpubhex),r.setPrivateKeyHex(f.ecprvhex),r.isPrivate=!0,r.isPublic=!1;var i=new Cr.crypto.ECDSA({curve:u});i.setPublicKeyHex(f.ecpubhex),i.isPrivate=!1,i.isPublic=!0;var a={};return a.prvKeyObj=r,a.pubKeyObj=i,a}throw"unknown algorithm: "+t},Rr.getPEM=function(t,e,n,r,i){function s(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{int:{bigint:t.n}},{int:t.e},{int:{bigint:t.d}},{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.dmp1}},{int:{bigint:t.dmq1}},{int:{bigint:t.coeff}}]});return e}function o(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:1},{octstr:{hex:t.prvKeyHex}},{tag:["a0",!0,{oid:{name:t.curveName}}]},{tag:["a1",!0,{bitstr:{hex:"00"+t.pubKeyHex}}]}]});return e}function a(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.g}},{int:{bigint:t.y}},{int:{bigint:t.x}}]});return e}var u=Cr.asn1,c=Cr.crypto;if(("undefined"!=typeof ve&&t instanceof ve||"undefined"!=typeof c.DSA&&t instanceof c.DSA||"undefined"!=typeof c.ECDSA&&t instanceof c.ECDSA)&&1==t.isPublic&&(void 0===e||"PKCS8PUB"==e)){var f=new Cr.asn1.x509.SubjectPublicKeyInfo(t),h=f.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(h,"PUBLIC KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&(void 0===n||null==n)&&1==t.isPrivate){var f=s(t),h=f.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(h,"RSA PRIVATE KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof ve&&t instanceof Cr.crypto.ECDSA&&(void 0===n||null==n)&&1==t.isPrivate){var l=new Cr.asn1.DERObjectIdentifier({name:t.curveName}),d=l.getEncodedHex(),p=o(t),g=p.getEncodedHex(),y="";return y+=u.ASN1Util.getPEMStringFromHex(d,"EC PARAMETERS"),y+=u.ASN1Util.getPEMStringFromHex(g,"EC PRIVATE KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&(void 0===n||null==n)&&1==t.isPrivate){var f=a(t),h=f.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(h,"DSA PRIVATE KEY")}if("PKCS5PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&void 0!==n&&null!=n&&1==t.isPrivate){var f=s(t),h=f.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",h,n,r)}if("PKCS5PRV"==e&&"undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA&&void 0!==n&&null!=n&&1==t.isPrivate){var f=o(t),h=f.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",h,n,r)}if("PKCS5PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&void 0!==n&&null!=n&&1==t.isPrivate){var f=a(t),h=f.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",h,n,r)}var v=function(t,e){var n=m(t,e),r=new Cr.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:n.pbkdf2Salt}},{int:n.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:n.encryptionSchemeIV}}]}]}]},{octstr:{hex:n.ciphertext}}]});return r.getEncodedHex()},m=function(t,e){var n=100,r=or.lib.WordArray.random(8),i="DES-EDE3-CBC",s=or.lib.WordArray.random(8),o=or.PBKDF2(e,r,{keySize:6,iterations:n}),a=or.enc.Hex.parse(t),u=or.TripleDES.encrypt(a,o,{iv:s})+"",c={};return c.ciphertext=u,c.pbkdf2Salt=or.enc.Hex.stringify(r),c.pbkdf2Iter=n,c.encryptionSchemeAlg=i,c.encryptionSchemeIV=or.enc.Hex.stringify(s),c};if("PKCS8PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&1==t.isPrivate){var S=s(t),b=S.getEncodedHex(),f=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"rsaEncryption"}},{null:!0}]},{octstr:{hex:b}}]}),h=f.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(h,"PRIVATE KEY");var g=v(h,n);return u.ASN1Util.getPEMStringFromHex(g,"ENCRYPTED PRIVATE KEY"); +}if("PKCS8PRV"==e&&"undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA&&1==t.isPrivate){var S=new Cr.asn1.ASN1Util.newObject({seq:[{int:1},{octstr:{hex:t.prvKeyHex}},{tag:["a1",!0,{bitstr:{hex:"00"+t.pubKeyHex}}]}]}),b=S.getEncodedHex(),f=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:t.curveName}}]},{octstr:{hex:b}}]}),h=f.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(h,"PRIVATE KEY");var g=v(h,n);return u.ASN1Util.getPEMStringFromHex(g,"ENCRYPTED PRIVATE KEY")}if("PKCS8PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&1==t.isPrivate){var S=new Cr.asn1.DERInteger({bigint:t.x}),b=S.getEncodedHex(),f=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"dsa"}},{seq:[{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.g}}]}]},{octstr:{hex:b}}]}),h=f.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(h,"PRIVATE KEY");var g=v(h,n);return u.ASN1Util.getPEMStringFromHex(g,"ENCRYPTED PRIVATE KEY")}throw"unsupported object nor format"},Rr.getKeyFromCSRPEM=function(t){var e=Rr.getHexFromPEM(t,"CERTIFICATE REQUEST"),n=Rr.getKeyFromCSRHex(e);return n},Rr.getKeyFromCSRHex=function(t){var e=Rr.parseCSRHex(t),n=Rr.getKey(e.p8pubkeyhex,null,"pkcs8pub");return n},Rr.parseCSRHex=function(t){var e={},n=t;if("30"!=n.substr(0,2))throw"malformed CSR(code:001)";var r=Or.getPosArrayOfChildren_AtObj(n,0);if(r.length<1)throw"malformed CSR(code:002)";if("30"!=n.substr(r[0],2))throw"malformed CSR(code:003)";var i=Or.getPosArrayOfChildren_AtObj(n,r[0]);if(i.length<3)throw"malformed CSR(code:004)";return e.p8pubkeyhex=Or.getHexOfTLV_AtObj(n,i[2]),e},Rr.getJWKFromKey=function(t){var e={};if(t instanceof ve&&t.isPrivate)return e.kty="RSA",e.n=pn(t.n.toString(16)),e.e=pn(t.e.toString(16)),e.d=pn(t.d.toString(16)),e.p=pn(t.p.toString(16)),e.q=pn(t.q.toString(16)),e.dp=pn(t.dmp1.toString(16)),e.dq=pn(t.dmq1.toString(16)),e.qi=pn(t.coeff.toString(16)),e;if(t instanceof ve&&t.isPublic)return e.kty="RSA",e.n=pn(t.n.toString(16)),e.e=pn(t.e.toString(16)),e;if(t instanceof Cr.crypto.ECDSA&&t.isPrivate){var n=t.getShortNISTPCurveName();if("P-256"!==n&&"P-384"!==n)throw"unsupported curve name for JWT: "+n;var r=t.getPublicKeyXYHex();return e.kty="EC",e.crv=n,e.x=pn(r.x),e.y=pn(r.y),e.d=pn(t.prvKeyHex),e}if(t instanceof Cr.crypto.ECDSA&&t.isPublic){var n=t.getShortNISTPCurveName();if("P-256"!==n&&"P-384"!==n)throw"unsupported curve name for JWT: "+n;var r=t.getPublicKeyXYHex();return e.kty="EC",e.crv=n,e.x=pn(r.x),e.y=pn(r.y),e}throw"not supported key object"},ve.prototype.readPrivateKeyFromPEMString=Dn,ve.prototype.readPrivateKeyFromASN1HexString=Tn;/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license */ -var Hr=new RegExp("");Hr.compile("[^0-9a-f]","gi"),ve.prototype.signWithMessageHash=kn,ve.prototype.signString=Hn,ve.prototype.signStringWithSHA1=Nn,ve.prototype.signStringWithSHA256=Bn,ve.prototype.sign=Hn,ve.prototype.signWithSHA1=Nn,ve.prototype.signWithSHA256=Bn,ve.prototype.signWithMessageHashPSS=Ln,ve.prototype.signStringPSS=Vn,ve.prototype.signPSS=Vn,ve.SALT_LEN_HLEN=-1,ve.SALT_LEN_MAX=-2,ve.prototype.verifyWithMessageHash=Yn,ve.prototype.verifyString=Jn,ve.prototype.verifyHexSignatureForMessage=zn,ve.prototype.verify=Jn,ve.prototype.verifyHexSignatureForByteArrayMessage=zn,ve.prototype.verifyWithMessageHashPSS=Xn,ve.prototype.verifyStringPSS=Gn,ve.prototype.verifyPSS=Gn,ve.SALT_LEN_RECOVER=-2,$n.pemToBase64=function(t){var e=t;return e=e.replace("-----BEGIN CERTIFICATE-----",""),e=e.replace("-----END CERTIFICATE-----",""),e=e.replace(/[ \n]+/g,"")},$n.pemToHex=function(t){var e=$n.pemToBase64(t),n=i(e);return n},$n.getSubjectPublicKeyPosFromCertHex=function(t){var e=$n.getSubjectPublicKeyInfoPosFromCertHex(t);if(e==-1)return-1;var n=Or.getPosArrayOfChildren_AtObj(t,e);if(2!=n.length)return-1;var r=n[1];if("03"!=t.substring(r,r+2))return-1;var i=Or.getStartPosOfV_AtObj(t,r);return"00"!=t.substring(i,i+2)?-1:i+2},$n.getSubjectPublicKeyInfoPosFromCertHex=function(t){var e=Or.getStartPosOfV_AtObj(t,0),n=Or.getPosArrayOfChildren_AtObj(t,e);return n.length<1?-1:"a003020102"==t.substring(n[0],n[0]+10)?n.length<6?-1:n[6]:n.length<5?-1:n[5]},$n.getPublicKeyHexArrayFromCertHex=function(t){var e=$n.getSubjectPublicKeyPosFromCertHex(t),n=Or.getPosArrayOfChildren_AtObj(t,e);if(2!=n.length)return[];var r=Or.getHexOfV_AtObj(t,n[0]),i=Or.getHexOfV_AtObj(t,n[1]);return null!=r&&null!=i?[r,i]:[]},$n.getHexTbsCertificateFromCert=function(t){var e=Or.getStartPosOfV_AtObj(t,0);return e},$n.getPublicKeyHexArrayFromCertPEM=function(t){var e=$n.pemToHex(t),n=$n.getPublicKeyHexArrayFromCertHex(e);return n},$n.hex2dn=function(t){for(var e="",n=Or.getPosArrayOfChildren_AtObj(t,0),r=0;r0){var l=":"+n.join(":")+":";if(l.indexOf(":"+f+":")==-1)throw"algorithm '"+f+"' not accepted in the list"}if("none"!=f&&null===e)throw"key shall be specified to verify.";if("string"==typeof e&&e.indexOf("-----BEGIN ")!=-1&&(e=Dr.getKey(e)),!("RS"!=h&&"PS"!=h||e instanceof ve))throw"key shall be a RSAKey obj for RS* and PS* algs";if("ES"==h&&!(e instanceof Cr.crypto.ECDSA))throw"key shall be a ECDSA obj for ES* algs";var d=null;if(void 0===r.jwsalg2sigalg[c.alg])throw"unsupported alg name: "+f;if(d=r.jwsalg2sigalg[f],"none"==d)throw"not supported";if("Hmac"==d.substr(0,4)){var p=null;if(void 0===e)throw"hexadecimal key shall be specified for HMAC";var g=new Cr.crypto.Mac({alg:d,pass:e});return g.updateString(a),p=g.doFinal(),u==p}if(d.indexOf("withECDSA")!=-1){var y=null;try{y=Cr.crypto.ECDSA.concatSigToASN1Sig(u)}catch(t){return!1}var v=new Cr.crypto.Signature({alg:d});return v.init(e),v.updateString(a),v.verify(y)}var v=new Cr.crypto.Signature({alg:d});return v.init(e),v.updateString(a),v.verify(u)},Cr.jws.JWS.parse=function(t){var e,n,r,i=t.split("."),s={};if(2!=i.length&&3!=i.length)throw"malformed sJWS: wrong number of '.' splitted elements";return e=i[0],n=i[1],3==i.length&&(r=i[2]),s.headerObj=Cr.jws.JWS.readSafeJSONString(jr(e)),s.payloadObj=Cr.jws.JWS.readSafeJSONString(jr(n)),s.headerPP=JSON.stringify(s.headerObj,null," "),null==s.payloadObj?s.payloadPP=jr(n):s.payloadPP=JSON.stringify(s.payloadObj,null," "),void 0!==r&&(s.sigHex=gn(r)),s},Cr.jws.JWS.verifyJWT=function(t,e,n){var r=Cr.jws.JWS,i=t.split("."),s=i[0],o=i[1],a=(gn(i[2]),r.readSafeJSONString(jr(s))),u=r.readSafeJSONString(jr(o));if(void 0===a.alg)return!1;if(void 0===n.alg)throw"acceptField.alg shall be specified";if(!r.inArray(a.alg,n.alg))return!1;if(void 0!==u.iss&&"object"==typeof n.iss&&!r.inArray(u.iss,n.iss))return!1;if(void 0!==u.sub&&"object"==typeof n.sub&&!r.inArray(u.sub,n.sub))return!1;if(void 0!==u.aud&&"object"==typeof n.aud)if("string"==typeof u.aud){if(!r.inArray(u.aud,n.aud))return!1}else if("object"==typeof u.aud&&!r.includedArray(u.aud,n.aud))return!1;var c=Cr.jws.IntDate.getNow();return void 0!==n.verifyAt&&"number"==typeof n.verifyAt&&(c=n.verifyAt),void 0!==n.gracePeriod&&"number"==typeof n.gracePeriod||(n.gracePeriod=0),!(void 0!==u.exp&&"number"==typeof u.exp&&u.exp+n.gracePeriod0){var l=":"+n.join(":")+":";if(l.indexOf(":"+f+":")==-1)throw"algorithm '"+f+"' not accepted in the list"}if("none"!=f&&null===e)throw"key shall be specified to verify.";if("string"==typeof e&&e.indexOf("-----BEGIN ")!=-1&&(e=Rr.getKey(e)),!("RS"!=h&&"PS"!=h||e instanceof ve))throw"key shall be a RSAKey obj for RS* and PS* algs";if("ES"==h&&!(e instanceof Cr.crypto.ECDSA))throw"key shall be a ECDSA obj for ES* algs";var d=null;if(void 0===r.jwsalg2sigalg[c.alg])throw"unsupported alg name: "+f;if(d=r.jwsalg2sigalg[f],"none"==d)throw"not supported";if("Hmac"==d.substr(0,4)){var p=null;if(void 0===e)throw"hexadecimal key shall be specified for HMAC";var g=new Cr.crypto.Mac({alg:d,pass:e});return g.updateString(a),p=g.doFinal(),u==p}if(d.indexOf("withECDSA")!=-1){var y=null;try{y=Cr.crypto.ECDSA.concatSigToASN1Sig(u)}catch(t){return!1}var v=new Cr.crypto.Signature({alg:d});return v.init(e),v.updateString(a),v.verify(y)}var v=new Cr.crypto.Signature({alg:d});return v.init(e),v.updateString(a),v.verify(u)},Cr.jws.JWS.parse=function(t){var e,n,r,i=t.split("."),s={};if(2!=i.length&&3!=i.length)throw"malformed sJWS: wrong number of '.' splitted elements";return e=i[0],n=i[1],3==i.length&&(r=i[2]),s.headerObj=Cr.jws.JWS.readSafeJSONString(Ir(e)),s.payloadObj=Cr.jws.JWS.readSafeJSONString(Ir(n)),s.headerPP=JSON.stringify(s.headerObj,null," "),null==s.payloadObj?s.payloadPP=Ir(n):s.payloadPP=JSON.stringify(s.payloadObj,null," "),void 0!==r&&(s.sigHex=gn(r)),s},Cr.jws.JWS.verifyJWT=function(t,e,n){var r=Cr.jws.JWS,i=t.split("."),s=i[0],o=i[1],a=(gn(i[2]),r.readSafeJSONString(Ir(s))),u=r.readSafeJSONString(Ir(o));if(void 0===a.alg)return!1;if(void 0===n.alg)throw"acceptField.alg shall be specified";if(!r.inArray(a.alg,n.alg))return!1;if(void 0!==u.iss&&"object"==typeof n.iss&&!r.inArray(u.iss,n.iss))return!1;if(void 0!==u.sub&&"object"==typeof n.sub&&!r.inArray(u.sub,n.sub))return!1;if(void 0!==u.aud&&"object"==typeof n.aud)if("string"==typeof u.aud){if(!r.inArray(u.aud,n.aud))return!1}else if("object"==typeof u.aud&&!r.includedArray(u.aud,n.aud))return!1;var c=Cr.jws.IntDate.getNow();return void 0!==n.verifyAt&&"number"==typeof n.verifyAt&&(c=n.verifyAt),void 0!==n.gracePeriod&&"number"==typeof n.gracePeriod||(n.gracePeriod=0),!(void 0!==u.exp&&"number"==typeof u.exp&&u.exp+n.gracePeriodi&&this.aHeader.pop(),this.aSignature.length>i&&this.aSignature.pop(),"addSignature failed: "+t}},this.addSignatureByHeaderKey=function(t,e){var n=jr(this.sPayload),r=new Cr.jws.JWS;r.generateJWSByP1PrvKey(t,n,e);this.aHeader.push(r.parsedJWS.headB64U),this.aSignature.push(r.parsedJWS.sigvalB64U)},this.addSignatureByHeaderPayloadKey=function(t,e,n){var r=new Cr.jws.JWS;r.generateJWSByP1PrvKey(t,e,n);this.aHeader.push(r.parsedJWS.headB64U),this.sPayload=r.parsedJWS.payloadB64U,this.aSignature.push(r.parsedJWS.sigvalB64U)},this.verifyAll=function(t){if(this.aHeader.length!==t.length||this.aSignature.length!==t.length)return!1;for(var e=0;e0))throw"malformed header";if(this.aHeader=e.headers,"string"!=typeof e.payload)throw"malformed signatures";if(this.sPayload=e.payload,!(e.signatures.length>0))throw"malformed signatures";this.signatures=e.signatures}catch(t){throw"malformed JWS-JS JSON object: "+t}},this.getJSON=function(){return{headers:this.aHeader,payload:this.sPayload,signatures:this.aSignature}},this.isEmpty=function(){return 0==this.aHeader.length?1:0}},e.SecureRandom=le,e.rng_seed_time=ce,e.BigInteger=o,e.RSAKey=ve,e.ECDSA=Cr.crypto.ECDSA,e.DSA=Cr.crypto.DSA,e.Signature=Cr.crypto.Signature,e.MessageDigest=Cr.crypto.MessageDigest,e.Mac=Cr.crypto.Mac,e.KEYUTIL=Dr,e.ASN1HEX=Or,e.X509=$n,e.CryptoJS=or,e.b64tohex=i,e.b64toBA=s,e.stoBA=sn,e.BAtos=on,e.BAtohex=an,e.stohex=un,e.stob64=cn,e.stob64u=fn,e.b64utos=hn,e.b64tob64u=ln,e.b64utob64=dn,e.hex2b64=r,e.hextob64u=pn,e.b64utohex=gn,e.b64tohex=i,e.utf8tob64u=Tr,e.b64utoutf8=jr,e.utf8tob64=yn,e.b64toutf8=vn,e.utf8tohex=mn,e.hextoutf8=Sn,e.hextorstr=bn,e.rstrtohex=wn,e.newline_toUnix=Fn,e.newline_toDos=Pn,e.intarystrtohex=On,e.strdiffidx=Ir,e.KJUR=Cr,e.crypto=Cr.crypto,e.asn1=Cr.asn1,e.jws=Cr.jws,e.lang=Cr.lang,e.readFileUTF8=Qn,e.readFileHexByBin=Zn,e.readFile=tr,e.saveFile=er,e.saveFileBinByHex=nr}).call(e,n(340).Buffer)},function(t,e,n){(function(t){/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -"use strict";function r(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(t){return!1}}function i(){return o.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(t,e){if(i()=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|t}function y(t){return+t!=t&&(t=0),o.alloc(+t)}function v(t,e){if(o.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var n=t.length;if(0===n)return 0;for(var r=!1;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return W(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return Y(t).length;default:if(r)return W(t).length;e=(""+e).toLowerCase(),r=!0}}function m(t,e,n){var r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if(n>>>=0,e>>>=0,n<=e)return"";for(t||(t="utf8");;)switch(t){case"hex":return R(this,e,n);case"utf8":case"utf-8":return C(this,e,n);case"ascii":return j(this,e,n);case"latin1":case"binary":return I(this,e,n);case"base64":return O(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return D(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function S(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function b(t,e,n,r,i){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(i)return-1;n=t.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof e&&(e=o.from(e,r)),o.isBuffer(e))return 0===e.length?-1:w(t,e,n,r,i);if("number"==typeof e)return e&=255,o.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):w(t,[e],n,r,i);throw new TypeError("val must be string, number or Buffer")}function w(t,e,n,r,i){function s(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}var o=1,a=t.length,u=e.length;if(void 0!==r&&(r=String(r).toLowerCase(),"ucs2"===r||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;o=2,a/=2,u/=2,n/=2}var c;if(i){var f=-1;for(c=n;ca&&(n=a-u),c=n;c>=0;c--){for(var h=!0,l=0;li&&(r=i)):r=i;var s=e.length;if(s%2!==0)throw new TypeError("Invalid hex string");r>s/2&&(r=s/2);for(var o=0;o239?4:s>223?3:s>191?2:1;if(i+a<=n){var u,c,f,h;switch(a){case 1:s<128&&(o=s);break;case 2:u=t[i+1],128===(192&u)&&(h=(31&s)<<6|63&u,h>127&&(o=h));break;case 3:u=t[i+1],c=t[i+2],128===(192&u)&&128===(192&c)&&(h=(15&s)<<12|(63&u)<<6|63&c,h>2047&&(h<55296||h>57343)&&(o=h));break;case 4:u=t[i+1],c=t[i+2],f=t[i+3],128===(192&u)&&128===(192&c)&&128===(192&f)&&(h=(15&s)<<18|(63&u)<<12|(63&c)<<6|63&f,h>65535&&h<1114112&&(o=h))}}null===o?(o=65533,a=1):o>65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o),i+=a}return T(r)}function T(t){var e=t.length;if(e<=tt)return String.fromCharCode.apply(String,t);for(var n="",r=0;rr)&&(n=r);for(var i="",s=e;sn)throw new RangeError("Trying to access beyond buffer length")}function k(t,e,n,r,i,s){if(!o.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function N(t,e,n,r){e<0&&(e=65535+e+1);for(var i=0,s=Math.min(t.length-n,2);i>>8*(r?i:1-i)}function B(t,e,n,r){e<0&&(e=4294967295+e+1);for(var i=0,s=Math.min(t.length-n,4);i>>8*(r?i:3-i)&255}function M(t,e,n,r,i,s){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function V(t,e,n,r,i){return i||M(t,e,n,4,3.4028234663852886e38,-3.4028234663852886e38),Q.write(t,e,n,r,23,4),n+4}function L(t,e,n,r,i){return i||M(t,e,n,8,1.7976931348623157e308,-1.7976931348623157e308),Q.write(t,e,n,r,52,8),n+8}function K(t){if(t=U(t).replace(et,""),t.length<2)return"";for(;t.length%4!==0;)t+="=";return t}function U(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function q(t){return t<16?"0"+t.toString(16):t.toString(16)}function W(t,e){e=e||1/0;for(var n,r=t.length,i=null,s=[],o=0;o55295&&n<57344){if(!i){if(n>56319){(e-=3)>-1&&s.push(239,191,189);continue}if(o+1===r){(e-=3)>-1&&s.push(239,191,189);continue}i=n;continue}if(n<56320){(e-=3)>-1&&s.push(239,191,189),i=n;continue}n=(i-55296<<10|n-56320)+65536}else i&&(e-=3)>-1&&s.push(239,191,189);if(i=null,n<128){if((e-=1)<0)break;s.push(n)}else if(n<2048){if((e-=2)<0)break;s.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;s.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;s.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return s}function z(t){for(var e=[],n=0;n>8,i=n%256,s.push(i),s.push(r);return s}function Y(t){return $.toByteArray(K(t))}function G(t,e,n,r){for(var i=0;i=e.length||i>=t.length);++i)e[i+n]=t[i];return i}function X(t){return t!==t}var $=n(341),Q=n(342),Z=n(343);e.Buffer=o,e.SlowBuffer=y,e.INSPECT_MAX_BYTES=50,o.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:r(),e.kMaxLength=i(),o.poolSize=8192,o._augment=function(t){return t.__proto__=o.prototype,t},o.from=function(t,e,n){return a(null,t,e,n)},o.TYPED_ARRAY_SUPPORT&&(o.prototype.__proto__=Uint8Array.prototype,o.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&o[Symbol.species]===o&&Object.defineProperty(o,Symbol.species,{value:null,configurable:!0})),o.alloc=function(t,e,n){return c(null,t,e,n)},o.allocUnsafe=function(t){return f(null,t)},o.allocUnsafeSlow=function(t){return f(null,t)},o.isBuffer=function(t){return!(null==t||!t._isBuffer)},o.compare=function(t,e){if(!o.isBuffer(t)||!o.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var n=t.length,r=e.length,i=0,s=Math.min(n,r);i0&&(t=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(t+=" ... ")),""},o.prototype.compare=function(t,e,n,r,i){if(!o.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),e<0||n>t.length||r<0||i>this.length)throw new RangeError("out of range index");if(r>=i&&e>=n)return 0;if(r>=i)return-1;if(e>=n)return 1;if(e>>>=0,n>>>=0,r>>>=0,i>>>=0,this===t)return 0;for(var s=i-r,a=n-e,u=Math.min(s,a),c=this.slice(r,i),f=t.slice(e,n),h=0;hi)&&(n=i),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var s=!1;;)switch(r){case"hex":return _(this,t,e,n);case"utf8":case"utf-8":return x(this,t,e,n);case"ascii":return E(this,t,e,n);case"latin1":case"binary":return A(this,t,e,n);case"base64":return F(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,e,n);default:if(s)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),s=!0}},o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var tt=4096;o.prototype.slice=function(t,e){var n=this.length;t=~~t,e=void 0===e?n:~~e,t<0?(t+=n,t<0&&(t=0)):t>n&&(t=n),e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),e0&&(i*=256);)r+=this[t+--e]*i;return r},o.prototype.readUInt8=function(t,e){return e||H(t,1,this.length),this[t]},o.prototype.readUInt16LE=function(t,e){return e||H(t,2,this.length),this[t]|this[t+1]<<8},o.prototype.readUInt16BE=function(t,e){return e||H(t,2,this.length),this[t]<<8|this[t+1]},o.prototype.readUInt32LE=function(t,e){return e||H(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},o.prototype.readUInt32BE=function(t,e){return e||H(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},o.prototype.readIntLE=function(t,e,n){t|=0,e|=0,n||H(t,e,this.length);for(var r=this[t],i=1,s=0;++s=i&&(r-=Math.pow(2,8*e)),r},o.prototype.readIntBE=function(t,e,n){t|=0,e|=0,n||H(t,e,this.length);for(var r=e,i=1,s=this[t+--r];r>0&&(i*=256);)s+=this[t+--r]*i;return i*=128,s>=i&&(s-=Math.pow(2,8*e)),s},o.prototype.readInt8=function(t,e){return e||H(t,1,this.length),128&this[t]?(255-this[t]+1)*-1:this[t]},o.prototype.readInt16LE=function(t,e){e||H(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},o.prototype.readInt16BE=function(t,e){e||H(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},o.prototype.readInt32LE=function(t,e){return e||H(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},o.prototype.readInt32BE=function(t,e){return e||H(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},o.prototype.readFloatLE=function(t,e){return e||H(t,4,this.length),Q.read(this,t,!0,23,4)},o.prototype.readFloatBE=function(t,e){return e||H(t,4,this.length),Q.read(this,t,!1,23,4)},o.prototype.readDoubleLE=function(t,e){return e||H(t,8,this.length),Q.read(this,t,!0,52,8)},o.prototype.readDoubleBE=function(t,e){return e||H(t,8,this.length),Q.read(this,t,!1,52,8)},o.prototype.writeUIntLE=function(t,e,n,r){if(t=+t,e|=0,n|=0,!r){var i=Math.pow(2,8*n)-1;k(this,t,e,n,i,0)}var s=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+s]=t/o&255;return e+n},o.prototype.writeUInt8=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,1,255,0),o.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},o.prototype.writeUInt16LE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):N(this,t,e,!0),e+2},o.prototype.writeUInt16BE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):N(this,t,e,!1),e+2},o.prototype.writeUInt32LE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):B(this,t,e,!0),e+4},o.prototype.writeUInt32BE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):B(this,t,e,!1),e+4},o.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);k(this,t,e,n,i-1,-i)}var s=0,o=1,a=0;for(this[e]=255&t;++s>0)-a&255;return e+n},o.prototype.writeIntBE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);k(this,t,e,n,i-1,-i)}var s=n-1,o=1,a=0;for(this[e+s]=255&t;--s>=0&&(o*=256);)t<0&&0===a&&0!==this[e+s+1]&&(a=1),this[e+s]=(t/o>>0)-a&255;return e+n},o.prototype.writeInt8=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,1,127,-128),o.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},o.prototype.writeInt16LE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):N(this,t,e,!0),e+2},o.prototype.writeInt16BE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):N(this,t,e,!1),e+2},o.prototype.writeInt32LE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,4,2147483647,-2147483648),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):B(this,t,e,!0),e+4},o.prototype.writeInt32BE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):B(this,t,e,!1),e+4},o.prototype.writeFloatLE=function(t,e,n){return V(this,t,e,!0,n)},o.prototype.writeFloatBE=function(t,e,n){return V(this,t,e,!1,n)},o.prototype.writeDoubleLE=function(t,e,n){return L(this,t,e,!0,n)},o.prototype.writeDoubleBE=function(t,e,n){return L(this,t,e,!1,n)},o.prototype.copy=function(t,e,n,r){if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e=0;--i)t[i+e]=this[i+n];else if(s<1e3||!o.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,n=void 0===n?this.length:n>>>0,t||(t=0);var s;if("number"==typeof t)for(s=e;s0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===t[e-2]?2:"="===t[e-1]?1:0}function r(t){return 3*t.length/4-n(t)}function i(t){var e,r,i,s,o,a=t.length;s=n(t),o=new f(3*a/4-s),r=s>0?a-4:a;var u=0;for(e=0;e>16&255,o[u++]=i>>8&255,o[u++]=255&i;return 2===s?(i=c[t.charCodeAt(e)]<<2|c[t.charCodeAt(e+1)]>>4,o[u++]=255&i):1===s&&(i=c[t.charCodeAt(e)]<<10|c[t.charCodeAt(e+1)]<<4|c[t.charCodeAt(e+2)]>>2,o[u++]=i>>8&255,o[u++]=255&i),o}function s(t){return u[t>>18&63]+u[t>>12&63]+u[t>>6&63]+u[63&t]}function o(t,e,n){for(var r,i=[],o=e;of?f:c+a));return 1===r?(e=t[n-1],i+=u[e>>2],i+=u[e<<4&63],i+="=="):2===r&&(e=(t[n-2]<<8)+t[n-1],i+=u[e>>10],i+=u[e>>4&63],i+=u[e<<2&63],i+="="),s.push(i),s.join("")}e.byteLength=r,e.toByteArray=i,e.fromByteArray=a;for(var u=[],c=[],f="undefined"!=typeof Uint8Array?Uint8Array:Array,h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l=0,d=h.length;l>1,f=-7,h=n?i-1:0,l=n?-1:1,d=t[e+h];for(h+=l,s=d&(1<<-f)-1,d>>=-f,f+=a;f>0;s=256*s+t[e+h],h+=l,f-=8);for(o=s&(1<<-f)-1,s>>=-f,f+=r;f>0;o=256*o+t[e+h],h+=l,f-=8);if(0===s)s=1-c;else{if(s===u)return o?NaN:(d?-1:1)*(1/0);o+=Math.pow(2,r),s-=c}return(d?-1:1)*o*Math.pow(2,s-r)},e.write=function(t,e,n,r,i,s){var o,a,u,c=8*s-i-1,f=(1<>1,l=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=r?0:s-1,p=r?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,o=f):(o=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-o))<1&&(o--,u*=2),e+=o+h>=1?l/u:l*Math.pow(2,1-h),e*u>=2&&(o++,u/=2),o+h>=f?(a=0,o=f):o+h>=1?(a=(e*u-1)*Math.pow(2,i),o+=h):(a=e*Math.pow(2,h-1)*Math.pow(2,i),o=0));i>=8;t[n+d]=255&a,d+=p,a/=256,i-=8);for(o=o<0;t[n+d]=255&o,d+=p,o/=256,c-=8);t[n+d-p]|=128*g}},function(t,e){var n={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==n.call(t)}},function(t,e){},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=r(s),a=n(346),u=r(a),c=n(347),f=r(c),h=function(){function t(e){var n=e.url,r=e.client_id,s=e.redirect_uri,a=e.response_type,c=e.scope,h=e.authority,l=e.data,d=e.prompt,p=e.display,g=e.max_age,y=e.ui_locales,v=e.id_token_hint,m=e.login_hint,S=e.acr_values,b=e.resource,w=e.request,_=e.request_uri,x=e.extraQueryParams;if(i(this,t),!n)throw o.default.error("No url passed to SigninRequest"),new Error("url");if(!r)throw o.default.error("No client_id passed to SigninRequest"),new Error("client_id");if(!s)throw o.default.error("No redirect_uri passed to SigninRequest"),new Error("redirect_uri");if(!a)throw o.default.error("No response_type passed to SigninRequest"),new Error("response_type");if(!c)throw o.default.error("No scope passed to SigninRequest"),new Error("scope");if(!h)throw o.default.error("No authority passed to SigninRequest"),new Error("authority");var E=t.isOidc(a);this.state=new f.default({nonce:E,data:l,client_id:r,authority:h}),n=u.default.addQueryParam(n,"client_id",r),n=u.default.addQueryParam(n,"redirect_uri",s),n=u.default.addQueryParam(n,"response_type",a),n=u.default.addQueryParam(n,"scope",c),n=u.default.addQueryParam(n,"state",this.state.id),E&&(n=u.default.addQueryParam(n,"nonce",this.state.nonce));var A={prompt:d,display:p,max_age:g,ui_locales:y,id_token_hint:v,login_hint:m,acr_values:S,resource:b,request:w,request_uri:_};for(var F in A)A[F]&&(n=u.default.addQueryParam(n,F,A[F]));for(var P in x)n=u.default.addQueryParam(n,P,x[P]);this.url=n}return t.isOidc=function(t){var e=t.split(/\s+/g).filter(function(t){return"id_token"===t});return!!e[0]},t.isOAuth=function(t){var e=t.split(/\s+/g).filter(function(t){return"token"===t});return!!e[0]},t}();e.default=h,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=r(s),a=n(332),u=r(a),c=function(){function t(){i(this,t)}return t.addQueryParam=function(t,e,n){return t.indexOf("?")<0&&(t+="?"),"?"!==t[t.length-1]&&(t+="&"),t+=encodeURIComponent(e),t+="=",t+=encodeURIComponent(n)},t.parseUrlFragment=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"#",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;o.default.debug("UrlUtility.parseUrlFragment"),"string"!=typeof t&&(t=n.location.href);var r=t.lastIndexOf(e);r>=0&&(t=t.substr(r+1));for(var i,s={},a=/([^&=]+)=([^&]*)/g,c=0;i=a.exec(t);)if(s[decodeURIComponent(i[1])]=decodeURIComponent(i[2]),c++>50)return o.default.error("response exceeded expected number of parameters",t),{error:"Response exceeded expected number of parameters"};for(var f in s)return s;return{}},t}();e.default=c,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=n.nonce,o=n.authority,a=n.client_id;i(this,e);var u=s(this,t.call(this,arguments[0]));return r===!0?u._nonce=(0,d.default)():r&&(u._nonce=r),u._authority=o,u._client_id=a,u}return o(e,t),e.prototype.toStorageString=function(){return c.default.debug("SigninState.toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,nonce:this.nonce,authority:this.authority,client_id:this.client_id})},e.fromStorageString=function(t){c.default.debug("SigninState.fromStorageString");var n=JSON.parse(t);return new e(n)},a(e,[{key:"nonce",get:function(){return this._nonce}},{key:"authority",get:function(){return this._authority}},{key:"client_id",get:function(){return this._client_id}}]),e}(h.default);e.default=p,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=e.id,r=e.data,s=e.created;i(this,t),this._id=n||(0,c.default)(),this._data=r,"number"==typeof s&&s>0?this._created=s:this._created=parseInt(Date.now()/1e3)}return t.prototype.toStorageString=function(){return a.default.debug("State.toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created})},t.fromStorageString=function(e){return a.default.debug("State.fromStorageString"),new t(JSON.parse(e))},t.clearStaleState=function(e,n){a.default.debug("State.clearStaleState");var r=Date.now()/1e3-n;return e.getAllKeys().then(function(n){a.default.debug("got keys",n);var i=[],s=!0,o=!1,u=void 0;try{for(var c,f=function(){var n=c.value;l=e.get(n).then(function(i){var s=!1;if(i)try{var o=t.fromStorageString(i);a.default.debug("got item from key: ",n,o.created),o.created<=r&&(s=!0)}catch(t){a.default.error("Error parsing state for key",n,t.message),s=!0}else a.default.debug("no item in storage for key: ",n),s=!0;if(s)return a.default.debug("removed item for key: ",n),e.remove(n)}),i.push(l)},h=n[Symbol.iterator]();!(s=(c=h.next()).done);s=!0){var l;f()}}catch(t){o=!0,u=t}finally{try{!s&&h.return&&h.return()}finally{if(o)throw u}}return a.default.debug("waiting on promise count:",i.length),Promise.all(i)})},s(t,[{key:"id",get:function(){return this._id}},{key:"data",get:function(){return this._data}},{key:"created",get:function(){return this._created}}]),t}();e.default=f,t.exports=e.default},function(t,e){"use strict"; +"undefined"!=typeof Cr&&Cr||(Cr={}),"undefined"!=typeof Cr.jws&&Cr.jws||(Cr.jws={}),Cr.jws.JWSJS=function(){var t=Cr.jws.JWS,e=Cr.jws.JWS;this.aHeader=[],this.sPayload="",this.aSignature=[],this.init=function(){this.aHeader=[],this.sPayload=void 0,this.aSignature=[]},this.initWithJWS=function(t){this.init();var e=t.split(".");if(3!=e.length)throw"malformed input JWS";this.aHeader.push(e[0]),this.sPayload=e[1],this.aSignature.push(e[2])},this.addSignature=function(t,e,n,r){if(void 0===this.sPayload||null===this.sPayload)throw"there's no JSON-JS signature to add.";var i=this.aHeader.length;if(this.aHeader.length!=this.aSignature.length)throw"aHeader.length != aSignature.length";try{var s=Cr.jws.JWS.sign(t,e,this.sPayload,n,r),o=s.split(".");o[0],o[2];this.aHeader.push(o[0]),this.aSignature.push(o[2])}catch(t){throw this.aHeader.length>i&&this.aHeader.pop(),this.aSignature.length>i&&this.aSignature.pop(),"addSignature failed: "+t}},this.addSignatureByHeaderKey=function(t,e){var n=Ir(this.sPayload),r=new Cr.jws.JWS;r.generateJWSByP1PrvKey(t,n,e);this.aHeader.push(r.parsedJWS.headB64U),this.aSignature.push(r.parsedJWS.sigvalB64U)},this.addSignatureByHeaderPayloadKey=function(t,e,n){var r=new Cr.jws.JWS;r.generateJWSByP1PrvKey(t,e,n);this.aHeader.push(r.parsedJWS.headB64U),this.sPayload=r.parsedJWS.payloadB64U,this.aSignature.push(r.parsedJWS.sigvalB64U)},this.verifyAll=function(t){if(this.aHeader.length!==t.length||this.aSignature.length!==t.length)return!1;for(var e=0;e0))throw"malformed header";if(this.aHeader=e.headers,"string"!=typeof e.payload)throw"malformed signatures";if(this.sPayload=e.payload,!(e.signatures.length>0))throw"malformed signatures";this.signatures=e.signatures}catch(t){throw"malformed JWS-JS JSON object: "+t}},this.getJSON=function(){return{headers:this.aHeader,payload:this.sPayload,signatures:this.aSignature}},this.isEmpty=function(){return 0==this.aHeader.length?1:0}},e.SecureRandom=le,e.rng_seed_time=ce,e.BigInteger=o,e.RSAKey=ve,e.ECDSA=Cr.crypto.ECDSA,e.DSA=Cr.crypto.DSA,e.Signature=Cr.crypto.Signature,e.MessageDigest=Cr.crypto.MessageDigest,e.Mac=Cr.crypto.Mac,e.KEYUTIL=Rr,e.ASN1HEX=Or,e.X509=$n,e.CryptoJS=or,e.b64tohex=i,e.b64toBA=s,e.stoBA=sn,e.BAtos=on,e.BAtohex=an,e.stohex=un,e.stob64=cn,e.stob64u=fn,e.b64utos=hn,e.b64tob64u=ln,e.b64utob64=dn,e.hex2b64=r,e.hextob64u=pn,e.b64utohex=gn,e.b64tohex=i,e.utf8tob64u=jr,e.b64utoutf8=Ir,e.utf8tob64=yn,e.b64toutf8=vn,e.utf8tohex=mn,e.hextoutf8=Sn,e.hextorstr=bn,e.rstrtohex=wn,e.newline_toUnix=An,e.newline_toDos=Pn,e.intarystrtohex=On,e.strdiffidx=Tr,e.KJUR=Cr,e.crypto=Cr.crypto,e.asn1=Cr.asn1,e.jws=Cr.jws,e.lang=Cr.lang,e.readFileUTF8=Qn,e.readFileHexByBin=Zn,e.readFile=tr,e.saveFile=er,e.saveFileBinByHex=nr}).call(e,n(340).Buffer)},function(t,e){},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.SigninRequest=void 0;var s=n(328),o=r(s),a=n(342),u=r(a),c=n(343),f=r(c);e.SigninRequest=function(){function t(e){var n=e.url,r=e.client_id,s=e.redirect_uri,a=e.response_type,c=e.scope,h=e.authority,l=e.data,d=e.prompt,p=e.display,g=e.max_age,y=e.ui_locales,v=e.id_token_hint,m=e.login_hint,S=e.acr_values,b=e.resource,w=e.request,x=e.request_uri,_=e.extraQueryParams;if(i(this,t),!n)throw o.default.error("No url passed to SigninRequest"),new Error("url");if(!r)throw o.default.error("No client_id passed to SigninRequest"),new Error("client_id");if(!s)throw o.default.error("No redirect_uri passed to SigninRequest"),new Error("redirect_uri");if(!a)throw o.default.error("No response_type passed to SigninRequest"),new Error("response_type");if(!c)throw o.default.error("No scope passed to SigninRequest"),new Error("scope");if(!h)throw o.default.error("No authority passed to SigninRequest"),new Error("authority");var E=t.isOidc(a);this.state=new f.default({nonce:E,data:l,client_id:r,authority:h}),n=u.default.addQueryParam(n,"client_id",r),n=u.default.addQueryParam(n,"redirect_uri",s),n=u.default.addQueryParam(n,"response_type",a),n=u.default.addQueryParam(n,"scope",c),n=u.default.addQueryParam(n,"state",this.state.id),E&&(n=u.default.addQueryParam(n,"nonce",this.state.nonce));var F={prompt:d,display:p,max_age:g,ui_locales:y,id_token_hint:v,login_hint:m,acr_values:S,resource:b,request:w,request_uri:x};for(var A in F)F[A]&&(n=u.default.addQueryParam(n,A,F[A]));for(var P in _)n=u.default.addQueryParam(n,P,_[P]);this.url=n}return t.isOidc=function(t){var e=t.split(/\s+/g).filter(function(t){return"id_token"===t});return!!e[0]},t.isOAuth=function(t){var e=t.split(/\s+/g).filter(function(t){return"token"===t});return!!e[0]},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.UrlUtility=void 0;var s=n(328),o=r(s),a=n(332),u=r(a);e.UrlUtility=function(){function t(){i(this,t)}return t.addQueryParam=function(t,e,n){return t.indexOf("?")<0&&(t+="?"),"?"!==t[t.length-1]&&(t+="&"),t+=encodeURIComponent(e),t+="=",t+=encodeURIComponent(n)},t.parseUrlFragment=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"#",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;o.default.debug("UrlUtility.parseUrlFragment"),"string"!=typeof t&&(t=n.location.href);var r=t.lastIndexOf(e);r>=0&&(t=t.substr(r+1));for(var i,s={},a=/([^&=]+)=([^&]*)/g,c=0;i=a.exec(t);)if(s[decodeURIComponent(i[1])]=decodeURIComponent(i[2]),c++>50)return o.default.error("response exceeded expected number of parameters",t),{error:"Response exceeded expected number of parameters"};for(var f in s)return s;return{}},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.SigninState=void 0;var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=n.nonce,o=n.authority,a=n.client_id;i(this,e);var u=s(this,t.call(this,arguments[0]));return r===!0?u._nonce=(0,d.default)():r&&(u._nonce=r),u._authority=o,u._client_id=a,u}return o(e,t),e.prototype.toStorageString=function(){return c.default.debug("SigninState.toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,nonce:this.nonce,authority:this.authority,client_id:this.client_id})},e.fromStorageString=function(t){c.default.debug("SigninState.fromStorageString");var n=JSON.parse(t);return new e(n)},a(e,[{key:"nonce",get:function(){return this._nonce}},{key:"authority",get:function(){return this._authority}},{key:"client_id",get:function(){return this._client_id}}]),e}(h.default)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.State=void 0;var s=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=e.id,r=e.data,s=e.created;i(this,t),this._id=n||(0,c.default)(),this._data=r,"number"==typeof s&&s>0?this._created=s:this._created=parseInt(Date.now()/1e3)}return t.prototype.toStorageString=function(){return a.default.debug("State.toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created})},t.fromStorageString=function(e){return a.default.debug("State.fromStorageString"),new t(JSON.parse(e))},t.clearStaleState=function(e,n){a.default.debug("State.clearStaleState");var r=Date.now()/1e3-n;return e.getAllKeys().then(function(n){a.default.debug("got keys",n);for(var i=[],s=function(s){var o=n[s];u=e.get(o).then(function(n){var i=!1;if(n)try{var s=t.fromStorageString(n);a.default.debug("got item from key: ",o,s.created),s.created<=r&&(i=!0)}catch(t){a.default.error("Error parsing state for key",o,t.message),i=!0}else a.default.debug("no item in storage for key: ",o),i=!0;if(i)return a.default.debug("removed item for key: ",o),e.remove(o)}),i.push(u)},o=0;o0){var s=parseInt(Date.now()/1e3);this.expires_at=s+r}}return s(t,[{key:"expires_in",get:function(){if(this.expires_at){var t=parseInt(Date.now()/1e3);return this.expires_at-t}}},{key:"expired",get:function(){var t=this.expires_in;if(void 0!==t)return t<=0}},{key:"scopes",get:function(){return(this.scope||"").split(" ")}},{key:"isOpenIdConnect",get:function(){return this.scopes.indexOf(u)>=0||!!this.id_token}}]),t}();e.default=c,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=r(s),a=n(346),u=r(a),c=n(348),f=r(c),h=function t(e){var n=e.url,r=e.id_token_hint,s=e.post_logout_redirect_uri,a=e.data;if(i(this,t),!n)throw o.default.error("No url passed to SignoutRequest"),new Error("url");r&&(n=u.default.addQueryParam(n,"id_token_hint",r)),s&&(n=u.default.addQueryParam(n,"post_logout_redirect_uri",s),a&&(this.state=new f.default({data:a}),n=u.default.addQueryParam(n,"state",this.state.id))),this.url=n};e.default=h,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(346),o=r(s),a=function t(e){i(this,t);var n=o.default.parseUrlFragment(e,"?");this.error=n.error,this.error_description=n.error_description,this.error_uri=n.error_uri,this.state=n.state};e.default=a,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S.default,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:w.default,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:x.default;i(this,e),n instanceof d.default||(n=new d.default(n));var u=s(this,t.call(this,n));return u._events=new v.default(n),u._silentRenewService=new r(u),u.settings.automaticSilentRenew&&(c.default.debug("automaticSilentRenew is configured, setting up silent renew"),u.startSilentRenew()),u.settings.monitorSession&&(c.default.debug("monitorSession is configured, setting up session monitor"),u._sessionMonitor=new o(u)),u._tokenRevocationClient=new a(u._settings),u}return o(e,t),e.prototype.getUser=function(){var t=this;return c.default.debug("UserManager.getUser"),this._loadUser().then(function(e){return e?(c.default.info("user loaded"),t._events.load(e,!1),e):(c.default.info("user not found in storage"),null)})},e.prototype.removeUser=function(){var t=this;return c.default.debug("UserManager.removeUser"),this.storeUser(null).then(function(){c.default.info("user removed from storage"),t._events.unload()})},e.prototype.signinRedirect=function(t){return c.default.debug("UserManager.signinRedirect"),this._signinStart(t,this._redirectNavigator).then(function(){c.default.info("signinRedirect successful")})},e.prototype.signinRedirectCallback=function(t){return c.default.debug("UserManager.signinRedirectCallback"),this._signinEnd(t||this._redirectNavigator.url).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinRedirectCallback successful, signed in sub: ",t.profile.sub):c.default.info("signinRedirectCallback successful")),t})},e.prototype.signinPopup=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signinPopup");var e=t.redirect_uri||this.settings.popup_redirect_uri||this.settings.redirect_uri;return e?(t.redirect_uri=e,t.display="popup",this._signin(t,this._popupNavigator,{startUrl:e,popupWindowFeatures:t.popupWindowFeatures||this.settings.popupWindowFeatures,popupWindowTarget:t.popupWindowTarget||this.settings.popupWindowTarget}).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinPopup successful, signed in sub: ",t.profile.sub):c.default.info("signinPopup successful")),t})):(c.default.error("No popup_redirect_uri or redirect_uri configured"),Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured")))},e.prototype.signinPopupCallback=function(t){return c.default.debug("UserManager.signinPopupCallback"),this._signinCallback(t,this._popupNavigator).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinPopupCallback successful, signed in sub: ",t.profile.sub):c.default.info("signinPopupCallback successful")),t})},e.prototype.signinSilent=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signinSilent");var n=e.redirect_uri||this.settings.silent_redirect_uri;if(!n)return c.default.error("No silent_redirect_uri configured"),Promise.reject(new Error("No silent_redirect_uri configured"));e.redirect_uri=n,e.prompt="none";var r=void 0;return r=e.id_token_hint||!this.settings.includeIdTokenInSilentRenew?Promise.resolve():this._loadUser().then(function(t){e.id_token_hint=t&&t.id_token}),r.then(function(){return t._signin(e,t._iframeNavigator,{startUrl:n,silentRequestTimeout:e.silentRequestTimeout||t.settings.silentRequestTimeout})}).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinSilent successful, signed in sub: ",t.profile.sub):c.default.info("signinSilent successful")),t})},e.prototype.signinSilentCallback=function(t){return c.default.debug("UserManager.signinSilentCallback"),this._signinCallback(t,this._iframeNavigator).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinSilentCallback successful, signed in sub: ",t.profile.sub):c.default.info("signinSilentCallback successful")),t})},e.prototype.querySessionStatus=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.querySessionStatus");var n=e.redirect_uri||this.settings.silent_redirect_uri;return n?(e.redirect_uri=n,e.prompt="none",e.response_type="id_token",e.scope="openid",this._signinStart(e,this._iframeNavigator,{startUrl:n,silentRequestTimeout:e.silentRequestTimeout||this.settings.silentRequestTimeout}).then(function(e){return t.processSigninResponse(e.url).then(function(t){return c.default.debug("got signin response"),t.session_state&&t.profile.sub&&t.profile.sid?(c.default.info("querySessionStatus success for sub: ",t.profile.sub),{session_state:t.session_state,sub:t.profile.sub,sid:t.profile.sid}):void c.default.info("querySessionStatus successful, user not authenticated")})})):(c.default.error("No silent_redirect_uri configured"),Promise.reject(new Error("No silent_redirect_uri configured")))},e.prototype._signin=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signin"),this._signinStart(t,e,r).then(function(t){return n._signinEnd(t.url)})},e.prototype._signinStart=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signinStart"),e.prepare(r).then(function(e){return c.default.debug("got navigator window handle"),n.createSigninRequest(t).then(function(t){return c.default.debug("got signin request"),r.url=t.url,r.id=t.state.id,e.navigate(r)}).catch(function(t){throw e.close&&(c.default.debug("Error after preparing navigator, closing navigator window"),e.close()),t})})},e.prototype._signinEnd=function(t){var e=this;return c.default.debug("_signinEnd"),this.processSigninResponse(t).then(function(t){c.default.debug("got signin response");var n=new g.default(t);return e.storeUser(n).then(function(){return c.default.debug("user stored"),e._events.load(n),n})})},e.prototype._signinCallback=function(t,e){return c.default.debug("_signinCallback"),e.callback(t)},e.prototype.signoutRedirect=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signoutRedirect");var e=t.post_logout_redirect_uri||this.settings.post_logout_redirect_uri;return e&&(t.post_logout_redirect_uri=e),this._signoutStart(t,this._redirectNavigator).then(function(){c.default.info("signoutRedirect successful")})},e.prototype.signoutRedirectCallback=function(t){return c.default.debug("UserManager.signoutRedirectCallback"),this._signoutEnd(t||this._redirectNavigator.url).then(function(t){return c.default.info("signoutRedirectCallback successful"),t})},e.prototype.signoutPopup=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signinPopup");var e=t.post_logout_redirect_uri||this.settings.popup_post_logout_redirect_uri||this.settings.post_logout_redirect_uri;return t.post_logout_redirect_uri=e,t.display="popup",t.post_logout_redirect_uri&&(t.state=t.state||{}),this._signout(t,this._popupNavigator,{startUrl:e,popupWindowFeatures:t.popupWindowFeatures||this.settings.popupWindowFeatures,popupWindowTarget:t.popupWindowTarget||this.settings.popupWindowTarget}).then(function(){c.default.info("signoutPopup successful")})},e.prototype.signoutPopupCallback=function(t,e){"undefined"==typeof e&&"boolean"==typeof t&&(t=null,e=!0),c.default.debug("UserManager.signoutPopupCallback");var n="?";return this._popupNavigator.callback(t,e,n).then(function(){c.default.info("signoutPopupCallback successful")})},e.prototype._signout=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signout"),this._signoutStart(t,e,r).then(function(t){return n._signoutEnd(t.url)})},e.prototype._signoutStart=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this,n=arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signoutStart"),n.prepare(r).then(function(n){return c.default.debug("got navigator window handle"),e._loadUser().then(function(i){c.default.debug("loaded current user from storage");var s=e._settings.revokeAccessTokenOnSignout?e._revokeInternal(i):Promise.resolve();return s.then(function(){var s=t.id_token_hint||i&&i.id_token;return s&&(c.default.debug("Setting id_token into signout request"),t.id_token_hint=s),e.removeUser().then(function(){return c.default.debug("user removed, creating signout request"),e.createSignoutRequest(t).then(function(t){return c.default.debug("got signout request"),r.url=t.url,t.state&&(r.id=t.state.id),n.navigate(r)})})})}).catch(function(t){throw n.close&&(c.default.debug("Error after preparing navigator, closing navigator window"),n.close()),t})})},e.prototype._signoutEnd=function(t){return c.default.debug("_signoutEnd"),this.processSignoutResponse(t).then(function(t){return c.default.debug("got signout response"),t})},e.prototype.revokeAccessToken=function(){var t=this;return c.default.debug("UserManager.revokeAccessToken"),this._loadUser().then(function(e){return t._revokeInternal(e,!0).then(function(n){if(n)return c.default.debug("removing token properties from user and re-storing"),e.access_token=null,e.expires_at=null,e.token_type=null,t.storeUser(e).then(function(){c.default.debug("user stored"),t._events.load(e)})})}).then(function(){c.default.info("access token revoked successfully")})},e.prototype._revokeInternal=function(t,e){c.default.debug("checking if token revocation is necessary");var n=t&&t.access_token;return!n||n.indexOf(".")>=0?(c.default.debug("no need to revoke due to no user, token, or JWT format"),Promise.resolve(!1)):this._tokenRevocationClient.revoke(n,e).then(function(){return!0})},e.prototype.startSilentRenew=function(){this._silentRenewService.start()},e.prototype.stopSilentRenew=function(){this._silentRenewService.stop()},e.prototype._loadUser=function(){return c.default.debug("_loadUser"),this._userStore.get(this._userStoreKey).then(function(t){return t?(c.default.debug("user storageString loaded"),g.default.fromStorageString(t)):(c.default.debug("no user storageString"),null)})},e.prototype.storeUser=function(t){if(t){c.default.debug("storeUser storing user");var e=t.toStorageString();return this._userStore.set(this._userStoreKey,e)}return c.default.debug("storeUser removing user storage"),this._userStore.remove(this._userStoreKey)},a(e,[{key:"_redirectNavigator",get:function(){return this.settings.redirectNavigator}},{key:"_popupNavigator",get:function(){return this.settings.popupNavigator}},{key:"_iframeNavigator",get:function(){return this.settings.iframeNavigator}},{key:"_userStore",get:function(){return this.settings.userStore}},{key:"events",get:function(){return this._events}},{key:"_userStoreKey",get:function(){return"user:"+this.settings.authority+":"+this.settings.client_id}}]),e}(h.default);e.default=E,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=n.popup_redirect_uri,o=n.popup_post_logout_redirect_uri,a=n.popupWindowFeatures,u=n.popupWindowTarget,c=n.silent_redirect_uri,f=n.silentRequestTimeout,h=n.automaticSilentRenew,d=void 0!==h&&h,g=n.includeIdTokenInSilentRenew,v=void 0===g||g,S=n.monitorSession,x=void 0===S||S,E=n.checkSessionInterval,A=void 0===E?_:E,F=n.revokeAccessTokenOnSignout,P=void 0!==F&&F,O=n.accessTokenExpiringNotificationTime,C=void 0===O?w:O,T=n.redirectNavigator,j=void 0===T?new l.default:T,I=n.popupNavigator,R=void 0===I?new p.default:I,D=n.iframeNavigator,H=void 0===D?new y.default:D,k=n.userStore,N=void 0===k?new m.default({store:b.default.sessionStorage}):k;i(this,e);var B=s(this,t.call(this,arguments[0]));return B._popup_redirect_uri=r,B._popup_post_logout_redirect_uri=o,B._popupWindowFeatures=a,B._popupWindowTarget=u,B._silent_redirect_uri=c,B._silentRequestTimeout=f,B._automaticSilentRenew=!!d,B._includeIdTokenInSilentRenew=v,B._accessTokenExpiringNotificationTime=C,B._monitorSession=x,B._checkSessionInterval=A,B._revokeAccessTokenOnSignout=P,B._redirectNavigator=j,B._popupNavigator=R,B._iframeNavigator=H,B._userStore=N,B}return o(e,t),a(e,[{key:"popup_redirect_uri",get:function(){return this._popup_redirect_uri}},{key:"popup_post_logout_redirect_uri",get:function(){return this._popup_post_logout_redirect_uri}},{key:"popupWindowFeatures",get:function(){return this._popupWindowFeatures}},{key:"popupWindowTarget",get:function(){return this._popupWindowTarget}},{key:"silent_redirect_uri",get:function(){return this._silent_redirect_uri}},{key:"silentRequestTimeout",get:function(){return this._silentRequestTimeout}},{key:"automaticSilentRenew",get:function(){return!(!this.silent_redirect_uri||!this._automaticSilentRenew)}},{key:"includeIdTokenInSilentRenew",get:function(){return this._includeIdTokenInSilentRenew}},{key:"accessTokenExpiringNotificationTime",get:function(){return this._accessTokenExpiringNotificationTime}},{key:"monitorSession",get:function(){return this._monitorSession}},{key:"checkSessionInterval",get:function(){return this._checkSessionInterval}},{key:"revokeAccessTokenOnSignout",get:function(){return this._revokeAccessTokenOnSignout}},{key:"redirectNavigator",get:function(){return this._redirectNavigator}},{key:"popupNavigator",get:function(){return this._popupNavigator}},{key:"iframeNavigator",get:function(){return this._iframeNavigator}},{key:"userStore",get:function(){return this._userStore}}]),e}(f.default);e.default=x,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1])||arguments[1];u.default.debug("UserManagerEvents.load"),t.prototype.load.call(this,e),n&&this._userLoaded.raise(e)},e.prototype.unload=function(){u.default.debug("UserManagerEvents.unload"),t.prototype.unload.call(this),this._userUnloaded.raise()},e.prototype.addUserLoaded=function(t){this._userLoaded.addHandler(t)},e.prototype.removeUserLoaded=function(t){this._userLoaded.removeHandler(t)},e.prototype.addUserUnloaded=function(t){this._userUnloaded.addHandler(t)},e.prototype.removeUserUnloaded=function(t){this._userUnloaded.removeHandler(t)},e.prototype.addSilentRenewError=function(t){this._silentRenewError.addHandler(t)},e.prototype.removeSilentRenewError=function(t){this._silentRenewError.removeHandler(t)},e.prototype._raiseSilentRenewError=function(t){u.default.debug("UserManagerEvents._raiseSilentRenewError",t.message),this._silentRenewError.raise(t)},e.prototype.addUserSignedOut=function(t){this._userSignedOut.addHandler(t)},e.prototype.removeUserSignedOut=function(t){this._userSignedOut.removeHandler(t)},e.prototype._raiseUserSignedOut=function(t){u.default.debug("UserManagerEvents._raiseUserSignedOut"),this._userSignedOut.raise(t)},e.prototype.addUserSessionChanged=function(t){this._userSessionChanged.addHandler(t)},e.prototype.removeUserSessionChanged=function(t){this._userSessionChanged.removeHandler(t)},e.prototype._raiseUserSessionChanged=function(t){u.default.debug("UserManagerEvents._raiseUserSessionChanged"),this._userSessionChanged.raise(t)},e}(f.default);e.default=d,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=r(s),a=n(364),u=r(a),c=60,f=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.accessTokenExpiringNotificationTime,r=void 0===n?c:n,s=e.accessTokenExpiringTimer,o=void 0===s?new u.default("Access token expiring"):s,a=e.accessTokenExpiredTimer,f=void 0===a?new u.default("Access token expired"):a;i(this,t),this._accessTokenExpiringNotificationTime=r,this._accessTokenExpiring=o,this._accessTokenExpired=f}return t.prototype.load=function(t){if(o.default.debug("AccessTokenEvents.load"), -this._cancelTimers(),t.access_token){var e=t.expires_in;if(o.default.debug("access token present, remaining duration:",e),e>0){var n=e-this._accessTokenExpiringNotificationTime;n<=0&&(n=1),o.default.debug("registering expiring timer in:",n),this._accessTokenExpiring.init(n)}var r=e+1;o.default.debug("registering expired timer in:",r),this._accessTokenExpired.init(r)}},t.prototype.unload=function(){o.default.debug("AccessTokenEvents.unload"),this._cancelTimers()},t.prototype._cancelTimers=function(){o.default.debug("canceling existing access token timers"),this._accessTokenExpiring.cancel(),this._accessTokenExpired.cancel()},t.prototype.addAccessTokenExpiring=function(t){this._accessTokenExpiring.addHandler(t)},t.prototype.removeAccessTokenExpiring=function(t){this._accessTokenExpiring.removeHandler(t)},t.prototype.addAccessTokenExpired=function(t){this._accessTokenExpired.addHandler(t)},t.prototype.removeAccessTokenExpired=function(t){this._accessTokenExpired.removeHandler(t)},t}();e.default=f,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.default.timer;i(this,e);var o=s(this,t.call(this,n));return o._timer=r,o._nowFunc=function(){return Date.now()/1e3},o}return o(e,t),e.prototype.init=function(t){this.cancel(),t<=0&&(t=1),t=parseInt(t),c.default.debug("Timer.init timer "+this._name+" for duration:",t),this._expiration=this.now+t;var e=p;t=0&&this._callbacks.splice(e,1)},t.prototype.raise=function(){o.default.debug("Raising event: "+this._name);var t=!0,e=!1,n=void 0;try{for(var r,i=this._callbacks[Symbol.iterator]();!(t=(r=i.next()).done);t=!0){var s=r.value;s.apply(void 0,arguments)}}catch(t){e=!0,n=t}finally{try{!t&&i.return&&i.return()}finally{if(e)throw n}}},t}();e.default=a,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=r(s),a=function(){function t(e){i(this,t),this._userManager=e}return t.prototype.start=function(){this._callback||(this._callback=this._tokenExpiring.bind(this),this._userManager.events.addAccessTokenExpiring(this._callback),this._userManager.getUser().then(function(t){}).catch(function(t){o.default.error("Error from getUser:",t.message)}))},t.prototype.stop=function(){this._callback&&(this._userManager.events.removeAccessTokenExpiring(this._callback),delete this._callback)},t.prototype._tokenExpiring=function(){var t=this;o.default.debug("SilentRenewService automatically renewing access token"),this._userManager.signinSilent().then(function(t){o.default.debug("Silent token renewal successful")},function(e){o.default.error("Error from signinSilent:",e.message),t._userManager.events._raiseSilentRenewError(e)})},t}();e.default=a,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:c.default;if(i(this,t),!e)throw a.default.error("No user manager passed to SessionMonitor"),new Error("userManager");this._userManager=e,this._CheckSessionIFrameCtor=r,this._userManager.events.addUserLoaded(this._start.bind(this)),this._userManager.events.addUserUnloaded(this._stop.bind(this)),this._userManager.getUser().then(function(t){t&&n._start(t)}).catch(function(t){a.default.error("SessionMonitor ctor; error from getUser:",t.message)})}return t.prototype._start=function(t){var e=this,n=t.session_state;n&&(this._sub=t.profile.sub,this._sid=t.profile.sid,a.default.debug("SessionMonitor._start; session_state:",n,", sub:",this._sub),this._checkSessionIFrame?this._checkSessionIFrame.start(n):this._metadataService.getCheckSessionIframe().then(function(t){if(t){a.default.debug("Initializing check session iframe");var r=e._client_id,i=e._checkSessionInterval;e._checkSessionIFrame=new e._CheckSessionIFrameCtor(e._callback.bind(e),r,t,i),e._checkSessionIFrame.load().then(function(){e._checkSessionIFrame.start(n)})}else a.default.warn("No check session iframe found in the metadata")}).catch(function(t){a.default.error("Error from getCheckSessionIframe:",t.message)}))},t.prototype._stop=function(){a.default.debug("SessionMonitor._stop"),this._sub=null,this._sid=null,this._checkSessionIFrame&&this._checkSessionIFrame.stop()},t.prototype._callback=function(){var t=this;a.default.debug("SessionMonitor._callback"),this._userManager.querySessionStatus().then(function(e){var n=!0;e?e.sub===t._sub?(n=!1,t._checkSessionIFrame.start(e.session_state),e.sid===t._sid?a.default.debug("Same sub still logged in at OP, restarting check session iframe; session_state:",e.session_state):(a.default.debug("Same sub still logged in at OP, session state has changed, restarting check session iframe; session_state:",e.session_state),t._userManager.events._raiseUserSessionChanged())):a.default.debug("Different subject signed into OP:",e.sub):a.default.debug("Subject no longer signed into OP"),n&&(a.default.debug("SessionMonitor._callback; raising signed out event"),t._userManager.events._raiseUserSignedOut())}).catch(function(e){a.default.debug("Error calling queryCurrentSigninSession; raising signed out event",e.message),t._userManager.events._raiseUserSignedOut()})},s(t,[{key:"_settings",get:function(){return this._userManager.settings}},{key:"_metadataService",get:function(){return this._userManager.metadataService}},{key:"_client_id",get:function(){return this._settings.client_id}},{key:"_checkSessionInterval",get:function(){return this._settings.checkSessionInterval}}]),t}();e.default=f,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=r(s),a=2e3,u=function(){function t(e,n,r,s){i(this,t),this._callback=e,this._client_id=n,this._url=r,this._interval=s||a;var o=r.indexOf("/",r.indexOf("//")+2);this._frame_origin=r.substr(0,o),this._frame=window.document.createElement("iframe"),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=r}return t.prototype.load=function(){var t=this;return new Promise(function(e){t._frame.onload=function(){e()},window.document.body.appendChild(t._frame),t._boundMessageEvent=t._message.bind(t),window.addEventListener("message",t._boundMessageEvent,!1)})},t.prototype._message=function(t){t.origin===this._frame_origin&&t.source===this._frame.contentWindow&&("error"===t.data?(o.default.error("error message from check session op iframe"),this.stop()):"changed"===t.data?(o.default.debug("changed message from check session op iframe"),this.stop(),this._callback()):o.default.debug(t.data+" message from check session op iframe"))},t.prototype.start=function(t){var e=this;this._session_state!==t&&(o.default.debug("CheckSessionIFrame.start"),this.stop(),this._session_state=t,this._timer=window.setInterval(function(){e._frame.contentWindow.postMessage(e._client_id+" "+e._session_state,e._frame_origin)},this._interval))},t.prototype.stop=function(){o.default.debug("CheckSessionIFrame.stop"),this._session_state=null,this._timer&&(window.clearInterval(this._timer),this._timer=null)},t}();e.default=u,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=r(s),a=n(334),u=r(a),c=n(332),f=r(c),h="access_token",l=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.default.XMLHttpRequest,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;if(i(this,t),!e)throw o.default.error("No settings provided"),new Error("No settings provided.");this._settings=e,this._XMLHttpRequestCtor=n,this._metadataService=new r(this._settings)}return t.prototype.revoke=function(t,e){var n=this;if(o.default.debug("TokenRevocationClient.revoke"),!t)throw o.default.error("No accessToken provided"),new Error("No accessToken provided.");return this._metadataService.getRevocationEndpoint().then(function(r){if(r){var i=n._settings.client_id,s=n._settings.client_secret;return n._revoke(r,i,s,t)}if(e)throw o.default.error("Revocation not supported"),new Error("Revocation not supported")})},t.prototype._revoke=function(t,e,n,r){var i=this;return o.default.debug("Calling revocation endpoint"),new Promise(function(s,a){var u=new i._XMLHttpRequestCtor;u.open("POST",t),u.onload=function(){o.default.debug("HTTP response received, status",u.status),200===u.status?s():a(Error(u.statusText+" ("+u.status+")"))};var c="client_id="+encodeURIComponent(e);n&&(c+="&client_secret="+encodeURIComponent(n)),c+="&token_type_hint="+encodeURIComponent(h),c+="&token="+encodeURIComponent(r),u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(c)})},t}();e.default=l,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(328),o=(r(s),n(371)),a=r(o),u=function(){function t(){i(this,t)}return t.prototype.prepare=function(t){var e=new a.default(t);return Promise.resolve(e)},t}();e.default=u,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n0){var s=parseInt(Date.now()/1e3);this.expires_at=s+r}}return s(t,[{key:"expires_in",get:function(){if(this.expires_at){var t=parseInt(Date.now()/1e3);return this.expires_at-t}}},{key:"expired",get:function(){var t=this.expires_in;if(void 0!==t)return t<=0}},{key:"scopes",get:function(){return(this.scope||"").split(" ")}},{key:"isOpenIdConnect",get:function(){return this.scopes.indexOf(u)>=0||!!this.id_token}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.SignoutRequest=void 0;var s=n(328),o=r(s),a=n(342),u=r(a),c=n(344),f=r(c);e.SignoutRequest=function t(e){var n=e.url,r=e.id_token_hint,s=e.post_logout_redirect_uri,a=e.data;if(i(this,t),!n)throw o.default.error("No url passed to SignoutRequest"),new Error("url");r&&(n=u.default.addQueryParam(n,"id_token_hint",r)),s&&(n=u.default.addQueryParam(n,"post_logout_redirect_uri",s),a&&(this.state=new f.default({data:a}),n=u.default.addQueryParam(n,"state",this.state.id))),this.url=n}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.SignoutResponse=void 0;var s=n(342),o=r(s);e.SignoutResponse=function t(e){i(this,t);var n=o.default.parseUrlFragment(e,"?");this.error=n.error,this.error_description=n.error_description,this.error_uri=n.error_uri,this.state=n.state}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryWebStorage=void 0;var s=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S.default,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:w.default,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:_.default;i(this,e),n instanceof d.default||(n=new d.default(n));var u=s(this,t.call(this,n));return u._events=new v.default(n),u._silentRenewService=new r(u),u.settings.automaticSilentRenew&&(c.default.debug("automaticSilentRenew is configured, setting up silent renew"),u.startSilentRenew()),u.settings.monitorSession&&(c.default.debug("monitorSession is configured, setting up session monitor"),u._sessionMonitor=new o(u)),u._tokenRevocationClient=new a(u._settings),u}return o(e,t),e.prototype.getUser=function(){var t=this;return c.default.debug("UserManager.getUser"),this._loadUser().then(function(e){return e?(c.default.info("user loaded"),t._events.load(e,!1),e):(c.default.info("user not found in storage"),null)})},e.prototype.removeUser=function(){var t=this;return c.default.debug("UserManager.removeUser"),this.storeUser(null).then(function(){c.default.info("user removed from storage"),t._events.unload()})},e.prototype.signinRedirect=function(t){return c.default.debug("UserManager.signinRedirect"),this._signinStart(t,this._redirectNavigator).then(function(){c.default.info("signinRedirect successful")})},e.prototype.signinRedirectCallback=function(t){return c.default.debug("UserManager.signinRedirectCallback"),this._signinEnd(t||this._redirectNavigator.url).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinRedirectCallback successful, signed in sub: ",t.profile.sub):c.default.info("signinRedirectCallback successful")),t})},e.prototype.signinPopup=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signinPopup");var e=t.redirect_uri||this.settings.popup_redirect_uri||this.settings.redirect_uri;return e?(t.redirect_uri=e,t.display="popup",this._signin(t,this._popupNavigator,{startUrl:e,popupWindowFeatures:t.popupWindowFeatures||this.settings.popupWindowFeatures,popupWindowTarget:t.popupWindowTarget||this.settings.popupWindowTarget}).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinPopup successful, signed in sub: ",t.profile.sub):c.default.info("signinPopup successful")),t})):(c.default.error("No popup_redirect_uri or redirect_uri configured"),Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured")))},e.prototype.signinPopupCallback=function(t){return c.default.debug("UserManager.signinPopupCallback"),this._signinCallback(t,this._popupNavigator).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinPopupCallback successful, signed in sub: ",t.profile.sub):c.default.info("signinPopupCallback successful")),t})},e.prototype.signinSilent=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signinSilent");var n=e.redirect_uri||this.settings.silent_redirect_uri;if(!n)return c.default.error("No silent_redirect_uri configured"),Promise.reject(new Error("No silent_redirect_uri configured"));e.redirect_uri=n,e.prompt="none";var r=void 0;return r=e.id_token_hint||!this.settings.includeIdTokenInSilentRenew?Promise.resolve():this._loadUser().then(function(t){e.id_token_hint=t&&t.id_token}),r.then(function(){return t._signin(e,t._iframeNavigator,{startUrl:n,silentRequestTimeout:e.silentRequestTimeout||t.settings.silentRequestTimeout})}).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinSilent successful, signed in sub: ",t.profile.sub):c.default.info("signinSilent successful")),t})},e.prototype.signinSilentCallback=function(t){return c.default.debug("UserManager.signinSilentCallback"),this._signinCallback(t,this._iframeNavigator).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinSilentCallback successful, signed in sub: ",t.profile.sub):c.default.info("signinSilentCallback successful")),t})},e.prototype.querySessionStatus=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.querySessionStatus");var n=e.redirect_uri||this.settings.silent_redirect_uri;return n?(e.redirect_uri=n,e.prompt="none",e.response_type="id_token",e.scope="openid",this._signinStart(e,this._iframeNavigator,{startUrl:n,silentRequestTimeout:e.silentRequestTimeout||this.settings.silentRequestTimeout}).then(function(e){return t.processSigninResponse(e.url).then(function(t){return c.default.debug("got signin response"),t.session_state&&t.profile.sub&&t.profile.sid?(c.default.info("querySessionStatus success for sub: ",t.profile.sub),{session_state:t.session_state,sub:t.profile.sub,sid:t.profile.sid}):void c.default.info("querySessionStatus successful, user not authenticated")})})):(c.default.error("No silent_redirect_uri configured"),Promise.reject(new Error("No silent_redirect_uri configured")))},e.prototype._signin=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signin"),this._signinStart(t,e,r).then(function(t){return n._signinEnd(t.url)})},e.prototype._signinStart=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signinStart"),e.prepare(r).then(function(e){return c.default.debug("got navigator window handle"),n.createSigninRequest(t).then(function(t){return c.default.debug("got signin request"),r.url=t.url,r.id=t.state.id,e.navigate(r)}).catch(function(t){throw e.close&&(c.default.debug("Error after preparing navigator, closing navigator window"),e.close()),t})})},e.prototype._signinEnd=function(t){var e=this;return c.default.debug("_signinEnd"),this.processSigninResponse(t).then(function(t){c.default.debug("got signin response");var n=new g.default(t);return e.storeUser(n).then(function(){return c.default.debug("user stored"),e._events.load(n),n})})},e.prototype._signinCallback=function(t,e){return c.default.debug("_signinCallback"),e.callback(t)},e.prototype.signoutRedirect=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signoutRedirect");var e=t.post_logout_redirect_uri||this.settings.post_logout_redirect_uri;return e&&(t.post_logout_redirect_uri=e),this._signoutStart(t,this._redirectNavigator).then(function(){c.default.info("signoutRedirect successful")})},e.prototype.signoutRedirectCallback=function(t){return c.default.debug("UserManager.signoutRedirectCallback"),this._signoutEnd(t||this._redirectNavigator.url).then(function(t){return c.default.info("signoutRedirectCallback successful"),t})},e.prototype.signoutPopup=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signinPopup");var e=t.post_logout_redirect_uri||this.settings.popup_post_logout_redirect_uri||this.settings.post_logout_redirect_uri;return t.post_logout_redirect_uri=e,t.display="popup",t.post_logout_redirect_uri&&(t.state=t.state||{}),this._signout(t,this._popupNavigator,{startUrl:e,popupWindowFeatures:t.popupWindowFeatures||this.settings.popupWindowFeatures,popupWindowTarget:t.popupWindowTarget||this.settings.popupWindowTarget}).then(function(){c.default.info("signoutPopup successful")})},e.prototype.signoutPopupCallback=function(t,e){"undefined"==typeof e&&"boolean"==typeof t&&(t=null,e=!0),c.default.debug("UserManager.signoutPopupCallback");var n="?";return this._popupNavigator.callback(t,e,n).then(function(){c.default.info("signoutPopupCallback successful")})},e.prototype._signout=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signout"),this._signoutStart(t,e,r).then(function(t){return n._signoutEnd(t.url)})},e.prototype._signoutStart=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this,n=arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signoutStart"),n.prepare(r).then(function(n){return c.default.debug("got navigator window handle"),e._loadUser().then(function(i){c.default.debug("loaded current user from storage");var s=e._settings.revokeAccessTokenOnSignout?e._revokeInternal(i):Promise.resolve();return s.then(function(){var s=t.id_token_hint||i&&i.id_token;return s&&(c.default.debug("Setting id_token into signout request"),t.id_token_hint=s),e.removeUser().then(function(){return c.default.debug("user removed, creating signout request"),e.createSignoutRequest(t).then(function(t){return c.default.debug("got signout request"),r.url=t.url,t.state&&(r.id=t.state.id),n.navigate(r)})})})}).catch(function(t){throw n.close&&(c.default.debug("Error after preparing navigator, closing navigator window"),n.close()),t})})},e.prototype._signoutEnd=function(t){return c.default.debug("_signoutEnd"),this.processSignoutResponse(t).then(function(t){return c.default.debug("got signout response"),t})},e.prototype.revokeAccessToken=function(){var t=this;return c.default.debug("UserManager.revokeAccessToken"),this._loadUser().then(function(e){return t._revokeInternal(e,!0).then(function(n){if(n)return c.default.debug("removing token properties from user and re-storing"),e.access_token=null,e.expires_at=null,e.token_type=null,t.storeUser(e).then(function(){c.default.debug("user stored"),t._events.load(e)})})}).then(function(){c.default.info("access token revoked successfully")})},e.prototype._revokeInternal=function(t,e){c.default.debug("checking if token revocation is necessary");var n=t&&t.access_token;return!n||n.indexOf(".")>=0?(c.default.debug("no need to revoke due to no user, token, or JWT format"),Promise.resolve(!1)):this._tokenRevocationClient.revoke(n,e).then(function(){return!0})},e.prototype.startSilentRenew=function(){this._silentRenewService.start()},e.prototype.stopSilentRenew=function(){this._silentRenewService.stop()},e.prototype._loadUser=function(){return c.default.debug("_loadUser"),this._userStore.get(this._userStoreKey).then(function(t){return t?(c.default.debug("user storageString loaded"),g.default.fromStorageString(t)):(c.default.debug("no user storageString"),null)})},e.prototype.storeUser=function(t){if(t){c.default.debug("storeUser storing user");var e=t.toStorageString();return this._userStore.set(this._userStoreKey,e)}return c.default.debug("storeUser removing user storage"),this._userStore.remove(this._userStoreKey)},a(e,[{key:"_redirectNavigator",get:function(){return this.settings.redirectNavigator}},{key:"_popupNavigator",get:function(){return this.settings.popupNavigator}},{key:"_iframeNavigator",get:function(){return this.settings.iframeNavigator}},{key:"_userStore",get:function(){return this.settings.userStore}},{key:"events",get:function(){return this._events}},{key:"_userStoreKey",get:function(){return"user:"+this.settings.authority+":"+this.settings.client_id}}]),e}(h.default)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.UserManagerSettings=void 0;var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=n.popup_redirect_uri,o=n.popup_post_logout_redirect_uri,a=n.popupWindowFeatures,u=n.popupWindowTarget,c=n.silent_redirect_uri,f=n.silentRequestTimeout,h=n.automaticSilentRenew,d=void 0!==h&&h,g=n.includeIdTokenInSilentRenew,v=void 0===g||g,S=n.monitorSession,_=void 0===S||S,E=n.checkSessionInterval,F=void 0===E?x:E,A=n.revokeAccessTokenOnSignout,P=void 0!==A&&A,O=n.accessTokenExpiringNotificationTime,C=void 0===O?w:O,j=n.redirectNavigator,I=void 0===j?new l.default:j,T=n.popupNavigator,D=void 0===T?new p.default:T,R=n.iframeNavigator,H=void 0===R?new y.default:R,k=n.userStore,N=void 0===k?new m.default({store:b.default.sessionStorage}):k;i(this,e);var B=s(this,t.call(this,arguments[0]));return B._popup_redirect_uri=r,B._popup_post_logout_redirect_uri=o,B._popupWindowFeatures=a,B._popupWindowTarget=u,B._silent_redirect_uri=c,B._silentRequestTimeout=f,B._automaticSilentRenew=!!d,B._includeIdTokenInSilentRenew=v,B._accessTokenExpiringNotificationTime=C,B._monitorSession=_,B._checkSessionInterval=F,B._revokeAccessTokenOnSignout=P,B._redirectNavigator=I,B._popupNavigator=D,B._iframeNavigator=H,B._userStore=N,B}return o(e,t),a(e,[{key:"popup_redirect_uri",get:function(){return this._popup_redirect_uri}},{key:"popup_post_logout_redirect_uri",get:function(){return this._popup_post_logout_redirect_uri}},{key:"popupWindowFeatures",get:function(){return this._popupWindowFeatures}},{key:"popupWindowTarget",get:function(){return this._popupWindowTarget}},{key:"silent_redirect_uri",get:function(){return this._silent_redirect_uri}},{key:"silentRequestTimeout",get:function(){return this._silentRequestTimeout}},{key:"automaticSilentRenew",get:function(){return!(!this.silent_redirect_uri||!this._automaticSilentRenew)}},{key:"includeIdTokenInSilentRenew",get:function(){return this._includeIdTokenInSilentRenew}},{key:"accessTokenExpiringNotificationTime",get:function(){return this._accessTokenExpiringNotificationTime}},{key:"monitorSession",get:function(){return this._monitorSession}},{key:"checkSessionInterval",get:function(){return this._checkSessionInterval}},{key:"revokeAccessTokenOnSignout",get:function(){return this._revokeAccessTokenOnSignout}},{key:"redirectNavigator",get:function(){return this._redirectNavigator}},{key:"popupNavigator",get:function(){return this._popupNavigator}},{key:"iframeNavigator",get:function(){return this._iframeNavigator}},{key:"userStore",get:function(){return this._userStore}}]),e}(f.default)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.RedirectNavigator=void 0;var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1])||arguments[1];u.default.debug("UserManagerEvents.load"),t.prototype.load.call(this,e),n&&this._userLoaded.raise(e)},e.prototype.unload=function(){u.default.debug("UserManagerEvents.unload"),t.prototype.unload.call(this),this._userUnloaded.raise()},e.prototype.addUserLoaded=function(t){this._userLoaded.addHandler(t)},e.prototype.removeUserLoaded=function(t){this._userLoaded.removeHandler(t)},e.prototype.addUserUnloaded=function(t){this._userUnloaded.addHandler(t)},e.prototype.removeUserUnloaded=function(t){this._userUnloaded.removeHandler(t)},e.prototype.addSilentRenewError=function(t){this._silentRenewError.addHandler(t)},e.prototype.removeSilentRenewError=function(t){this._silentRenewError.removeHandler(t)},e.prototype._raiseSilentRenewError=function(t){u.default.debug("UserManagerEvents._raiseSilentRenewError",t.message),this._silentRenewError.raise(t)},e.prototype.addUserSignedOut=function(t){this._userSignedOut.addHandler(t)},e.prototype.removeUserSignedOut=function(t){this._userSignedOut.removeHandler(t)},e.prototype._raiseUserSignedOut=function(t){u.default.debug("UserManagerEvents._raiseUserSignedOut"),this._userSignedOut.raise(t)},e.prototype.addUserSessionChanged=function(t){this._userSessionChanged.addHandler(t)},e.prototype.removeUserSessionChanged=function(t){this._userSessionChanged.removeHandler(t)},e.prototype._raiseUserSessionChanged=function(t){u.default.debug("UserManagerEvents._raiseUserSessionChanged"),this._userSessionChanged.raise(t)},e}(f.default)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.AccessTokenEvents=void 0;var s=n(328),o=r(s),a=n(360),u=r(a),c=60;e.AccessTokenEvents=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.accessTokenExpiringNotificationTime,r=void 0===n?c:n,s=e.accessTokenExpiringTimer,o=void 0===s?new u.default("Access token expiring"):s,a=e.accessTokenExpiredTimer,f=void 0===a?new u.default("Access token expired"):a;i(this,t),this._accessTokenExpiringNotificationTime=r, +this._accessTokenExpiring=o,this._accessTokenExpired=f}return t.prototype.load=function(t){if(o.default.debug("AccessTokenEvents.load"),this._cancelTimers(),t.access_token){var e=t.expires_in;if(o.default.debug("access token present, remaining duration:",e),e>0){var n=e-this._accessTokenExpiringNotificationTime;n<=0&&(n=1),o.default.debug("registering expiring timer in:",n),this._accessTokenExpiring.init(n)}var r=e+1;o.default.debug("registering expired timer in:",r),this._accessTokenExpired.init(r)}},t.prototype.unload=function(){o.default.debug("AccessTokenEvents.unload"),this._cancelTimers()},t.prototype._cancelTimers=function(){o.default.debug("canceling existing access token timers"),this._accessTokenExpiring.cancel(),this._accessTokenExpired.cancel()},t.prototype.addAccessTokenExpiring=function(t){this._accessTokenExpiring.addHandler(t)},t.prototype.removeAccessTokenExpiring=function(t){this._accessTokenExpiring.removeHandler(t)},t.prototype.addAccessTokenExpired=function(t){this._accessTokenExpired.addHandler(t)},t.prototype.removeAccessTokenExpired=function(t){this._accessTokenExpired.removeHandler(t)},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.Timer=void 0;var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.default.timer;i(this,e);var o=s(this,t.call(this,n));return o._timer=r,o._nowFunc=function(){return Date.now()/1e3},o}return o(e,t),e.prototype.init=function(t){this.cancel(),t<=0&&(t=1),t=parseInt(t),c.default.debug("Timer.init timer "+this._name+" for duration:",t),this._expiration=this.now+t;var e=p;t=0&&this._callbacks.splice(e,1)},t.prototype.raise=function(){o.default.debug("Raising event: "+this._name);for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:c.default;if(i(this,t),!e)throw a.default.error("No user manager passed to SessionMonitor"),new Error("userManager");this._userManager=e,this._CheckSessionIFrameCtor=r,this._userManager.events.addUserLoaded(this._start.bind(this)),this._userManager.events.addUserUnloaded(this._stop.bind(this)),this._userManager.getUser().then(function(t){t&&n._start(t)}).catch(function(t){a.default.error("SessionMonitor ctor; error from getUser:",t.message)})}return t.prototype._start=function(t){var e=this,n=t.session_state;n&&(this._sub=t.profile.sub,this._sid=t.profile.sid,a.default.debug("SessionMonitor._start; session_state:",n,", sub:",this._sub),this._checkSessionIFrame?this._checkSessionIFrame.start(n):this._metadataService.getCheckSessionIframe().then(function(t){if(t){a.default.debug("Initializing check session iframe");var r=e._client_id,i=e._checkSessionInterval;e._checkSessionIFrame=new e._CheckSessionIFrameCtor(e._callback.bind(e),r,t,i),e._checkSessionIFrame.load().then(function(){e._checkSessionIFrame.start(n)})}else a.default.warn("No check session iframe found in the metadata")}).catch(function(t){a.default.error("Error from getCheckSessionIframe:",t.message)}))},t.prototype._stop=function(){a.default.debug("SessionMonitor._stop"),this._sub=null,this._sid=null,this._checkSessionIFrame&&this._checkSessionIFrame.stop()},t.prototype._callback=function(){var t=this;a.default.debug("SessionMonitor._callback"),this._userManager.querySessionStatus().then(function(e){var n=!0;e?e.sub===t._sub?(n=!1,t._checkSessionIFrame.start(e.session_state),e.sid===t._sid?a.default.debug("Same sub still logged in at OP, restarting check session iframe; session_state:",e.session_state):(a.default.debug("Same sub still logged in at OP, session state has changed, restarting check session iframe; session_state:",e.session_state),t._userManager.events._raiseUserSessionChanged())):a.default.debug("Different subject signed into OP:",e.sub):a.default.debug("Subject no longer signed into OP"),n&&(a.default.debug("SessionMonitor._callback; raising signed out event"),t._userManager.events._raiseUserSignedOut())}).catch(function(e){a.default.debug("Error calling queryCurrentSigninSession; raising signed out event",e.message),t._userManager.events._raiseUserSignedOut()})},s(t,[{key:"_settings",get:function(){return this._userManager.settings}},{key:"_metadataService",get:function(){return this._userManager.metadataService}},{key:"_client_id",get:function(){return this._settings.client_id}},{key:"_checkSessionInterval",get:function(){return this._settings.checkSessionInterval}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.CheckSessionIFrame=void 0;var s=n(328),o=r(s),a=2e3;e.CheckSessionIFrame=function(){function t(e,n,r,s){i(this,t),this._callback=e,this._client_id=n,this._url=r,this._interval=s||a;var o=r.indexOf("/",r.indexOf("//")+2);this._frame_origin=r.substr(0,o),this._frame=window.document.createElement("iframe"),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=r}return t.prototype.load=function(){var t=this;return new Promise(function(e){t._frame.onload=function(){e()},window.document.body.appendChild(t._frame),t._boundMessageEvent=t._message.bind(t),window.addEventListener("message",t._boundMessageEvent,!1)})},t.prototype._message=function(t){t.origin===this._frame_origin&&t.source===this._frame.contentWindow&&("error"===t.data?(o.default.error("error message from check session op iframe"),this.stop()):"changed"===t.data?(o.default.debug("changed message from check session op iframe"),this.stop(),this._callback()):o.default.debug(t.data+" message from check session op iframe"))},t.prototype.start=function(t){var e=this;this._session_state!==t&&(o.default.debug("CheckSessionIFrame.start"),this.stop(),this._session_state=t,this._timer=window.setInterval(function(){e._frame.contentWindow.postMessage(e._client_id+" "+e._session_state,e._frame_origin)},this._interval))},t.prototype.stop=function(){o.default.debug("CheckSessionIFrame.stop"),this._session_state=null,this._timer&&(window.clearInterval(this._timer),this._timer=null)},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.TokenRevocationClient=void 0;var s=n(328),o=r(s),a=n(334),u=r(a),c=n(332),f=r(c),h="access_token";e.TokenRevocationClient=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.default.XMLHttpRequest,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;if(i(this,t),!e)throw o.default.error("No settings provided"),new Error("No settings provided.");this._settings=e,this._XMLHttpRequestCtor=n,this._metadataService=new r(this._settings)}return t.prototype.revoke=function(t,e){var n=this;if(o.default.debug("TokenRevocationClient.revoke"),!t)throw o.default.error("No accessToken provided"),new Error("No accessToken provided.");return this._metadataService.getRevocationEndpoint().then(function(r){if(r){var i=n._settings.client_id,s=n._settings.client_secret;return n._revoke(r,i,s,t)}if(e)throw o.default.error("Revocation not supported"),new Error("Revocation not supported")})},t.prototype._revoke=function(t,e,n,r){var i=this;return o.default.debug("Calling revocation endpoint"),new Promise(function(s,a){var u=new i._XMLHttpRequestCtor;u.open("POST",t),u.onload=function(){o.default.debug("HTTP response received, status",u.status),200===u.status?s():a(Error(u.statusText+" ("+u.status+")"))};var c="client_id="+encodeURIComponent(e);n&&(c+="&client_secret="+encodeURIComponent(n)),c+="&token_type_hint="+encodeURIComponent(h),c+="&token="+encodeURIComponent(r),u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(c)})},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.CordovaPopupNavigator=void 0;var s=n(328),o=(r(s),n(367)),a=r(o);e.CordovaPopupNavigator=function(){function t(){i(this,t)}return t.prototype.prepare=function(t){var e=new a.default(t);return Promise.resolve(e)},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.CordovaPopupWindow=void 0;var s=function(){function t(t,e){for(var n=0;n 0 && arguments[0] !== undefined ? arguments[0] : {}; @@ -512,12 +509,9 @@ return /******/ (function(modules) { // webpackBootstrap return this._metadataService; } }]); - + return OidcClient; }(); - - exports.default = OidcClient; - module.exports = exports['default']; /***/ }), /* 3 */ @@ -528,6 +522,7 @@ return /******/ (function(modules) { // webpackBootstrap 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; }; @@ -561,7 +556,7 @@ return /******/ (function(modules) { // webpackBootstrap var DefaultStaleStateAge = 60 * 5; // seconds var DefaultClockSkewInSeconds = 60 * 5; - var OidcClientSettings = function () { + var OidcClientSettings = exports.OidcClientSettings = function () { function OidcClientSettings() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, authority = _ref.authority, @@ -813,12 +808,9 @@ return /******/ (function(modules) { // webpackBootstrap } } }]); - + return OidcClientSettings; }(); - - exports.default = OidcClientSettings; - module.exports = exports['default']; /***/ }), /* 4 */ @@ -829,6 +821,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.WebStorageStateStore = undefined; var _Log = __webpack_require__(1); @@ -843,7 +836,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var WebStorageStateStore = exports.WebStorageStateStore = function () { function WebStorageStateStore() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$prefix = _ref.prefix, @@ -906,9 +899,6 @@ return /******/ (function(modules) { // webpackBootstrap return WebStorageStateStore; }(); - - exports.default = WebStorageStateStore; - module.exports = exports['default']; /***/ }), /* 5 */ @@ -959,7 +949,7 @@ return /******/ (function(modules) { // webpackBootstrap var testing = false; var request = null; - var Global = function () { + var Global = exports.Global = function () { function Global() { _classCallCheck(this, Global); } @@ -1012,9 +1002,7 @@ return /******/ (function(modules) { // webpackBootstrap return Global; }(); - exports.default = Global; ; - module.exports = exports['default']; /***/ }), /* 6 */ @@ -1025,6 +1013,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.ResponseValidator = undefined; var _Log = __webpack_require__(1); @@ -1053,7 +1042,7 @@ return /******/ (function(modules) { // webpackBootstrap var ProtocolClaims = ["nonce", "at_hash", "iat", "nbf", "exp", "aud", "iss", "c_hash"]; - var ResponseValidator = function () { + var ResponseValidator = exports.ResponseValidator = function () { function ResponseValidator(settings) { var MetadataServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _MetadataService2.default; var UserInfoServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _UserInfoService2.default; @@ -1217,36 +1206,16 @@ return /******/ (function(modules) { // webpackBootstrap values = [values]; } - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var value = _step.value; - - 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) { - result[name] = [result[name], value]; - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; + 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) { + result[name] = [result[name], value]; } } } @@ -1464,9 +1433,6 @@ return /******/ (function(modules) { // webpackBootstrap return ResponseValidator; }(); - - exports.default = ResponseValidator; - module.exports = exports['default']; /***/ }), /* 7 */ @@ -1477,6 +1443,7 @@ return /******/ (function(modules) { // webpackBootstrap 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. @@ -1495,7 +1462,7 @@ return /******/ (function(modules) { // webpackBootstrap var OidcMetadataUrlPath = '.well-known/openid-configuration'; - var MetadataService = function () { + var MetadataService = exports.MetadataService = function () { function MetadataService(settings) { var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService2.default; @@ -1640,12 +1607,9 @@ return /******/ (function(modules) { // webpackBootstrap return this._metadataUrl; } }]); - + return MetadataService; }(); - - exports.default = MetadataService; - module.exports = exports['default']; /***/ }), /* 8 */ @@ -1656,6 +1620,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.JsonService = undefined; var _Log = __webpack_require__(1); @@ -1670,7 +1635,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var JsonService = exports.JsonService = function () { function JsonService() { var XMLHttpRequestCtor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _Global2.default.XMLHttpRequest; @@ -1725,9 +1690,6 @@ return /******/ (function(modules) { // webpackBootstrap return JsonService; }(); - - exports.default = JsonService; - module.exports = exports['default']; /***/ }), /* 9 */ @@ -1738,6 +1700,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.UserInfoService = undefined; var _JsonService = __webpack_require__(8); @@ -1756,7 +1719,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var UserInfoService = exports.UserInfoService = function () { function UserInfoService(settings) { var JsonServiceCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _JsonService2.default; var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService2.default; @@ -1795,9 +1758,6 @@ return /******/ (function(modules) { // webpackBootstrap return UserInfoService; }(); - - exports.default = UserInfoService; - module.exports = exports['default']; /***/ }), /* 10 */ @@ -1808,6 +1768,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.ErrorResponse = undefined; var _Log = __webpack_require__(1); @@ -1822,7 +1783,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function (_Error) { + var ErrorResponse = exports.ErrorResponse = function (_Error) { _inherits(ErrorResponse, _Error); function ErrorResponse() { @@ -1853,9 +1814,6 @@ return /******/ (function(modules) { // webpackBootstrap return ErrorResponse; }(Error); - - exports.default = ErrorResponse; - module.exports = exports['default']; /***/ }), /* 11 */ @@ -1866,6 +1824,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.JoseUtil = undefined; var _jsrsasign = __webpack_require__(12); @@ -1880,7 +1839,7 @@ return /******/ (function(modules) { // webpackBootstrap var AllowedSigningAlgs = ['RS256', 'RS384', 'RS512', 'PS256', 'PS384', 'PS512', 'ES256', 'ES384', 'ES512']; - var JoseUtil = function () { + var JoseUtil = exports.JoseUtil = function () { function JoseUtil() { _classCallCheck(this, JoseUtil); } @@ -2021,9 +1980,6 @@ return /******/ (function(modules) { // webpackBootstrap return JoseUtil; }(); - - exports.default = JoseUtil; - module.exports = exports['default']; /***/ }), /* 12 */ @@ -2301,2114 +2257,97 @@ return /******/ (function(modules) { // webpackBootstrap if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.DSA=function(){this.p=null;this.q=null;this.g=null;this.y=null;this.x=null;this.type="DSA";this.setPrivate=function(z,w,v,A,u){this.isPrivate=true;this.p=z;this.q=w;this.g=v;this.y=A;this.x=u};this.setPublic=function(w,v,u,z){this.isPublic=true;this.p=w;this.q=v;this.g=u;this.y=z;this.x=null};this.signWithMessageHash=function(z){var v=this.p;var u=this.q;var C=this.g;var D=this.y;var E=this.x;var A=z.substr(0,u.bitLength()/4);var B=new BigInteger(z,16);var w=n(BigInteger.ONE.add(BigInteger.ONE),u.subtract(BigInteger.ONE));var G=(C.modPow(w,v)).mod(u);var F=(w.modInverse(u).multiply(B.add(E.multiply(G)))).mod(u);var H=KJUR.asn1.ASN1Util.jsonToASN1HEX({seq:[{"int":{bigint:G}},{"int":{bigint:F}}]});return H};this.verifyWithMessageHash=function(C,B){var z=this.p;var u=this.q;var G=this.g;var H=this.y;var E=this.parseASN1Signature(B);var K=E[0];var J=E[1];var C=C.substr(0,u.bitLength()/4);var D=new BigInteger(C,16);if(BigInteger.ZERO.compareTo(K)>0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){throw"invalid DSA signature"}var I=J.modInverse(u);var A=D.multiply(I).mod(u);var v=K.multiply(I).mod(u);var F=G.modPow(A,z).multiply(H.modPow(v,z)).mod(z).mod(u);return F.compareTo(K)==0};this.parseASN1Signature=function(u){try{var y=new BigInteger(ASN1HEX.getVbyList(u,0,[0],"02"),16);var v=new BigInteger(ASN1HEX.getVbyList(u,0,[1],"02"),16);return[y,v]}catch(w){throw"malformed DSA signature"}};function d(E,w,B,v,u,C){var z=KJUR.crypto.Util.hashString(w,E.toLowerCase());var z=z.substr(0,u.bitLength()/4);var A=new BigInteger(z,16);var y=n(BigInteger.ONE.add(BigInteger.ONE),u.subtract(BigInteger.ONE));var F=(B.modPow(y,v)).mod(u);var D=(y.modInverse(u).multiply(A.add(C.multiply(F)))).mod(u);var G=new Array();G[0]=F;G[1]=D;return G}function r(v){var u=openpgp.config.config.prefer_hash_algorithm;switch(Math.round(v.bitLength()/8)){case 20:if(u!=2&&u>11&&u!=10&&u<8){return 2}return u;case 28:if(u>11&&u<8){return 11}return u;case 32:if(u>10&&u<8){return 8}return u;default:util.print_debug("DSA select hash algorithm: returning null for an unknown length of q");return null}}this.select_hash_algorithm=r;function m(I,K,J,B,z,u,F,G){var C=KJUR.crypto.Util.hashString(B,I.toLowerCase());var C=C.substr(0,u.bitLength()/4);var D=new BigInteger(C,16);if(BigInteger.ZERO.compareTo(K)>0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){util.print_error("invalid DSA Signature");return null}var H=J.modInverse(u);var A=D.multiply(H).mod(u);var v=K.multiply(H).mod(u);var E=F.modPow(A,z).multiply(G.modPow(v,z)).mod(z).mod(u);return E.compareTo(K)==0}function a(z){var A=new BigInteger(z,primeCenterie);var y=j(q,512);var u=t(p,q,z);var v;do{v=new BigInteger(q.bitCount(),rand)}while(x.compareTo(BigInteger.ZERO)!=1&&x.compareTo(q)!=-1);var w=g.modPow(x,p);return{x:v,q:A,p:y,g:u,y:w}}function j(y,z,w){if(z%64!=0){return false}var u;var v;do{u=w(bitcount,true);v=u.subtract(BigInteger.ONE);u=u.subtract(v.remainder(y))}while(!u.isProbablePrime(primeCenterie)||u.bitLength()!=l);return u}function t(B,z,A,w){var u=B.subtract(BigInteger.ONE);var y=u.divide(z);var v;do{v=w(A)}while(v.compareTo(u)!=-1&&v.compareTo(BigInteger.ONE)!=1);return v.modPow(y,B)}function o(w,y,u){var v;do{v=u(y,false)}while(v.compareTo(w)!=-1&&v.compareTo(BigInteger.ZERO)!=1);return v}function i(v,w){k=o(v);var u=g.modPow(k,w).mod(v);return u}function h(B,w,y,v,z,u){var A=B(v);s=(w.modInverse(z).multiply(A.add(u.multiply(y)))).mod(z);return s}this.sign=d;this.verify=m;function n(w,u){if(u.compareTo(w)<=0){return}var v=u.subtract(w);var y=e(v.bitLength());while(y>v){y=e(v.bitLength())}return w.add(y)}function e(w){if(w<0){return null}var u=Math.floor((w+7)/8);var v=c(u);if(w%8>0){v=String.fromCharCode((Math.pow(2,w%8)-1)&v.charCodeAt(0))+v.substring(1)}return new BigInteger(f(v),16)}function c(w){var u="";for(var v=0;v=s*2){break}}var x={};x.keyhex=v.substr(0,g[o]["keylen"]*2);x.ivhex=v.substr(g[o]["keylen"]*2,g[o]["ivlen"]*2);return x};var a=function(n,t,p,u){var q=CryptoJS.enc.Base64.parse(n);var o=CryptoJS.enc.Hex.stringify(q);var s=g[t]["proc"];var r=s(o,p,u);return r};var f=function(n,q,o,s){var p=g[q]["eproc"];var r=p(n,o,s);return r};return{version:"1.0.5",getHexFromPEM:function(o,r){var p=o;if(p.indexOf("BEGIN "+r)==-1){throw"can't find PEM header: "+r}p=p.replace("-----BEGIN "+r+"-----","");p=p.replace("-----END "+r+"-----","");var q=p.replace(/\s+/g,"");var n=b64tohex(q);return n},getDecryptedKeyHexByKeyIV:function(o,r,q,p){var n=b(r);return n(o,q,p)},parsePKCS5PEM:function(n){return l(n)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(o,n,p){return h(o,n,p)},decryptKeyB64:function(n,p,o,q){return a(n,p,o,q)},getDecryptedKeyHex:function(w,v){var o=l(w);var r=o.type;var p=o.cipher;var n=o.ivsalt;var q=o.data;var u=h(p,v,n);var t=u.keyhex;var s=a(q,p,t,n);return s},getRSAKeyFromEncryptedPKCS5PEM:function(p,o){var q=this.getDecryptedKeyHex(p,o);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(q);return n},getEryptedPKCS5PEMFromPrvKeyHex:function(q,x,r,p){var n="";if(typeof r=="undefined"||r==null){r="AES-256-CBC"}if(typeof g[r]=="undefined"){throw"PKCS5PKEY unsupported algorithm: "+r}if(typeof p=="undefined"||p==null){var t=g[r]["ivlen"];var s=k(t);p=s.toUpperCase()}var w=h(r,x,p);var v=w.keyhex;var u=f(q,r,v,p);var o=u.replace(/(.{64})/g,"$1\r\n");var n="-----BEGIN RSA PRIVATE KEY-----\r\n";n+="Proc-Type: 4,ENCRYPTED\r\n";n+="DEK-Info: "+r+","+p+"\r\n";n+="\r\n";n+=o;n+="\r\n-----END RSA PRIVATE KEY-----\r\n";return n},getEryptedPKCS5PEMFromRSAKey:function(C,D,o,s){var A=new KJUR.asn1.DERInteger({"int":0});var v=new KJUR.asn1.DERInteger({bigint:C.n});var z=new KJUR.asn1.DERInteger({"int":C.e});var B=new KJUR.asn1.DERInteger({bigint:C.d});var t=new KJUR.asn1.DERInteger({bigint:C.p});var r=new KJUR.asn1.DERInteger({bigint:C.q});var y=new KJUR.asn1.DERInteger({bigint:C.dmp1});var u=new KJUR.asn1.DERInteger({bigint:C.dmq1});var x=new KJUR.asn1.DERInteger({bigint:C.coeff});var E=new KJUR.asn1.DERSequence({array:[A,v,z,B,t,r,y,u,x]});var w=E.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(w,D,o,s)},newEncryptedPKCS5PEM:function(n,o,r,s){if(typeof o=="undefined"||o==null){o=1024}if(typeof r=="undefined"||r==null){r="10001"}var p=new RSAKey();p.generate(o,r);var q=null;if(typeof s=="undefined"||s==null){q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n)}else{q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n,s)}return q},getRSAKeyFromPlainPKCS8PEM:function(p){if(p.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var o=this.getHexFromPEM(p,"PRIVATE KEY");var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getRSAKeyFromPlainPKCS8Hex:function(q){var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"outer DERSequence shall have 3 elements: "+p.length}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);if(o!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+o}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);var r=ASN1HEX.getHexOfTLV_AtObj(q,p[2]);var s=ASN1HEX.getHexOfV_AtObj(r,0);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(s);return n},parseHexOfEncryptedPKCS8:function(u){var q={};var p=ASN1HEX.getPosArrayOfChildren_AtObj(u,0);if(p.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+p.length}q.ciphertext=ASN1HEX.getHexOfV_AtObj(u,p[1]);var w=ASN1HEX.getPosArrayOfChildren_AtObj(u,p[0]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+w.length}if(ASN1HEX.getHexOfV_AtObj(u,w[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(u,w[1]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+n.length}var o=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[1]);if(o.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+o.length}if(ASN1HEX.getHexOfV_AtObj(u,o[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}q.encryptionSchemeAlg="TripleDES";q.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(u,o[1]);var r=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[0]);if(r.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+r.length}if(ASN1HEX.getHexOfV_AtObj(u,r[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var v=ASN1HEX.getPosArrayOfChildren_AtObj(u,r[1]);if(v.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+v.length}q.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(u,v[0]);var s=ASN1HEX.getHexOfV_AtObj(u,v[1]);try{q.pbkdf2Iter=parseInt(s,16)}catch(t){throw"malformed format pbkdf2Iter: "+s}return q},getPBKDF2KeyHexFromParam:function(s,n){var r=CryptoJS.enc.Hex.parse(s.pbkdf2Salt);var o=s.pbkdf2Iter;var q=CryptoJS.PBKDF2(n,r,{keySize:192/32,iterations:o});var p=CryptoJS.enc.Hex.stringify(q);return p},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(v,w){var p=this.getHexFromPEM(v,"ENCRYPTED PRIVATE KEY");var n=this.parseHexOfEncryptedPKCS8(p);var s=PKCS5PKEY.getPBKDF2KeyHexFromParam(n,w);var t={};t.ciphertext=CryptoJS.enc.Hex.parse(n.ciphertext);var r=CryptoJS.enc.Hex.parse(s);var q=CryptoJS.enc.Hex.parse(n.encryptionSchemeIV);var u=CryptoJS.TripleDES.decrypt(t,r,{iv:q});var o=CryptoJS.enc.Hex.stringify(u);return o},getRSAKeyFromEncryptedPKCS8PEM:function(q,p){var o=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,p);var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getKeyFromEncryptedPKCS8PEM:function(q,o){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,o);var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},parsePlainPrivatePKCS8Hex:function(q){var o={};o.algparam=null;if(q.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(q.substr(p[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,p[1]);if(n.length!=2){throw"malformed PKCS8 private key(code:004)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}o.keyidx=ASN1HEX.getStartPosOfV_AtObj(q,p[2]);return o},getKeyFromPlainPrivatePKCS8PEM:function(o){var n=this.getHexFromPEM(o,"PRIVATE KEY");var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},getKeyFromPlainPrivatePKCS8Hex:function(n){var p=this.parsePlainPrivatePKCS8Hex(n);if(p.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(n,p);var o=p.key;var q=new RSAKey();q.setPrivateEx(o.n,o.e,o.d,o.p,o.q,o.dp,o.dq,o.co);return q}else{if(p.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(n,p);if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var r=KJUR.crypto.OID.oidhex2name[p.algparam];var q=new KJUR.crypto.ECDSA({curve:r,prv:p.key});return q}else{throw"unsupported private key algorithm"}}},getRSAKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getRSAKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8Hex:function(o){var n=this.parsePublicPKCS8Hex(o);if(n.algoid=="2a864886f70d010101"){var r=this.parsePublicRawRSAKeyHex(n.key);var p=new RSAKey();p.setPublic(r.n,r.e);return p}else{if(n.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[n.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+n.algparam}var q=KJUR.crypto.OID.oidhex2name[n.algparam];var p=new KJUR.crypto.ECDSA({curve:q,pub:n.key});return p}else{throw"unsupported public key algorithm"}}},parsePublicRawRSAKeyHex:function(p){var n={};if(p.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var o=ASN1HEX.getPosArrayOfChildren_AtObj(p,0);if(o.length!=2){throw"malformed RSA key(code:002)"}if(p.substr(o[0],2)!="02"){throw"malformed RSA key(code:003)"}n.n=ASN1HEX.getHexOfV_AtObj(p,o[0]);if(p.substr(o[1],2)!="02"){throw"malformed RSA key(code:004)"}n.e=ASN1HEX.getHexOfV_AtObj(p,o[1]);return n},parsePrivateRawRSAKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed RSA private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=9){throw"malformed RSA private key(code:002)"}q.key={};q.key.n=ASN1HEX.getHexOfV_AtObj(o,n[1]);q.key.e=ASN1HEX.getHexOfV_AtObj(o,n[2]);q.key.d=ASN1HEX.getHexOfV_AtObj(o,n[3]);q.key.p=ASN1HEX.getHexOfV_AtObj(o,n[4]);q.key.q=ASN1HEX.getHexOfV_AtObj(o,n[5]);q.key.dp=ASN1HEX.getHexOfV_AtObj(o,n[6]);q.key.dq=ASN1HEX.getHexOfV_AtObj(o,n[7]);q.key.co=ASN1HEX.getHexOfV_AtObj(o,n[8])},parsePrivateRawECKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed ECC private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=3){throw"malformed ECC private key(code:002)"}if(o.substr(n[1],2)!="04"){throw"malformed ECC private key(code:003)"}q.key=ASN1HEX.getHexOfV_AtObj(o,n[1])},parsePublicPKCS8Hex:function(q){var o={};o.algparam=null;var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=2){throw"outer DERSequence shall have 2 elements: "+p.length}var r=p[0];if(q.substr(r,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(n.length!=2){throw"malformed PKCS8 public key(code:002)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}o.key=ASN1HEX.getHexOfV_AtObj(q,p[1]).substr(2);return o},getRSAKeyFromPublicPKCS8Hex:function(r){var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"outer DERSequence shall have 2 elements: "+q.length}var p=ASN1HEX.getHexOfTLV_AtObj(r,q[0]);if(p!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(r.substr(q[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var t=ASN1HEX.getStartPosOfV_AtObj(r,q[1])+2;if(r.substr(t,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var n=ASN1HEX.getPosArrayOfChildren_AtObj(r,t);if(n.length!=2){throw"inner DERSequence shall have 2 elements: "+n.length}if(r.substr(n[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(r.substr(n[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var u=ASN1HEX.getHexOfV_AtObj(r,n[0]);var s=ASN1HEX.getHexOfV_AtObj(r,n[1]);var o=new RSAKey();o.setPublic(u,s);return o},}}(); - /*! keyutil-1.0.13.js (c) 2013-2016 Kenji Urushima | kjur.github.com/jsrsasign/license - */ - var KEYUTIL=function(){var d=function(p,r,q){return k(CryptoJS.AES,p,r,q)};var e=function(p,r,q){return k(CryptoJS.TripleDES,p,r,q)};var a=function(p,r,q){return k(CryptoJS.DES,p,r,q)};var k=function(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(p,r,q){return g(CryptoJS.AES,p,r,q)};var o=function(p,r,q){return g(CryptoJS.TripleDES,p,r,q)};var f=function(p,r,q){return g(CryptoJS.DES,p,r,q)};var g=function(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(p){return i[p]["proc"]};var m=function(p){var r=CryptoJS.lib.WordArray.random(p);var q=CryptoJS.enc.Hex.stringify(r);return q};var n=function(t){var u={};if(t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){u.cipher=RegExp.$1;u.ivsalt=RegExp.$2}if(t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){u.type=RegExp.$1}var r=-1;var v=0;if(t.indexOf("\r\n\r\n")!=-1){r=t.indexOf("\r\n\r\n");v=2}if(t.indexOf("\n\n")!=-1){r=t.indexOf("\n\n");v=1}var q=t.indexOf("-----END");if(r!=-1&&q!=-1){var p=t.substring(r+v*2,q-v);p=p.replace(/\s+/g,"");u.data=p}return u};var j=function(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(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(p,s,q,u){var r=i[s]["eproc"];var t=r(p,q,u);return t};return{version:"1.0.0",getHexFromPEM:function(q,u){var r=q;if(r.indexOf("-----BEGIN ")==-1){throw"can't find PEM header: "+u}if(typeof u=="string"&&u!=""){r=r.replace("-----BEGIN "+u+"-----","");r=r.replace("-----END "+u+"-----","")}else{r=r.replace(/-----BEGIN [^-]+-----/,"");r=r.replace(/-----END [^-]+-----/,"")}var t=r.replace(/\s+/g,"");var p=b64tohex(t);return p},getDecryptedKeyHexByKeyIV:function(q,t,s,r){var p=c(t);return p(q,s,r)},parsePKCS5PEM:function(p){return n(p)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(q,p,r){return j(q,p,r)},decryptKeyB64:function(p,r,q,s){return b(p,r,q,s)},getDecryptedKeyHex:function(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},getRSAKeyFromEncryptedPKCS5PEM:function(r,q){var s=this.getDecryptedKeyHex(r,q);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(s);return p},getEncryptedPKCS5PEMFromPrvKeyHex:function(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},getEncryptedPKCS5PEMFromRSAKey:function(D,E,r,t){var B=new KJUR.asn1.DERInteger({"int":0});var w=new KJUR.asn1.DERInteger({bigint:D.n});var A=new KJUR.asn1.DERInteger({"int":D.e});var C=new KJUR.asn1.DERInteger({bigint:D.d});var u=new KJUR.asn1.DERInteger({bigint:D.p});var s=new KJUR.asn1.DERInteger({bigint:D.q});var z=new KJUR.asn1.DERInteger({bigint:D.dmp1});var v=new KJUR.asn1.DERInteger({bigint:D.dmq1});var y=new KJUR.asn1.DERInteger({bigint:D.coeff});var F=new KJUR.asn1.DERSequence({array:[B,w,A,C,u,s,z,v,y]});var x=F.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",x,E,r,t)},newEncryptedPKCS5PEM:function(p,q,t,u){if(typeof q=="undefined"||q==null){q=1024}if(typeof t=="undefined"||t==null){t="10001"}var r=new RSAKey();r.generate(q,t);var s=null;if(typeof u=="undefined"||u==null){s=this.getEncryptedPKCS5PEMFromRSAKey(r,p)}else{s=this.getEncryptedPKCS5PEMFromRSAKey(r,p,u)}return s},getRSAKeyFromPlainPKCS8PEM:function(r){if(r.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var q=this.getHexFromPEM(r,"PRIVATE KEY");var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getRSAKeyFromPlainPKCS8Hex:function(s){var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"outer DERSequence shall have 3 elements: "+r.length}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);if(q!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+q}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);var t=ASN1HEX.getHexOfTLV_AtObj(s,r[2]);var u=ASN1HEX.getHexOfV_AtObj(t,0);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(u);return p},parseHexOfEncryptedPKCS8:function(w){var s={};var r=ASN1HEX.getPosArrayOfChildren_AtObj(w,0);if(r.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+r.length}s.ciphertext=ASN1HEX.getHexOfV_AtObj(w,r[1]);var y=ASN1HEX.getPosArrayOfChildren_AtObj(w,r[0]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+y.length}if(ASN1HEX.getHexOfV_AtObj(w,y[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(w,y[1]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+p.length}var q=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[1]);if(q.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+q.length}if(ASN1HEX.getHexOfV_AtObj(w,q[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}s.encryptionSchemeAlg="TripleDES";s.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(w,q[1]);var t=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[0]);if(t.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+t.length}if(ASN1HEX.getHexOfV_AtObj(w,t[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var x=ASN1HEX.getPosArrayOfChildren_AtObj(w,t[1]);if(x.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+x.length}s.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(w,x[0]);var u=ASN1HEX.getHexOfV_AtObj(w,x[1]);try{s.pbkdf2Iter=parseInt(u,16)}catch(v){throw"malformed format pbkdf2Iter: "+u}return s},getPBKDF2KeyHexFromParam:function(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(x,y){var r=this.getHexFromPEM(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},getRSAKeyFromEncryptedPKCS8PEM:function(s,r){var q=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,r);var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getKeyFromEncryptedPKCS8PEM:function(s,q){var p=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,q);var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},parsePlainPrivatePKCS8Hex:function(s){var q={};q.algparam=null;if(s.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var r=ASN1HEX.getPosArrayOfChildren_AtObj(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=ASN1HEX.getPosArrayOfChildren_AtObj(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=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}if(s.substr(r[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}q.keyidx=ASN1HEX.getStartPosOfV_AtObj(s,r[2]);return q},getKeyFromPlainPrivatePKCS8PEM:function(q){var p=this.getHexFromPEM(q,"PRIVATE KEY");var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},getKeyFromPlainPrivatePKCS8Hex:function(p){var w=this.parsePlainPrivatePKCS8Hex(p);if(w.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(p,w);var u=w.key;var z=new RSAKey();z.setPrivateEx(u.n,u.e,u.d,u.p,u.q,u.dp,u.dq,u.co);return z}else{if(w.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(p,w);if(KJUR.crypto.OID.oidhex2name[w.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+w.algparam}var v=KJUR.crypto.OID.oidhex2name[w.algparam];var z=new KJUR.crypto.ECDSA({curve:v});z.setPublicKeyHex(w.pubkey);z.setPrivateKeyHex(w.key);z.isPublic=false;return z}else{if(w.algoid=="2a8648ce380401"){var t=ASN1HEX.getVbyList(p,0,[1,1,0],"02");var s=ASN1HEX.getVbyList(p,0,[1,1,1],"02");var y=ASN1HEX.getVbyList(p,0,[1,1,2],"02");var B=ASN1HEX.getVbyList(p,0,[2,0],"02");var r=new BigInteger(t,16);var q=new BigInteger(s,16);var x=new BigInteger(y,16);var A=new BigInteger(B,16);var z=new KJUR.crypto.DSA();z.setPrivate(r,q,x,null,A);return z}else{throw"unsupported private key algorithm"}}}},getRSAKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getRSAKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8Hex:function(q){var p=this.parsePublicPKCS8Hex(q);if(p.algoid=="2a864886f70d010101"){var u=this.parsePublicRawRSAKeyHex(p.key);var r=new RSAKey();r.setPublic(u.n,u.e);return r}else{if(p.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var s=KJUR.crypto.OID.oidhex2name[p.algparam];var r=new KJUR.crypto.ECDSA({curve:s,pub:p.key});return r}else{if(p.algoid=="2a8648ce380401"){var t=p.algparam;var v=ASN1HEX.getHexOfV_AtObj(p.key,0);var r=new KJUR.crypto.DSA();r.setPublic(new BigInteger(t.p,16),new BigInteger(t.q,16),new BigInteger(t.g,16),new BigInteger(v,16));return r}else{throw"unsupported public key algorithm"}}}},parsePublicRawRSAKeyHex:function(r){var p={};if(r.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var q=ASN1HEX.getPosArrayOfChildren_AtObj(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=ASN1HEX.getHexOfV_AtObj(r,q[0]);if(r.substr(q[1],2)!="02"){throw"malformed RSA key(code:004)"}p.e=ASN1HEX.getHexOfV_AtObj(r,q[1]);return p},parsePrivateRawRSAKeyHexAtObj:function(q,s){var r=s.keyidx;if(q.substr(r,2)!="30"){throw"malformed RSA private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(p.length!=9){throw"malformed RSA private key(code:002)"}s.key={};s.key.n=ASN1HEX.getHexOfV_AtObj(q,p[1]);s.key.e=ASN1HEX.getHexOfV_AtObj(q,p[2]);s.key.d=ASN1HEX.getHexOfV_AtObj(q,p[3]);s.key.p=ASN1HEX.getHexOfV_AtObj(q,p[4]);s.key.q=ASN1HEX.getHexOfV_AtObj(q,p[5]);s.key.dp=ASN1HEX.getHexOfV_AtObj(q,p[6]);s.key.dq=ASN1HEX.getHexOfV_AtObj(q,p[7]);s.key.co=ASN1HEX.getHexOfV_AtObj(q,p[8])},parsePrivateRawECKeyHexAtObj:function(p,t){var q=t.keyidx;var r=ASN1HEX.getVbyList(p,q,[1],"04");var s=ASN1HEX.getVbyList(p,q,[2,0],"03").substr(2);t.key=r;t.pubkey=s},parsePublicPKCS8Hex:function(s){var q={};q.algparam=null;var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=2){throw"outer DERSequence shall have 2 elements: "+r.length}var t=r[0];if(s.substr(t,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,t);if(p.length!=2){throw"malformed PKCS8 public key(code:002)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}else{if(s.substr(p[1],2)=="30"){q.algparam={};q.algparam.p=ASN1HEX.getVbyList(s,p[1],[0],"02");q.algparam.q=ASN1HEX.getVbyList(s,p[1],[1],"02");q.algparam.g=ASN1HEX.getVbyList(s,p[1],[2],"02")}}if(s.substr(r[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}q.key=ASN1HEX.getHexOfV_AtObj(s,r[1]).substr(2);return q},getRSAKeyFromPublicPKCS8Hex:function(t){var s=ASN1HEX.getPosArrayOfChildren_AtObj(t,0);if(s.length!=2){throw"outer DERSequence shall have 2 elements: "+s.length}var r=ASN1HEX.getHexOfTLV_AtObj(t,s[0]);if(r!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(t.substr(s[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var v=ASN1HEX.getStartPosOfV_AtObj(t,s[1])+2;if(t.substr(v,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var p=ASN1HEX.getPosArrayOfChildren_AtObj(t,v);if(p.length!=2){throw"inner DERSequence shall have 2 elements: "+p.length}if(t.substr(p[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(t.substr(p[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var w=ASN1HEX.getHexOfV_AtObj(t,p[0]);var u=ASN1HEX.getHexOfV_AtObj(t,p[1]);var q=new RSAKey();q.setPublic(w,u);return q},}}();KEYUTIL.getKey=function(f,e,h){if(typeof RSAKey!="undefined"&&f instanceof RSAKey){return f}if(typeof KJUR.crypto.ECDSA!="undefined"&&f instanceof KJUR.crypto.ECDSA){return f}if(typeof KJUR.crypto.DSA!="undefined"&&f instanceof KJUR.crypto.DSA){return f}if(f.curve!==undefined&&f.xy!==undefined&&f.d===undefined){return new KJUR.crypto.ECDSA({pub:f.xy,curve:f.curve})}if(f.curve!==undefined&&f.d!==undefined){return new KJUR.crypto.ECDSA({prv:f.d,curve:f.curve})}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(f.n,f.e);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.co!==undefined&&f.qi===undefined){var w=new RSAKey();w.setPrivateEx(f.n,f.e,f.d,f.p,f.q,f.dp,f.dq,f.co);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p===undefined){var w=new RSAKey();w.setPrivate(f.n,f.e,f.d);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x===undefined){var w=new KJUR.crypto.DSA();w.setPublic(f.p,f.q,f.g,f.y);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x!==undefined){var w=new KJUR.crypto.DSA();w.setPrivate(f.p,f.q,f.g,f.y,f.x);return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(b64utohex(f.n),b64utohex(f.e));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.qi!==undefined){var w=new RSAKey();w.setPrivateEx(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d),b64utohex(f.p),b64utohex(f.q),b64utohex(f.dp),b64utohex(f.dq),b64utohex(f.qi));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined){var w=new RSAKey();w.setPrivate(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d));return w}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d===undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var r=("0000000000"+b64utohex(f.x)).slice(-l);var n=("0000000000"+b64utohex(f.y)).slice(-l);var m="04"+r+n;d.setPublicKeyHex(m);return d}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d!==undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var r=("0000000000"+b64utohex(f.x)).slice(-l);var n=("0000000000"+b64utohex(f.y)).slice(-l);var m="04"+r+n;var a=("0000000000"+b64utohex(f.d)).slice(-l);d.setPublicKeyHex(m);d.setPrivateKeyHex(a);return d}if(f.indexOf("-END CERTIFICATE-",0)!=-1||f.indexOf("-END X509 CERTIFICATE-",0)!=-1||f.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1){return X509.getPublicKeyFromCertPEM(f)}if(h==="pkcs8pub"){return KEYUTIL.getKeyFromPublicPKCS8Hex(f)}if(f.indexOf("-END PUBLIC KEY-")!=-1){return KEYUTIL.getKeyFromPublicPKCS8PEM(f)}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var i=KEYUTIL.getHexFromPEM(f,"RSA PRIVATE KEY");return KEYUTIL.getKey(i,null,"pkcs5prv")}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var u=this.getHexFromPEM(f,"DSA PRIVATE KEY");var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(f)}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){return KEYUTIL.getRSAKeyFromEncryptedPKCS5PEM(f,e)}if(f.indexOf("-END EC PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var w=ASN1HEX.getVbyList(u,0,[1],"04");var c=ASN1HEX.getVbyList(u,0,[2,0],"06");var o=ASN1HEX.getVbyList(u,0,[3,0],"03").substr(2);var b="";if(KJUR.crypto.OID.oidhex2name[c]!==undefined){b=KJUR.crypto.OID.oidhex2name[c]}else{throw"undefined OID(hex) in KJUR.crypto.OID: "+c}var d=new KJUR.crypto.ECDSA({name:b});d.setPublicKeyHex(o);d.setPrivateKeyHex(w);d.isPublic=false;return d}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromEncryptedPKCS8PEM(f,e)}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(a,r,o,g,j){var v=KJUR.asn1;var u=KJUR.crypto;function p(s){var w=KJUR.asn1.ASN1Util.newObject({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 w}function q(w){var s=KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:w.prvKeyHex}},{tag:["a0",true,{oid:{name:w.curveName}}]},{tag:["a1",true,{bitstr:{hex:"00"+w.pubKeyHex}}]}]});return s}function n(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.g}},{"int":{bigint:s.y}},{"int":{bigint:s.x}}]});return w}if(((typeof RSAKey!="undefined"&&a instanceof RSAKey)||(typeof u.DSA!="undefined"&&a instanceof u.DSA)||(typeof u.ECDSA!="undefined"&&a instanceof u.ECDSA))&&a.isPublic==true&&(r===undefined||r=="PKCS8PUB")){var t=new KJUR.asn1.x509.SubjectPublicKeyInfo(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"PUBLIC KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o===undefined||o==null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"RSA PRIVATE KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o===undefined||o==null)&&a.isPrivate==true){var f=new KJUR.asn1.DERObjectIdentifier({name:a.curveName});var l=f.getEncodedHex();var e=q(a);var k=e.getEncodedHex();var i="";i+=v.ASN1Util.getPEMStringFromHex(l,"EC PARAMETERS");i+=v.ASN1Util.getPEMStringFromHex(k,"EC PRIVATE KEY");return i}if(r=="PKCS1PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o===undefined||o==null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"DSA PRIVATE KEY")}if(r=="PKCS5PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=q(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",m,o,g)}var h=function(w,s){var y=b(w,s);var x=new KJUR.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:y.pbkdf2Salt}},{"int":y.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:y.encryptionSchemeIV}}]}]}]},{octstr:{hex:y.ciphertext}}]});return x.getEncodedHex()};var b=function(D,E){var x=100;var C=CryptoJS.lib.WordArray.random(8);var B="DES-EDE3-CBC";var s=CryptoJS.lib.WordArray.random(8);var y=CryptoJS.PBKDF2(E,C,{keySize:192/32,iterations:x});var z=CryptoJS.enc.Hex.parse(D);var A=CryptoJS.TripleDES.encrypt(z,y,{iv:s})+"";var w={};w.ciphertext=A;w.pbkdf2Salt=CryptoJS.enc.Hex.stringify(C);w.pbkdf2Iter=x;w.encryptionSchemeAlg=B;w.encryptionSchemeIV=CryptoJS.enc.Hex.stringify(s);return w};if(r=="PKCS8PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&a.isPrivate==true){var d=p(a);var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"rsaEncryption"}},{"null":true}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&a.isPrivate==true){var d=new KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:a.prvKeyHex}},{tag:["a1",true,{bitstr:{hex:"00"+a.pubKeyHex}}]}]});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:a.curveName}}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&a.isPrivate==true){var d=new KJUR.asn1.DERInteger({bigint:a.x});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"dsa"}},{seq:[{"int":{bigint:a.p}},{"int":{bigint:a.q}},{"int":{bigint:a.g}}]}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}throw"unsupported object nor format"};KEYUTIL.getKeyFromCSRPEM=function(b){var a=KEYUTIL.getHexFromPEM(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(c){var b={};var e=c;if(e.substr(0,2)!="30"){throw"malformed CSR(code:001)"}var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,0);if(d.length<1){throw"malformed CSR(code:002)"}if(e.substr(d[0],2)!="30"){throw"malformed CSR(code:003)"}var a=ASN1HEX.getPosArrayOfChildren_AtObj(e,d[0]);if(a.length<3){throw"malformed CSR(code:004)"}b.p8pubkeyhex=ASN1HEX.getHexOfTLV_AtObj(e,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"}; - /*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license - */ - function _rsapem_pemToBase64(b){var a=b;a=a.replace("-----BEGIN RSA PRIVATE KEY-----","");a=a.replace("-----END RSA PRIVATE KEY-----","");a=a.replace(/[ \n]+/g,"");return a}function _rsapem_getPosArrayOfChildrenFromHex(d){var j=new Array();var k=ASN1HEX.getStartPosOfV_AtObj(d,0);var f=ASN1HEX.getPosOfNextSibling_AtObj(d,k);var h=ASN1HEX.getPosOfNextSibling_AtObj(d,f);var b=ASN1HEX.getPosOfNextSibling_AtObj(d,h);var l=ASN1HEX.getPosOfNextSibling_AtObj(d,b);var e=ASN1HEX.getPosOfNextSibling_AtObj(d,l);var g=ASN1HEX.getPosOfNextSibling_AtObj(d,e);var c=ASN1HEX.getPosOfNextSibling_AtObj(d,g);var i=ASN1HEX.getPosOfNextSibling_AtObj(d,c);j.push(k,f,h,b,l,e,g,c,i);return j}function _rsapem_getHexValueArrayOfChildrenFromHex(i){var o=_rsapem_getPosArrayOfChildrenFromHex(i);var r=ASN1HEX.getHexOfV_AtObj(i,o[0]);var f=ASN1HEX.getHexOfV_AtObj(i,o[1]);var j=ASN1HEX.getHexOfV_AtObj(i,o[2]);var k=ASN1HEX.getHexOfV_AtObj(i,o[3]);var c=ASN1HEX.getHexOfV_AtObj(i,o[4]);var b=ASN1HEX.getHexOfV_AtObj(i,o[5]);var h=ASN1HEX.getHexOfV_AtObj(i,o[6]);var g=ASN1HEX.getHexOfV_AtObj(i,o[7]);var l=ASN1HEX.getHexOfV_AtObj(i,o[8]);var m=new Array();m.push(r,f,j,k,c,b,h,g,l);return m}function _rsapem_readPrivateKeyFromASN1HexString(c){var b=_rsapem_getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}function _rsapem_readPrivateKeyFromPEMString(e){var c=_rsapem_pemToBase64(e);var d=b64tohex(c);var b=_rsapem_getHexValueArrayOfChildrenFromHex(d);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}RSAKey.prototype.readPrivateKeyFromPEMString=_rsapem_readPrivateKeyFromPEMString;RSAKey.prototype.readPrivateKeyFromASN1HexString=_rsapem_readPrivateKeyFromASN1HexString; - /*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license - */ - var _RE_HEXDECONLY=new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]","gi");function _rsasign_getHexPaddedDigestInfoForString(d,e,a){var b=function(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>24,(d&16711680)>>16,(d&65280)>>8,d&255]))));d+=1}return b}function _rsasign_signStringPSS(e,a,d){var c=function(f){return KJUR.crypto.Util.hashHex(f,a)};var b=c(rstrtohex(e));if(d===undefined){d=-1}return this.signWithMessageHashPSS(b,a,d)}function _rsasign_signWithMessageHashPSS(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(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>(8*c-m))&255;q[0]&=~p;for(d=0;dthis.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(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(h==c)}function _rsasign_verifyWithMessageHash(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)}function _rsasign_verifyStringPSS(c,b,a,f){var e=function(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)}function _rsasign_verifyWithMessageHashPSS(f,s,l,c){var k=new BigInteger(s,16);if(k.bitLength()>this.n.bitLength()){return false}var r=function(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>(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;q0){var c=":"+j.join(":")+":";if(c.indexOf(":"+h+":")==-1){throw"algorithm '"+h+"' not accepted in the list"}}if(h!="none"&&t===null){throw"key shall be specified to verify."}if(typeof t=="string"&&t.indexOf("-----BEGIN ")!=-1){t=KEYUTIL.getKey(t)}if(s=="RS"||s=="PS"){if(!(t instanceof RSAKey)){throw"key shall be a RSAKey obj for RS* and PS* algs"}}if(s=="ES"){if(!(t instanceof KJUR.crypto.ECDSA)){throw"key shall be a ECDSA obj for ES* algs"}}if(h=="none"){}var n=null;if(m.jwsalg2sigalg[i.alg]===undefined){throw"unsupported alg name: "+h}else{n=m.jwsalg2sigalg[h]}if(n=="none"){throw"not supported"}else{if(n.substr(0,4)=="Hmac"){var k=null;if(t===undefined){throw"hexadecimal key shall be specified for HMAC"}var g=new KJUR.crypto.Mac({alg:n,pass:t});g.updateString(b);k=g.doFinal();return r==k}else{if(n.indexOf("withECDSA")!=-1){var f=null;try{f=KJUR.crypto.ECDSA.concatSigToASN1Sig(r)}catch(o){return false}var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(f)}else{var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(r)}}}};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(d,j,l){var h=KJUR.jws.JWS;var i=d.split(".");var c=i[0];var g=i[1];var m=c+"."+g;var k=b64utohex(i[2]);var f=h.readSafeJSONString(b64utoutf8(c));var e=h.readSafeJSONString(b64utoutf8(g));if(f.alg===undefined){return false}if(l.alg===undefined){throw"acceptField.alg shall be specified"}if(!h.inArray(f.alg,l.alg)){return false}if(e.iss!==undefined&&typeof l.iss==="object"){if(!h.inArray(e.iss,l.iss)){return false}}if(e.sub!==undefined&&typeof l.sub==="object"){if(!h.inArray(e.sub,l.sub)){return false}}if(e.aud!==undefined&&typeof l.aud==="object"){if(typeof e.aud=="string"){if(!h.inArray(e.aud,l.aud)){return false}}else{if(typeof e.aud=="object"){if(!h.includedArray(e.aud,l.aud)){return false}}}}var b=KJUR.jws.IntDate.getNow();if(l.verifyAt!==undefined&&typeof l.verifyAt==="number"){b=l.verifyAt}if(l.gracePeriod===undefined||typeof l.gracePeriod!=="number"){l.gracePeriod=0}if(e.exp!==undefined&&typeof e.exp=="number"){if(e.exp+l.gracePeriodj){this.aHeader.pop()}if(this.aSignature.length>j){this.aSignature.pop()}throw"addSignature failed: "+g}};this.addSignatureByHeaderKey=function(f,c){var e=b64utoutf8(this.sPayload);var d=new KJUR.jws.JWS();var g=d.generateJWSByP1PrvKey(f,e,c);this.aHeader.push(d.parsedJWS.headB64U);this.aSignature.push(d.parsedJWS.sigvalB64U)};this.addSignatureByHeaderPayloadKey=function(f,e,c){var d=new KJUR.jws.JWS();var g=d.generateJWSByP1PrvKey(f,e,c);this.aHeader.push(d.parsedJWS.headB64U);this.sPayload=d.parsedJWS.payloadB64U;this.aSignature.push(d.parsedJWS.sigvalB64U)};this.verifyAll=function(f){if(this.aHeader.length!==f.length||this.aSignature.length!==f.length){return false}for(var e=0;e0){this.aHeader=e.headers}else{throw"malformed header"}if(typeof e.payload==="string"){this.sPayload=e.payload}else{throw"malformed signatures"}if(e.signatures.length>0){this.signatures=e.signatures}else{throw"malformed signatures"}}catch(c){throw"malformed JWS-JS JSON object: "+c}}};this.getJSON=function(){return{headers:this.aHeader,payload:this.sPayload,signatures:this.aSignature}};this.isEmpty=function(){if(this.aHeader.length==0){return 1}return 0}}; - /*! nodeutil-1.0.0 (c) 2015 Kenji Urushima | kjur.github.com/jsrsasign/license - */ - function readFileUTF8(a){return __webpack_require__(17).readFileSync(a,"utf8")}function readFileHexByBin(c){var b=__webpack_require__(12);var a=__webpack_require__(17);return b.rstrtohex(a.readFileSync(c,"binary"))}function readFile(b){var a=__webpack_require__(17);return a.readFileSync(b,"binary")}function saveFile(c,b){var a=__webpack_require__(17);a.writeFileSync(c,b,"binary")}function saveFileBinByHex(e,b){var a=__webpack_require__(17);var c=__webpack_require__(12);var d=c.hextorstr(b);a.writeFileSync(e,d,"binary")}; - exports.SecureRandom = SecureRandom; - exports.rng_seed_time = rng_seed_time; - - exports.BigInteger = BigInteger; - exports.RSAKey = RSAKey; - exports.ECDSA = KJUR.crypto.ECDSA; - exports.DSA = KJUR.crypto.DSA; - exports.Signature = KJUR.crypto.Signature; - exports.MessageDigest = KJUR.crypto.MessageDigest; - exports.Mac = KJUR.crypto.Mac; - 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.b64tohex = b64tohex; - 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.newline_toUnix = newline_toUnix; - exports.newline_toDos = newline_toDos; - exports.intarystrtohex = intarystrtohex; - exports.strdiffidx = strdiffidx; - - exports.KJUR = KJUR; - exports.crypto = KJUR.crypto; - exports.asn1 = KJUR.asn1; - exports.jws = KJUR.jws; - exports.lang = KJUR.lang; - - exports.readFileUTF8 = readFileUTF8; - exports.readFileHexByBin = readFileHexByBin; - exports.readFile = readFile; - exports.saveFile = saveFile; - exports.saveFileBinByHex = saveFileBinByHex; - - - /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13).Buffer)) - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - - /* WEBPACK VAR INJECTION */(function(global) {/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ - /* eslint-disable no-proto */ - - 'use strict' - - var base64 = __webpack_require__(14) - var ieee754 = __webpack_require__(15) - var isArray = __webpack_require__(16) - - 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.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(exports, (function() { return this; }()))) - -/***/ }), -/* 14 */ -/***/ (function(module, exports) { - - '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 - } - - revLookup['-'.charCodeAt(0)] = 62 - revLookup['_'.charCodeAt(0)] = 63 - - function placeHoldersCount (b64) { - var len = b64.length - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 - } - - function byteLength (b64) { - // base64 is 4/3 + up to two characters of the original data - return (b64.length * 3 / 4) - placeHoldersCount(b64) - } - - function toByteArray (b64) { - var i, l, tmp, placeHolders, arr - var len = b64.length - placeHolders = placeHoldersCount(b64) - - arr = new Arr((len * 3 / 4) - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len - - var L = 0 - - for (i = 0; i < l; 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[L++] = (tmp >> 16) & 0xFF - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[L++] = tmp & 0xFF - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = 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) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output.push(tripletToBase64(tmp)) - } - return output.join('') - } + var PKCS5PKEY=function(){var c=function(n,p,o){return i(CryptoJS.AES,n,p,o)};var d=function(n,p,o){return i(CryptoJS.TripleDES,n,p,o)};var i=function(q,v,s,o){var p=CryptoJS.enc.Hex.parse(v);var u=CryptoJS.enc.Hex.parse(s);var n=CryptoJS.enc.Hex.parse(o);var r={};r.key=u;r.iv=n;r.ciphertext=p;var t=q.decrypt(r,u,{iv:n});return CryptoJS.enc.Hex.stringify(t)};var j=function(n,p,o){return e(CryptoJS.AES,n,p,o)};var m=function(n,p,o){return e(CryptoJS.TripleDES,n,p,o)};var e=function(s,x,v,p){var r=CryptoJS.enc.Hex.parse(x);var w=CryptoJS.enc.Hex.parse(v);var o=CryptoJS.enc.Hex.parse(p);var n={};var u=s.encrypt(r,w,{iv:o});var q=CryptoJS.enc.Hex.parse(u.toString());var t=CryptoJS.enc.Base64.stringify(q);return t};var g={"AES-256-CBC":{proc:c,eproc:j,keylen:32,ivlen:16},"AES-192-CBC":{proc:c,eproc:j,keylen:24,ivlen:16},"AES-128-CBC":{proc:c,eproc:j,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:d,eproc:m,keylen:24,ivlen:8}};var b=function(n){return g[n]["proc"]};var k=function(n){var p=CryptoJS.lib.WordArray.random(n);var o=CryptoJS.enc.Hex.stringify(p);return o};var l=function(q){var r={};if(q.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){r.cipher=RegExp.$1;r.ivsalt=RegExp.$2}if(q.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){r.type=RegExp.$1}var p=-1;var t=0;if(q.indexOf("\r\n\r\n")!=-1){p=q.indexOf("\r\n\r\n");t=2}if(q.indexOf("\n\n")!=-1){p=q.indexOf("\n\n");t=1}var o=q.indexOf("-----END");if(p!=-1&&o!=-1){var n=q.substring(p+t*2,o-t);n=n.replace(/\s+/g,"");r.data=n}return r};var h=function(o,w,n){var t=n.substring(0,16);var r=CryptoJS.enc.Hex.parse(t);var p=CryptoJS.enc.Utf8.parse(w);var s=g[o]["keylen"]+g[o]["ivlen"];var v="";var u=null;for(;;){var q=CryptoJS.algo.MD5.create();if(u!=null){q.update(u)}q.update(p);q.update(r);u=q.finalize();v=v+CryptoJS.enc.Hex.stringify(u);if(v.length>=s*2){break}}var x={};x.keyhex=v.substr(0,g[o]["keylen"]*2);x.ivhex=v.substr(g[o]["keylen"]*2,g[o]["ivlen"]*2);return x};var a=function(n,t,p,u){var q=CryptoJS.enc.Base64.parse(n);var o=CryptoJS.enc.Hex.stringify(q);var s=g[t]["proc"];var r=s(o,p,u);return r};var f=function(n,q,o,s){var p=g[q]["eproc"];var r=p(n,o,s);return r};return{version:"1.0.5",getHexFromPEM:function(o,r){var p=o;if(p.indexOf("BEGIN "+r)==-1){throw"can't find PEM header: "+r}p=p.replace("-----BEGIN "+r+"-----","");p=p.replace("-----END "+r+"-----","");var q=p.replace(/\s+/g,"");var n=b64tohex(q);return n},getDecryptedKeyHexByKeyIV:function(o,r,q,p){var n=b(r);return n(o,q,p)},parsePKCS5PEM:function(n){return l(n)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(o,n,p){return h(o,n,p)},decryptKeyB64:function(n,p,o,q){return a(n,p,o,q)},getDecryptedKeyHex:function(w,v){var o=l(w);var r=o.type;var p=o.cipher;var n=o.ivsalt;var q=o.data;var u=h(p,v,n);var t=u.keyhex;var s=a(q,p,t,n);return s},getRSAKeyFromEncryptedPKCS5PEM:function(p,o){var q=this.getDecryptedKeyHex(p,o);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(q);return n},getEryptedPKCS5PEMFromPrvKeyHex:function(q,x,r,p){var n="";if(typeof r=="undefined"||r==null){r="AES-256-CBC"}if(typeof g[r]=="undefined"){throw"PKCS5PKEY unsupported algorithm: "+r}if(typeof p=="undefined"||p==null){var t=g[r]["ivlen"];var s=k(t);p=s.toUpperCase()}var w=h(r,x,p);var v=w.keyhex;var u=f(q,r,v,p);var o=u.replace(/(.{64})/g,"$1\r\n");var n="-----BEGIN RSA PRIVATE KEY-----\r\n";n+="Proc-Type: 4,ENCRYPTED\r\n";n+="DEK-Info: "+r+","+p+"\r\n";n+="\r\n";n+=o;n+="\r\n-----END RSA PRIVATE KEY-----\r\n";return n},getEryptedPKCS5PEMFromRSAKey:function(C,D,o,s){var A=new KJUR.asn1.DERInteger({"int":0});var v=new KJUR.asn1.DERInteger({bigint:C.n});var z=new KJUR.asn1.DERInteger({"int":C.e});var B=new KJUR.asn1.DERInteger({bigint:C.d});var t=new KJUR.asn1.DERInteger({bigint:C.p});var r=new KJUR.asn1.DERInteger({bigint:C.q});var y=new KJUR.asn1.DERInteger({bigint:C.dmp1});var u=new KJUR.asn1.DERInteger({bigint:C.dmq1});var x=new KJUR.asn1.DERInteger({bigint:C.coeff});var E=new KJUR.asn1.DERSequence({array:[A,v,z,B,t,r,y,u,x]});var w=E.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(w,D,o,s)},newEncryptedPKCS5PEM:function(n,o,r,s){if(typeof o=="undefined"||o==null){o=1024}if(typeof r=="undefined"||r==null){r="10001"}var p=new RSAKey();p.generate(o,r);var q=null;if(typeof s=="undefined"||s==null){q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n)}else{q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n,s)}return q},getRSAKeyFromPlainPKCS8PEM:function(p){if(p.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var o=this.getHexFromPEM(p,"PRIVATE KEY");var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getRSAKeyFromPlainPKCS8Hex:function(q){var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"outer DERSequence shall have 3 elements: "+p.length}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);if(o!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+o}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);var r=ASN1HEX.getHexOfTLV_AtObj(q,p[2]);var s=ASN1HEX.getHexOfV_AtObj(r,0);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(s);return n},parseHexOfEncryptedPKCS8:function(u){var q={};var p=ASN1HEX.getPosArrayOfChildren_AtObj(u,0);if(p.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+p.length}q.ciphertext=ASN1HEX.getHexOfV_AtObj(u,p[1]);var w=ASN1HEX.getPosArrayOfChildren_AtObj(u,p[0]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+w.length}if(ASN1HEX.getHexOfV_AtObj(u,w[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(u,w[1]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+n.length}var o=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[1]);if(o.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+o.length}if(ASN1HEX.getHexOfV_AtObj(u,o[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}q.encryptionSchemeAlg="TripleDES";q.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(u,o[1]);var r=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[0]);if(r.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+r.length}if(ASN1HEX.getHexOfV_AtObj(u,r[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var v=ASN1HEX.getPosArrayOfChildren_AtObj(u,r[1]);if(v.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+v.length}q.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(u,v[0]);var s=ASN1HEX.getHexOfV_AtObj(u,v[1]);try{q.pbkdf2Iter=parseInt(s,16)}catch(t){throw"malformed format pbkdf2Iter: "+s}return q},getPBKDF2KeyHexFromParam:function(s,n){var r=CryptoJS.enc.Hex.parse(s.pbkdf2Salt);var o=s.pbkdf2Iter;var q=CryptoJS.PBKDF2(n,r,{keySize:192/32,iterations:o});var p=CryptoJS.enc.Hex.stringify(q);return p},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(v,w){var p=this.getHexFromPEM(v,"ENCRYPTED PRIVATE KEY");var n=this.parseHexOfEncryptedPKCS8(p);var s=PKCS5PKEY.getPBKDF2KeyHexFromParam(n,w);var t={};t.ciphertext=CryptoJS.enc.Hex.parse(n.ciphertext);var r=CryptoJS.enc.Hex.parse(s);var q=CryptoJS.enc.Hex.parse(n.encryptionSchemeIV);var u=CryptoJS.TripleDES.decrypt(t,r,{iv:q});var o=CryptoJS.enc.Hex.stringify(u);return o},getRSAKeyFromEncryptedPKCS8PEM:function(q,p){var o=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,p);var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getKeyFromEncryptedPKCS8PEM:function(q,o){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,o);var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},parsePlainPrivatePKCS8Hex:function(q){var o={};o.algparam=null;if(q.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(q.substr(p[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,p[1]);if(n.length!=2){throw"malformed PKCS8 private key(code:004)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}o.keyidx=ASN1HEX.getStartPosOfV_AtObj(q,p[2]);return o},getKeyFromPlainPrivatePKCS8PEM:function(o){var n=this.getHexFromPEM(o,"PRIVATE KEY");var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},getKeyFromPlainPrivatePKCS8Hex:function(n){var p=this.parsePlainPrivatePKCS8Hex(n);if(p.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(n,p);var o=p.key;var q=new RSAKey();q.setPrivateEx(o.n,o.e,o.d,o.p,o.q,o.dp,o.dq,o.co);return q}else{if(p.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(n,p);if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var r=KJUR.crypto.OID.oidhex2name[p.algparam];var q=new KJUR.crypto.ECDSA({curve:r,prv:p.key});return q}else{throw"unsupported private key algorithm"}}},getRSAKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getRSAKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8Hex:function(o){var n=this.parsePublicPKCS8Hex(o);if(n.algoid=="2a864886f70d010101"){var r=this.parsePublicRawRSAKeyHex(n.key);var p=new RSAKey();p.setPublic(r.n,r.e);return p}else{if(n.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[n.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+n.algparam}var q=KJUR.crypto.OID.oidhex2name[n.algparam];var p=new KJUR.crypto.ECDSA({curve:q,pub:n.key});return p}else{throw"unsupported public key algorithm"}}},parsePublicRawRSAKeyHex:function(p){var n={};if(p.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var o=ASN1HEX.getPosArrayOfChildren_AtObj(p,0);if(o.length!=2){throw"malformed RSA key(code:002)"}if(p.substr(o[0],2)!="02"){throw"malformed RSA key(code:003)"}n.n=ASN1HEX.getHexOfV_AtObj(p,o[0]);if(p.substr(o[1],2)!="02"){throw"malformed RSA key(code:004)"}n.e=ASN1HEX.getHexOfV_AtObj(p,o[1]);return n},parsePrivateRawRSAKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed RSA private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=9){throw"malformed RSA private key(code:002)"}q.key={};q.key.n=ASN1HEX.getHexOfV_AtObj(o,n[1]);q.key.e=ASN1HEX.getHexOfV_AtObj(o,n[2]);q.key.d=ASN1HEX.getHexOfV_AtObj(o,n[3]);q.key.p=ASN1HEX.getHexOfV_AtObj(o,n[4]);q.key.q=ASN1HEX.getHexOfV_AtObj(o,n[5]);q.key.dp=ASN1HEX.getHexOfV_AtObj(o,n[6]);q.key.dq=ASN1HEX.getHexOfV_AtObj(o,n[7]);q.key.co=ASN1HEX.getHexOfV_AtObj(o,n[8])},parsePrivateRawECKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed ECC private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=3){throw"malformed ECC private key(code:002)"}if(o.substr(n[1],2)!="04"){throw"malformed ECC private key(code:003)"}q.key=ASN1HEX.getHexOfV_AtObj(o,n[1])},parsePublicPKCS8Hex:function(q){var o={};o.algparam=null;var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=2){throw"outer DERSequence shall have 2 elements: "+p.length}var r=p[0];if(q.substr(r,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(n.length!=2){throw"malformed PKCS8 public key(code:002)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}o.key=ASN1HEX.getHexOfV_AtObj(q,p[1]).substr(2);return o},getRSAKeyFromPublicPKCS8Hex:function(r){var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"outer DERSequence shall have 2 elements: "+q.length}var p=ASN1HEX.getHexOfTLV_AtObj(r,q[0]);if(p!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(r.substr(q[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var t=ASN1HEX.getStartPosOfV_AtObj(r,q[1])+2;if(r.substr(t,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var n=ASN1HEX.getPosArrayOfChildren_AtObj(r,t);if(n.length!=2){throw"inner DERSequence shall have 2 elements: "+n.length}if(r.substr(n[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(r.substr(n[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var u=ASN1HEX.getHexOfV_AtObj(r,n[0]);var s=ASN1HEX.getHexOfV_AtObj(r,n[1]);var o=new RSAKey();o.setPublic(u,s);return o},}}(); + /*! keyutil-1.0.13.js (c) 2013-2016 Kenji Urushima | kjur.github.com/jsrsasign/license + */ + var KEYUTIL=function(){var d=function(p,r,q){return k(CryptoJS.AES,p,r,q)};var e=function(p,r,q){return k(CryptoJS.TripleDES,p,r,q)};var a=function(p,r,q){return k(CryptoJS.DES,p,r,q)};var k=function(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(p,r,q){return g(CryptoJS.AES,p,r,q)};var o=function(p,r,q){return g(CryptoJS.TripleDES,p,r,q)};var f=function(p,r,q){return g(CryptoJS.DES,p,r,q)};var g=function(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(p){return i[p]["proc"]};var m=function(p){var r=CryptoJS.lib.WordArray.random(p);var q=CryptoJS.enc.Hex.stringify(r);return q};var n=function(t){var u={};if(t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){u.cipher=RegExp.$1;u.ivsalt=RegExp.$2}if(t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){u.type=RegExp.$1}var r=-1;var v=0;if(t.indexOf("\r\n\r\n")!=-1){r=t.indexOf("\r\n\r\n");v=2}if(t.indexOf("\n\n")!=-1){r=t.indexOf("\n\n");v=1}var q=t.indexOf("-----END");if(r!=-1&&q!=-1){var p=t.substring(r+v*2,q-v);p=p.replace(/\s+/g,"");u.data=p}return u};var j=function(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(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(p,s,q,u){var r=i[s]["eproc"];var t=r(p,q,u);return t};return{version:"1.0.0",getHexFromPEM:function(q,u){var r=q;if(r.indexOf("-----BEGIN ")==-1){throw"can't find PEM header: "+u}if(typeof u=="string"&&u!=""){r=r.replace("-----BEGIN "+u+"-----","");r=r.replace("-----END "+u+"-----","")}else{r=r.replace(/-----BEGIN [^-]+-----/,"");r=r.replace(/-----END [^-]+-----/,"")}var t=r.replace(/\s+/g,"");var p=b64tohex(t);return p},getDecryptedKeyHexByKeyIV:function(q,t,s,r){var p=c(t);return p(q,s,r)},parsePKCS5PEM:function(p){return n(p)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(q,p,r){return j(q,p,r)},decryptKeyB64:function(p,r,q,s){return b(p,r,q,s)},getDecryptedKeyHex:function(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},getRSAKeyFromEncryptedPKCS5PEM:function(r,q){var s=this.getDecryptedKeyHex(r,q);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(s);return p},getEncryptedPKCS5PEMFromPrvKeyHex:function(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},getEncryptedPKCS5PEMFromRSAKey:function(D,E,r,t){var B=new KJUR.asn1.DERInteger({"int":0});var w=new KJUR.asn1.DERInteger({bigint:D.n});var A=new KJUR.asn1.DERInteger({"int":D.e});var C=new KJUR.asn1.DERInteger({bigint:D.d});var u=new KJUR.asn1.DERInteger({bigint:D.p});var s=new KJUR.asn1.DERInteger({bigint:D.q});var z=new KJUR.asn1.DERInteger({bigint:D.dmp1});var v=new KJUR.asn1.DERInteger({bigint:D.dmq1});var y=new KJUR.asn1.DERInteger({bigint:D.coeff});var F=new KJUR.asn1.DERSequence({array:[B,w,A,C,u,s,z,v,y]});var x=F.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",x,E,r,t)},newEncryptedPKCS5PEM:function(p,q,t,u){if(typeof q=="undefined"||q==null){q=1024}if(typeof t=="undefined"||t==null){t="10001"}var r=new RSAKey();r.generate(q,t);var s=null;if(typeof u=="undefined"||u==null){s=this.getEncryptedPKCS5PEMFromRSAKey(r,p)}else{s=this.getEncryptedPKCS5PEMFromRSAKey(r,p,u)}return s},getRSAKeyFromPlainPKCS8PEM:function(r){if(r.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var q=this.getHexFromPEM(r,"PRIVATE KEY");var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getRSAKeyFromPlainPKCS8Hex:function(s){var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"outer DERSequence shall have 3 elements: "+r.length}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);if(q!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+q}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);var t=ASN1HEX.getHexOfTLV_AtObj(s,r[2]);var u=ASN1HEX.getHexOfV_AtObj(t,0);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(u);return p},parseHexOfEncryptedPKCS8:function(w){var s={};var r=ASN1HEX.getPosArrayOfChildren_AtObj(w,0);if(r.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+r.length}s.ciphertext=ASN1HEX.getHexOfV_AtObj(w,r[1]);var y=ASN1HEX.getPosArrayOfChildren_AtObj(w,r[0]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+y.length}if(ASN1HEX.getHexOfV_AtObj(w,y[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(w,y[1]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+p.length}var q=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[1]);if(q.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+q.length}if(ASN1HEX.getHexOfV_AtObj(w,q[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}s.encryptionSchemeAlg="TripleDES";s.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(w,q[1]);var t=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[0]);if(t.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+t.length}if(ASN1HEX.getHexOfV_AtObj(w,t[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var x=ASN1HEX.getPosArrayOfChildren_AtObj(w,t[1]);if(x.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+x.length}s.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(w,x[0]);var u=ASN1HEX.getHexOfV_AtObj(w,x[1]);try{s.pbkdf2Iter=parseInt(u,16)}catch(v){throw"malformed format pbkdf2Iter: "+u}return s},getPBKDF2KeyHexFromParam:function(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(x,y){var r=this.getHexFromPEM(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},getRSAKeyFromEncryptedPKCS8PEM:function(s,r){var q=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,r);var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getKeyFromEncryptedPKCS8PEM:function(s,q){var p=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,q);var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},parsePlainPrivatePKCS8Hex:function(s){var q={};q.algparam=null;if(s.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var r=ASN1HEX.getPosArrayOfChildren_AtObj(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=ASN1HEX.getPosArrayOfChildren_AtObj(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=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}if(s.substr(r[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}q.keyidx=ASN1HEX.getStartPosOfV_AtObj(s,r[2]);return q},getKeyFromPlainPrivatePKCS8PEM:function(q){var p=this.getHexFromPEM(q,"PRIVATE KEY");var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},getKeyFromPlainPrivatePKCS8Hex:function(p){var w=this.parsePlainPrivatePKCS8Hex(p);if(w.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(p,w);var u=w.key;var z=new RSAKey();z.setPrivateEx(u.n,u.e,u.d,u.p,u.q,u.dp,u.dq,u.co);return z}else{if(w.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(p,w);if(KJUR.crypto.OID.oidhex2name[w.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+w.algparam}var v=KJUR.crypto.OID.oidhex2name[w.algparam];var z=new KJUR.crypto.ECDSA({curve:v});z.setPublicKeyHex(w.pubkey);z.setPrivateKeyHex(w.key);z.isPublic=false;return z}else{if(w.algoid=="2a8648ce380401"){var t=ASN1HEX.getVbyList(p,0,[1,1,0],"02");var s=ASN1HEX.getVbyList(p,0,[1,1,1],"02");var y=ASN1HEX.getVbyList(p,0,[1,1,2],"02");var B=ASN1HEX.getVbyList(p,0,[2,0],"02");var r=new BigInteger(t,16);var q=new BigInteger(s,16);var x=new BigInteger(y,16);var A=new BigInteger(B,16);var z=new KJUR.crypto.DSA();z.setPrivate(r,q,x,null,A);return z}else{throw"unsupported private key algorithm"}}}},getRSAKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getRSAKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8Hex:function(q){var p=this.parsePublicPKCS8Hex(q);if(p.algoid=="2a864886f70d010101"){var u=this.parsePublicRawRSAKeyHex(p.key);var r=new RSAKey();r.setPublic(u.n,u.e);return r}else{if(p.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var s=KJUR.crypto.OID.oidhex2name[p.algparam];var r=new KJUR.crypto.ECDSA({curve:s,pub:p.key});return r}else{if(p.algoid=="2a8648ce380401"){var t=p.algparam;var v=ASN1HEX.getHexOfV_AtObj(p.key,0);var r=new KJUR.crypto.DSA();r.setPublic(new BigInteger(t.p,16),new BigInteger(t.q,16),new BigInteger(t.g,16),new BigInteger(v,16));return r}else{throw"unsupported public key algorithm"}}}},parsePublicRawRSAKeyHex:function(r){var p={};if(r.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var q=ASN1HEX.getPosArrayOfChildren_AtObj(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=ASN1HEX.getHexOfV_AtObj(r,q[0]);if(r.substr(q[1],2)!="02"){throw"malformed RSA key(code:004)"}p.e=ASN1HEX.getHexOfV_AtObj(r,q[1]);return p},parsePrivateRawRSAKeyHexAtObj:function(q,s){var r=s.keyidx;if(q.substr(r,2)!="30"){throw"malformed RSA private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(p.length!=9){throw"malformed RSA private key(code:002)"}s.key={};s.key.n=ASN1HEX.getHexOfV_AtObj(q,p[1]);s.key.e=ASN1HEX.getHexOfV_AtObj(q,p[2]);s.key.d=ASN1HEX.getHexOfV_AtObj(q,p[3]);s.key.p=ASN1HEX.getHexOfV_AtObj(q,p[4]);s.key.q=ASN1HEX.getHexOfV_AtObj(q,p[5]);s.key.dp=ASN1HEX.getHexOfV_AtObj(q,p[6]);s.key.dq=ASN1HEX.getHexOfV_AtObj(q,p[7]);s.key.co=ASN1HEX.getHexOfV_AtObj(q,p[8])},parsePrivateRawECKeyHexAtObj:function(p,t){var q=t.keyidx;var r=ASN1HEX.getVbyList(p,q,[1],"04");var s=ASN1HEX.getVbyList(p,q,[2,0],"03").substr(2);t.key=r;t.pubkey=s},parsePublicPKCS8Hex:function(s){var q={};q.algparam=null;var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=2){throw"outer DERSequence shall have 2 elements: "+r.length}var t=r[0];if(s.substr(t,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,t);if(p.length!=2){throw"malformed PKCS8 public key(code:002)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}else{if(s.substr(p[1],2)=="30"){q.algparam={};q.algparam.p=ASN1HEX.getVbyList(s,p[1],[0],"02");q.algparam.q=ASN1HEX.getVbyList(s,p[1],[1],"02");q.algparam.g=ASN1HEX.getVbyList(s,p[1],[2],"02")}}if(s.substr(r[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}q.key=ASN1HEX.getHexOfV_AtObj(s,r[1]).substr(2);return q},getRSAKeyFromPublicPKCS8Hex:function(t){var s=ASN1HEX.getPosArrayOfChildren_AtObj(t,0);if(s.length!=2){throw"outer DERSequence shall have 2 elements: "+s.length}var r=ASN1HEX.getHexOfTLV_AtObj(t,s[0]);if(r!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(t.substr(s[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var v=ASN1HEX.getStartPosOfV_AtObj(t,s[1])+2;if(t.substr(v,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var p=ASN1HEX.getPosArrayOfChildren_AtObj(t,v);if(p.length!=2){throw"inner DERSequence shall have 2 elements: "+p.length}if(t.substr(p[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(t.substr(p[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var w=ASN1HEX.getHexOfV_AtObj(t,p[0]);var u=ASN1HEX.getHexOfV_AtObj(t,p[1]);var q=new RSAKey();q.setPublic(w,u);return q},}}();KEYUTIL.getKey=function(f,e,h){if(typeof RSAKey!="undefined"&&f instanceof RSAKey){return f}if(typeof KJUR.crypto.ECDSA!="undefined"&&f instanceof KJUR.crypto.ECDSA){return f}if(typeof KJUR.crypto.DSA!="undefined"&&f instanceof KJUR.crypto.DSA){return f}if(f.curve!==undefined&&f.xy!==undefined&&f.d===undefined){return new KJUR.crypto.ECDSA({pub:f.xy,curve:f.curve})}if(f.curve!==undefined&&f.d!==undefined){return new KJUR.crypto.ECDSA({prv:f.d,curve:f.curve})}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(f.n,f.e);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.co!==undefined&&f.qi===undefined){var w=new RSAKey();w.setPrivateEx(f.n,f.e,f.d,f.p,f.q,f.dp,f.dq,f.co);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p===undefined){var w=new RSAKey();w.setPrivate(f.n,f.e,f.d);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x===undefined){var w=new KJUR.crypto.DSA();w.setPublic(f.p,f.q,f.g,f.y);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x!==undefined){var w=new KJUR.crypto.DSA();w.setPrivate(f.p,f.q,f.g,f.y,f.x);return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(b64utohex(f.n),b64utohex(f.e));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.qi!==undefined){var w=new RSAKey();w.setPrivateEx(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d),b64utohex(f.p),b64utohex(f.q),b64utohex(f.dp),b64utohex(f.dq),b64utohex(f.qi));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined){var w=new RSAKey();w.setPrivate(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d));return w}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d===undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var r=("0000000000"+b64utohex(f.x)).slice(-l);var n=("0000000000"+b64utohex(f.y)).slice(-l);var m="04"+r+n;d.setPublicKeyHex(m);return d}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d!==undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var r=("0000000000"+b64utohex(f.x)).slice(-l);var n=("0000000000"+b64utohex(f.y)).slice(-l);var m="04"+r+n;var a=("0000000000"+b64utohex(f.d)).slice(-l);d.setPublicKeyHex(m);d.setPrivateKeyHex(a);return d}if(f.indexOf("-END CERTIFICATE-",0)!=-1||f.indexOf("-END X509 CERTIFICATE-",0)!=-1||f.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1){return X509.getPublicKeyFromCertPEM(f)}if(h==="pkcs8pub"){return KEYUTIL.getKeyFromPublicPKCS8Hex(f)}if(f.indexOf("-END PUBLIC KEY-")!=-1){return KEYUTIL.getKeyFromPublicPKCS8PEM(f)}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var i=KEYUTIL.getHexFromPEM(f,"RSA PRIVATE KEY");return KEYUTIL.getKey(i,null,"pkcs5prv")}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var u=this.getHexFromPEM(f,"DSA PRIVATE KEY");var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(f)}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){return KEYUTIL.getRSAKeyFromEncryptedPKCS5PEM(f,e)}if(f.indexOf("-END EC PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var w=ASN1HEX.getVbyList(u,0,[1],"04");var c=ASN1HEX.getVbyList(u,0,[2,0],"06");var o=ASN1HEX.getVbyList(u,0,[3,0],"03").substr(2);var b="";if(KJUR.crypto.OID.oidhex2name[c]!==undefined){b=KJUR.crypto.OID.oidhex2name[c]}else{throw"undefined OID(hex) in KJUR.crypto.OID: "+c}var d=new KJUR.crypto.ECDSA({name:b});d.setPublicKeyHex(o);d.setPrivateKeyHex(w);d.isPublic=false;return d}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromEncryptedPKCS8PEM(f,e)}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(a,r,o,g,j){var v=KJUR.asn1;var u=KJUR.crypto;function p(s){var w=KJUR.asn1.ASN1Util.newObject({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 w}function q(w){var s=KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:w.prvKeyHex}},{tag:["a0",true,{oid:{name:w.curveName}}]},{tag:["a1",true,{bitstr:{hex:"00"+w.pubKeyHex}}]}]});return s}function n(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.g}},{"int":{bigint:s.y}},{"int":{bigint:s.x}}]});return w}if(((typeof RSAKey!="undefined"&&a instanceof RSAKey)||(typeof u.DSA!="undefined"&&a instanceof u.DSA)||(typeof u.ECDSA!="undefined"&&a instanceof u.ECDSA))&&a.isPublic==true&&(r===undefined||r=="PKCS8PUB")){var t=new KJUR.asn1.x509.SubjectPublicKeyInfo(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"PUBLIC KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o===undefined||o==null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"RSA PRIVATE KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o===undefined||o==null)&&a.isPrivate==true){var f=new KJUR.asn1.DERObjectIdentifier({name:a.curveName});var l=f.getEncodedHex();var e=q(a);var k=e.getEncodedHex();var i="";i+=v.ASN1Util.getPEMStringFromHex(l,"EC PARAMETERS");i+=v.ASN1Util.getPEMStringFromHex(k,"EC PRIVATE KEY");return i}if(r=="PKCS1PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o===undefined||o==null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"DSA PRIVATE KEY")}if(r=="PKCS5PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=q(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",m,o,g)}var h=function(w,s){var y=b(w,s);var x=new KJUR.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:y.pbkdf2Salt}},{"int":y.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:y.encryptionSchemeIV}}]}]}]},{octstr:{hex:y.ciphertext}}]});return x.getEncodedHex()};var b=function(D,E){var x=100;var C=CryptoJS.lib.WordArray.random(8);var B="DES-EDE3-CBC";var s=CryptoJS.lib.WordArray.random(8);var y=CryptoJS.PBKDF2(E,C,{keySize:192/32,iterations:x});var z=CryptoJS.enc.Hex.parse(D);var A=CryptoJS.TripleDES.encrypt(z,y,{iv:s})+"";var w={};w.ciphertext=A;w.pbkdf2Salt=CryptoJS.enc.Hex.stringify(C);w.pbkdf2Iter=x;w.encryptionSchemeAlg=B;w.encryptionSchemeIV=CryptoJS.enc.Hex.stringify(s);return w};if(r=="PKCS8PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&a.isPrivate==true){var d=p(a);var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"rsaEncryption"}},{"null":true}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&a.isPrivate==true){var d=new KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:a.prvKeyHex}},{tag:["a1",true,{bitstr:{hex:"00"+a.pubKeyHex}}]}]});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:a.curveName}}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&a.isPrivate==true){var d=new KJUR.asn1.DERInteger({bigint:a.x});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"dsa"}},{seq:[{"int":{bigint:a.p}},{"int":{bigint:a.q}},{"int":{bigint:a.g}}]}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}throw"unsupported object nor format"};KEYUTIL.getKeyFromCSRPEM=function(b){var a=KEYUTIL.getHexFromPEM(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(c){var b={};var e=c;if(e.substr(0,2)!="30"){throw"malformed CSR(code:001)"}var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,0);if(d.length<1){throw"malformed CSR(code:002)"}if(e.substr(d[0],2)!="30"){throw"malformed CSR(code:003)"}var a=ASN1HEX.getPosArrayOfChildren_AtObj(e,d[0]);if(a.length<3){throw"malformed CSR(code:004)"}b.p8pubkeyhex=ASN1HEX.getHexOfTLV_AtObj(e,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"}; + /*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license + */ + function _rsapem_pemToBase64(b){var a=b;a=a.replace("-----BEGIN RSA PRIVATE KEY-----","");a=a.replace("-----END RSA PRIVATE KEY-----","");a=a.replace(/[ \n]+/g,"");return a}function _rsapem_getPosArrayOfChildrenFromHex(d){var j=new Array();var k=ASN1HEX.getStartPosOfV_AtObj(d,0);var f=ASN1HEX.getPosOfNextSibling_AtObj(d,k);var h=ASN1HEX.getPosOfNextSibling_AtObj(d,f);var b=ASN1HEX.getPosOfNextSibling_AtObj(d,h);var l=ASN1HEX.getPosOfNextSibling_AtObj(d,b);var e=ASN1HEX.getPosOfNextSibling_AtObj(d,l);var g=ASN1HEX.getPosOfNextSibling_AtObj(d,e);var c=ASN1HEX.getPosOfNextSibling_AtObj(d,g);var i=ASN1HEX.getPosOfNextSibling_AtObj(d,c);j.push(k,f,h,b,l,e,g,c,i);return j}function _rsapem_getHexValueArrayOfChildrenFromHex(i){var o=_rsapem_getPosArrayOfChildrenFromHex(i);var r=ASN1HEX.getHexOfV_AtObj(i,o[0]);var f=ASN1HEX.getHexOfV_AtObj(i,o[1]);var j=ASN1HEX.getHexOfV_AtObj(i,o[2]);var k=ASN1HEX.getHexOfV_AtObj(i,o[3]);var c=ASN1HEX.getHexOfV_AtObj(i,o[4]);var b=ASN1HEX.getHexOfV_AtObj(i,o[5]);var h=ASN1HEX.getHexOfV_AtObj(i,o[6]);var g=ASN1HEX.getHexOfV_AtObj(i,o[7]);var l=ASN1HEX.getHexOfV_AtObj(i,o[8]);var m=new Array();m.push(r,f,j,k,c,b,h,g,l);return m}function _rsapem_readPrivateKeyFromASN1HexString(c){var b=_rsapem_getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}function _rsapem_readPrivateKeyFromPEMString(e){var c=_rsapem_pemToBase64(e);var d=b64tohex(c);var b=_rsapem_getHexValueArrayOfChildrenFromHex(d);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}RSAKey.prototype.readPrivateKeyFromPEMString=_rsapem_readPrivateKeyFromPEMString;RSAKey.prototype.readPrivateKeyFromASN1HexString=_rsapem_readPrivateKeyFromASN1HexString; + /*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license + */ + var _RE_HEXDECONLY=new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]","gi");function _rsasign_getHexPaddedDigestInfoForString(d,e,a){var b=function(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>24,(d&16711680)>>16,(d&65280)>>8,d&255]))));d+=1}return b}function _rsasign_signStringPSS(e,a,d){var c=function(f){return KJUR.crypto.Util.hashHex(f,a)};var b=c(rstrtohex(e));if(d===undefined){d=-1}return this.signWithMessageHashPSS(b,a,d)}function _rsasign_signWithMessageHashPSS(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(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>(8*c-m))&255;q[0]&=~p;for(d=0;dthis.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(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(h==c)}function _rsasign_verifyWithMessageHash(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)}function _rsasign_verifyStringPSS(c,b,a,f){var e=function(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)}function _rsasign_verifyWithMessageHashPSS(f,s,l,c){var k=new BigInteger(s,16);if(k.bitLength()>this.n.bitLength()){return false}var r=function(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>(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;q0){var c=":"+j.join(":")+":";if(c.indexOf(":"+h+":")==-1){throw"algorithm '"+h+"' not accepted in the list"}}if(h!="none"&&t===null){throw"key shall be specified to verify."}if(typeof t=="string"&&t.indexOf("-----BEGIN ")!=-1){t=KEYUTIL.getKey(t)}if(s=="RS"||s=="PS"){if(!(t instanceof RSAKey)){throw"key shall be a RSAKey obj for RS* and PS* algs"}}if(s=="ES"){if(!(t instanceof KJUR.crypto.ECDSA)){throw"key shall be a ECDSA obj for ES* algs"}}if(h=="none"){}var n=null;if(m.jwsalg2sigalg[i.alg]===undefined){throw"unsupported alg name: "+h}else{n=m.jwsalg2sigalg[h]}if(n=="none"){throw"not supported"}else{if(n.substr(0,4)=="Hmac"){var k=null;if(t===undefined){throw"hexadecimal key shall be specified for HMAC"}var g=new KJUR.crypto.Mac({alg:n,pass:t});g.updateString(b);k=g.doFinal();return r==k}else{if(n.indexOf("withECDSA")!=-1){var f=null;try{f=KJUR.crypto.ECDSA.concatSigToASN1Sig(r)}catch(o){return false}var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(f)}else{var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(r)}}}};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(d,j,l){var h=KJUR.jws.JWS;var i=d.split(".");var c=i[0];var g=i[1];var m=c+"."+g;var k=b64utohex(i[2]);var f=h.readSafeJSONString(b64utoutf8(c));var e=h.readSafeJSONString(b64utoutf8(g));if(f.alg===undefined){return false}if(l.alg===undefined){throw"acceptField.alg shall be specified"}if(!h.inArray(f.alg,l.alg)){return false}if(e.iss!==undefined&&typeof l.iss==="object"){if(!h.inArray(e.iss,l.iss)){return false}}if(e.sub!==undefined&&typeof l.sub==="object"){if(!h.inArray(e.sub,l.sub)){return false}}if(e.aud!==undefined&&typeof l.aud==="object"){if(typeof e.aud=="string"){if(!h.inArray(e.aud,l.aud)){return false}}else{if(typeof e.aud=="object"){if(!h.includedArray(e.aud,l.aud)){return false}}}}var b=KJUR.jws.IntDate.getNow();if(l.verifyAt!==undefined&&typeof l.verifyAt==="number"){b=l.verifyAt}if(l.gracePeriod===undefined||typeof l.gracePeriod!=="number"){l.gracePeriod=0}if(e.exp!==undefined&&typeof e.exp=="number"){if(e.exp+l.gracePeriodj){this.aHeader.pop()}if(this.aSignature.length>j){this.aSignature.pop()}throw"addSignature failed: "+g}};this.addSignatureByHeaderKey=function(f,c){var e=b64utoutf8(this.sPayload);var d=new KJUR.jws.JWS();var g=d.generateJWSByP1PrvKey(f,e,c);this.aHeader.push(d.parsedJWS.headB64U);this.aSignature.push(d.parsedJWS.sigvalB64U)};this.addSignatureByHeaderPayloadKey=function(f,e,c){var d=new KJUR.jws.JWS();var g=d.generateJWSByP1PrvKey(f,e,c);this.aHeader.push(d.parsedJWS.headB64U);this.sPayload=d.parsedJWS.payloadB64U;this.aSignature.push(d.parsedJWS.sigvalB64U)};this.verifyAll=function(f){if(this.aHeader.length!==f.length||this.aSignature.length!==f.length){return false}for(var e=0;e0){this.aHeader=e.headers}else{throw"malformed header"}if(typeof e.payload==="string"){this.sPayload=e.payload}else{throw"malformed signatures"}if(e.signatures.length>0){this.signatures=e.signatures}else{throw"malformed signatures"}}catch(c){throw"malformed JWS-JS JSON object: "+c}}};this.getJSON=function(){return{headers:this.aHeader,payload:this.sPayload,signatures:this.aSignature}};this.isEmpty=function(){if(this.aHeader.length==0){return 1}return 0}}; + /*! nodeutil-1.0.0 (c) 2015 Kenji Urushima | kjur.github.com/jsrsasign/license + */ + function readFileUTF8(a){return __webpack_require__(13).readFileSync(a,"utf8")}function readFileHexByBin(c){var b=__webpack_require__(12);var a=__webpack_require__(13);return b.rstrtohex(a.readFileSync(c,"binary"))}function readFile(b){var a=__webpack_require__(13);return a.readFileSync(b,"binary")}function saveFile(c,b){var a=__webpack_require__(13);a.writeFileSync(c,b,"binary")}function saveFileBinByHex(e,b){var a=__webpack_require__(13);var c=__webpack_require__(12);var d=c.hextorstr(b);a.writeFileSync(e,d,"binary")}; + exports.SecureRandom = SecureRandom; + exports.rng_seed_time = rng_seed_time; - function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var output = '' - 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] - output += lookup[tmp >> 2] - output += lookup[(tmp << 4) & 0x3F] - output += '==' - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) - output += lookup[tmp >> 10] - output += lookup[(tmp >> 4) & 0x3F] - output += lookup[(tmp << 2) & 0x3F] - output += '=' - } - - parts.push(output) - - return parts.join('') - } - - -/***/ }), -/* 15 */ -/***/ (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.BigInteger = BigInteger; + exports.RSAKey = RSAKey; + exports.ECDSA = KJUR.crypto.ECDSA; + exports.DSA = KJUR.crypto.DSA; + exports.Signature = KJUR.crypto.Signature; + exports.MessageDigest = KJUR.crypto.MessageDigest; + exports.Mac = KJUR.crypto.Mac; + exports.KEYUTIL = KEYUTIL; + exports.ASN1HEX = ASN1HEX; + exports.X509 = X509; + exports.CryptoJS = CryptoJS; - 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 - } + // ext/base64.js + exports.b64tohex = b64tohex; + exports.b64toBA = b64toBA; - 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 - } - } + // 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.b64tohex = b64tohex; + 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.newline_toUnix = newline_toUnix; + exports.newline_toDos = newline_toDos; + exports.intarystrtohex = intarystrtohex; + exports.strdiffidx = strdiffidx; - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + exports.KJUR = KJUR; + exports.crypto = KJUR.crypto; + exports.asn1 = KJUR.asn1; + exports.jws = KJUR.jws; + exports.lang = KJUR.lang; - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + exports.readFileUTF8 = readFileUTF8; + exports.readFileHexByBin = readFileHexByBin; + exports.readFile = readFile; + exports.saveFile = saveFile; + exports.saveFileBinByHex = saveFileBinByHex; - buffer[offset + i - d] |= s * 128 - } - - -/***/ }), -/* 16 */ -/***/ (function(module, exports) { - - var toString = {}.toString; - module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; - }; - + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13).Buffer)) /***/ }), -/* 17 */ +/* 13 */ /***/ (function(module, exports) { /***/ }), -/* 18 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -4416,16 +2355,17 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.SigninRequest = undefined; var _Log = __webpack_require__(1); var _Log2 = _interopRequireDefault(_Log); - var _UrlUtility = __webpack_require__(19); + var _UrlUtility = __webpack_require__(15); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); - var _SigninState = __webpack_require__(20); + var _SigninState = __webpack_require__(16); var _SigninState2 = _interopRequireDefault(_SigninState); @@ -4434,7 +2374,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var SigninRequest = exports.SigninRequest = function () { function SigninRequest(_ref) { var url = _ref.url, client_id = _ref.client_id, @@ -4525,12 +2465,9 @@ return /******/ (function(modules) { // webpackBootstrap return SigninRequest; }(); - - exports.default = SigninRequest; - module.exports = exports['default']; /***/ }), -/* 19 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -4538,6 +2475,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.UrlUtility = undefined; var _Log = __webpack_require__(1); @@ -4552,7 +2490,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var UrlUtility = exports.UrlUtility = function () { function UrlUtility() { _classCallCheck(this, UrlUtility); } @@ -4612,12 +2550,9 @@ return /******/ (function(modules) { // webpackBootstrap return UrlUtility; }(); - - exports.default = UrlUtility; - module.exports = exports['default']; /***/ }), -/* 20 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -4625,6 +2560,7 @@ return /******/ (function(modules) { // webpackBootstrap 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; }; }(); @@ -4632,11 +2568,11 @@ return /******/ (function(modules) { // webpackBootstrap var _Log2 = _interopRequireDefault(_Log); - var _State2 = __webpack_require__(21); + var _State2 = __webpack_require__(17); var _State3 = _interopRequireDefault(_State2); - var _random = __webpack_require__(22); + var _random = __webpack_require__(18); var _random2 = _interopRequireDefault(_random); @@ -4649,7 +2585,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function (_State) { + var SigninState = exports.SigninState = function (_State) { _inherits(SigninState, _State); function SigninState() { @@ -4707,15 +2643,12 @@ return /******/ (function(modules) { // webpackBootstrap return this._client_id; } }]); - + return SigninState; }(_State3.default); - - exports.default = SigninState; - module.exports = exports['default']; /***/ }), -/* 21 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -4723,6 +2656,7 @@ return /******/ (function(modules) { // webpackBootstrap 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. @@ -4731,7 +2665,7 @@ return /******/ (function(modules) { // webpackBootstrap var _Log2 = _interopRequireDefault(_Log); - var _random = __webpack_require__(22); + var _random = __webpack_require__(18); var _random2 = _interopRequireDefault(_random); @@ -4739,7 +2673,7 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var State = function () { + var State = exports.State = function () { function State() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, id = _ref.id, @@ -4781,62 +2715,44 @@ return /******/ (function(modules) { // webpackBootstrap _Log2.default.debug("got keys", keys); var promises = []; - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - var _loop = function _loop() { - var key = _step.value; - p = storage.get(key).then(function (item) { - var remove = false; - - if (item) { - try { - var state = State.fromStorageString(item); - - _Log2.default.debug("got item from key: ", key, state.created); - - if (state.created <= cutoff) { - remove = true; - } - } catch (e) { - _Log2.default.error("Error parsing state for key", key, e.message); + + 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); + + _Log2.default.debug("got item from key: ", key, state.created); + + if (state.created <= cutoff) { remove = true; } - } else { - _Log2.default.debug("no item in storage for key: ", key); + } catch (e) { + _Log2.default.error("Error parsing state for key", key, e.message); remove = true; } + } else { + _Log2.default.debug("no item in storage for key: ", key); + remove = true; + } - if (remove) { - _Log2.default.debug("removed item for key: ", key); - return storage.remove(key); - } - }); + if (remove) { + _Log2.default.debug("removed item for key: ", key); + return storage.remove(key); + } + }); - promises.push(p); - }; + promises.push(p); + }; - for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var p; + for (var i = 0; i < keys.length; i++) { + var p; - _loop(); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } + _loop(i); } _Log2.default.debug("waiting on promise count:", promises.length); @@ -4860,15 +2776,12 @@ return /******/ (function(modules) { // webpackBootstrap return this._created; } }]); - + return State; }(); - - exports.default = State; - module.exports = exports['default']; /***/ }), -/* 22 */ +/* 18 */ /***/ (function(module, exports) { 'use strict'; @@ -4925,7 +2838,7 @@ return /******/ (function(modules) { // webpackBootstrap module.exports = exports['default']; /***/ }), -/* 23 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4933,11 +2846,12 @@ return /******/ (function(modules) { // webpackBootstrap 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__(19); + var _UrlUtility = __webpack_require__(15); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); @@ -4947,7 +2861,7 @@ return /******/ (function(modules) { // webpackBootstrap var OidcScope = "openid"; - var SigninResponse = function () { + var SigninResponse = exports.SigninResponse = function () { function SigninResponse(url) { _classCallCheck(this, SigninResponse); @@ -5001,15 +2915,12 @@ return /******/ (function(modules) { // webpackBootstrap return this.scopes.indexOf(OidcScope) >= 0 || !!this.id_token; } }]); - + return SigninResponse; }(); - - exports.default = SigninResponse; - module.exports = exports['default']; /***/ }), -/* 24 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -5017,16 +2928,17 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.SignoutRequest = undefined; var _Log = __webpack_require__(1); var _Log2 = _interopRequireDefault(_Log); - var _UrlUtility = __webpack_require__(19); + var _UrlUtility = __webpack_require__(15); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); - var _State = __webpack_require__(21); + var _State = __webpack_require__(17); var _State2 = _interopRequireDefault(_State); @@ -5035,7 +2947,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function SignoutRequest(_ref) { + 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, @@ -5064,21 +2976,19 @@ return /******/ (function(modules) { // webpackBootstrap this.url = url; }; - - exports.default = SignoutRequest; - module.exports = exports['default']; /***/ }), -/* 25 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); + exports.SignoutResponse = undefined; - var _UrlUtility = __webpack_require__(19); + var _UrlUtility = __webpack_require__(15); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); @@ -5087,23 +2997,20 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function SignoutResponse(url) { - _classCallCheck(this, SignoutResponse); + var SignoutResponse = exports.SignoutResponse = function SignoutResponse(url) { + _classCallCheck(this, SignoutResponse); - var values = _UrlUtility2.default.parseUrlFragment(url, "?"); + var values = _UrlUtility2.default.parseUrlFragment(url, "?"); - this.error = values.error; - this.error_description = values.error_description; - this.error_uri = values.error_uri; + this.error = values.error; + this.error_description = values.error_description; + this.error_uri = values.error_uri; - this.state = values.state; + this.state = values.state; }; - - exports.default = SignoutResponse; - module.exports = exports['default']; /***/ }), -/* 26 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5111,6 +3018,7 @@ return /******/ (function(modules) { // webpackBootstrap 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. @@ -5123,7 +3031,7 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var InMemoryWebStorage = function () { + var InMemoryWebStorage = exports.InMemoryWebStorage = function () { function InMemoryWebStorage() { _classCallCheck(this, InMemoryWebStorage); @@ -5155,15 +3063,12 @@ return /******/ (function(modules) { // webpackBootstrap return Object.getOwnPropertyNames(this._data).length; } }]); - + return InMemoryWebStorage; }(); - - exports.default = InMemoryWebStorage; - module.exports = exports['default']; /***/ }), -/* 27 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -5171,6 +3076,7 @@ return /******/ (function(modules) { // webpackBootstrap 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; }; }(); @@ -5182,27 +3088,27 @@ return /******/ (function(modules) { // webpackBootstrap var _OidcClient3 = _interopRequireDefault(_OidcClient2); - var _UserManagerSettings = __webpack_require__(28); + var _UserManagerSettings = __webpack_require__(24); var _UserManagerSettings2 = _interopRequireDefault(_UserManagerSettings); - var _User = __webpack_require__(34); + var _User = __webpack_require__(30); var _User2 = _interopRequireDefault(_User); - var _UserManagerEvents = __webpack_require__(35); + var _UserManagerEvents = __webpack_require__(31); var _UserManagerEvents2 = _interopRequireDefault(_UserManagerEvents); - var _SilentRenewService = __webpack_require__(39); + var _SilentRenewService = __webpack_require__(35); var _SilentRenewService2 = _interopRequireDefault(_SilentRenewService); - var _SessionMonitor = __webpack_require__(40); + var _SessionMonitor = __webpack_require__(36); var _SessionMonitor2 = _interopRequireDefault(_SessionMonitor); - var _TokenRevocationClient = __webpack_require__(42); + var _TokenRevocationClient = __webpack_require__(38); var _TokenRevocationClient2 = _interopRequireDefault(_TokenRevocationClient); @@ -5215,7 +3121,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function (_OidcClient) { + var UserManager = exports.UserManager = function (_OidcClient) { _inherits(UserManager, _OidcClient); function UserManager() { @@ -5538,7 +3444,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 + // 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 @@ -5743,15 +3649,12 @@ return /******/ (function(modules) { // webpackBootstrap return 'user:' + this.settings.authority + ':' + this.settings.client_id; } }]); - + return UserManager; }(_OidcClient3.default); - - exports.default = UserManager; - module.exports = exports['default']; /***/ }), -/* 28 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -5759,6 +3662,7 @@ return /******/ (function(modules) { // webpackBootstrap 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; }; }(); @@ -5770,15 +3674,15 @@ return /******/ (function(modules) { // webpackBootstrap var _OidcClientSettings3 = _interopRequireDefault(_OidcClientSettings2); - var _RedirectNavigator = __webpack_require__(29); + var _RedirectNavigator = __webpack_require__(25); var _RedirectNavigator2 = _interopRequireDefault(_RedirectNavigator); - var _PopupNavigator = __webpack_require__(30); + var _PopupNavigator = __webpack_require__(26); var _PopupNavigator2 = _interopRequireDefault(_PopupNavigator); - var _IFrameNavigator = __webpack_require__(32); + var _IFrameNavigator = __webpack_require__(28); var _IFrameNavigator2 = _interopRequireDefault(_IFrameNavigator); @@ -5802,7 +3706,7 @@ return /******/ (function(modules) { // webpackBootstrap var DefaultAccessTokenExpiringNotificationTime = 60; var DefaultCheckSessionInterval = 2000; - var UserManagerSettings = function (_OidcClientSettings) { + var UserManagerSettings = exports.UserManagerSettings = function (_OidcClientSettings) { _inherits(UserManagerSettings, _OidcClientSettings); function UserManagerSettings() { @@ -5942,15 +3846,12 @@ return /******/ (function(modules) { // webpackBootstrap return this._userStore; } }]); - + return UserManagerSettings; }(_OidcClientSettings3.default); - - exports.default = UserManagerSettings; - module.exports = exports['default']; /***/ }), -/* 29 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5958,6 +3859,7 @@ return /******/ (function(modules) { // webpackBootstrap 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. @@ -5970,7 +3872,7 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var RedirectNavigator = function () { + var RedirectNavigator = exports.RedirectNavigator = function () { function RedirectNavigator() { _classCallCheck(this, RedirectNavigator); } @@ -5999,15 +3901,12 @@ return /******/ (function(modules) { // webpackBootstrap return window.location.href; } }]); - + return RedirectNavigator; }(); - - exports.default = RedirectNavigator; - module.exports = exports['default']; /***/ }), -/* 30 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -6015,12 +3914,13 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.PopupNavigator = undefined; var _Log = __webpack_require__(1); var _Log2 = _interopRequireDefault(_Log); - var _PopupWindow = __webpack_require__(31); + var _PopupWindow = __webpack_require__(27); var _PopupWindow2 = _interopRequireDefault(_PopupWindow); @@ -6029,7 +3929,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var PopupNavigator = exports.PopupNavigator = function () { function PopupNavigator() { _classCallCheck(this, PopupNavigator); } @@ -6052,12 +3952,9 @@ return /******/ (function(modules) { // webpackBootstrap return PopupNavigator; }(); - - exports.default = PopupNavigator; - module.exports = exports['default']; /***/ }), -/* 31 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -6065,6 +3962,7 @@ return /******/ (function(modules) { // webpackBootstrap 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. @@ -6073,7 +3971,7 @@ return /******/ (function(modules) { // webpackBootstrap var _Log2 = _interopRequireDefault(_Log); - var _UrlUtility = __webpack_require__(19); + var _UrlUtility = __webpack_require__(15); var _UrlUtility2 = _interopRequireDefault(_UrlUtility); @@ -6087,7 +3985,7 @@ return /******/ (function(modules) { // webpackBootstrap var DefaultPopupTarget = "_blank"; - var PopupWindow = function () { + var PopupWindow = exports.PopupWindow = function () { function PopupWindow(params) { var _this = this; @@ -6215,15 +4113,12 @@ return /******/ (function(modules) { // webpackBootstrap return this._promise; } }]); - + return PopupWindow; }(); - - exports.default = PopupWindow; - module.exports = exports['default']; /***/ }), -/* 32 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -6231,12 +4126,13 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.IFrameNavigator = undefined; var _Log = __webpack_require__(1); var _Log2 = _interopRequireDefault(_Log); - var _IFrameWindow = __webpack_require__(33); + var _IFrameWindow = __webpack_require__(29); var _IFrameWindow2 = _interopRequireDefault(_IFrameWindow); @@ -6245,7 +4141,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var IFrameNavigator = exports.IFrameNavigator = function () { function IFrameNavigator() { _classCallCheck(this, IFrameNavigator); } @@ -6268,12 +4164,9 @@ return /******/ (function(modules) { // webpackBootstrap return IFrameNavigator; }(); - - exports.default = IFrameNavigator; - module.exports = exports['default']; /***/ }), -/* 33 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6281,6 +4174,7 @@ return /******/ (function(modules) { // webpackBootstrap 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. @@ -6295,7 +4189,7 @@ return /******/ (function(modules) { // webpackBootstrap var DefaultTimeout = 10000; - var IFrameWindow = function () { + var IFrameWindow = exports.IFrameWindow = function () { function IFrameWindow(params) { var _this = this; @@ -6411,15 +4305,12 @@ return /******/ (function(modules) { // webpackBootstrap return location.protocol + "//" + location.host; } }]); - + return IFrameWindow; }(); - - exports.default = IFrameWindow; - module.exports = exports['default']; /***/ }), -/* 34 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6427,6 +4318,7 @@ return /******/ (function(modules) { // webpackBootstrap 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. @@ -6439,7 +4331,7 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var User = function () { + var User = exports.User = function () { function User(_ref) { var id_token = _ref.id_token, session_state = _ref.session_state, @@ -6504,15 +4396,12 @@ return /******/ (function(modules) { // webpackBootstrap return (this.scope || "").split(" "); } }]); - + return User; }(); - - exports.default = User; - module.exports = exports['default']; /***/ }), -/* 35 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -6520,16 +4409,17 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.UserManagerEvents = undefined; var _Log = __webpack_require__(1); var _Log2 = _interopRequireDefault(_Log); - var _AccessTokenEvents2 = __webpack_require__(36); + var _AccessTokenEvents2 = __webpack_require__(32); var _AccessTokenEvents3 = _interopRequireDefault(_AccessTokenEvents2); - var _Event = __webpack_require__(38); + var _Event = __webpack_require__(34); var _Event2 = _interopRequireDefault(_Event); @@ -6542,7 +4432,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function (_AccessTokenEvents) { + var UserManagerEvents = exports.UserManagerEvents = function (_AccessTokenEvents) { _inherits(UserManagerEvents, _AccessTokenEvents); function UserManagerEvents(settings) { @@ -6631,12 +4521,9 @@ return /******/ (function(modules) { // webpackBootstrap return UserManagerEvents; }(_AccessTokenEvents3.default); - - exports.default = UserManagerEvents; - module.exports = exports['default']; /***/ }), -/* 36 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -6644,12 +4531,13 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.AccessTokenEvents = undefined; var _Log = __webpack_require__(1); var _Log2 = _interopRequireDefault(_Log); - var _Timer = __webpack_require__(37); + var _Timer = __webpack_require__(33); var _Timer2 = _interopRequireDefault(_Timer); @@ -6660,7 +4548,7 @@ return /******/ (function(modules) { // webpackBootstrap var DefaultAccessTokenExpiringNotificationTime = 60; // seconds - var AccessTokenEvents = function () { + var AccessTokenEvents = exports.AccessTokenEvents = function () { function AccessTokenEvents() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime, @@ -6734,12 +4622,9 @@ return /******/ (function(modules) { // webpackBootstrap return AccessTokenEvents; }(); - - exports.default = AccessTokenEvents; - module.exports = exports['default']; /***/ }), -/* 37 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -6747,6 +4632,7 @@ return /******/ (function(modules) { // webpackBootstrap 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; }; }(); @@ -6758,7 +4644,7 @@ return /******/ (function(modules) { // webpackBootstrap var _Global2 = _interopRequireDefault(_Global); - var _Event2 = __webpack_require__(38); + var _Event2 = __webpack_require__(34); var _Event3 = _interopRequireDefault(_Event2); @@ -6773,7 +4659,7 @@ return /******/ (function(modules) { // webpackBootstrap var TimerDuration = 5; // seconds - var Timer = function (_Event) { + var Timer = exports.Timer = function (_Event) { _inherits(Timer, _Event); function Timer(name) { @@ -6801,8 +4687,8 @@ return /******/ (function(modules) { // webpackBootstrap _Log2.default.debug("Timer.init timer " + this._name + " for duration:", duration); this._expiration = this.now + duration; - // 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 + // 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) { @@ -6835,15 +4721,12 @@ return /******/ (function(modules) { // webpackBootstrap return parseInt(this._nowFunc()); } }]); - + return Timer; }(_Event3.default); - - exports.default = Timer; - module.exports = exports['default']; /***/ }), -/* 38 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6851,6 +4734,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.Event = undefined; var _Log = __webpack_require__(1); @@ -6861,7 +4745,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var Event = exports.Event = function () { function Event(name) { _classCallCheck(this, Event); @@ -6884,40 +4768,18 @@ return /******/ (function(modules) { // webpackBootstrap Event.prototype.raise = function raise() { _Log2.default.debug("Raising event: " + this._name); - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; + for (var i = 0; i < this._callbacks.length; i++) { + var _callbacks; - try { - for (var _iterator = this._callbacks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var cb = _step.value; - - cb.apply(undefined, arguments); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } + (_callbacks = this._callbacks)[i].apply(_callbacks, arguments); } }; return Event; }(); - - exports.default = Event; - module.exports = exports['default']; /***/ }), -/* 39 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6925,6 +4787,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.SilentRenewService = undefined; var _Log = __webpack_require__(1); @@ -6935,7 +4798,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var SilentRenewService = exports.SilentRenewService = function () { function SilentRenewService(userManager) { _classCallCheck(this, SilentRenewService); @@ -6979,12 +4842,9 @@ return /******/ (function(modules) { // webpackBootstrap return SilentRenewService; }(); - - exports.default = SilentRenewService; - module.exports = exports['default']; /***/ }), -/* 40 */ +/* 36 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -6992,6 +4852,7 @@ return /******/ (function(modules) { // webpackBootstrap 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. @@ -7000,7 +4861,7 @@ return /******/ (function(modules) { // webpackBootstrap var _Log2 = _interopRequireDefault(_Log); - var _CheckSessionIFrame = __webpack_require__(41); + var _CheckSessionIFrame = __webpack_require__(37); var _CheckSessionIFrame2 = _interopRequireDefault(_CheckSessionIFrame); @@ -7008,7 +4869,7 @@ return /******/ (function(modules) { // webpackBootstrap function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var SessionMonitor = function () { + var SessionMonitor = exports.SessionMonitor = function () { function SessionMonitor(userManager) { var _this = this; @@ -7140,15 +5001,12 @@ return /******/ (function(modules) { // webpackBootstrap return this._settings.checkSessionInterval; } }]); - + return SessionMonitor; }(); - - exports.default = SessionMonitor; - module.exports = exports['default']; /***/ }), -/* 41 */ +/* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7156,6 +5014,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.CheckSessionIFrame = undefined; var _Log = __webpack_require__(1); @@ -7168,7 +5027,7 @@ return /******/ (function(modules) { // webpackBootstrap var DefaultInterval = 2000; - var CheckSessionIFrame = function () { + var CheckSessionIFrame = exports.CheckSessionIFrame = function () { function CheckSessionIFrame(callback, client_id, url, interval) { _classCallCheck(this, CheckSessionIFrame); @@ -7250,12 +5109,9 @@ return /******/ (function(modules) { // webpackBootstrap return CheckSessionIFrame; }(); - - exports.default = CheckSessionIFrame; - module.exports = exports['default']; /***/ }), -/* 42 */ +/* 38 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -7263,6 +5119,7 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.TokenRevocationClient = undefined; var _Log = __webpack_require__(1); @@ -7283,7 +5140,7 @@ return /******/ (function(modules) { // webpackBootstrap var AccessTokenTypeHint = "access_token"; - var TokenRevocationClient = function () { + var TokenRevocationClient = exports.TokenRevocationClient = function () { function TokenRevocationClient(settings) { var XMLHttpRequestCtor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _Global2.default.XMLHttpRequest; var MetadataServiceCtor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _MetadataService2.default; @@ -7361,12 +5218,9 @@ return /******/ (function(modules) { // webpackBootstrap return TokenRevocationClient; }(); - - exports.default = TokenRevocationClient; - module.exports = exports['default']; /***/ }), -/* 43 */ +/* 39 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -7374,12 +5228,13 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.CordovaPopupNavigator = undefined; var _Log = __webpack_require__(1); var _Log2 = _interopRequireDefault(_Log); - var _CordovaPopupWindow = __webpack_require__(44); + var _CordovaPopupWindow = __webpack_require__(40); var _CordovaPopupWindow2 = _interopRequireDefault(_CordovaPopupWindow); @@ -7388,7 +5243,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var CordovaPopupNavigator = exports.CordovaPopupNavigator = function () { function CordovaPopupNavigator() { _classCallCheck(this, CordovaPopupNavigator); } @@ -7400,12 +5255,9 @@ return /******/ (function(modules) { // webpackBootstrap return CordovaPopupNavigator; }(); - - exports.default = CordovaPopupNavigator; - module.exports = exports['default']; /***/ }), -/* 44 */ +/* 40 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -7413,6 +5265,7 @@ return /******/ (function(modules) { // webpackBootstrap 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. @@ -7428,7 +5281,7 @@ return /******/ (function(modules) { // webpackBootstrap var DefaultPopupFeatures = 'location=no,toolbar=no,zoom=no'; var DefaultPopupTarget = "_blank"; - var CordovaPopupWindow = function () { + var CordovaPopupWindow = exports.CordovaPopupWindow = function () { function CordovaPopupWindow(params) { var _this = this; @@ -7529,15 +5382,12 @@ return /******/ (function(modules) { // webpackBootstrap return this._promise; } }]); - + return CordovaPopupWindow; }(); - - exports.default = CordovaPopupWindow; - module.exports = exports['default']; /***/ }), -/* 45 */ +/* 41 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; @@ -7545,12 +5395,13 @@ return /******/ (function(modules) { // webpackBootstrap Object.defineProperty(exports, "__esModule", { value: true }); + exports.CordovaIFrameNavigator = undefined; var _Log = __webpack_require__(1); var _Log2 = _interopRequireDefault(_Log); - var _CordovaPopupWindow = __webpack_require__(44); + var _CordovaPopupWindow = __webpack_require__(40); var _CordovaPopupWindow2 = _interopRequireDefault(_CordovaPopupWindow); @@ -7559,7 +5410,7 @@ return /******/ (function(modules) { // webpackBootstrap 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 = function () { + var CordovaIFrameNavigator = exports.CordovaIFrameNavigator = function () { function CordovaIFrameNavigator() { _classCallCheck(this, CordovaIFrameNavigator); } @@ -7572,12 +5423,9 @@ return /******/ (function(modules) { // webpackBootstrap return CordovaIFrameNavigator; }(); - - exports.default = CordovaIFrameNavigator; - module.exports = exports['default']; /***/ }) /******/ ]) }); ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA4NzQyODczYjAzNzdmNGUyYTg2MyIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvTG9nLmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50U2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9HbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Jlc3BvbnNlVmFsaWRhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9NZXRhZGF0YVNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pzb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VySW5mb1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Vycm9yUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pvc2VVdGlsLmpzIiwid2VicGFjazovLy8uL34vanNyc2FzaWduL2xpYi9qc3JzYXNpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYXNlNjQtanMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9pZWVlNzU0L2luZGV4LmpzIiwid2VicGFjazovLy8uL34vaXNhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbmluUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXJsVXRpbGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbmluU3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1N0YXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9yYW5kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3NyYy9TaWdub3V0UmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbm91dFJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXJNYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VyTWFuYWdlclNldHRpbmdzLmpzIiwid2VicGFjazovLy8uL3NyYy9SZWRpcmVjdE5hdmlnYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvUG9wdXBOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1BvcHVwV2luZG93LmpzIiwid2VicGFjazovLy8uL3NyYy9JRnJhbWVOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0lGcmFtZVdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlck1hbmFnZXJFdmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0FjY2Vzc1Rva2VuRXZlbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy9UaW1lci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRXZlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpbGVudFJlbmV3U2VydmljZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2Vzc2lvbk1vbml0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NoZWNrU2Vzc2lvbklGcmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVG9rZW5SZXZvY2F0aW9uQ2xpZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9Db3Jkb3ZhUG9wdXBOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvcmRvdmFQb3B1cFdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvQ29yZG92YUlGcmFtZU5hdmlnYXRvci5qcyJdLCJuYW1lcyI6WyJMb2ciLCJyZXF1aXJlIiwiT2lkY0NsaWVudCIsIk9pZGNDbGllbnRTZXR0aW5ncyIsIldlYlN0b3JhZ2VTdGF0ZVN0b3JlIiwiSW5NZW1vcnlXZWJTdG9yYWdlIiwiVXNlck1hbmFnZXIiLCJBY2Nlc3NUb2tlbkV2ZW50cyIsIk1ldGFkYXRhU2VydmljZSIsIkNvcmRvdmFQb3B1cE5hdmlnYXRvciIsIkNvcmRvdmFJRnJhbWVOYXZpZ2F0b3IiLCJDaGVja1Nlc3Npb25JRnJhbWUiLCJUb2tlblJldm9jYXRpb25DbGllbnQiLCJTZXNzaW9uTW9uaXRvciIsIkdsb2JhbCIsIlVzZXIiLCJub3BMb2dnZXIiLCJkZWJ1ZyIsImluZm8iLCJ3YXJuIiwiZXJyb3IiLCJOT05FIiwiRVJST1IiLCJXQVJOIiwiSU5GTyIsIkRFQlVHIiwibG9nZ2VyIiwibGV2ZWwiLCJyZXNldCIsImFyZ3MiLCJhcHBseSIsIkFycmF5IiwiZnJvbSIsInZhbHVlIiwiRXJyb3IiLCJzZXR0aW5ncyIsIl9zZXR0aW5ncyIsImNyZWF0ZVNpZ25pblJlcXVlc3QiLCJyZXNwb25zZV90eXBlIiwic2NvcGUiLCJyZWRpcmVjdF91cmkiLCJkYXRhIiwic3RhdGUiLCJwcm9tcHQiLCJkaXNwbGF5IiwibWF4X2FnZSIsInVpX2xvY2FsZXMiLCJpZF90b2tlbl9oaW50IiwibG9naW5faGludCIsImFjcl92YWx1ZXMiLCJyZXNvdXJjZSIsInJlcXVlc3QiLCJyZXF1ZXN0X3VyaSIsImV4dHJhUXVlcnlQYXJhbXMiLCJzdGF0ZVN0b3JlIiwiY2xpZW50X2lkIiwiYXV0aG9yaXR5IiwiX21ldGFkYXRhU2VydmljZSIsImdldEF1dGhvcml6YXRpb25FbmRwb2ludCIsInRoZW4iLCJ1cmwiLCJzaWduaW5SZXF1ZXN0Iiwic2lnbmluU3RhdGUiLCJfc3RhdGVTdG9yZSIsInNldCIsImlkIiwidG9TdG9yYWdlU3RyaW5nIiwicHJvY2Vzc1NpZ25pblJlc3BvbnNlIiwicmVzcG9uc2UiLCJQcm9taXNlIiwicmVqZWN0IiwicmVtb3ZlIiwic3RvcmVkU3RhdGVTdHJpbmciLCJmcm9tU3RvcmFnZVN0cmluZyIsIl92YWxpZGF0b3IiLCJ2YWxpZGF0ZVNpZ25pblJlc3BvbnNlIiwiY3JlYXRlU2lnbm91dFJlcXVlc3QiLCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLCJnZXRFbmRTZXNzaW9uRW5kcG9pbnQiLCJzaWdub3V0U3RhdGUiLCJwcm9jZXNzU2lnbm91dFJlc3BvbnNlIiwicmVzb2x2ZSIsInN0YXRlS2V5IiwidmFsaWRhdGVTaWdub3V0UmVzcG9uc2UiLCJjbGVhclN0YWxlU3RhdGUiLCJzdGFsZVN0YXRlQWdlIiwidmFsaWRhdG9yIiwibWV0YWRhdGFTZXJ2aWNlIiwiT2lkY01ldGFkYXRhVXJsUGF0aCIsIkRlZmF1bHRSZXNwb25zZVR5cGUiLCJEZWZhdWx0U2NvcGUiLCJEZWZhdWx0U3RhbGVTdGF0ZUFnZSIsIkRlZmF1bHRDbG9ja1NrZXdJblNlY29uZHMiLCJtZXRhZGF0YVVybCIsIm1ldGFkYXRhIiwic2lnbmluZ0tleXMiLCJjbGllbnRfc2VjcmV0IiwiZmlsdGVyUHJvdG9jb2xDbGFpbXMiLCJsb2FkVXNlckluZm8iLCJjbG9ja1NrZXciLCJSZXNwb25zZVZhbGlkYXRvckN0b3IiLCJNZXRhZGF0YVNlcnZpY2VDdG9yIiwiX2F1dGhvcml0eSIsIl9tZXRhZGF0YVVybCIsIl9tZXRhZGF0YSIsIl9zaWduaW5nS2V5cyIsIl9jbGllbnRfaWQiLCJfY2xpZW50X3NlY3JldCIsIl9yZXNwb25zZV90eXBlIiwiX3Njb3BlIiwiX3JlZGlyZWN0X3VyaSIsIl9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLCJfcHJvbXB0IiwiX2Rpc3BsYXkiLCJfbWF4X2FnZSIsIl91aV9sb2NhbGVzIiwiX2Fjcl92YWx1ZXMiLCJfcmVzb3VyY2UiLCJfZmlsdGVyUHJvdG9jb2xDbGFpbXMiLCJfbG9hZFVzZXJJbmZvIiwiX3N0YWxlU3RhdGVBZ2UiLCJfY2xvY2tTa2V3IiwiX2V4dHJhUXVlcnlQYXJhbXMiLCJpbmRleE9mIiwibGVuZ3RoIiwicHJlZml4Iiwic3RvcmUiLCJsb2NhbFN0b3JhZ2UiLCJfc3RvcmUiLCJfcHJlZml4Iiwia2V5Iiwic2V0SXRlbSIsImdldCIsIml0ZW0iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImdldEFsbEtleXMiLCJrZXlzIiwiaW5kZXgiLCJwdXNoIiwic3Vic3RyIiwidGltZXIiLCJzZXRJbnRlcnZhbCIsImNiIiwiZHVyYXRpb24iLCJjbGVhckludGVydmFsIiwiaGFuZGxlIiwidGVzdGluZyIsIl90ZXN0aW5nIiwic2V0WE1MSHR0cFJlcXVlc3QiLCJuZXdSZXF1ZXN0IiwibG9jYXRpb24iLCJzZXNzaW9uU3RvcmFnZSIsIlhNTEh0dHBSZXF1ZXN0IiwiUHJvdG9jb2xDbGFpbXMiLCJSZXNwb25zZVZhbGlkYXRvciIsIlVzZXJJbmZvU2VydmljZUN0b3IiLCJqb3NlVXRpbCIsIl91c2VySW5mb1NlcnZpY2UiLCJfam9zZVV0aWwiLCJfcHJvY2Vzc1NpZ25pblBhcmFtcyIsIl92YWxpZGF0ZVRva2VucyIsIl9wcm9jZXNzQ2xhaW1zIiwibm9uY2UiLCJpZF90b2tlbiIsImlzT3BlbklkQ29ubmVjdCIsInByb2ZpbGUiLCJhY2Nlc3NfdG9rZW4iLCJnZXRDbGFpbXMiLCJjbGFpbXMiLCJzdWIiLCJfbWVyZ2VDbGFpbXMiLCJjbGFpbXMxIiwiY2xhaW1zMiIsInJlc3VsdCIsIk9iamVjdCIsImFzc2lnbiIsIm5hbWUiLCJ2YWx1ZXMiLCJpc0FycmF5IiwiZm9yRWFjaCIsInR5cGUiLCJfdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW4iLCJfdmFsaWRhdGVJZFRva2VuIiwiX3ZhbGlkYXRlQWNjZXNzVG9rZW4iLCJqd3QiLCJwYXJzZUp3dCIsImhlYWRlciIsInBheWxvYWQiLCJraWQiLCJnZXRJc3N1ZXIiLCJnZXRTaWduaW5nS2V5cyIsIl9maWx0ZXJCeUFsZyIsImFsZyIsImZpbHRlciIsImF1ZGllbmNlIiwiY2xvY2tTa2V3SW5TZWNvbmRzIiwidmFsaWRhdGVKd3QiLCJpc3N1ZXIiLCJrdHkiLCJzdGFydHNXaXRoIiwiYXRfaGFzaCIsImhhc2hBbGciLCJoYXNoQml0cyIsInBhcnNlSW50Iiwic2hhIiwiaGFzaCIsImhhc2hTdHJpbmciLCJsZWZ0IiwibGVmdF9iNjR1IiwiaGV4VG9CYXNlNjRVcmwiLCJKc29uU2VydmljZUN0b3IiLCJfanNvblNlcnZpY2UiLCJnZXRNZXRhZGF0YSIsImdldEpzb24iLCJfZ2V0TWV0YWRhdGFQcm9wZXJ0eSIsImdldFVzZXJJbmZvRW5kcG9pbnQiLCJnZXRUb2tlbkVuZHBvaW50IiwiZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lIiwiZ2V0UmV2b2NhdGlvbkVuZHBvaW50Iiwib3B0aW9uYWwiLCJ1bmRlZmluZWQiLCJqd2tzX3VyaSIsImtleVNldCIsIkpzb25TZXJ2aWNlIiwiWE1MSHR0cFJlcXVlc3RDdG9yIiwiX1hNTEh0dHBSZXF1ZXN0IiwidG9rZW4iLCJyZXEiLCJvcGVuIiwib25sb2FkIiwic3RhdHVzIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiZSIsIm1lc3NhZ2UiLCJzdGF0dXNUZXh0Iiwib25lcnJvciIsInNldFJlcXVlc3RIZWFkZXIiLCJzZW5kIiwiVXNlckluZm9TZXJ2aWNlIiwiRXJyb3JSZXNwb25zZSIsImVycm9yX2Rlc2NyaXB0aW9uIiwiZXJyb3JfdXJpIiwiQWxsb3dlZFNpZ25pbmdBbGdzIiwiSm9zZVV0aWwiLCJKV1MiLCJoZWFkZXJPYmoiLCJwYXlsb2FkT2JqIiwibm93IiwibiIsImdldEtleSIsIng1YyIsImdldFB1YmxpY0tleUZyb21DZXJ0UEVNIiwiY3J2IiwieCIsInkiLCJfdmFsaWRhdGVKd3QiLCJEYXRlIiwiaXNzIiwiYXVkIiwidmFsaWRBdWRpZW5jZSIsImxvd2VyTm93IiwidXBwZXJOb3ciLCJpYXQiLCJuYmYiLCJleHAiLCJ2ZXJpZnkiLCJVdGlsIiwiU2lnbmluUmVxdWVzdCIsIm9pZGMiLCJpc09pZGMiLCJhZGRRdWVyeVBhcmFtIiwic3BsaXQiLCJpc09BdXRoIiwiVXJsVXRpbGl0eSIsImVuY29kZVVSSUNvbXBvbmVudCIsInBhcnNlVXJsRnJhZ21lbnQiLCJkZWxpbWl0ZXIiLCJnbG9iYWwiLCJocmVmIiwiaWR4IiwibGFzdEluZGV4T2YiLCJwYXJhbXMiLCJyZWdleCIsIm0iLCJjb3VudGVyIiwiZXhlYyIsImRlY29kZVVSSUNvbXBvbmVudCIsInByb3AiLCJTaWduaW5TdGF0ZSIsImFyZ3VtZW50cyIsIl9ub25jZSIsInN0cmluZ2lmeSIsImNyZWF0ZWQiLCJzdG9yYWdlU3RyaW5nIiwiU3RhdGUiLCJfaWQiLCJfZGF0YSIsIl9jcmVhdGVkIiwic3RvcmFnZSIsImFnZSIsImN1dG9mZiIsInByb21pc2VzIiwicCIsImFsbCIsInJhbmRvbSIsImd1aWRIb2xkZXIiLCJoZXgiLCJyIiwiZ3VpZFJlc3BvbnNlIiwiaSIsIk1hdGgiLCJPaWRjU2NvcGUiLCJTaWduaW5SZXNwb25zZSIsInNlc3Npb25fc3RhdGUiLCJ0b2tlbl90eXBlIiwiZXhwaXJlc19pbiIsImV4cGlyZXNfYXQiLCJzY29wZXMiLCJTaWdub3V0UmVxdWVzdCIsIlNpZ25vdXRSZXNwb25zZSIsImdldE93blByb3BlcnR5TmFtZXMiLCJTaWxlbnRSZW5ld1NlcnZpY2VDdG9yIiwiU2Vzc2lvbk1vbml0b3JDdG9yIiwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50Q3RvciIsIl9ldmVudHMiLCJfc2lsZW50UmVuZXdTZXJ2aWNlIiwiYXV0b21hdGljU2lsZW50UmVuZXciLCJzdGFydFNpbGVudFJlbmV3IiwibW9uaXRvclNlc3Npb24iLCJfc2Vzc2lvbk1vbml0b3IiLCJfdG9rZW5SZXZvY2F0aW9uQ2xpZW50IiwiZ2V0VXNlciIsIl9sb2FkVXNlciIsInVzZXIiLCJsb2FkIiwicmVtb3ZlVXNlciIsInN0b3JlVXNlciIsInVubG9hZCIsInNpZ25pblJlZGlyZWN0IiwiX3NpZ25pblN0YXJ0IiwiX3JlZGlyZWN0TmF2aWdhdG9yIiwic2lnbmluUmVkaXJlY3RDYWxsYmFjayIsIl9zaWduaW5FbmQiLCJzaWduaW5Qb3B1cCIsInBvcHVwX3JlZGlyZWN0X3VyaSIsIl9zaWduaW4iLCJfcG9wdXBOYXZpZ2F0b3IiLCJzdGFydFVybCIsInBvcHVwV2luZG93RmVhdHVyZXMiLCJwb3B1cFdpbmRvd1RhcmdldCIsInNpZ25pblBvcHVwQ2FsbGJhY2siLCJfc2lnbmluQ2FsbGJhY2siLCJzaWduaW5TaWxlbnQiLCJzaWxlbnRfcmVkaXJlY3RfdXJpIiwic2V0SWRUb2tlbiIsImluY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldyIsIl9pZnJhbWVOYXZpZ2F0b3IiLCJzaWxlbnRSZXF1ZXN0VGltZW91dCIsInNpZ25pblNpbGVudENhbGxiYWNrIiwicXVlcnlTZXNzaW9uU3RhdHVzIiwibmF2UmVzcG9uc2UiLCJzaWduaW5SZXNwb25zZSIsInNpZCIsIm5hdmlnYXRvciIsIm5hdmlnYXRvclBhcmFtcyIsInByZXBhcmUiLCJuYXZpZ2F0ZSIsImNhdGNoIiwiY2xvc2UiLCJlcnIiLCJjYWxsYmFjayIsInNpZ25vdXRSZWRpcmVjdCIsInBvc3RMb2dvdXRSZWRpcmVjdFVyaSIsIl9zaWdub3V0U3RhcnQiLCJzaWdub3V0UmVkaXJlY3RDYWxsYmFjayIsIl9zaWdub3V0RW5kIiwic2lnbm91dFBvcHVwIiwicG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX3NpZ25vdXQiLCJzaWdub3V0UG9wdXBDYWxsYmFjayIsImtlZXBPcGVuIiwicmV2b2tlUHJvbWlzZSIsInJldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0IiwiX3Jldm9rZUludGVybmFsIiwic2lnbm91dFJlcXVlc3QiLCJzaWdub3V0UmVzcG9uc2UiLCJyZXZva2VBY2Nlc3NUb2tlbiIsInN1Y2Nlc3MiLCJyZXF1aXJlZCIsInJldm9rZSIsInN0YXJ0Iiwic3RvcFNpbGVudFJlbmV3Iiwic3RvcCIsIl91c2VyU3RvcmUiLCJfdXNlclN0b3JlS2V5IiwicmVkaXJlY3ROYXZpZ2F0b3IiLCJwb3B1cE5hdmlnYXRvciIsImlmcmFtZU5hdmlnYXRvciIsInVzZXJTdG9yZSIsIkRlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSIsIkRlZmF1bHRDaGVja1Nlc3Npb25JbnRlcnZhbCIsIlVzZXJNYW5hZ2VyU2V0dGluZ3MiLCJjaGVja1Nlc3Npb25JbnRlcnZhbCIsImFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lIiwiX3BvcHVwX3JlZGlyZWN0X3VyaSIsIl9wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLCJfcG9wdXBXaW5kb3dGZWF0dXJlcyIsIl9wb3B1cFdpbmRvd1RhcmdldCIsIl9zaWxlbnRfcmVkaXJlY3RfdXJpIiwiX3NpbGVudFJlcXVlc3RUaW1lb3V0IiwiX2F1dG9tYXRpY1NpbGVudFJlbmV3IiwiX2luY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldyIsIl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSIsIl9tb25pdG9yU2Vzc2lvbiIsIl9jaGVja1Nlc3Npb25JbnRlcnZhbCIsIl9yZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCIsIlJlZGlyZWN0TmF2aWdhdG9yIiwid2luZG93IiwiUG9wdXBOYXZpZ2F0b3IiLCJwb3B1cCIsIm5vdGlmeU9wZW5lciIsIkNoZWNrRm9yUG9wdXBDbG9zZWRJbnRlcnZhbCIsIkRlZmF1bHRQb3B1cEZlYXR1cmVzIiwiRGVmYXVsdFBvcHVwVGFyZ2V0IiwiUG9wdXBXaW5kb3ciLCJfcHJvbWlzZSIsIl9yZXNvbHZlIiwiX3JlamVjdCIsInRhcmdldCIsImZlYXR1cmVzIiwiX3BvcHVwIiwiX2NoZWNrRm9yUG9wdXBDbG9zZWRUaW1lciIsIl9jaGVja0ZvclBvcHVwQ2xvc2VkIiwiYmluZCIsIl9lcnJvciIsIl9jYWxsYmFjayIsImZvY3VzIiwicHJvbWlzZSIsIl9zdWNjZXNzIiwiX2NsZWFudXAiLCJjbG9zZWQiLCJvcGVuZXIiLCJJRnJhbWVOYXZpZ2F0b3IiLCJmcmFtZSIsIm5vdGlmeVBhcmVudCIsIkRlZmF1bHRUaW1lb3V0IiwiSUZyYW1lV2luZG93IiwiX2JvdW5kTWVzc2FnZUV2ZW50IiwiX21lc3NhZ2UiLCJhZGRFdmVudExpc3RlbmVyIiwiX2ZyYW1lIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic3R5bGUiLCJ2aXNpYmlsaXR5IiwicG9zaXRpb24iLCJ3aWR0aCIsImhlaWdodCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsInRpbWVvdXQiLCJfdGltZXIiLCJzZXRUaW1lb3V0IiwiX3RpbWVvdXQiLCJzcmMiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQ2hpbGQiLCJvcmlnaW4iLCJfb3JpZ2luIiwic291cmNlIiwiY29udGVudFdpbmRvdyIsInBhcmVudCIsInBvc3RNZXNzYWdlIiwicHJvdG9jb2wiLCJob3N0IiwiVXNlck1hbmFnZXJFdmVudHMiLCJfdXNlckxvYWRlZCIsIl91c2VyVW5sb2FkZWQiLCJfc2lsZW50UmVuZXdFcnJvciIsIl91c2VyU2lnbmVkT3V0IiwiX3VzZXJTZXNzaW9uQ2hhbmdlZCIsInJhaXNlRXZlbnQiLCJyYWlzZSIsImFkZFVzZXJMb2FkZWQiLCJhZGRIYW5kbGVyIiwicmVtb3ZlVXNlckxvYWRlZCIsInJlbW92ZUhhbmRsZXIiLCJhZGRVc2VyVW5sb2FkZWQiLCJyZW1vdmVVc2VyVW5sb2FkZWQiLCJhZGRTaWxlbnRSZW5ld0Vycm9yIiwicmVtb3ZlU2lsZW50UmVuZXdFcnJvciIsIl9yYWlzZVNpbGVudFJlbmV3RXJyb3IiLCJhZGRVc2VyU2lnbmVkT3V0IiwicmVtb3ZlVXNlclNpZ25lZE91dCIsIl9yYWlzZVVzZXJTaWduZWRPdXQiLCJhZGRVc2VyU2Vzc2lvbkNoYW5nZWQiLCJyZW1vdmVVc2VyU2Vzc2lvbkNoYW5nZWQiLCJfcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWQiLCJhY2Nlc3NUb2tlbkV4cGlyaW5nVGltZXIiLCJhY2Nlc3NUb2tlbkV4cGlyZWRUaW1lciIsIl9hY2Nlc3NUb2tlbkV4cGlyaW5nIiwiX2FjY2Vzc1Rva2VuRXhwaXJlZCIsImNvbnRhaW5lciIsIl9jYW5jZWxUaW1lcnMiLCJleHBpcmluZyIsImluaXQiLCJleHBpcmVkIiwiY2FuY2VsIiwiYWRkQWNjZXNzVG9rZW5FeHBpcmluZyIsInJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJpbmciLCJhZGRBY2Nlc3NUb2tlbkV4cGlyZWQiLCJyZW1vdmVBY2Nlc3NUb2tlbkV4cGlyZWQiLCJUaW1lckR1cmF0aW9uIiwiVGltZXIiLCJfbm93RnVuYyIsIl9uYW1lIiwiX2V4cGlyYXRpb24iLCJ0aW1lckR1cmF0aW9uIiwiX3RpbWVySGFuZGxlIiwiZGlmZiIsIkV2ZW50IiwiX2NhbGxiYWNrcyIsImZpbmRJbmRleCIsInNwbGljZSIsIlNpbGVudFJlbmV3U2VydmljZSIsInVzZXJNYW5hZ2VyIiwiX3VzZXJNYW5hZ2VyIiwiX3Rva2VuRXhwaXJpbmciLCJldmVudHMiLCJDaGVja1Nlc3Npb25JRnJhbWVDdG9yIiwiX0NoZWNrU2Vzc2lvbklGcmFtZUN0b3IiLCJfc3RhcnQiLCJfc3RvcCIsIl9zdWIiLCJfc2lkIiwiX2NoZWNrU2Vzc2lvbklGcmFtZSIsImludGVydmFsIiwicmFpc2VVc2VyU2lnbmVkT3V0RXZlbnQiLCJzZXNzaW9uIiwiRGVmYXVsdEludGVydmFsIiwiX3VybCIsIl9pbnRlcnZhbCIsIl9mcmFtZV9vcmlnaW4iLCJfc2Vzc2lvbl9zdGF0ZSIsIkFjY2Vzc1Rva2VuVHlwZUhpbnQiLCJfWE1MSHR0cFJlcXVlc3RDdG9yIiwiYWNjZXNzVG9rZW4iLCJfcmV2b2tlIiwieGhyIiwiQ29yZG92YVBvcHVwV2luZG93IiwiX2lzSW5BcHBCcm93c2VySW5zdGFsbGVkIiwiY29yZG92YU1ldGFkYXRhIiwic29tZSIsImhhc093blByb3BlcnR5IiwiY29yZG92YSIsIkluQXBwQnJvd3NlciIsIl9leGl0Q2FsbGJhY2tFdmVudCIsIl9leGl0Q2FsbGJhY2siLCJfbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCIsIl9sb2FkU3RhcnRDYWxsYmFjayIsImV2ZW50Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FDOVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXFCLG1EQUFtRDtBQUN4RTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLFVBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQSxJQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSx3Q0FBdUMsU0FBUztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQSx5QkFBd0IsUUFBUTtBQUNoQztBQUNBLHNCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0Esb0JBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFjcFksSUFBZDtBQUNILE07O2tDQUNENFksTSxtQkFBT3pNLE8sRUFBUztBQUNaLGNBQUs4TSxRQUFMOztBQUVBLHVCQUFJdGEsS0FBSixDQUFVd04sT0FBVjtBQUNBLGNBQUtrTSxPQUFMLENBQWEsSUFBSTVZLEtBQUosQ0FBVTBNLE9BQVYsQ0FBYjtBQUNILE07O2tDQUVEdUksSyxvQkFBUTtBQUNKLGNBQUt1RSxRQUFMO0FBQ0gsTTs7a0NBRURBLFEsdUJBQVc7QUFDUCx1QkFBSXphLEtBQUosQ0FBVSw2QkFBVjs7QUFFQSxhQUFJLEtBQUtnYSxNQUFULEVBQWdCO0FBQ1osa0JBQUtBLE1BQUwsQ0FBWW1DLG1CQUFaLENBQWdDLE1BQWhDLEVBQXdDLEtBQUs0RixrQkFBN0MsRUFBaUUsS0FBakU7QUFDQSxrQkFBSy9ILE1BQUwsQ0FBWW1DLG1CQUFaLENBQWdDLFdBQWhDLEVBQTZDLEtBQUs4Rix1QkFBbEQsRUFBMkUsS0FBM0U7QUFDQSxrQkFBS2pJLE1BQUwsQ0FBWTlELEtBQVo7QUFDSDtBQUNELGNBQUs4RCxNQUFMLEdBQWMsSUFBZDtBQUNILE07Ozs7NkJBdkNhO0FBQ1Ysb0JBQU8sS0FBS0wsUUFBWjtBQUNIOzs7Ozs7bUJBdkRnQjZILGtCOzs7Ozs7Ozs7Ozs7O0FDTHJCOzs7O0FBQ0E7Ozs7OzsySkFKQTtBQUNBOztLQUtxQi9oQixzQjs7Ozs7c0NBRWpCc1csTyxvQkFBUXBGLE0sRUFBUTtBQUNaQSxnQkFBT21FLG1CQUFQLEdBQTZCLFlBQTdCO0FBQ0EsYUFBSXVFLFFBQVEsaUNBQXVCMUksTUFBdkIsQ0FBWjtBQUNBLGdCQUFPdk4sUUFBUVksT0FBUixDQUFnQnFWLEtBQWhCLENBQVA7QUFDSCxNOzs7OzttQkFOZ0I1WixzQiIsImZpbGUiOiJvaWRjLWNsaWVudC5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSB7XG5cdFx0dmFyIGEgPSBmYWN0b3J5KCk7XG5cdFx0Zm9yKHZhciBpIGluIGEpICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBleHBvcnRzIDogcm9vdClbaV0gPSBhW2ldO1xuXHR9XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgODc0Mjg3M2IwMzc3ZjRlMmE4NjMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5leHBvcnQgY29uc3QgTG9nID0gcmVxdWlyZSgnLi9zcmMvTG9nJyk7XHJcbmV4cG9ydCBjb25zdCBPaWRjQ2xpZW50ID0gcmVxdWlyZSgnLi9zcmMvT2lkY0NsaWVudCcpO1xyXG5leHBvcnQgY29uc3QgT2lkY0NsaWVudFNldHRpbmdzID0gcmVxdWlyZSgnLi9zcmMvT2lkY0NsaWVudFNldHRpbmdzJyk7XHJcbmV4cG9ydCBjb25zdCBXZWJTdG9yYWdlU3RhdGVTdG9yZSA9IHJlcXVpcmUoJy4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJyk7XHJcbmV4cG9ydCBjb25zdCBJbk1lbW9yeVdlYlN0b3JhZ2UgPSByZXF1aXJlKCcuL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UnKTtcclxuZXhwb3J0IGNvbnN0IFVzZXJNYW5hZ2VyID0gcmVxdWlyZSgnLi9zcmMvVXNlck1hbmFnZXInKTtcclxuZXhwb3J0IGNvbnN0IEFjY2Vzc1Rva2VuRXZlbnRzID0gcmVxdWlyZSgnLi9zcmMvQWNjZXNzVG9rZW5FdmVudHMnKTtcclxuZXhwb3J0IGNvbnN0IE1ldGFkYXRhU2VydmljZSA9IHJlcXVpcmUoJy4vc3JjL01ldGFkYXRhU2VydmljZScpO1xyXG5leHBvcnQgY29uc3QgQ29yZG92YVBvcHVwTmF2aWdhdG9yID0gcmVxdWlyZSgnLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yJyk7XHJcbmV4cG9ydCBjb25zdCBDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yID0gcmVxdWlyZSgnLi9zcmMvQ29yZG92YUlGcmFtZU5hdmlnYXRvcicpO1xyXG5leHBvcnQgY29uc3QgQ2hlY2tTZXNzaW9uSUZyYW1lID0gcmVxdWlyZSgnLi9zcmMvQ2hlY2tTZXNzaW9uSUZyYW1lJyk7XHJcbmV4cG9ydCBjb25zdCBUb2tlblJldm9jYXRpb25DbGllbnQgPSByZXF1aXJlKCcuL3NyYy9Ub2tlblJldm9jYXRpb25DbGllbnQnKTtcclxuZXhwb3J0IGNvbnN0IFNlc3Npb25Nb25pdG9yID0gcmVxdWlyZSgnLi9zcmMvU2Vzc2lvbk1vbml0b3InKTtcclxuZXhwb3J0IGNvbnN0IEdsb2JhbCA9IHJlcXVpcmUoJy4vc3JjL0dsb2JhbCcpO1xyXG5leHBvcnQgY29uc3QgVXNlciA9IHJlcXVpcmUoJy4vc3JjL1VzZXInKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIExvZyxcclxuICAgIE9pZGNDbGllbnQsXHJcbiAgICBPaWRjQ2xpZW50U2V0dGluZ3MsXHJcbiAgICBXZWJTdG9yYWdlU3RhdGVTdG9yZSxcclxuICAgIEluTWVtb3J5V2ViU3RvcmFnZSxcclxuICAgIFVzZXJNYW5hZ2VyLFxyXG4gICAgQWNjZXNzVG9rZW5FdmVudHMsXHJcbiAgICBNZXRhZGF0YVNlcnZpY2UsXHJcbiAgICBDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3IsXHJcbiAgICBDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yLFxyXG4gICAgQ2hlY2tTZXNzaW9uSUZyYW1lLFxyXG4gICAgVG9rZW5SZXZvY2F0aW9uQ2xpZW50LFxyXG4gICAgU2Vzc2lvbk1vbml0b3IsXHJcbiAgICBHbG9iYWwsXHJcbiAgICBVc2VyXHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2luZGV4LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxubGV0IG5vcExvZ2dlciA9IHtcclxuICAgIGRlYnVnKCl7fSxcclxuICAgIGluZm8oKXt9LFxyXG4gICAgd2Fybigpe30sXHJcbiAgICBlcnJvcigpe31cclxufTtcclxuXHJcbmNvbnN0IE5PTkUgPSAwO1xyXG5jb25zdCBFUlJPUiA9IDE7XHJcbmNvbnN0IFdBUk4gPSAyO1xyXG5jb25zdCBJTkZPID0gMztcclxuY29uc3QgREVCVUcgPSA0O1xyXG5cclxubGV0IGxvZ2dlcjtcclxubGV0IGxldmVsO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nIHtcclxuICAgIHN0YXRpYyBnZXQgTk9ORSgpIHtyZXR1cm4gTk9ORX07XHJcbiAgICBzdGF0aWMgZ2V0IEVSUk9SKCkge3JldHVybiBFUlJPUn07XHJcbiAgICBzdGF0aWMgZ2V0IFdBUk4oKSB7cmV0dXJuIFdBUk59O1xyXG4gICAgc3RhdGljIGdldCBJTkZPKCkge3JldHVybiBJTkZPfTtcclxuICAgIHN0YXRpYyBnZXQgREVCVUcoKSB7cmV0dXJuIERFQlVHfTtcclxuICAgIFxyXG4gICAgc3RhdGljIHJlc2V0KCl7XHJcbiAgICAgICAgbGV2ZWwgPSBJTkZPO1xyXG4gICAgICAgIGxvZ2dlciA9IG5vcExvZ2dlcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIGdldCBsZXZlbCgpe1xyXG4gICAgICAgIHJldHVybiBsZXZlbDtcclxuICAgIH1cclxuICAgIHN0YXRpYyBzZXQgbGV2ZWwodmFsdWUpe1xyXG4gICAgICAgIGlmIChOT05FIDw9IHZhbHVlICYmIHZhbHVlIDw9IERFQlVHKXtcclxuICAgICAgICAgICAgbGV2ZWwgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIGdldCBsb2dnZXIoKXtcclxuICAgICAgICByZXR1cm4gbG9nZ2VyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHNldCBsb2dnZXIodmFsdWUpe1xyXG4gICAgICAgIGlmICghdmFsdWUuZGVidWcgJiYgdmFsdWUuaW5mbykge1xyXG4gICAgICAgICAgICAvLyBqdXN0IHRvIHN0YXkgYmFja3dhcmRzIGNvbXBhdC4gY2FuIHJlbW92ZSBpbiAyLjBcclxuICAgICAgICAgICAgdmFsdWUuZGVidWcgPSB2YWx1ZS5pbmZvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLmRlYnVnICYmIHZhbHVlLmluZm8gJiYgdmFsdWUud2FybiAmJiB2YWx1ZS5lcnJvcil7XHJcbiAgICAgICAgICAgIGxvZ2dlciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsb2dnZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgZGVidWcoLi4uYXJncyl7XHJcbiAgICAgICAgaWYgKGxldmVsID49IERFQlVHKXtcclxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGluZm8oLi4uYXJncyl7XHJcbiAgICAgICAgaWYgKGxldmVsID49IElORk8pe1xyXG4gICAgICAgICAgICBsb2dnZXIuaW5mby5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyB3YXJuKC4uLmFyZ3Mpe1xyXG4gICAgICAgIGlmIChsZXZlbCA+PSBXQVJOKXtcclxuICAgICAgICAgICAgbG9nZ2VyLndhcm4uYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZXJyb3IoLi4uYXJncyl7XHJcbiAgICAgICAgaWYgKGxldmVsID49IEVSUk9SKXtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5Mb2cucmVzZXQoKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvTG9nLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBPaWRjQ2xpZW50U2V0dGluZ3MgZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MnO1xyXG5pbXBvcnQgRXJyb3JSZXNwb25zZSBmcm9tICcuL0Vycm9yUmVzcG9uc2UnO1xyXG5pbXBvcnQgU2lnbmluUmVxdWVzdCBmcm9tICcuL1NpZ25pblJlcXVlc3QnO1xyXG5pbXBvcnQgU2lnbmluUmVzcG9uc2UgZnJvbSAnLi9TaWduaW5SZXNwb25zZSc7XHJcbmltcG9ydCBTaWdub3V0UmVxdWVzdCBmcm9tICcuL1NpZ25vdXRSZXF1ZXN0JztcclxuaW1wb3J0IFNpZ25vdXRSZXNwb25zZSBmcm9tICcuL1NpZ25vdXRSZXNwb25zZSc7XHJcbmltcG9ydCBTaWduaW5TdGF0ZSBmcm9tICcuL1NpZ25pblN0YXRlJztcclxuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2lkY0NsaWVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncyA9IHt9KSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzIGluc3RhbmNlb2YgT2lkY0NsaWVudFNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IG5ldyBPaWRjQ2xpZW50U2V0dGluZ3Moc2V0dGluZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgX3N0YXRlU3RvcmUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3Muc3RhdGVTdG9yZTtcclxuICAgIH1cclxuICAgIGdldCBfdmFsaWRhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnZhbGlkYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBfbWV0YWRhdGFTZXJ2aWNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1ldGFkYXRhU2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhU2VydmljZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNpZ25pblJlcXVlc3Qoe1xyXG4gICAgICAgIHJlc3BvbnNlX3R5cGUsIHNjb3BlLCByZWRpcmVjdF91cmksIFxyXG4gICAgICAgIC8vIGRhdGEgd2FzIG1lYW50IHRvIGJlIHRoZSBwbGFjZSBhIGNhbGxlciBjb3VsZCBpbmRpY2F0ZSB0aGUgZGF0YSB0b1xyXG4gICAgICAgIC8vIGhhdmUgcm91bmQgdHJpcHBlZCwgYnV0IHBlb3BsZSB3ZXJlIGdldHRpbmcgY29uZnVzZWQsIHNvIGkgYWRkZWQgc3RhdGUgKHNpbmNlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlYykgXHJcbiAgICAgICAgLy8gYW5kIHNvIG5vdyBpZiBkYXRhIGlzIG5vdCBwYXNzZWQsIGJ1dCBzdGF0ZSBpcyB0aGVuIHN0YXRlIHdpbGwgYmUgdXNlZFxyXG4gICAgICAgIGRhdGEsIHN0YXRlLCBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsXHJcbiAgICAgICAgcmVzb3VyY2UsIHJlcXVlc3QsIHJlcXVlc3RfdXJpLCBleHRyYVF1ZXJ5UGFyYW1zIH0gPSB7fSxcclxuICAgICAgICBzdGF0ZVN0b3JlXHJcbiAgICApIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25pblJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgIGxldCBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgcmVzcG9uc2VfdHlwZSA9IHJlc3BvbnNlX3R5cGUgfHwgdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfdHlwZTtcclxuICAgICAgICBzY29wZSA9IHNjb3BlIHx8IHRoaXMuX3NldHRpbmdzLnNjb3BlO1xyXG4gICAgICAgIHJlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIC8vIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQgYXJlbid0IGFsbG93ZWQgb24gX3NldHRpbmdzXHJcbiAgICAgICAgcHJvbXB0ID0gcHJvbXB0IHx8IHRoaXMuX3NldHRpbmdzLnByb21wdDtcclxuICAgICAgICBkaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLl9zZXR0aW5ncy5kaXNwbGF5O1xyXG4gICAgICAgIG1heF9hZ2UgPSBtYXhfYWdlIHx8IHRoaXMuX3NldHRpbmdzLm1heF9hZ2U7XHJcbiAgICAgICAgdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXMgfHwgdGhpcy5fc2V0dGluZ3MudWlfbG9jYWxlcztcclxuICAgICAgICBhY3JfdmFsdWVzID0gYWNyX3ZhbHVlcyB8fCB0aGlzLl9zZXR0aW5ncy5hY3JfdmFsdWVzO1xyXG4gICAgICAgIHJlc291cmNlID0gcmVzb3VyY2UgfHwgdGhpcy5fc2V0dGluZ3MucmVzb3VyY2U7XHJcbiAgICAgICAgZXh0cmFRdWVyeVBhcmFtcyA9IGV4dHJhUXVlcnlQYXJhbXMgfHwgdGhpcy5fc2V0dGluZ3MuZXh0cmFRdWVyeVBhcmFtcztcclxuICAgICAgICBcclxuICAgICAgICBsZXQgYXV0aG9yaXR5ID0gdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldEF1dGhvcml6YXRpb25FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgYXV0aG9yaXphdGlvbiBlbmRwb2ludFwiLCB1cmwpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNpZ25pblJlcXVlc3QgPSBuZXcgU2lnbmluUmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQsXHJcbiAgICAgICAgICAgICAgICByZWRpcmVjdF91cmksXHJcbiAgICAgICAgICAgICAgICByZXNwb25zZV90eXBlLFxyXG4gICAgICAgICAgICAgICAgc2NvcGUsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhIHx8IHN0YXRlLFxyXG4gICAgICAgICAgICAgICAgYXV0aG9yaXR5LFxyXG4gICAgICAgICAgICAgICAgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50LCBhY3JfdmFsdWVzLFxyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2UsIHJlcXVlc3QsIHJlcXVlc3RfdXJpLCBleHRyYVF1ZXJ5UGFyYW1zLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBzaWduaW5TdGF0ZSA9IHNpZ25pblJlcXVlc3Quc3RhdGU7XHJcbiAgICAgICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc3RhdGVTdG9yZS5zZXQoc2lnbmluU3RhdGUuaWQsIHNpZ25pblN0YXRlLnRvU3RvcmFnZVN0cmluZygpKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzaWduaW5SZXF1ZXN0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzU2lnbmluUmVzcG9uc2UodXJsLCBzdGF0ZVN0b3JlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5wcm9jZXNzU2lnbmluUmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBTaWduaW5SZXNwb25zZSh1cmwpO1xyXG5cclxuICAgICAgICBpZiAoIXJlc3BvbnNlLnN0YXRlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHN0YXRlIGluIHJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUucmVtb3ZlKHJlc3BvbnNlLnN0YXRlKS50aGVuKHN0b3JlZFN0YXRlU3RyaW5nID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzdG9yZWRTdGF0ZVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IFNpZ25pblN0YXRlLmZyb21TdG9yYWdlU3RyaW5nKHN0b3JlZFN0YXRlU3RyaW5nKTtcclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIHN0YXRlIGZyb20gc3RvcmFnZTsgdmFsaWRhdGluZyByZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZVNpZ25pblJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlU2lnbm91dFJlcXVlc3Qoe2lkX3Rva2VuX2hpbnQsIGRhdGEsIHN0YXRlLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cml9ID0ge30sXHJcbiAgICAgICAgc3RhdGVTdG9yZVxyXG4gICAgKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jcmVhdGVTaWdub3V0UmVxdWVzdFwiKTtcclxuXHJcbiAgICAgICAgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIHx8IHRoaXMuX3NldHRpbmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRFbmRTZXNzaW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBlbmQgc2Vzc2lvbiBlbmRwb2ludCB1cmwgcmV0dXJuZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJubyBlbmQgc2Vzc2lvbiBlbmRwb2ludFwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgZW5kIHNlc3Npb24gZW5kcG9pbnRcIiwgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFNpZ25vdXRSZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgICAgIGlkX3Rva2VuX2hpbnQsXHJcbiAgICAgICAgICAgICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhIHx8IHN0YXRlXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdmFyIHNpZ25vdXRTdGF0ZSA9IHJlcXVlc3Quc3RhdGU7XHJcbiAgICAgICAgICAgIGlmIChzaWdub3V0U3RhdGUpIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNpZ25vdXQgcmVxdWVzdCBoYXMgc3RhdGUgdG8gcGVyc2lzdFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xyXG4gICAgICAgICAgICAgICAgc3RhdGVTdG9yZS5zZXQoc2lnbm91dFN0YXRlLmlkLCBzaWdub3V0U3RhdGUudG9TdG9yYWdlU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzU2lnbm91dFJlc3BvbnNlKHVybCwgc3RhdGVTdG9yZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk9pZGNDbGllbnQucHJvY2Vzc1NpZ25vdXRSZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gbmV3IFNpZ25vdXRSZXNwb25zZSh1cmwpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIExvZy53YXJuKFwiUmVzcG9uc2Ugd2FzIGVycm9yXCIsIHJlc3BvbnNlLmVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzdGF0ZUtleSA9IHJlc3BvbnNlLnN0YXRlO1xyXG5cclxuICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RhdGVTdG9yZS5yZW1vdmUoc3RhdGVLZXkpLnRoZW4oc3RvcmVkU3RhdGVTdHJpbmcgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXN0b3JlZFN0YXRlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXRlID0gU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmVkU3RhdGVTdHJpbmcpO1xyXG5cclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgc3RhdGUgZnJvbSBzdG9yYWdlOyB2YWxpZGF0aW5nIHJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yLnZhbGlkYXRlU2lnbm91dFJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJTdGFsZVN0YXRlKHN0YXRlU3RvcmUpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJPaWRjQ2xpZW50LmNsZWFyU3RhbGVTdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFN0YXRlLmNsZWFyU3RhbGVTdGF0ZShzdGF0ZVN0b3JlLCB0aGlzLnNldHRpbmdzLnN0YWxlU3RhdGVBZ2UpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9PaWRjQ2xpZW50LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBXZWJTdG9yYWdlU3RhdGVTdG9yZSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJztcclxuaW1wb3J0IFJlc3BvbnNlVmFsaWRhdG9yIGZyb20gJy4vUmVzcG9uc2VWYWxpZGF0b3InO1xyXG5pbXBvcnQgTWV0YWRhdGFTZXJ2aWNlIGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlJztcclxuXHJcbmNvbnN0IE9pZGNNZXRhZGF0YVVybFBhdGggPSAnLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xyXG5cclxuY29uc3QgRGVmYXVsdFJlc3BvbnNlVHlwZSA9IFwiaWRfdG9rZW5cIjtcclxuY29uc3QgRGVmYXVsdFNjb3BlID0gXCJvcGVuaWRcIjtcclxuY29uc3QgRGVmYXVsdFN0YWxlU3RhdGVBZ2UgPSA2MCAqIDU7IC8vIHNlY29uZHNcclxuY29uc3QgRGVmYXVsdENsb2NrU2tld0luU2Vjb25kcyA9IDYwICogNTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9pZGNDbGllbnRTZXR0aW5ncyB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7XHJcbiAgICAgICAgLy8gbWV0YWRhdGEgcmVsYXRlZFxyXG4gICAgICAgIGF1dGhvcml0eSwgbWV0YWRhdGFVcmwsIG1ldGFkYXRhLCBzaWduaW5nS2V5cyxcclxuICAgICAgICAvLyBjbGllbnQgcmVsYXRlZFxyXG4gICAgICAgIGNsaWVudF9pZCwgY2xpZW50X3NlY3JldCwgcmVzcG9uc2VfdHlwZSA9IERlZmF1bHRSZXNwb25zZVR5cGUsIHNjb3BlID0gRGVmYXVsdFNjb3BlLFxyXG4gICAgICAgIHJlZGlyZWN0X3VyaSwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgIC8vIG9wdGlvbmFsIHByb3RvY29sXHJcbiAgICAgICAgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBhY3JfdmFsdWVzLCByZXNvdXJjZSxcclxuICAgICAgICAvLyBiZWhhdmlvciBmbGFnc1xyXG4gICAgICAgIGZpbHRlclByb3RvY29sQ2xhaW1zID0gdHJ1ZSwgbG9hZFVzZXJJbmZvID0gdHJ1ZSxcclxuICAgICAgICBzdGFsZVN0YXRlQWdlID0gRGVmYXVsdFN0YWxlU3RhdGVBZ2UsIGNsb2NrU2tldyA9IERlZmF1bHRDbG9ja1NrZXdJblNlY29uZHMsXHJcbiAgICAgICAgLy8gb3RoZXIgYmVoYXZpb3JcclxuICAgICAgICBzdGF0ZVN0b3JlID0gbmV3IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlKCksXHJcbiAgICAgICAgUmVzcG9uc2VWYWxpZGF0b3JDdG9yID0gUmVzcG9uc2VWYWxpZGF0b3IsXHJcbiAgICAgICAgTWV0YWRhdGFTZXJ2aWNlQ3RvciA9IE1ldGFkYXRhU2VydmljZSxcclxuICAgICAgICAvLyBleHRyYSBxdWVyeSBwYXJhbXNcclxuICAgICAgICBleHRyYVF1ZXJ5UGFyYW1zID0ge31cclxuICAgIH0gPSB7fSkge1xyXG5cclxuICAgICAgICB0aGlzLl9hdXRob3JpdHkgPSBhdXRob3JpdHk7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSBtZXRhZGF0YVVybDtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhO1xyXG4gICAgICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gc2lnbmluZ0tleXM7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcclxuICAgICAgICB0aGlzLl9jbGllbnRfc2VjcmV0ID0gY2xpZW50X3NlY3JldDtcclxuICAgICAgICB0aGlzLl9yZXNwb25zZV90eXBlID0gcmVzcG9uc2VfdHlwZTtcclxuICAgICAgICB0aGlzLl9zY29wZSA9IHNjb3BlO1xyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb21wdCA9IHByb21wdDtcclxuICAgICAgICB0aGlzLl9kaXNwbGF5ID0gZGlzcGxheTtcclxuICAgICAgICB0aGlzLl9tYXhfYWdlID0gbWF4X2FnZTtcclxuICAgICAgICB0aGlzLl91aV9sb2NhbGVzID0gdWlfbG9jYWxlcztcclxuICAgICAgICB0aGlzLl9hY3JfdmFsdWVzID0gYWNyX3ZhbHVlcztcclxuICAgICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xyXG5cclxuICAgICAgICB0aGlzLl9maWx0ZXJQcm90b2NvbENsYWltcyA9ICEhZmlsdGVyUHJvdG9jb2xDbGFpbXM7XHJcbiAgICAgICAgdGhpcy5fbG9hZFVzZXJJbmZvID0gISFsb2FkVXNlckluZm87XHJcbiAgICAgICAgdGhpcy5fc3RhbGVTdGF0ZUFnZSA9IHN0YWxlU3RhdGVBZ2U7XHJcbiAgICAgICAgdGhpcy5fY2xvY2tTa2V3ID0gY2xvY2tTa2V3O1xyXG5cclxuICAgICAgICB0aGlzLl9zdGF0ZVN0b3JlID0gc3RhdGVTdG9yZTtcclxuICAgICAgICB0aGlzLl92YWxpZGF0b3IgPSBuZXcgUmVzcG9uc2VWYWxpZGF0b3JDdG9yKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLl9leHRyYVF1ZXJ5UGFyYW1zID0gdHlwZW9mIGV4dHJhUXVlcnlQYXJhbXMgPT09ICdvYmplY3QnID8gZXh0cmFRdWVyeVBhcmFtcyA6IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNsaWVudCBjb25maWdcclxuICAgIGdldCBjbGllbnRfaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudF9pZDtcclxuICAgIH1cclxuICAgIHNldCBjbGllbnRfaWQodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NsaWVudF9pZCkge1xyXG4gICAgICAgICAgICAvLyBvbmUtdGltZSBzZXQgb25seVxyXG4gICAgICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcImNsaWVudF9pZCBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjbGllbnRfaWQgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgY2xpZW50X3NlY3JldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X3NlY3JldDtcclxuICAgIH1cclxuICAgIGdldCByZXNwb25zZV90eXBlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNwb25zZV90eXBlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHNjb3BlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY29wZTtcclxuICAgIH1cclxuICAgIGdldCByZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuICAgIGdldCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gb3B0aW9uYWwgcHJvdG9jb2wgcGFyYW1zXHJcbiAgICBnZXQgcHJvbXB0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9tcHQ7XHJcbiAgICB9XHJcbiAgICBnZXQgZGlzcGxheSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGxheTtcclxuICAgIH1cclxuICAgIGdldCBtYXhfYWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhfYWdlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHVpX2xvY2FsZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VpX2xvY2FsZXM7XHJcbiAgICB9XHJcbiAgICBnZXQgYWNyX3ZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWNyX3ZhbHVlcztcclxuICAgIH1cclxuICAgIGdldCByZXNvdXJjZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIG1ldGFkYXRhXHJcbiAgICBnZXQgYXV0aG9yaXR5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRob3JpdHk7XHJcbiAgICB9XHJcbiAgICBzZXQgYXV0aG9yaXR5KHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9hdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgLy8gb25lLXRpbWUgc2V0IG9ubHlcclxuICAgICAgICAgICAgdGhpcy5fYXV0aG9yaXR5ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJhdXRob3JpdHkgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXR5IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhVXJsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbWV0YWRhdGFVcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSB0aGlzLmF1dGhvcml0eTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybCAmJiB0aGlzLl9tZXRhZGF0YVVybC5pbmRleE9mKE9pZGNNZXRhZGF0YVVybFBhdGgpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21ldGFkYXRhVXJsW3RoaXMuX21ldGFkYXRhVXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSAnLyc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSBPaWRjTWV0YWRhdGFVcmxQYXRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFVcmw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2V0dGFibGUvY2FjaGFibGUgbWV0YWRhdGEgdmFsdWVzXHJcbiAgICBnZXQgbWV0YWRhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhO1xyXG4gICAgfVxyXG4gICAgc2V0IG1ldGFkYXRhKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lnbmluZ0tleXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbmdLZXlzO1xyXG4gICAgfVxyXG4gICAgc2V0IHNpZ25pbmdLZXlzKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fc2lnbmluZ0tleXMgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBiZWhhdmlvciBmbGFnc1xyXG4gICAgZ2V0IGZpbHRlclByb3RvY29sQ2xhaW1zKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJQcm90b2NvbENsYWltcztcclxuICAgIH1cclxuICAgIGdldCBsb2FkVXNlckluZm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VySW5mbztcclxuICAgIH1cclxuICAgIGdldCBzdGFsZVN0YXRlQWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFsZVN0YXRlQWdlO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNsb2NrU2tldygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvY2tTa2V3O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzdGF0ZVN0b3JlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZVN0b3JlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHZhbGlkYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yO1xyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhU2VydmljZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGV4dHJhIHF1ZXJ5IHBhcmFtc1xyXG4gICAgZ2V0IGV4dHJhUXVlcnlQYXJhbXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4dHJhUXVlcnlQYXJhbXM7XHJcbiAgICB9XHJcbiAgICBzZXQgZXh0cmFRdWVyeVBhcmFtcyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKXtcclxuICAgICAgICAgICAgdGhpcy5fZXh0cmFRdWVyeVBhcmFtcyA9IHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhUXVlcnlQYXJhbXMgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL09pZGNDbGllbnRTZXR0aW5ncy5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYlN0b3JhZ2VTdGF0ZVN0b3JlIHtcclxuICAgIGNvbnN0cnVjdG9yKHtwcmVmaXggPSBcIm9pZGMuXCIsIHN0b3JlID0gR2xvYmFsLmxvY2FsU3RvcmFnZX0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XHJcbiAgICAgICAgdGhpcy5fcHJlZml4ID0gcHJlZml4O1xyXG4gICAgfVxyXG5cclxuICAgIHNldChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuc2V0XCIsIGtleSk7XHJcblxyXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvcmUuc2V0SXRlbShrZXksIHZhbHVlKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGtleSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLmdldFwiLCBrZXkpO1xyXG5cclxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XHJcblxyXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5fc3RvcmUuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlKGtleSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLnJlbW92ZVwiLCBrZXkpO1xyXG5cclxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XHJcblxyXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5fc3RvcmUuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIHRoaXMuX3N0b3JlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbEtleXMoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuZ2V0QWxsS2V5c1wiKTtcclxuXHJcbiAgICAgICAgdmFyIGtleXMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX3N0b3JlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5fc3RvcmUua2V5KGluZGV4KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZih0aGlzLl9wcmVmaXgpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5LnN1YnN0cih0aGlzLl9wcmVmaXgubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShrZXlzKTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvV2ViU3RvcmFnZVN0YXRlU3RvcmUuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5jb25zdCB0aW1lciA9IHtcclxuICAgIHNldEludGVydmFsOiBmdW5jdGlvbiAoY2IsIGR1cmF0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHNldEludGVydmFsKGNiLCBkdXJhdGlvbik7XHJcbiAgICB9LFxyXG4gICAgY2xlYXJJbnRlcnZhbDogZnVuY3Rpb24gKGhhbmRsZSkge1xyXG4gICAgICAgIHJldHVybiBjbGVhckludGVydmFsKGhhbmRsZSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5sZXQgdGVzdGluZyA9IGZhbHNlO1xyXG5sZXQgcmVxdWVzdCA9IG51bGw7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHbG9iYWwge1xyXG5cclxuICAgIHN0YXRpYyBfdGVzdGluZygpIHtcclxuICAgICAgICB0ZXN0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGxvY2F0aW9uKCkge1xyXG4gICAgICAgIGlmICghdGVzdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgbG9jYWxTdG9yYWdlKCkge1xyXG4gICAgICAgIGlmICghdGVzdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IHNlc3Npb25TdG9yYWdlKCkge1xyXG4gICAgICAgIGlmICghdGVzdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzZXRYTUxIdHRwUmVxdWVzdChuZXdSZXF1ZXN0KSB7XHJcbiAgICAgICAgcmVxdWVzdCA9IG5ld1JlcXVlc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBYTUxIdHRwUmVxdWVzdCgpIHtcclxuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QgfHwgWE1MSHR0cFJlcXVlc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgdGltZXIoKSB7XHJcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aW1lcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9HbG9iYWwuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IE1ldGFkYXRhU2VydmljZSBmcm9tICcuL01ldGFkYXRhU2VydmljZSc7XHJcbmltcG9ydCBVc2VySW5mb1NlcnZpY2UgZnJvbSAnLi9Vc2VySW5mb1NlcnZpY2UnO1xyXG5pbXBvcnQgRXJyb3JSZXNwb25zZSBmcm9tICcuL0Vycm9yUmVzcG9uc2UnO1xyXG5pbXBvcnQgSm9zZVV0aWwgZnJvbSAnLi9Kb3NlVXRpbCc7XHJcblxyXG5jb25zdCBQcm90b2NvbENsYWltcyA9IFtcIm5vbmNlXCIsIFwiYXRfaGFzaFwiLCBcImlhdFwiLCBcIm5iZlwiLCBcImV4cFwiLCBcImF1ZFwiLCBcImlzc1wiLCBcImNfaGFzaFwiXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc3BvbnNlVmFsaWRhdG9yIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgTWV0YWRhdGFTZXJ2aWNlQ3RvciA9IE1ldGFkYXRhU2VydmljZSwgVXNlckluZm9TZXJ2aWNlQ3RvciA9IFVzZXJJbmZvU2VydmljZSwgam9zZVV0aWwgPSBKb3NlVXRpbCkge1xyXG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2V0dGluZ3MgcGFzc2VkIHRvIFJlc3BvbnNlVmFsaWRhdG9yXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXR0aW5nc1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJJbmZvU2VydmljZSA9IG5ldyBVc2VySW5mb1NlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcclxuICAgICAgICB0aGlzLl9qb3NlVXRpbCA9IGpvc2VVdGlsO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXRlU2lnbmluUmVzcG9uc2Uoc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IudmFsaWRhdGVTaWduaW5SZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NTaWduaW5QYXJhbXMoc3RhdGUsIHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwic3RhdGUgcHJvY2Vzc2VkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVUb2tlbnMoc3RhdGUsIHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInRva2VucyB2YWxpZGF0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc0NsYWltcyhyZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiY2xhaW1zIHByb2Nlc3NlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGVTaWdub3V0UmVzcG9uc2Uoc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IudmFsaWRhdGVTaWdub3V0UmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5pZCAhPT0gcmVzcG9uc2Uuc3RhdGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IHRoZSBzdGF0ZSBtYXRjaGVzLCB0YWtlIHRoZSBzdG9yZWQgZGF0YVxyXG4gICAgICAgIC8vIGFuZCBzZXQgaXQgaW50byB0aGUgcmVzcG9uc2Ugc28gY2FsbGVycyBjYW4gZ2V0IHRoZWlyIHN0YXRlXHJcbiAgICAgICAgLy8gdGhpcyBpcyBpbXBvcnRhbnQgZm9yIGJvdGggc3VjY2VzcyAmIGVycm9yIG91dGNvbWVzXHJcbiAgICAgICAgTG9nLmRlYnVnKFwic3RhdGUgdmFsaWRhdGVkXCIpO1xyXG4gICAgICAgIHJlc3BvbnNlLnN0YXRlID0gc3RhdGUuZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XHJcbiAgICAgICAgICAgIExvZy53YXJuKFwiUmVzcG9uc2Ugd2FzIGVycm9yXCIsIHJlc3BvbnNlLmVycm9yKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBfcHJvY2Vzc1NpZ25pblBhcmFtcyhzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtc1wiKTtcclxuXHJcbiAgICAgICAgaWYgKHN0YXRlLmlkICE9PSByZXNwb25zZS5zdGF0ZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlN0YXRlIGRvZXMgbm90IG1hdGNoXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFzdGF0ZS5jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gY2xpZW50X2lkIG9uIHN0YXRlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gY2xpZW50X2lkIG9uIHN0YXRlXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFzdGF0ZS5hdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXV0aG9yaXR5IG9uIHN0YXRlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gYXV0aG9yaXR5IG9uIHN0YXRlXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlIGF1dGhvcml0eSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgc2lnbmluIHN0YXRlXHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5ID0gc3RhdGUuYXV0aG9yaXR5O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBlbnN1cmUgd2UncmUgdXNpbmcgdGhlIGNvcnJlY3QgYXV0aG9yaXR5IGlmIHRoZSBhdXRob3JpdHkgaXMgbm90IGxvYWRlZCBmcm9tIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSAmJiB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkgIT09IHN0YXRlLmF1dGhvcml0eSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJhdXRob3JpdHkgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImF1dGhvcml0eSBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlIGNsaWVudF9pZCB0byBiZSBsb2FkZWQgZnJvbSB0aGUgc2lnbmluIHN0YXRlXHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkID0gc3RhdGUuY2xpZW50X2lkO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBlbnN1cmUgd2UncmUgdXNpbmcgdGhlIGNvcnJlY3QgY2xpZW50X2lkIGlmIHRoZSBjbGllbnRfaWQgaXMgbm90IGxvYWRlZCBmcm9tIHNpZ25pbiBzdGF0ZVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCAmJiB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQgIT09IHN0YXRlLmNsaWVudF9pZCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJjbGllbnRfaWQgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImNsaWVudF9pZCBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgc3RhdGUgbWF0Y2hlcywgdGFrZSB0aGUgc3RvcmVkIGRhdGFcclxuICAgICAgICAvLyBhbmQgc2V0IGl0IGludG8gdGhlIHJlc3BvbnNlIHNvIGNhbGxlcnMgY2FuIGdldCB0aGVpciBzdGF0ZVxyXG4gICAgICAgIC8vIHRoaXMgaXMgaW1wb3J0YW50IGZvciBib3RoIHN1Y2Nlc3MgJiBlcnJvciBvdXRjb21lc1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcInN0YXRlIHZhbGlkYXRlZFwiKTtcclxuICAgICAgICByZXNwb25zZS5zdGF0ZSA9IHN0YXRlLmRhdGE7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xyXG4gICAgICAgICAgICBMb2cud2FybihcIlJlc3BvbnNlIHdhcyBlcnJvclwiLCByZXNwb25zZS5lcnJvcik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0YXRlLm5vbmNlICYmICFyZXNwb25zZS5pZF90b2tlbikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJFeHBlY3RpbmcgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXN0YXRlLm5vbmNlICYmIHJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vdCBleHBlY3RpbmcgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIF9wcm9jZXNzQ2xhaW1zKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3Byb2Nlc3NDbGFpbXNcIik7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5pc09wZW5JZENvbm5lY3QpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwicmVzcG9uc2UgaXMgT0lEQywgcHJvY2Vzc2luZyBjbGFpbXNcIik7XHJcblxyXG4gICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMocmVzcG9uc2UucHJvZmlsZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubG9hZFVzZXJJbmZvICYmIHJlc3BvbnNlLmFjY2Vzc190b2tlbikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwibG9hZGluZyB1c2VyIGluZm9cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJJbmZvU2VydmljZS5nZXRDbGFpbXMocmVzcG9uc2UuYWNjZXNzX3Rva2VuKS50aGVuKGNsYWltcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBpbmZvIGNsYWltcyByZWNlaXZlZCBmcm9tIHVzZXIgaW5mbyBlbmRwb2ludFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYWltcy5zdWIgIT09IHJlc3BvbnNlLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcInN1YiBmcm9tIHVzZXIgaW5mbyBlbmRwb2ludCBkb2VzIG5vdCBtYXRjaCBzdWIgaW4gYWNjZXNzX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwic3ViIGZyb20gdXNlciBpbmZvIGVuZHBvaW50IGRvZXMgbm90IG1hdGNoIHN1YiBpbiBhY2Nlc3NfdG9rZW5cIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucHJvZmlsZSA9IHRoaXMuX21lcmdlQ2xhaW1zKHJlc3BvbnNlLnByb2ZpbGUsIGNsYWltcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBpbmZvIGNsYWltcyByZWNlaXZlZCwgdXBkYXRlZCBwcm9maWxlOlwiLCByZXNwb25zZS5wcm9maWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJub3QgbG9hZGluZyB1c2VyIGluZm9cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlc3BvbnNlIGlzIG5vdCBPSURDLCBub3QgcHJvY2Vzc2luZyBjbGFpbXNcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBfbWVyZ2VDbGFpbXMoY2xhaW1zMSwgY2xhaW1zMikge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBjbGFpbXMxKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBjbGFpbXMyKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBjbGFpbXMyW25hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRbbmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0W25hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbbmFtZV0uaW5kZXhPZih2YWx1ZSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRbbmFtZV0gIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gW3Jlc3VsdFtuYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIF9maWx0ZXJQcm90b2NvbENsYWltcyhjbGFpbXMpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fZmlsdGVyUHJvdG9jb2xDbGFpbXMsIGluY29taW5nIGNsYWltczpcIiwgY2xhaW1zKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGNsYWltcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMpIHtcclxuICAgICAgICAgICAgUHJvdG9jb2xDbGFpbXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRbdHlwZV07XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwicHJvdG9jb2wgY2xhaW1zIGZpbHRlcmVkXCIsIHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJwcm90b2NvbCBjbGFpbXMgbm90IGZpbHRlcmVkXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZVRva2VucyhzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVUb2tlbnNcIik7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5pZF90b2tlbikge1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFjY2Vzc190b2tlbikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiVmFsaWRhdGluZyBpZF90b2tlbiBhbmQgYWNjZXNzX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuKHN0YXRlLCByZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlZhbGlkYXRpbmcgaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk5vIGlkX3Rva2VuIHRvIHZhbGlkYXRlXCIpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZUlkVG9rZW5BbmRBY2Nlc3NUb2tlbihzdGF0ZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW5cIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFzdGF0ZS5ub25jZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBub25jZSBvbiBzdGF0ZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIG5vbmNlIG9uIHN0YXRlXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IGp3dCA9IHRoaXMuX2pvc2VVdGlsLnBhcnNlSnd0KHJlc3BvbnNlLmlkX3Rva2VuKTtcclxuICAgICAgICBpZiAoIWp3dCB8fCAhand0LmhlYWRlciB8fCAhand0LnBheWxvYWQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIsIGp3dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgaWRfdG9rZW5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0YXRlLm5vbmNlICE9PSBqd3QucGF5bG9hZC5ub25jZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIG5vbmNlIGluIGlkX3Rva2VuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBub25jZSBpbiBpZF90b2tlblwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIga2lkID0gand0LmhlYWRlci5raWQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0SXNzdWVyKCkudGhlbihpc3N1ZXIgPT4ge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZWNlaXZlZCBpc3N1ZXJcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzKCkudGhlbihrZXlzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICgha2V5cykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpZ25pbmcga2V5cyBmcm9tIG1ldGFkYXRhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgc2lnbmluZyBrZXlzXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGtleTtcclxuICAgICAgICAgICAgICAgIGlmICgha2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5cyA9IHRoaXMuX2ZpbHRlckJ5QWxnKGtleXMsIGp3dC5oZWFkZXIuYWxnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBraWQgZm91bmQgaW4gaWRfdG9rZW4gYW5kIG1vcmUgdGhhbiBvbmUga2V5IGZvdW5kIGluIG1ldGFkYXRhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8ga2lkIGZvdW5kIGluIGlkX3Rva2VuIGFuZCBtb3JlIHRoYW4gb25lIGtleSBmb3VuZCBpbiBtZXRhZGF0YVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2lkIGlzIG1hbmRhdG9yeSBvbmx5IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGtleXMgaW4gdGhlIHJlZmVyZW5jZWQgSldLIFNldCBkb2N1bWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cDovL29wZW5pZC5uZXQvc3BlY3Mvb3BlbmlkLWNvbm5lY3QtY29yZS0xXzAuaHRtbCNTaWduaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5cy5maWx0ZXIoa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5raWQgPT09IGtpZDtcclxuICAgICAgICAgICAgICAgICAgICB9KVswXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGtleSBtYXRjaGluZyBraWQgb3IgYWxnIGZvdW5kIGluIHNpZ25pbmcga2V5c1wiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8ga2V5IG1hdGNoaW5nIGtpZCBvciBhbGcgZm91bmQgaW4gc2lnbmluZyBrZXlzXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgYXVkaWVuY2UgPSBzdGF0ZS5jbGllbnRfaWQ7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBjbG9ja1NrZXdJblNlY29uZHMgPSB0aGlzLl9zZXR0aW5ncy5jbG9ja1NrZXc7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJWYWxpZGFpbmcgSldUOyB1c2luZyBjbG9jayBza2V3IChpbiBzZWNvbmRzKSBvZjogXCIsIGNsb2NrU2tld0luU2Vjb25kcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pvc2VVdGlsLnZhbGlkYXRlSnd0KHJlc3BvbnNlLmlkX3Rva2VuLCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tld0luU2Vjb25kcykudGhlbigoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkpXVCB2YWxpZGF0aW9uIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqd3QucGF5bG9hZC5zdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc3ViIHByZXNlbnQgaW4gaWRfdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzdWIgcHJlc2VudCBpbiBpZF90b2tlblwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gand0LnBheWxvYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9maWx0ZXJCeUFsZyhrZXlzLCBhbGcpe1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9maWx0ZXJCeUFsZ1wiLCBhbGcpO1xyXG5cclxuICAgICAgICB2YXIga3R5ID0gbnVsbDtcclxuICAgICAgICBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJSU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIlJTQVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhbGcuc3RhcnRzV2l0aChcIlBTXCIpKSB7XHJcbiAgICAgICAgICAgIGt0eSA9IFwiUFNcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJFU1wiKSkge1xyXG4gICAgICAgICAgICBrdHkgPSBcIkVDXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJhbGcgbm90IHN1cHBvcnRlZDogXCIsIGFsZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTG9va2luZyBmb3Iga2V5cyB0aGF0IG1hdGNoIGt0eTogXCIsIGt0eSk7XHJcblxyXG4gICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrZXkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ga2V5Lmt0eSA9PT0ga3R5O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBMb2cuZGVidWcoXCJOdW1iZXIgb2Yga2V5cyB0aGF0IG1hdGNoIGt0eTogXCIsIGt0eSwga2V5cy5sZW5ndGgpO1xyXG5cclxuICAgICAgICByZXR1cm4ga2V5cztcclxuICAgIH1cclxuXHJcbiAgICBfdmFsaWRhdGVBY2Nlc3NUb2tlbihyZXNwb25zZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuXCIpO1xyXG5cclxuICAgICAgICBpZiAoIXJlc3BvbnNlLnByb2ZpbGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcHJvZmlsZSBsb2FkZWQgZnJvbSBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHByb2ZpbGUgbG9hZGVkIGZyb20gaWRfdG9rZW5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5wcm9maWxlLmF0X2hhc2gpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXRfaGFzaCBpbiBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF0X2hhc2ggaW4gaWRfdG9rZW5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5pZF90b2tlbikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBpZF90b2tlblwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGlkX3Rva2VuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXNwb25zZS5pZF90b2tlbik7XHJcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIsIGp3dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgaWRfdG9rZW5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGhhc2hBbGcgPSBqd3QuaGVhZGVyLmFsZztcclxuICAgICAgICBpZiAoIWhhc2hBbGcgfHwgaGFzaEFsZy5sZW5ndGggIT09IDUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOlwiLCBoYXNoQWxnKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFsZzogXCIgKyBoYXNoQWxnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaGFzaEJpdHMgPSBoYXNoQWxnLnN1YnN0cigyLCAzKTtcclxuICAgICAgICBpZiAoIWhhc2hCaXRzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGFsZzpcIiwgaGFzaEFsZywgaGFzaEJpdHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGhhc2hCaXRzID0gcGFyc2VJbnQoaGFzaEJpdHMpO1xyXG4gICAgICAgIGlmIChoYXNoQml0cyAhPT0gMjU2ICYmIGhhc2hCaXRzICE9PSAzODQgJiYgaGFzaEJpdHMgIT09IDUxMikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6XCIsIGhhc2hBbGcsIGhhc2hCaXRzKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFsZzogXCIgKyBoYXNoQWxnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2hhID0gXCJzaGFcIiArIGhhc2hCaXRzO1xyXG4gICAgICAgIHZhciBoYXNoID0gdGhpcy5fam9zZVV0aWwuaGFzaFN0cmluZyhyZXNwb25zZS5hY2Nlc3NfdG9rZW4sIHNoYSk7XHJcbiAgICAgICAgaWYgKCFoYXNoKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcImFjY2Vzc190b2tlbiBoYXNoIGZhaWxlZDpcIiwgc2hhKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsZWZ0ID0gaGFzaC5zdWJzdHIoMCwgaGFzaC5sZW5ndGggLyAyKTtcclxuICAgICAgICB2YXIgbGVmdF9iNjR1ID0gdGhpcy5fam9zZVV0aWwuaGV4VG9CYXNlNjRVcmwobGVmdCk7XHJcbiAgICAgICAgaWYgKGxlZnRfYjY0dSAhPT0gcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIsIGxlZnRfYjY0dSwgcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgfVxyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1Jlc3BvbnNlVmFsaWRhdG9yLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBKc29uU2VydmljZSBmcm9tICcuL0pzb25TZXJ2aWNlJztcclxuXHJcbmNvbnN0IE9pZGNNZXRhZGF0YVVybFBhdGggPSAnLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0YWRhdGFTZXJ2aWNlIHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBKc29uU2VydmljZUN0b3IgPSBKc29uU2VydmljZSkge1xyXG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2V0dGluZ3MgcGFzc2VkIHRvIE1ldGFkYXRhU2VydmljZVwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0dGluZ3NcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xyXG4gICAgICAgIHRoaXMuX2pzb25TZXJ2aWNlID0gbmV3IEpzb25TZXJ2aWNlQ3RvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtZXRhZGF0YVVybCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX21ldGFkYXRhVXJsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YVVybCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSB0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YVVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybCAmJiB0aGlzLl9tZXRhZGF0YVVybC5pbmRleE9mKE9pZGNNZXRhZGF0YVVybFBhdGgpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybFt0aGlzLl9tZXRhZGF0YVVybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsICs9ICcvJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gT2lkY01ldGFkYXRhVXJsUGF0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhVXJsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1ldGFkYXRhKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRNZXRhZGF0YVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJldHVybmluZyBtZXRhZGF0YSBmcm9tIHNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5tZXRhZGF0YVVybCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhdXRob3JpdHkgb3IgbWV0YWRhdGFVcmwgY29uZmlndXJlZCBvbiBzZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF1dGhvcml0eSBvciBtZXRhZGF0YVVybCBjb25maWd1cmVkIG9uIHNldHRpbmdzXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcImdldHRpbmcgbWV0YWRhdGEgZnJvbVwiLCB0aGlzLm1ldGFkYXRhVXJsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pzb25TZXJ2aWNlLmdldEpzb24odGhpcy5tZXRhZGF0YVVybClcclxuICAgICAgICAgICAgLnRoZW4obWV0YWRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwianNvbiByZWNlaXZlZFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhID0gbWV0YWRhdGE7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRJc3N1ZXIoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldElzc3VlclwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImlzc3VlclwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldEF1dGhvcml6YXRpb25FbmRwb2ludFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImF1dGhvcml6YXRpb25fZW5kcG9pbnRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VXNlckluZm9FbmRwb2ludCgpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0VXNlckluZm9FbmRwb2ludFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcInVzZXJpbmZvX2VuZHBvaW50XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRva2VuRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFRva2VuRW5kcG9pbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJ0b2tlbl9lbmRwb2ludFwiLCB0cnVlKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRDaGVja1Nlc3Npb25JZnJhbWVcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJjaGVja19zZXNzaW9uX2lmcmFtZVwiLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRFbmRTZXNzaW9uRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldEVuZFNlc3Npb25FbmRwb2ludFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImVuZF9zZXNzaW9uX2VuZHBvaW50XCIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFJldm9jYXRpb25FbmRwb2ludCgpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0UmV2b2NhdGlvbkVuZHBvaW50XCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwicmV2b2NhdGlvbl9lbmRwb2ludFwiLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0TWV0YWRhdGFQcm9wZXJ0eShuYW1lLCBvcHRpb25hbD1mYWxzZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5fZ2V0TWV0YWRhdGFQcm9wZXJ0eVwiLCBuYW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGEoKS50aGVuKG1ldGFkYXRhID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwibWV0YWRhdGEgcmVjaWV2ZWRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAobWV0YWRhdGFbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25hbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy53YXJuKFwiTWV0YWRhdGEgZG9lcyBub3QgY29udGFpbiBvcHRpb25hbCBwcm9wZXJ0eSBcIiArIG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJNZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIHByb3BlcnR5IFwiICsgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0YWRhdGEgZG9lcyBub3QgY29udGFpbiBwcm9wZXJ0eSBcIiArIG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFbbmFtZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2lnbmluZ0tleXMoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXMpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmV0dXJuaW5nIHNpZ25pbmdLZXlzIGZyb20gc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJqd2tzX3VyaVwiKS50aGVuKGp3a3NfdXJpID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiandrc191cmkgcmVjZWl2ZWRcIiwgandrc191cmkpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pzb25TZXJ2aWNlLmdldEpzb24oandrc191cmkpLnRoZW4oa2V5U2V0ID0+IHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImtleSBzZXQgcmVjZWl2ZWRcIiwga2V5U2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleVNldC5rZXlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTWlzc2luZyBrZXlzIG9uIGtleXNldFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGtleXMgb24ga2V5c2V0XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzID0ga2V5U2V0LmtleXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9NZXRhZGF0YVNlcnZpY2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKc29uU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihYTUxIdHRwUmVxdWVzdEN0b3IgPSBHbG9iYWwuWE1MSHR0cFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLl9YTUxIdHRwUmVxdWVzdCA9IFhNTEh0dHBSZXF1ZXN0Q3RvcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0SnNvbih1cmwsIHRva2VuKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSnNvblNlcnZpY2UuZ2V0SnNvblwiLCB1cmwpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghdXJsKXtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHBhc3NlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXJsXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdmFyIHJlcSA9IG5ldyB0aGlzLl9YTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICByZXEub3BlbignR0VUJywgdXJsKTtcclxuXHJcbiAgICAgICAgICAgIHJlcS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQsIHN0YXR1c1wiLCByZXEuc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkVycm9yIHBhcnNpbmcgSlNPTiByZXNwb25zZVwiLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHJlcS5zdGF0dXNUZXh0ICsgXCIgKFwiICsgcmVxLnN0YXR1cyArIFwiKVwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwibmV0d29yayBlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihcIk5ldHdvcmsgRXJyb3JcIikpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ0b2tlbiBwYXNzZWQsIHNldHRpbmcgQXV0aG9yaXphdGlvbiBoZWFkZXJcIik7XHJcbiAgICAgICAgICAgICAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyB0b2tlbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlcS5zZW5kKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvSnNvblNlcnZpY2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgSnNvblNlcnZpY2UgZnJvbSAnLi9Kc29uU2VydmljZSc7XHJcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJJbmZvU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBVc2VySW5mb1NlcnZpY2VcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9qc29uU2VydmljZSA9IG5ldyBKc29uU2VydmljZUN0b3IoKTtcclxuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2xhaW1zKHRva2VuKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlckluZm9TZXJ2aWNlLmdldENsYWltc1wiKTtcclxuXHJcbiAgICAgICAgaWYgKCF0b2tlbikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB0b2tlbiBwYXNzZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJBIHRva2VuIGlzIHJlcXVpcmVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0VXNlckluZm9FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwicmVjZWl2ZWQgdXNlcmluZm8gdXJsXCIsIHVybCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbih1cmwsIHRva2VuKS50aGVuKGNsYWltcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJjbGFpbXMgcmVjZWl2ZWRcIiwgY2xhaW1zKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjbGFpbXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9Vc2VySW5mb1NlcnZpY2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVycm9yUmVzcG9uc2UgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7ZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uLCBlcnJvcl91cmksIHN0YXRlfT17fVxyXG4gICAgKSB7XHJcbiAgICAgICAgIGlmICghZXJyb3Ipe1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBlcnJvciBwYXNzZWQgdG8gRXJyb3JSZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXJyb3JcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHN1cGVyKGVycm9yX2Rlc2NyaXB0aW9uIHx8IGVycm9yKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkVycm9yUmVzcG9uc2VcIjsgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgIHRoaXMuZXJyb3JfZGVzY3JpcHRpb24gPSBlcnJvcl9kZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IGVycm9yX3VyaTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0Vycm9yUmVzcG9uc2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgeyBqd3MsIEtFWVVUSUwgYXMgS2V5VXRpbCwgWDUwOSwgY3J5cHRvLCBoZXh0b2I2NHUgfSBmcm9tICdqc3JzYXNpZ24nO1xyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmNvbnN0IEFsbG93ZWRTaWduaW5nQWxncyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLCAnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInLCAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpvc2VVdGlsIHtcclxuXHJcbiAgICBzdGF0aWMgcGFyc2VKd3Qoand0KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSm9zZVV0aWwucGFyc2VKd3RcIik7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHRva2VuID0gandzLkpXUy5wYXJzZShqd3QpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB0b2tlbi5oZWFkZXJPYmosXHJcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB0b2tlbi5wYXlsb2FkT2JqXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdmFsaWRhdGVKd3Qoand0LCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSm9zZVV0aWwudmFsaWRhdGVKd3RcIik7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkua3R5ID09PSBcIlJTQVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmUgJiYga2V5Lm4pIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPSBLZXlVdGlsLmdldEtleShrZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5Lng1YyAmJiBrZXkueDVjLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KFg1MDkuZ2V0UHVibGljS2V5RnJvbUNlcnRQRU0oa2V5Lng1Y1swXSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiUlNBIGtleSBtaXNzaW5nIGtleSBtYXRlcmlhbFwiLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJSU0Ega2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChrZXkua3R5ID09PSBcIkVDXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkuY3J2ICYmIGtleS54ICYmIGtleS55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gS2V5VXRpbC5nZXRLZXkoa2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkVDIGtleSBtaXNzaW5nIGtleSBtYXRlcmlhbFwiLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFQyBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQga2V5IHR5cGVcIiwga2V5ICYmIGtleS5rdHkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGtleSB0eXBlOiBcIiArIGtleSAmJiBrZXkua3R5KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBKb3NlVXRpbC5fdmFsaWRhdGVKd3Qoand0LCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKGUgJiYgZS5tZXNzYWdlIHx8IGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJKV1QgdmFsaWRhdGlvbiBmYWlsZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBfdmFsaWRhdGVKd3Qoand0LCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0XCIpO1xyXG5cclxuICAgICAgICBpZiAoIWNsb2NrU2tldykge1xyXG4gICAgICAgICAgICBjbG9ja1NrZXcgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFub3cpIHtcclxuICAgICAgICAgICAgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBheWxvYWQgPSBKb3NlVXRpbC5wYXJzZUp3dChqd3QpLnBheWxvYWQ7XHJcblxyXG4gICAgICAgIGlmICghcGF5bG9hZC5pc3MpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiaXNzdWVyIHdhcyBub3QgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJpc3N1ZXIgd2FzIG5vdCBwcm92aWRlZFwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXlsb2FkLmlzcyAhPT0gaXNzdWVyKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkludmFsaWQgaXNzdWVyIGluIHRva2VuXCIsIHBheWxvYWQuaXNzKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgaXNzdWVyIGluIHRva2VuOiBcIiArIHBheWxvYWQuaXNzKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXBheWxvYWQuYXVkKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcImF1ZCB3YXMgbm90IHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiYXVkIHdhcyBub3QgcHJvdmlkZWRcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdmFsaWRBdWRpZW5jZSA9IHBheWxvYWQuYXVkID09PSBhdWRpZW5jZSB8fCAoQXJyYXkuaXNBcnJheShwYXlsb2FkLmF1ZCkgJiYgcGF5bG9hZC5hdWQuaW5kZXhPZihhdWRpZW5jZSkgPj0gMCk7IFxyXG4gICAgICAgIGlmICghdmFsaWRBdWRpZW5jZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIGF1ZGllbmNlIGluIHRva2VuXCIsIHBheWxvYWQuYXVkKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgYXVkaWVuY2UgaW4gdG9rZW46IFwiICsgcGF5bG9hZC5hdWQpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsb3dlck5vdyA9IG5vdyArIGNsb2NrU2tldztcclxuICAgICAgICB2YXIgdXBwZXJOb3cgPSBub3cgLSBjbG9ja1NrZXc7XHJcblxyXG4gICAgICAgIGlmICghcGF5bG9hZC5pYXQpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiaWF0IHdhcyBub3QgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJpYXQgd2FzIG5vdCBwcm92aWRlZFwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsb3dlck5vdyA8IHBheWxvYWQuaWF0KSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcImlhdCBpcyBpbiB0aGUgZnV0dXJlXCIsIHBheWxvYWQuaWF0KTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImlhdCBpcyBpbiB0aGUgZnV0dXJlOiBcIiArIHBheWxvYWQuaWF0KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGF5bG9hZC5uYmYgJiYgbG93ZXJOb3cgPCBwYXlsb2FkLm5iZikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJuYmYgaXMgaW4gdGhlIGZ1dHVyZVwiLCBwYXlsb2FkLm5iZik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJuYmYgaXMgaW4gdGhlIGZ1dHVyZTogXCIgKyBwYXlsb2FkLm5iZikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwYXlsb2FkLmV4cCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJleHAgd2FzIG5vdCBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImV4cCB3YXMgbm90IHByb3ZpZGVkXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBheWxvYWQuZXhwIDwgdXBwZXJOb3cpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiZXhwIGlzIGluIHRoZSBwYXN0XCIsIHBheWxvYWQuZXhwKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImV4cCBpcyBpbiB0aGUgcGFzdDpcIiArIHBheWxvYWQuZXhwKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWp3cy5KV1MudmVyaWZ5KGp3dCwga2V5LCBBbGxvd2VkU2lnbmluZ0FsZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwic2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoZSAmJiBlLm1lc3NhZ2UgfHwgZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBoYXNoU3RyaW5nKHZhbHVlLCBhbGcpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJKb3NlVXRpbC5oYXNoU3RyaW5nXCIsIHZhbHVlLCBhbGcpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjcnlwdG8uVXRpbC5oYXNoU3RyaW5nKHZhbHVlLCBhbGcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBoZXhUb0Jhc2U2NFVybCh2YWx1ZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLmhleFRvQmFzZTY0VXJsXCIsIHZhbHVlKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gaGV4dG9iNjR1KHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvSm9zZVV0aWwuanMiLCJcbnZhciBuYXZpZ2F0b3IgPSB7fTtcbm5hdmlnYXRvci51c2VyQWdlbnQgPSBmYWxzZTtcblxudmFyIHdpbmRvdyA9IHt9O1xuLypcbiAqIGpzcnNhc2lnbiA1LjEuMCAoMjAxNi0wOS0wOCkgKGMpIDIwMTAtMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5cbi8qXG55YWhvby1taW4uanNcbkNvcHlyaWdodCAoYykgMjAxMSwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvZGUgbGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlOlxuaHR0cDovL2RldmVsb3Blci55YWhvby5jb20veXVpL2xpY2Vuc2UuaHRtbFxudmVyc2lvbjogMi45LjBcbiovXG5pZih0eXBlb2YgWUFIT089PVwidW5kZWZpbmVkXCJ8fCFZQUhPTyl7dmFyIFlBSE9PPXt9O31ZQUhPTy5uYW1lc3BhY2U9ZnVuY3Rpb24oKXt2YXIgYj1hcmd1bWVudHMsZz1udWxsLGUsYyxmO2ZvcihlPTA7ZTxiLmxlbmd0aDtlPWUrMSl7Zj0oXCJcIitiW2VdKS5zcGxpdChcIi5cIik7Zz1ZQUhPTztmb3IoYz0oZlswXT09XCJZQUhPT1wiKT8xOjA7YzxmLmxlbmd0aDtjPWMrMSl7Z1tmW2NdXT1nW2ZbY11dfHx7fTtnPWdbZltjXV07fX1yZXR1cm4gZzt9O1lBSE9PLmxvZz1mdW5jdGlvbihkLGEsYyl7dmFyIGI9WUFIT08ud2lkZ2V0LkxvZ2dlcjtpZihiJiZiLmxvZyl7cmV0dXJuIGIubG9nKGQsYSxjKTt9ZWxzZXtyZXR1cm4gZmFsc2U7fX07WUFIT08ucmVnaXN0ZXI9ZnVuY3Rpb24oYSxmLGUpe3ZhciBrPVlBSE9PLmVudi5tb2R1bGVzLGMsaixoLGcsZDtpZigha1thXSl7a1thXT17dmVyc2lvbnM6W10sYnVpbGRzOltdfTt9Yz1rW2FdO2o9ZS52ZXJzaW9uO2g9ZS5idWlsZDtnPVlBSE9PLmVudi5saXN0ZW5lcnM7Yy5uYW1lPWE7Yy52ZXJzaW9uPWo7Yy5idWlsZD1oO2MudmVyc2lvbnMucHVzaChqKTtjLmJ1aWxkcy5wdXNoKGgpO2MubWFpbkNsYXNzPWY7Zm9yKGQ9MDtkPGcubGVuZ3RoO2Q9ZCsxKXtnW2RdKGMpO31pZihmKXtmLlZFUlNJT049ajtmLkJVSUxEPWg7fWVsc2V7WUFIT08ubG9nKFwibWFpbkNsYXNzIGlzIHVuZGVmaW5lZCBmb3IgbW9kdWxlIFwiK2EsXCJ3YXJuXCIpO319O1lBSE9PLmVudj1ZQUhPTy5lbnZ8fHttb2R1bGVzOltdLGxpc3RlbmVyczpbXX07WUFIT08uZW52LmdldFZlcnNpb249ZnVuY3Rpb24oYSl7cmV0dXJuIFlBSE9PLmVudi5tb2R1bGVzW2FdfHxudWxsO307WUFIT08uZW52LnBhcnNlVUE9ZnVuY3Rpb24oZCl7dmFyIGU9ZnVuY3Rpb24oaSl7dmFyIGo9MDtyZXR1cm4gcGFyc2VGbG9hdChpLnJlcGxhY2UoL1xcLi9nLGZ1bmN0aW9uKCl7cmV0dXJuKGorKz09MSk/XCJcIjpcIi5cIjt9KSk7fSxoPW5hdmlnYXRvcixnPXtpZTowLG9wZXJhOjAsZ2Vja286MCx3ZWJraXQ6MCxjaHJvbWU6MCxtb2JpbGU6bnVsbCxhaXI6MCxpcGFkOjAsaXBob25lOjAsaXBvZDowLGlvczpudWxsLGFuZHJvaWQ6MCx3ZWJvczowLGNhamE6aCYmaC5jYWphVmVyc2lvbixzZWN1cmU6ZmFsc2Usb3M6bnVsbH0sYz1kfHwobmF2aWdhdG9yJiZuYXZpZ2F0b3IudXNlckFnZW50KSxmPXdpbmRvdyYmd2luZG93LmxvY2F0aW9uLGI9ZiYmZi5ocmVmLGE7Zy5zZWN1cmU9YiYmKGIudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiaHR0cHNcIik9PT0wKTtpZihjKXtpZigoL3dpbmRvd3N8d2luMzIvaSkudGVzdChjKSl7Zy5vcz1cIndpbmRvd3NcIjt9ZWxzZXtpZigoL21hY2ludG9zaC9pKS50ZXN0KGMpKXtnLm9zPVwibWFjaW50b3NoXCI7fWVsc2V7aWYoKC9yaGluby9pKS50ZXN0KGMpKXtnLm9zPVwicmhpbm9cIjt9fX1pZigoL0tIVE1MLykudGVzdChjKSl7Zy53ZWJraXQ9MTt9YT1jLm1hdGNoKC9BcHBsZVdlYktpdFxcLyhbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2cud2Via2l0PWUoYVsxXSk7aWYoLyBNb2JpbGVcXC8vLnRlc3QoYykpe2cubW9iaWxlPVwiQXBwbGVcIjthPWMubWF0Y2goL09TIChbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2E9ZShhWzFdLnJlcGxhY2UoXCJfXCIsXCIuXCIpKTt9Zy5pb3M9YTtnLmlwYWQ9Zy5pcG9kPWcuaXBob25lPTA7YT1jLm1hdGNoKC9pUGFkfGlQb2R8aVBob25lLyk7aWYoYSYmYVswXSl7Z1thWzBdLnRvTG93ZXJDYXNlKCldPWcuaW9zO319ZWxzZXthPWMubWF0Y2goL05va2lhTlteXFwvXSp8QW5kcm9pZCBcXGRcXC5cXGR8d2ViT1NcXC9cXGRcXC5cXGQvKTtpZihhKXtnLm1vYmlsZT1hWzBdO31pZigvd2ViT1MvLnRlc3QoYykpe2cubW9iaWxlPVwiV2ViT1NcIjthPWMubWF0Y2goL3dlYk9TXFwvKFteXFxzXSopOy8pO2lmKGEmJmFbMV0pe2cud2Vib3M9ZShhWzFdKTt9fWlmKC8gQW5kcm9pZC8udGVzdChjKSl7Zy5tb2JpbGU9XCJBbmRyb2lkXCI7YT1jLm1hdGNoKC9BbmRyb2lkIChbXlxcc10qKTsvKTtpZihhJiZhWzFdKXtnLmFuZHJvaWQ9ZShhWzFdKTt9fX1hPWMubWF0Y2goL0Nocm9tZVxcLyhbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2cuY2hyb21lPWUoYVsxXSk7fWVsc2V7YT1jLm1hdGNoKC9BZG9iZUFJUlxcLyhbXlxcc10qKS8pO2lmKGEpe2cuYWlyPWFbMF07fX19aWYoIWcud2Via2l0KXthPWMubWF0Y2goL09wZXJhW1xcc1xcL10oW15cXHNdKikvKTtpZihhJiZhWzFdKXtnLm9wZXJhPWUoYVsxXSk7YT1jLm1hdGNoKC9WZXJzaW9uXFwvKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy5vcGVyYT1lKGFbMV0pO31hPWMubWF0Y2goL09wZXJhIE1pbmlbXjtdKi8pO2lmKGEpe2cubW9iaWxlPWFbMF07fX1lbHNle2E9Yy5tYXRjaCgvTVNJRVxccyhbXjtdKikvKTtpZihhJiZhWzFdKXtnLmllPWUoYVsxXSk7fWVsc2V7YT1jLm1hdGNoKC9HZWNrb1xcLyhbXlxcc10qKS8pO2lmKGEpe2cuZ2Vja289MTthPWMubWF0Y2goL3J2OihbXlxcc1xcKV0qKS8pO2lmKGEmJmFbMV0pe2cuZ2Vja289ZShhWzFdKTt9fX19fX1yZXR1cm4gZzt9O1lBSE9PLmVudi51YT1ZQUhPTy5lbnYucGFyc2VVQSgpOyhmdW5jdGlvbigpe1lBSE9PLm5hbWVzcGFjZShcInV0aWxcIixcIndpZGdldFwiLFwiZXhhbXBsZVwiKTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIFlBSE9PX2NvbmZpZyl7dmFyIGI9WUFIT09fY29uZmlnLmxpc3RlbmVyLGE9WUFIT08uZW52Lmxpc3RlbmVycyxkPXRydWUsYztpZihiKXtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXtpZihhW2NdPT1iKXtkPWZhbHNlO2JyZWFrO319aWYoZCl7YS5wdXNoKGIpO319fX0pKCk7WUFIT08ubGFuZz1ZQUhPTy5sYW5nfHx7fTsoZnVuY3Rpb24oKXt2YXIgZj1ZQUhPTy5sYW5nLGE9T2JqZWN0LnByb3RvdHlwZSxjPVwiW29iamVjdCBBcnJheV1cIixoPVwiW29iamVjdCBGdW5jdGlvbl1cIixpPVwiW29iamVjdCBPYmplY3RdXCIsYj1bXSxnPXtcIiZcIjpcIiZhbXA7XCIsXCI8XCI6XCImbHQ7XCIsXCI+XCI6XCImZ3Q7XCIsJ1wiJzpcIiZxdW90O1wiLFwiJ1wiOlwiJiN4Mjc7XCIsXCIvXCI6XCImI3gyRjtcIixcImBcIjpcIiYjeDYwO1wifSxkPVtcInRvU3RyaW5nXCIsXCJ2YWx1ZU9mXCJdLGU9e2lzQXJyYXk6ZnVuY3Rpb24oail7cmV0dXJuIGEudG9TdHJpbmcuYXBwbHkoaik9PT1jO30saXNCb29sZWFuOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwiYm9vbGVhblwiO30saXNGdW5jdGlvbjpmdW5jdGlvbihqKXtyZXR1cm4odHlwZW9mIGo9PT1cImZ1bmN0aW9uXCIpfHxhLnRvU3RyaW5nLmFwcGx5KGopPT09aDt9LGlzTnVsbDpmdW5jdGlvbihqKXtyZXR1cm4gaj09PW51bGw7fSxpc051bWJlcjpmdW5jdGlvbihqKXtyZXR1cm4gdHlwZW9mIGo9PT1cIm51bWJlclwiJiZpc0Zpbml0ZShqKTt9LGlzT2JqZWN0OmZ1bmN0aW9uKGope3JldHVybihqJiYodHlwZW9mIGo9PT1cIm9iamVjdFwifHxmLmlzRnVuY3Rpb24oaikpKXx8ZmFsc2U7fSxpc1N0cmluZzpmdW5jdGlvbihqKXtyZXR1cm4gdHlwZW9mIGo9PT1cInN0cmluZ1wiO30saXNVbmRlZmluZWQ6ZnVuY3Rpb24oail7cmV0dXJuIHR5cGVvZiBqPT09XCJ1bmRlZmluZWRcIjt9LF9JRUVudW1GaXg6KFlBSE9PLmVudi51YS5pZSk/ZnVuY3Rpb24obCxrKXt2YXIgaixuLG07Zm9yKGo9MDtqPGQubGVuZ3RoO2o9aisxKXtuPWRbal07bT1rW25dO2lmKGYuaXNGdW5jdGlvbihtKSYmbSE9YVtuXSl7bFtuXT1tO319fTpmdW5jdGlvbigpe30sZXNjYXBlSFRNTDpmdW5jdGlvbihqKXtyZXR1cm4gai5yZXBsYWNlKC9bJjw+XCInXFwvYF0vZyxmdW5jdGlvbihrKXtyZXR1cm4gZ1trXTt9KTt9LGV4dGVuZDpmdW5jdGlvbihtLG4sbCl7aWYoIW58fCFtKXt0aHJvdyBuZXcgRXJyb3IoXCJleHRlbmQgZmFpbGVkLCBwbGVhc2UgY2hlY2sgdGhhdCBcIitcImFsbCBkZXBlbmRlbmNpZXMgYXJlIGluY2x1ZGVkLlwiKTt9dmFyIGs9ZnVuY3Rpb24oKXt9LGo7ay5wcm90b3R5cGU9bi5wcm90b3R5cGU7bS5wcm90b3R5cGU9bmV3IGsoKTttLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tO20uc3VwZXJjbGFzcz1uLnByb3RvdHlwZTtpZihuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj09YS5jb25zdHJ1Y3Rvcil7bi5wcm90b3R5cGUuY29uc3RydWN0b3I9bjt9aWYobCl7Zm9yKGogaW4gbCl7aWYoZi5oYXNPd25Qcm9wZXJ0eShsLGopKXttLnByb3RvdHlwZVtqXT1sW2pdO319Zi5fSUVFbnVtRml4KG0ucHJvdG90eXBlLGwpO319LGF1Z21lbnRPYmplY3Q6ZnVuY3Rpb24obixtKXtpZighbXx8IW4pe3Rocm93IG5ldyBFcnJvcihcIkFic29yYiBmYWlsZWQsIHZlcmlmeSBkZXBlbmRlbmNpZXMuXCIpO312YXIgaj1hcmd1bWVudHMsbCxvLGs9alsyXTtpZihrJiZrIT09dHJ1ZSl7Zm9yKGw9MjtsPGoubGVuZ3RoO2w9bCsxKXtuW2pbbF1dPW1baltsXV07fX1lbHNle2ZvcihvIGluIG0pe2lmKGt8fCEobyBpbiBuKSl7bltvXT1tW29dO319Zi5fSUVFbnVtRml4KG4sbSk7fXJldHVybiBuO30sYXVnbWVudFByb3RvOmZ1bmN0aW9uKG0sbCl7aWYoIWx8fCFtKXt0aHJvdyBuZXcgRXJyb3IoXCJBdWdtZW50IGZhaWxlZCwgdmVyaWZ5IGRlcGVuZGVuY2llcy5cIik7fXZhciBqPVttLnByb3RvdHlwZSxsLnByb3RvdHlwZV0saztmb3Ioaz0yO2s8YXJndW1lbnRzLmxlbmd0aDtrPWsrMSl7ai5wdXNoKGFyZ3VtZW50c1trXSk7fWYuYXVnbWVudE9iamVjdC5hcHBseSh0aGlzLGopO3JldHVybiBtO30sZHVtcDpmdW5jdGlvbihqLHApe3ZhciBsLG4scj1bXSx0PVwiey4uLn1cIixrPVwiZigpey4uLn1cIixxPVwiLCBcIixtPVwiID0+IFwiO2lmKCFmLmlzT2JqZWN0KGopKXtyZXR1cm4gaitcIlwiO31lbHNle2lmKGogaW5zdGFuY2VvZiBEYXRlfHwoXCJub2RlVHlwZVwiIGluIGomJlwidGFnTmFtZVwiIGluIGopKXtyZXR1cm4gajt9ZWxzZXtpZihmLmlzRnVuY3Rpb24oaikpe3JldHVybiBrO319fXA9KGYuaXNOdW1iZXIocCkpP3A6MztpZihmLmlzQXJyYXkoaikpe3IucHVzaChcIltcIik7Zm9yKGw9MCxuPWoubGVuZ3RoO2w8bjtsPWwrMSl7aWYoZi5pc09iamVjdChqW2xdKSl7ci5wdXNoKChwPjApP2YuZHVtcChqW2xdLHAtMSk6dCk7fWVsc2V7ci5wdXNoKGpbbF0pO31yLnB1c2gocSk7fWlmKHIubGVuZ3RoPjEpe3IucG9wKCk7fXIucHVzaChcIl1cIik7fWVsc2V7ci5wdXNoKFwie1wiKTtmb3IobCBpbiBqKXtpZihmLmhhc093blByb3BlcnR5KGosbCkpe3IucHVzaChsK20pO2lmKGYuaXNPYmplY3QoaltsXSkpe3IucHVzaCgocD4wKT9mLmR1bXAoaltsXSxwLTEpOnQpO31lbHNle3IucHVzaChqW2xdKTt9ci5wdXNoKHEpO319aWYoci5sZW5ndGg+MSl7ci5wb3AoKTt9ci5wdXNoKFwifVwiKTt9cmV0dXJuIHIuam9pbihcIlwiKTt9LHN1YnN0aXR1dGU6ZnVuY3Rpb24oeCx5LEUsbCl7dmFyIEQsQyxCLEcsdCx1LEY9W10scCx6PXgubGVuZ3RoLEE9XCJkdW1wXCIscj1cIiBcIixxPVwie1wiLG09XCJ9XCIsbix3O2Zvcig7Oyl7RD14Lmxhc3RJbmRleE9mKHEseik7aWYoRDwwKXticmVhazt9Qz14LmluZGV4T2YobSxEKTtpZihEKzE+Qyl7YnJlYWs7fXA9eC5zdWJzdHJpbmcoRCsxLEMpO0c9cDt1PW51bGw7Qj1HLmluZGV4T2Yocik7aWYoQj4tMSl7dT1HLnN1YnN0cmluZyhCKzEpO0c9Ry5zdWJzdHJpbmcoMCxCKTt9dD15W0ddO2lmKEUpe3Q9RShHLHQsdSk7fWlmKGYuaXNPYmplY3QodCkpe2lmKGYuaXNBcnJheSh0KSl7dD1mLmR1bXAodCxwYXJzZUludCh1LDEwKSk7fWVsc2V7dT11fHxcIlwiO249dS5pbmRleE9mKEEpO2lmKG4+LTEpe3U9dS5zdWJzdHJpbmcoNCk7fXc9dC50b1N0cmluZygpO2lmKHc9PT1pfHxuPi0xKXt0PWYuZHVtcCh0LHBhcnNlSW50KHUsMTApKTt9ZWxzZXt0PXc7fX19ZWxzZXtpZighZi5pc1N0cmluZyh0KSYmIWYuaXNOdW1iZXIodCkpe3Q9XCJ+LVwiK0YubGVuZ3RoK1wiLX5cIjtGW0YubGVuZ3RoXT1wO319eD14LnN1YnN0cmluZygwLEQpK3QreC5zdWJzdHJpbmcoQysxKTtpZihsPT09ZmFsc2Upe3o9RC0xO319Zm9yKEQ9Ri5sZW5ndGgtMTtEPj0wO0Q9RC0xKXt4PXgucmVwbGFjZShuZXcgUmVnRXhwKFwifi1cIitEK1wiLX5cIiksXCJ7XCIrRltEXStcIn1cIixcImdcIik7fXJldHVybiB4O30sdHJpbTpmdW5jdGlvbihqKXt0cnl7cmV0dXJuIGoucmVwbGFjZSgvXlxccyt8XFxzKyQvZyxcIlwiKTt9Y2F0Y2goayl7cmV0dXJuIGo7XG59fSxtZXJnZTpmdW5jdGlvbigpe3ZhciBuPXt9LGs9YXJndW1lbnRzLGo9ay5sZW5ndGgsbTtmb3IobT0wO208ajttPW0rMSl7Zi5hdWdtZW50T2JqZWN0KG4sa1ttXSx0cnVlKTt9cmV0dXJuIG47fSxsYXRlcjpmdW5jdGlvbih0LGssdSxuLHApe3Q9dHx8MDtrPWt8fHt9O3ZhciBsPXUscz1uLHEsajtpZihmLmlzU3RyaW5nKHUpKXtsPWtbdV07fWlmKCFsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwibWV0aG9kIHVuZGVmaW5lZFwiKTt9aWYoIWYuaXNVbmRlZmluZWQobikmJiFmLmlzQXJyYXkocykpe3M9W25dO31xPWZ1bmN0aW9uKCl7bC5hcHBseShrLHN8fGIpO307aj0ocCk/c2V0SW50ZXJ2YWwocSx0KTpzZXRUaW1lb3V0KHEsdCk7cmV0dXJue2ludGVydmFsOnAsY2FuY2VsOmZ1bmN0aW9uKCl7aWYodGhpcy5pbnRlcnZhbCl7Y2xlYXJJbnRlcnZhbChqKTt9ZWxzZXtjbGVhclRpbWVvdXQoaik7fX19O30saXNWYWx1ZTpmdW5jdGlvbihqKXtyZXR1cm4oZi5pc09iamVjdChqKXx8Zi5pc1N0cmluZyhqKXx8Zi5pc051bWJlcihqKXx8Zi5pc0Jvb2xlYW4oaikpO319O2YuaGFzT3duUHJvcGVydHk9KGEuaGFzT3duUHJvcGVydHkpP2Z1bmN0aW9uKGosayl7cmV0dXJuIGomJmouaGFzT3duUHJvcGVydHkmJmouaGFzT3duUHJvcGVydHkoayk7fTpmdW5jdGlvbihqLGspe3JldHVybiAhZi5pc1VuZGVmaW5lZChqW2tdKSYmai5jb25zdHJ1Y3Rvci5wcm90b3R5cGVba10hPT1qW2tdO307ZS5hdWdtZW50T2JqZWN0KGYsZSx0cnVlKTtZQUhPTy51dGlsLkxhbmc9ZjtmLmF1Z21lbnQ9Zi5hdWdtZW50UHJvdG87WUFIT08uYXVnbWVudD1mLmF1Z21lbnRQcm90bztZQUhPTy5leHRlbmQ9Zi5leHRlbmQ7fSkoKTtZQUhPTy5yZWdpc3RlcihcInlhaG9vXCIsWUFIT08se3ZlcnNpb246XCIyLjkuMFwiLGJ1aWxkOlwiMjgwMFwifSk7XG5cbi8qISBDcnlwdG9KUyB2My4xLjIgY29yZS1maXguanNcbiAqIGNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuICogKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4gKiBUSElTIElTIEZJWCBvZiAnY29yZS5qcycgdG8gZml4IEhtYWMgaXNzdWUuXG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy9pc3N1ZXMvZGV0YWlsP2lkPTg0XG4gKiBodHRwczovL2NyeXB0by1qcy5nb29nbGVjb2RlLmNvbS9zdm4taGlzdG9yeS9yNjY3L2JyYW5jaGVzLzMueC9zcmMvY29yZS5qc1xuICovXG52YXIgQ3J5cHRvSlM9Q3J5cHRvSlN8fChmdW5jdGlvbihlLGcpe3ZhciBhPXt9O3ZhciBiPWEubGliPXt9O3ZhciBqPWIuQmFzZT0oZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7fXJldHVybntleHRlbmQ6ZnVuY3Rpb24ocCl7bi5wcm90b3R5cGU9dGhpczt2YXIgbz1uZXcgbigpO2lmKHApe28ubWl4SW4ocCl9aWYoIW8uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKXtvLmluaXQ9ZnVuY3Rpb24oKXtvLiRzdXBlci5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19by5pbml0LnByb3RvdHlwZT1vO28uJHN1cGVyPXRoaXM7cmV0dXJuIG99LGNyZWF0ZTpmdW5jdGlvbigpe3ZhciBvPXRoaXMuZXh0ZW5kKCk7by5pbml0LmFwcGx5KG8sYXJndW1lbnRzKTtyZXR1cm4gb30saW5pdDpmdW5jdGlvbigpe30sbWl4SW46ZnVuY3Rpb24ocCl7Zm9yKHZhciBvIGluIHApe2lmKHAuaGFzT3duUHJvcGVydHkobykpe3RoaXNbb109cFtvXX19aWYocC5oYXNPd25Qcm9wZXJ0eShcInRvU3RyaW5nXCIpKXt0aGlzLnRvU3RyaW5nPXAudG9TdHJpbmd9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKX19fSgpKTt2YXIgbD1iLldvcmRBcnJheT1qLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihvLG4pe289dGhpcy53b3Jkcz1vfHxbXTtpZihuIT1nKXt0aGlzLnNpZ0J5dGVzPW59ZWxzZXt0aGlzLnNpZ0J5dGVzPW8ubGVuZ3RoKjR9fSx0b1N0cmluZzpmdW5jdGlvbihuKXtyZXR1cm4obnx8aCkuc3RyaW5naWZ5KHRoaXMpfSxjb25jYXQ6ZnVuY3Rpb24odCl7dmFyIHE9dGhpcy53b3Jkczt2YXIgcD10LndvcmRzO3ZhciBuPXRoaXMuc2lnQnl0ZXM7dmFyIHM9dC5zaWdCeXRlczt0aGlzLmNsYW1wKCk7aWYobiU0KXtmb3IodmFyIHI9MDtyPHM7cisrKXt2YXIgbz0ocFtyPj4+Ml0+Pj4oMjQtKHIlNCkqOCkpJjI1NTtxWyhuK3IpPj4+Ml18PW88PCgyNC0oKG4rciklNCkqOCl9fWVsc2V7Zm9yKHZhciByPTA7cjxzO3IrPTQpe3FbKG4rcik+Pj4yXT1wW3I+Pj4yXX19dGhpcy5zaWdCeXRlcys9cztyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLndvcmRzO3ZhciBuPXRoaXMuc2lnQnl0ZXM7b1tuPj4+Ml0mPTQyOTQ5NjcyOTU8PCgzMi0obiU0KSo4KTtvLmxlbmd0aD1lLmNlaWwobi80KX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgbj1qLmNsb25lLmNhbGwodGhpcyk7bi53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApO3JldHVybiBufSxyYW5kb206ZnVuY3Rpb24ocCl7dmFyIG89W107Zm9yKHZhciBuPTA7bjxwO24rPTQpe28ucHVzaCgoZS5yYW5kb20oKSo0Mjk0OTY3Mjk2KXwwKX1yZXR1cm4gbmV3IGwuaW5pdChvLHApfX0pO3ZhciBtPWEuZW5jPXt9O3ZhciBoPW0uSGV4PXtzdHJpbmdpZnk6ZnVuY3Rpb24ocCl7dmFyIHI9cC53b3Jkczt2YXIgbz1wLnNpZ0J5dGVzO3ZhciBxPVtdO2Zvcih2YXIgbj0wO248bztuKyspe3ZhciBzPShyW24+Pj4yXT4+PigyNC0obiU0KSo4KSkmMjU1O3EucHVzaCgocz4+PjQpLnRvU3RyaW5nKDE2KSk7cS5wdXNoKChzJjE1KS50b1N0cmluZygxNikpfXJldHVybiBxLmpvaW4oXCJcIil9LHBhcnNlOmZ1bmN0aW9uKHApe3ZhciBuPXAubGVuZ3RoO3ZhciBxPVtdO2Zvcih2YXIgbz0wO288bjtvKz0yKXtxW28+Pj4zXXw9cGFyc2VJbnQocC5zdWJzdHIobywyKSwxNik8PCgyNC0obyU4KSo0KX1yZXR1cm4gbmV3IGwuaW5pdChxLG4vMil9fTt2YXIgZD1tLkxhdGluMT17c3RyaW5naWZ5OmZ1bmN0aW9uKHEpe3ZhciByPXEud29yZHM7dmFyIHA9cS5zaWdCeXRlczt2YXIgbj1bXTtmb3IodmFyIG89MDtvPHA7bysrKXt2YXIgcz0ocltvPj4+Ml0+Pj4oMjQtKG8lNCkqOCkpJjI1NTtuLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShzKSl9cmV0dXJuIG4uam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24ocCl7dmFyIG49cC5sZW5ndGg7dmFyIHE9W107Zm9yKHZhciBvPTA7bzxuO28rKyl7cVtvPj4+Ml18PShwLmNoYXJDb2RlQXQobykmMjU1KTw8KDI0LShvJTQpKjgpfXJldHVybiBuZXcgbC5pbml0KHEsbil9fTt2YXIgYz1tLlV0Zjg9e3N0cmluZ2lmeTpmdW5jdGlvbihuKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZC5zdHJpbmdpZnkobikpKX1jYXRjaChvKXt0aHJvdyBuZXcgRXJyb3IoXCJNYWxmb3JtZWQgVVRGLTggZGF0YVwiKX19LHBhcnNlOmZ1bmN0aW9uKG4pe3JldHVybiBkLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChuKSkpfX07dmFyIGk9Yi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtPWouZXh0ZW5kKHtyZXNldDpmdW5jdGlvbigpe3RoaXMuX2RhdGE9bmV3IGwuaW5pdCgpO3RoaXMuX25EYXRhQnl0ZXM9MH0sX2FwcGVuZDpmdW5jdGlvbihuKXtpZih0eXBlb2Ygbj09XCJzdHJpbmdcIil7bj1jLnBhcnNlKG4pfXRoaXMuX2RhdGEuY29uY2F0KG4pO3RoaXMuX25EYXRhQnl0ZXMrPW4uc2lnQnl0ZXN9LF9wcm9jZXNzOmZ1bmN0aW9uKHcpe3ZhciBxPXRoaXMuX2RhdGE7dmFyIHg9cS53b3Jkczt2YXIgbj1xLnNpZ0J5dGVzO3ZhciB0PXRoaXMuYmxvY2tTaXplO3ZhciB2PXQqNDt2YXIgdT1uL3Y7aWYodyl7dT1lLmNlaWwodSl9ZWxzZXt1PWUubWF4KCh1fDApLXRoaXMuX21pbkJ1ZmZlclNpemUsMCl9dmFyIHM9dSp0O3ZhciByPWUubWluKHMqNCxuKTtpZihzKXtmb3IodmFyIHA9MDtwPHM7cCs9dCl7dGhpcy5fZG9Qcm9jZXNzQmxvY2soeCxwKX12YXIgbz14LnNwbGljZSgwLHMpO3Euc2lnQnl0ZXMtPXJ9cmV0dXJuIG5ldyBsLmluaXQobyxyKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgbj1qLmNsb25lLmNhbGwodGhpcyk7bi5fZGF0YT10aGlzLl9kYXRhLmNsb25lKCk7cmV0dXJuIG59LF9taW5CdWZmZXJTaXplOjB9KTt2YXIgZj1iLkhhc2hlcj1pLmV4dGVuZCh7Y2ZnOmouZXh0ZW5kKCksaW5pdDpmdW5jdGlvbihuKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQobik7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe2kucmVzZXQuY2FsbCh0aGlzKTt0aGlzLl9kb1Jlc2V0KCl9LHVwZGF0ZTpmdW5jdGlvbihuKXt0aGlzLl9hcHBlbmQobik7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbihuKXtpZihuKXt0aGlzLl9hcHBlbmQobil9dmFyIG89dGhpcy5fZG9GaW5hbGl6ZSgpO3JldHVybiBvfSxibG9ja1NpemU6NTEyLzMyLF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHAsbyl7cmV0dXJuIG5ldyBuLmluaXQobykuZmluYWxpemUocCl9fSxfY3JlYXRlSG1hY0hlbHBlcjpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24ocCxvKXtyZXR1cm4gbmV3IGsuSE1BQy5pbml0KG4sbykuZmluYWxpemUocCl9fX0pO3ZhciBrPWEuYWxnbz17fTtyZXR1cm4gYX0oTWF0aCkpO1xuLypcbkNyeXB0b0pTIHYzLjEuMiB4NjQtY29yZS1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKGcpe3ZhciBhPUNyeXB0b0pTLGY9YS5saWIsZT1mLkJhc2UsaD1mLldvcmRBcnJheSxhPWEueDY0PXt9O2EuV29yZD1lLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihiLGMpe3RoaXMuaGlnaD1iO3RoaXMubG93PWN9fSk7YS5Xb3JkQXJyYXk9ZS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYixjKXtiPXRoaXMud29yZHM9Ynx8W107dGhpcy5zaWdCeXRlcz1jIT1nP2M6OCpiLmxlbmd0aH0sdG9YMzI6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy53b3JkcyxjPWIubGVuZ3RoLGE9W10sZD0wO2Q8YztkKyspe3ZhciBlPWJbZF07YS5wdXNoKGUuaGlnaCk7YS5wdXNoKGUubG93KX1yZXR1cm4gaC5jcmVhdGUoYSx0aGlzLnNpZ0J5dGVzKX0sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZS5jbG9uZS5jYWxsKHRoaXMpLGM9Yi53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApLGE9Yy5sZW5ndGgsZD0wO2Q8YTtkKyspY1tkXT1jW2RdLmNsb25lKCk7cmV0dXJuIGJ9fSl9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIGNpcGhlci1jb3JlLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbkNyeXB0b0pTLmxpYi5DaXBoZXJ8fGZ1bmN0aW9uKHUpe3ZhciBnPUNyeXB0b0pTLGY9Zy5saWIsaz1mLkJhc2UsbD1mLldvcmRBcnJheSxxPWYuQnVmZmVyZWRCbG9ja0FsZ29yaXRobSxyPWcuZW5jLkJhc2U2NCx2PWcuYWxnby5FdnBLREYsbj1mLkNpcGhlcj1xLmV4dGVuZCh7Y2ZnOmsuZXh0ZW5kKCksY3JlYXRlRW5jcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0VOQ19YRk9STV9NT0RFLGEsYil9LGNyZWF0ZURlY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9ERUNfWEZPUk1fTU9ERSxhLGIpfSxpbml0OmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQoYyk7dGhpcy5feGZvcm1Nb2RlPWE7dGhpcy5fa2V5PWI7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3EucmVzZXQuY2FsbCh0aGlzKTt0aGlzLl9kb1Jlc2V0KCl9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dGhpcy5fYXBwZW5kKGEpO1xucmV0dXJuIHRoaXMuX3Byb2Nlc3MoKX0sZmluYWxpemU6ZnVuY3Rpb24oYSl7YSYmdGhpcy5fYXBwZW5kKGEpO3JldHVybiB0aGlzLl9kb0ZpbmFsaXplKCl9LGtleVNpemU6NCxpdlNpemU6NCxfRU5DX1hGT1JNX01PREU6MSxfREVDX1hGT1JNX01PREU6MixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKGEpe3JldHVybntlbmNyeXB0OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4oXCJzdHJpbmdcIj09dHlwZW9mIGM/czpqKS5lbmNyeXB0KGEsYixjLGQpfSxkZWNyeXB0OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4oXCJzdHJpbmdcIj09dHlwZW9mIGM/czpqKS5kZWNyeXB0KGEsYixjLGQpfX19fSk7Zi5TdHJlYW1DaXBoZXI9bi5leHRlbmQoe19kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2Nlc3MoITApfSxibG9ja1NpemU6MX0pO3ZhciBtPWcubW9kZT17fSx0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9pdjtkP3RoaXMuX2l2PXU6ZD10aGlzLl9wcmV2QmxvY2s7Zm9yKHZhciBlPVxuMDtlPGM7ZSsrKWFbYitlXV49ZFtlXX0saD0oZi5CbG9ja0NpcGhlck1vZGU9ay5leHRlbmQoe2NyZWF0ZUVuY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkVuY3J5cHRvci5jcmVhdGUoYSxiKX0sY3JlYXRlRGVjcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuRGVjcnlwdG9yLmNyZWF0ZShhLGIpfSxpbml0OmZ1bmN0aW9uKGEsYil7dGhpcy5fY2lwaGVyPWE7dGhpcy5faXY9Yn19KSkuZXh0ZW5kKCk7aC5FbmNyeXB0b3I9aC5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2NpcGhlcixkPWMuYmxvY2tTaXplO3QuY2FsbCh0aGlzLGEsYixkKTtjLmVuY3J5cHRCbG9jayhhLGIpO3RoaXMuX3ByZXZCbG9jaz1hLnNsaWNlKGIsYitkKX19KTtoLkRlY3J5cHRvcj1oLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2lwaGVyLGQ9Yy5ibG9ja1NpemUsZT1hLnNsaWNlKGIsYitkKTtjLmRlY3J5cHRCbG9jayhhLFxuYik7dC5jYWxsKHRoaXMsYSxiLGQpO3RoaXMuX3ByZXZCbG9jaz1lfX0pO209bS5DQkM9aDtoPShnLnBhZD17fSkuUGtjczc9e3BhZDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz00KmIsYz1jLWEuc2lnQnl0ZXMlYyxkPWM8PDI0fGM8PDE2fGM8PDh8YyxlPVtdLGY9MDtmPGM7Zis9NCllLnB1c2goZCk7Yz1sLmNyZWF0ZShlLGMpO2EuY29uY2F0KGMpfSx1bnBhZDpmdW5jdGlvbihhKXthLnNpZ0J5dGVzLT1hLndvcmRzW2Euc2lnQnl0ZXMtMT4+PjJdJjI1NX19O2YuQmxvY2tDaXBoZXI9bi5leHRlbmQoe2NmZzpuLmNmZy5leHRlbmQoe21vZGU6bSxwYWRkaW5nOmh9KSxyZXNldDpmdW5jdGlvbigpe24ucmVzZXQuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmNmZyxiPWEuaXYsYT1hLm1vZGU7aWYodGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERSl2YXIgYz1hLmNyZWF0ZUVuY3J5cHRvcjtlbHNlIGM9YS5jcmVhdGVEZWNyeXB0b3IsdGhpcy5fbWluQnVmZmVyU2l6ZT0xO1xudGhpcy5fbW9kZT1jLmNhbGwoYSx0aGlzLGImJmIud29yZHMpfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxiKXt0aGlzLl9tb2RlLnByb2Nlc3NCbG9jayhhLGIpfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2ZnLnBhZGRpbmc7aWYodGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERSl7YS5wYWQodGhpcy5fZGF0YSx0aGlzLmJsb2NrU2l6ZSk7dmFyIGI9dGhpcy5fcHJvY2VzcyghMCl9ZWxzZSBiPXRoaXMuX3Byb2Nlc3MoITApLGEudW5wYWQoYik7cmV0dXJuIGJ9LGJsb2NrU2l6ZTo0fSk7dmFyIHA9Zi5DaXBoZXJQYXJhbXM9ay5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSl7dGhpcy5taXhJbihhKX0sdG9TdHJpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyl9fSksbT0oZy5mb3JtYXQ9e30pLk9wZW5TU0w9e3N0cmluZ2lmeTpmdW5jdGlvbihhKXt2YXIgYj1hLmNpcGhlcnRleHQ7YT1hLnNhbHQ7XG5yZXR1cm4oYT9sLmNyZWF0ZShbMTM5ODg5MzY4NCwxNzAxMDc2ODMxXSkuY29uY2F0KGEpLmNvbmNhdChiKTpiKS50b1N0cmluZyhyKX0scGFyc2U6ZnVuY3Rpb24oYSl7YT1yLnBhcnNlKGEpO3ZhciBiPWEud29yZHM7aWYoMTM5ODg5MzY4ND09YlswXSYmMTcwMTA3NjgzMT09YlsxXSl7dmFyIGM9bC5jcmVhdGUoYi5zbGljZSgyLDQpKTtiLnNwbGljZSgwLDQpO2Euc2lnQnl0ZXMtPTE2fXJldHVybiBwLmNyZWF0ZSh7Y2lwaGVydGV4dDphLHNhbHQ6Y30pfX0saj1mLlNlcmlhbGl6YWJsZUNpcGhlcj1rLmV4dGVuZCh7Y2ZnOmsuZXh0ZW5kKHtmb3JtYXQ6bX0pLGVuY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7dmFyIGU9YS5jcmVhdGVFbmNyeXB0b3IoYyxkKTtiPWUuZmluYWxpemUoYik7ZT1lLmNmZztyZXR1cm4gcC5jcmVhdGUoe2NpcGhlcnRleHQ6YixrZXk6YyxpdjplLml2LGFsZ29yaXRobTphLG1vZGU6ZS5tb2RlLHBhZGRpbmc6ZS5wYWRkaW5nLFxuYmxvY2tTaXplOmEuYmxvY2tTaXplLGZvcm1hdHRlcjpkLmZvcm1hdH0pfSxkZWNyeXB0OmZ1bmN0aW9uKGEsYixjLGQpe2Q9dGhpcy5jZmcuZXh0ZW5kKGQpO2I9dGhpcy5fcGFyc2UoYixkLmZvcm1hdCk7cmV0dXJuIGEuY3JlYXRlRGVjcnlwdG9yKGMsZCkuZmluYWxpemUoYi5jaXBoZXJ0ZXh0KX0sX3BhcnNlOmZ1bmN0aW9uKGEsYil7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGE/Yi5wYXJzZShhLHRoaXMpOmF9fSksZz0oZy5rZGY9e30pLk9wZW5TU0w9e2V4ZWN1dGU6ZnVuY3Rpb24oYSxiLGMsZCl7ZHx8KGQ9bC5yYW5kb20oOCkpO2E9di5jcmVhdGUoe2tleVNpemU6YitjfSkuY29tcHV0ZShhLGQpO2M9bC5jcmVhdGUoYS53b3Jkcy5zbGljZShiKSw0KmMpO2Euc2lnQnl0ZXM9NCpiO3JldHVybiBwLmNyZWF0ZSh7a2V5OmEsaXY6YyxzYWx0OmR9KX19LHM9Zi5QYXNzd29yZEJhc2VkQ2lwaGVyPWouZXh0ZW5kKHtjZmc6ai5jZmcuZXh0ZW5kKHtrZGY6Z30pLGVuY3J5cHQ6ZnVuY3Rpb24oYSxcbmIsYyxkKXtkPXRoaXMuY2ZnLmV4dGVuZChkKTtjPWQua2RmLmV4ZWN1dGUoYyxhLmtleVNpemUsYS5pdlNpemUpO2QuaXY9Yy5pdjthPWouZW5jcnlwdC5jYWxsKHRoaXMsYSxiLGMua2V5LGQpO2EubWl4SW4oYyk7cmV0dXJuIGF9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7Yj10aGlzLl9wYXJzZShiLGQuZm9ybWF0KTtjPWQua2RmLmV4ZWN1dGUoYyxhLmtleVNpemUsYS5pdlNpemUsYi5zYWx0KTtkLml2PWMuaXY7cmV0dXJuIGouZGVjcnlwdC5jYWxsKHRoaXMsYSxiLGMua2V5LGQpfX0pfSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIGFlcy5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmb3IodmFyIHE9Q3J5cHRvSlMseD1xLmxpYi5CbG9ja0NpcGhlcixyPXEuYWxnbyxqPVtdLHk9W10sej1bXSxBPVtdLEI9W10sQz1bXSxzPVtdLHU9W10sdj1bXSx3PVtdLGc9W10saz0wOzI1Nj5rO2srKylnW2tdPTEyOD5rP2s8PDE6azw8MV4yODM7Zm9yKHZhciBuPTAsbD0wLGs9MDsyNTY+aztrKyspe3ZhciBmPWxebDw8MV5sPDwyXmw8PDNebDw8NCxmPWY+Pj44XmYmMjU1Xjk5O2pbbl09Zjt5W2ZdPW47dmFyIHQ9Z1tuXSxEPWdbdF0sRT1nW0RdLGI9MjU3KmdbZl1eMTY4NDMwMDgqZjt6W25dPWI8PDI0fGI+Pj44O0Fbbl09Yjw8MTZ8Yj4+PjE2O0Jbbl09Yjw8OHxiPj4+MjQ7Q1tuXT1iO2I9MTY4NDMwMDkqRV42NTUzNypEXjI1Nyp0XjE2ODQzMDA4Km47c1tmXT1iPDwyNHxiPj4+ODt1W2ZdPWI8PDE2fGI+Pj4xNjt2W2ZdPWI8PDh8Yj4+PjI0O3dbZl09YjtuPyhuPXReZ1tnW2dbRV50XV1dLGxePWdbZ1tsXV0pOm49bD0xfXZhciBGPVswLDEsMiw0LDgsXG4xNiwzMiw2NCwxMjgsMjcsNTRdLHI9ci5BRVM9eC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBjPXRoaXMuX2tleSxlPWMud29yZHMsYT1jLnNpZ0J5dGVzLzQsYz00KigodGhpcy5fblJvdW5kcz1hKzYpKzEpLGI9dGhpcy5fa2V5U2NoZWR1bGU9W10saD0wO2g8YztoKyspaWYoaDxhKWJbaF09ZVtoXTtlbHNle3ZhciBkPWJbaC0xXTtoJWE/NjxhJiY0PT1oJWEmJihkPWpbZD4+PjI0XTw8MjR8altkPj4+MTYmMjU1XTw8MTZ8altkPj4+OCYyNTVdPDw4fGpbZCYyNTVdKTooZD1kPDw4fGQ+Pj4yNCxkPWpbZD4+PjI0XTw8MjR8altkPj4+MTYmMjU1XTw8MTZ8altkPj4+OCYyNTVdPDw4fGpbZCYyNTVdLGRePUZbaC9hfDBdPDwyNCk7YltoXT1iW2gtYV1eZH1lPXRoaXMuX2ludktleVNjaGVkdWxlPVtdO2ZvcihhPTA7YTxjO2ErKyloPWMtYSxkPWElND9iW2hdOmJbaC00XSxlW2FdPTQ+YXx8ND49aD9kOnNbaltkPj4+MjRdXV51W2pbZD4+PjE2JjI1NV1dXnZbaltkPj4+XG44JjI1NV1dXndbaltkJjI1NV1dfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oYyxlKXt0aGlzLl9kb0NyeXB0QmxvY2soYyxlLHRoaXMuX2tleVNjaGVkdWxlLHosQSxCLEMsail9LGRlY3J5cHRCbG9jazpmdW5jdGlvbihjLGUpe3ZhciBhPWNbZSsxXTtjW2UrMV09Y1tlKzNdO2NbZSszXT1hO3RoaXMuX2RvQ3J5cHRCbG9jayhjLGUsdGhpcy5faW52S2V5U2NoZWR1bGUscyx1LHYsdyx5KTthPWNbZSsxXTtjW2UrMV09Y1tlKzNdO2NbZSszXT1hfSxfZG9DcnlwdEJsb2NrOmZ1bmN0aW9uKGMsZSxhLGIsaCxkLGosbSl7Zm9yKHZhciBuPXRoaXMuX25Sb3VuZHMsZj1jW2VdXmFbMF0sZz1jW2UrMV1eYVsxXSxrPWNbZSsyXV5hWzJdLHA9Y1tlKzNdXmFbM10sbD00LHQ9MTt0PG47dCsrKXZhciBxPWJbZj4+PjI0XV5oW2c+Pj4xNiYyNTVdXmRbaz4+PjgmMjU1XV5qW3AmMjU1XV5hW2wrK10scj1iW2c+Pj4yNF1eaFtrPj4+MTYmMjU1XV5kW3A+Pj44JjI1NV1ealtmJjI1NV1eYVtsKytdLHM9XG5iW2s+Pj4yNF1eaFtwPj4+MTYmMjU1XV5kW2Y+Pj44JjI1NV1ealtnJjI1NV1eYVtsKytdLHA9YltwPj4+MjRdXmhbZj4+PjE2JjI1NV1eZFtnPj4+OCYyNTVdXmpbayYyNTVdXmFbbCsrXSxmPXEsZz1yLGs9cztxPShtW2Y+Pj4yNF08PDI0fG1bZz4+PjE2JjI1NV08PDE2fG1baz4+PjgmMjU1XTw8OHxtW3AmMjU1XSleYVtsKytdO3I9KG1bZz4+PjI0XTw8MjR8bVtrPj4+MTYmMjU1XTw8MTZ8bVtwPj4+OCYyNTVdPDw4fG1bZiYyNTVdKV5hW2wrK107cz0obVtrPj4+MjRdPDwyNHxtW3A+Pj4xNiYyNTVdPDwxNnxtW2Y+Pj44JjI1NV08PDh8bVtnJjI1NV0pXmFbbCsrXTtwPShtW3A+Pj4yNF08PDI0fG1bZj4+PjE2JjI1NV08PDE2fG1bZz4+PjgmMjU1XTw8OHxtW2smMjU1XSleYVtsKytdO2NbZV09cTtjW2UrMV09cjtjW2UrMl09cztjW2UrM109cH0sa2V5U2l6ZTo4fSk7cS5BRVM9eC5fY3JlYXRlSGVscGVyKHIpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiB0cmlwbGVkZXMtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe2Z1bmN0aW9uIGooYixjKXt2YXIgYT0odGhpcy5fbEJsb2NrPj4+Yl50aGlzLl9yQmxvY2spJmM7dGhpcy5fckJsb2NrXj1hO3RoaXMuX2xCbG9ja149YTw8Yn1mdW5jdGlvbiBsKGIsYyl7dmFyIGE9KHRoaXMuX3JCbG9jaz4+PmJedGhpcy5fbEJsb2NrKSZjO3RoaXMuX2xCbG9ja149YTt0aGlzLl9yQmxvY2tePWE8PGJ9dmFyIGg9Q3J5cHRvSlMsZT1oLmxpYixuPWUuV29yZEFycmF5LGU9ZS5CbG9ja0NpcGhlcixnPWguYWxnbyxxPVs1Nyw0OSw0MSwzMywyNSwxNyw5LDEsNTgsNTAsNDIsMzQsMjYsMTgsMTAsMiw1OSw1MSw0MywzNSwyNywxOSwxMSwzLDYwLDUyLDQ0LDM2LDYzLDU1LDQ3LDM5LDMxLDIzLDE1LDcsNjIsNTQsNDYsMzgsMzAsMjIsMTQsNiw2MSw1Myw0NSwzNywyOSwyMSwxMyw1LDI4LDIwLDEyLDRdLHA9WzE0LDE3LDExLDI0LDEsNSwzLDI4LDE1LDYsMjEsMTAsMjMsMTksMTIsNCwyNiw4LDE2LDcsMjcsMjAsMTMsMiw0MSw1MiwzMSwzNyw0NyxcbjU1LDMwLDQwLDUxLDQ1LDMzLDQ4LDQ0LDQ5LDM5LDU2LDM0LDUzLDQ2LDQyLDUwLDM2LDI5LDMyXSxyPVsxLDIsNCw2LDgsMTAsMTIsMTQsMTUsMTcsMTksMjEsMjMsMjUsMjcsMjhdLHM9W3tcIjBcIjo4NDIxODg4LDI2ODQzNTQ1NjozMjc2OCw1MzY4NzA5MTI6ODQyMTM3OCw4MDUzMDYzNjg6MiwxMDczNzQxODI0OjUxMiwxMzQyMTc3MjgwOjg0MjE4OTAsMTYxMDYxMjczNjo4Mzg5MTIyLDE4NzkwNDgxOTI6ODM4ODYwOCwyMTQ3NDgzNjQ4OjUxNCwyNDE1OTE5MTA0OjgzODkxMjAsMjY4NDM1NDU2MDozMzI4MCwyOTUyNzkwMDE2Ojg0MjEzNzYsMzIyMTIyNTQ3MjozMjc3MCwzNDg5NjYwOTI4OjgzODg2MTAsMzc1ODA5NjM4NDowLDQwMjY1MzE4NDA6MzMyODIsMTM0MjE3NzI4OjAsNDAyNjUzMTg0Ojg0MjE4OTAsNjcxMDg4NjQwOjMzMjgyLDkzOTUyNDA5NjozMjc2OCwxMjA3OTU5NTUyOjg0MjE4ODgsMTQ3NjM5NTAwODo1MTIsMTc0NDgzMDQ2NDo4NDIxMzc4LDIwMTMyNjU5MjA6MixcbjIyODE3MDEzNzY6ODM4OTEyMCwyNTUwMTM2ODMyOjMzMjgwLDI4MTg1NzIyODg6ODQyMTM3NiwzMDg3MDA3NzQ0OjgzODkxMjIsMzM1NTQ0MzIwMDo4Mzg4NjEwLDM2MjM4Nzg2NTY6MzI3NzAsMzg5MjMxNDExMjo1MTQsNDE2MDc0OTU2ODo4Mzg4NjA4LDE6MzI3NjgsMjY4NDM1NDU3OjIsNTM2ODcwOTEzOjg0MjE4ODgsODA1MzA2MzY5OjgzODg2MDgsMTA3Mzc0MTgyNTo4NDIxMzc4LDEzNDIxNzcyODE6MzMyODAsMTYxMDYxMjczNzo1MTIsMTg3OTA0ODE5Mzo4Mzg5MTIyLDIxNDc0ODM2NDk6ODQyMTg5MCwyNDE1OTE5MTA1Ojg0MjEzNzYsMjY4NDM1NDU2MTo4Mzg4NjEwLDI5NTI3OTAwMTc6MzMyODIsMzIyMTIyNTQ3Mzo1MTQsMzQ4OTY2MDkyOTo4Mzg5MTIwLDM3NTgwOTYzODU6MzI3NzAsNDAyNjUzMTg0MTowLDEzNDIxNzcyOTo4NDIxODkwLDQwMjY1MzE4NTo4NDIxMzc2LDY3MTA4ODY0MTo4Mzg4NjA4LDkzOTUyNDA5Nzo1MTIsMTIwNzk1OTU1MzozMjc2OCwxNDc2Mzk1MDA5OjgzODg2MTAsXG4xNzQ0ODMwNDY1OjIsMjAxMzI2NTkyMTozMzI4MiwyMjgxNzAxMzc3OjMyNzcwLDI1NTAxMzY4MzM6ODM4OTEyMiwyODE4NTcyMjg5OjUxNCwzMDg3MDA3NzQ1Ojg0MjE4ODgsMzM1NTQ0MzIwMTo4Mzg5MTIwLDM2MjM4Nzg2NTc6MCwzODkyMzE0MTEzOjMzMjgwLDQxNjA3NDk1Njk6ODQyMTM3OH0se1wiMFwiOjEwNzQyODI1MTIsMTY3NzcyMTY6MTYzODQsMzM1NTQ0MzI6NTI0Mjg4LDUwMzMxNjQ4OjEwNzQyNjYxMjgsNjcxMDg4NjQ6MTA3Mzc0MTg0MCw4Mzg4NjA4MDoxMDc0MjgyNDk2LDEwMDY2MzI5NjoxMDczNzU4MjA4LDExNzQ0MDUxMjoxNiwxMzQyMTc3Mjg6NTQwNjcyLDE1MDk5NDk0NDoxMDczNzU4MjI0LDE2Nzc3MjE2MDoxMDczNzQxODI0LDE4NDU0OTM3Njo1NDA2ODgsMjAxMzI2NTkyOjUyNDMwNCwyMTgxMDM4MDg6MCwyMzQ4ODEwMjQ6MTY0MDAsMjUxNjU4MjQwOjEwNzQyNjYxMTIsODM4ODYwODoxMDczNzU4MjA4LDI1MTY1ODI0OjU0MDY4OCw0MTk0MzA0MDoxNiw1ODcyMDI1NjoxMDczNzU4MjI0LFxuNzU0OTc0NzI6MTA3NDI4MjUxMiw5MjI3NDY4ODoxMDczNzQxODI0LDEwOTA1MTkwNDo1MjQyODgsMTI1ODI5MTIwOjEwNzQyNjYxMjgsMTQyNjA2MzM2OjUyNDMwNCwxNTkzODM1NTI6MCwxNzYxNjA3Njg6MTYzODQsMTkyOTM3OTg0OjEwNzQyNjYxMTIsMjA5NzE1MjAwOjEwNzM3NDE4NDAsMjI2NDkyNDE2OjU0MDY3MiwyNDMyNjk2MzI6MTA3NDI4MjQ5NiwyNjAwNDY4NDg6MTY0MDAsMjY4NDM1NDU2OjAsMjg1MjEyNjcyOjEwNzQyNjYxMjgsMzAxOTg5ODg4OjEwNzM3NTgyMjQsMzE4NzY3MTA0OjEwNzQyODI0OTYsMzM1NTQ0MzIwOjEwNzQyNjYxMTIsMzUyMzIxNTM2OjE2LDM2OTA5ODc1Mjo1NDA2ODgsMzg1ODc1OTY4OjE2Mzg0LDQwMjY1MzE4NDoxNjQwMCw0MTk0MzA0MDA6NTI0Mjg4LDQzNjIwNzYxNjo1MjQzMDQsNDUyOTg0ODMyOjEwNzM3NDE4NDAsNDY5NzYyMDQ4OjU0MDY3Miw0ODY1MzkyNjQ6MTA3Mzc1ODIwOCw1MDMzMTY0ODA6MTA3Mzc0MTgyNCw1MjAwOTM2OTY6MTA3NDI4MjUxMixcbjI3NjgyNDA2NDo1NDA2ODgsMjkzNjAxMjgwOjUyNDI4OCwzMTAzNzg0OTY6MTA3NDI2NjExMiwzMjcxNTU3MTI6MTYzODQsMzQzOTMyOTI4OjEwNzM3NTgyMDgsMzYwNzEwMTQ0OjEwNzQyODI1MTIsMzc3NDg3MzYwOjE2LDM5NDI2NDU3NjoxMDczNzQxODI0LDQxMTA0MTc5MjoxMDc0MjgyNDk2LDQyNzgxOTAwODoxMDczNzQxODQwLDQ0NDU5NjIyNDoxMDczNzU4MjI0LDQ2MTM3MzQ0MDo1MjQzMDQsNDc4MTUwNjU2OjAsNDk0OTI3ODcyOjE2NDAwLDUxMTcwNTA4ODoxMDc0MjY2MTI4LDUyODQ4MjMwNDo1NDA2NzJ9LHtcIjBcIjoyNjAsMTA0ODU3NjowLDIwOTcxNTI6NjcxMDkxMjAsMzE0NTcyODo2NTc5Niw0MTk0MzA0OjY1NTQwLDUyNDI4ODA6NjcxMDg4NjgsNjI5MTQ1Njo2NzE3NDY2MCw3MzQwMDMyOjY3MTc0NDAwLDgzODg2MDg6NjcxMDg4NjQsOTQzNzE4NDo2NzE3NDY1NiwxMDQ4NTc2MDo2NTc5MiwxMTUzNDMzNjo2NzE3NDQwNCwxMjU4MjkxMjo2NzEwOTEyNCwxMzYzMTQ4ODo2NTUzNixcbjE0NjgwMDY0OjQsMTU3Mjg2NDA6MjU2LDUyNDI4ODo2NzE3NDY1NiwxNTcyODY0OjY3MTc0NDA0LDI2MjE0NDA6MCwzNjcwMDE2OjY3MTA5MTIwLDQ3MTg1OTI6NjcxMDg4NjgsNTc2NzE2ODo2NTUzNiw2ODE1NzQ0OjY1NTQwLDc4NjQzMjA6MjYwLDg5MTI4OTY6NCw5OTYxNDcyOjI1NiwxMTAxMDA0ODo2NzE3NDQwMCwxMjA1ODYyNDo2NTc5NiwxMzEwNzIwMDo2NTc5MiwxNDE1NTc3Njo2NzEwOTEyNCwxNTIwNDM1Mjo2NzE3NDY2MCwxNjI1MjkyODo2NzEwODg2NCwxNjc3NzIxNjo2NzE3NDY1NiwxNzgyNTc5Mjo2NTU0MCwxODg3NDM2ODo2NTUzNiwxOTkyMjk0NDo2NzEwOTEyMCwyMDk3MTUyMDoyNTYsMjIwMjAwOTY6NjcxNzQ2NjAsMjMwNjg2NzI6NjcxMDg4NjgsMjQxMTcyNDg6MCwyNTE2NTgyNDo2NzEwOTEyNCwyNjIxNDQwMDo2NzEwODg2NCwyNzI2Mjk3Njo0LDI4MzExNTUyOjY1NzkyLDI5MzYwMTI4OjY3MTc0NDAwLDMwNDA4NzA0OjI2MCwzMTQ1NzI4MDo2NTc5NiwzMjUwNTg1Njo2NzE3NDQwNCxcbjE3MzAxNTA0OjY3MTA4ODY0LDE4MzUwMDgwOjI2MCwxOTM5ODY1Njo2NzE3NDY1NiwyMDQ0NzIzMjowLDIxNDk1ODA4OjY1NTQwLDIyNTQ0Mzg0OjY3MTA5MTIwLDIzNTkyOTYwOjI1NiwyNDY0MTUzNjo2NzE3NDQwNCwyNTY5MDExMjo2NTUzNiwyNjczODY4ODo2NzE3NDY2MCwyNzc4NzI2NDo2NTc5NiwyODgzNTg0MDo2NzEwODg2OCwyOTg4NDQxNjo2NzEwOTEyNCwzMDkzMjk5Mjo2NzE3NDQwMCwzMTk4MTU2ODo0LDMzMDMwMTQ0OjY1NzkyfSx7XCIwXCI6MjE1MTY4MjA0OCw2NTUzNjoyMTQ3NDg3ODA4LDEzMTA3Mjo0MTk4NDY0LDE5NjYwODoyMTUxNjc3OTUyLDI2MjE0NDowLDMyNzY4MDo0MTk4NDAwLDM5MzIxNjoyMTQ3NDgzNzEyLDQ1ODc1Mjo0MTk0MzY4LDUyNDI4ODoyMTQ3NDgzNjQ4LDU4OTgyNDo0MTk0MzA0LDY1NTM2MDo2NCw3MjA4OTY6MjE0NzQ4Nzc0NCw3ODY0MzI6MjE1MTY3ODAxNiw4NTE5Njg6NDE2MCw5MTc1MDQ6NDA5Niw5ODMwNDA6MjE1MTY4MjExMiwzMjc2ODoyMTQ3NDg3ODA4LFxuOTgzMDQ6NjQsMTYzODQwOjIxNTE2NzgwMTYsMjI5Mzc2OjIxNDc0ODc3NDQsMjk0OTEyOjQxOTg0MDAsMzYwNDQ4OjIxNTE2ODIxMTIsNDI1OTg0OjAsNDkxNTIwOjIxNTE2Nzc5NTIsNTU3MDU2OjQwOTYsNjIyNTkyOjIxNTE2ODIwNDgsNjg4MTI4OjQxOTQzMDQsNzUzNjY0OjQxNjAsODE5MjAwOjIxNDc0ODM2NDgsODg0NzM2OjQxOTQzNjgsOTUwMjcyOjQxOTg0NjQsMTAxNTgwODoyMTQ3NDgzNzEyLDEwNDg1NzY6NDE5NDM2OCwxMTE0MTEyOjQxOTg0MDAsMTE3OTY0ODoyMTQ3NDgzNzEyLDEyNDUxODQ6MCwxMzEwNzIwOjQxNjAsMTM3NjI1NjoyMTUxNjc4MDE2LDE0NDE3OTI6MjE1MTY4MjA0OCwxNTA3MzI4OjIxNDc0ODc4MDgsMTU3Mjg2NDoyMTUxNjgyMTEyLDE2Mzg0MDA6MjE0NzQ4MzY0OCwxNzAzOTM2OjIxNTE2Nzc5NTIsMTc2OTQ3Mjo0MTk4NDY0LDE4MzUwMDg6MjE0NzQ4Nzc0NCwxOTAwNTQ0OjQxOTQzMDQsMTk2NjA4MDo2NCwyMDMxNjE2OjQwOTYsMTA4MTM0NDoyMTUxNjc3OTUyLFxuMTE0Njg4MDoyMTUxNjgyMTEyLDEyMTI0MTY6MCwxMjc3OTUyOjQxOTg0MDAsMTM0MzQ4ODo0MTk0MzY4LDE0MDkwMjQ6MjE0NzQ4MzY0OCwxNDc0NTYwOjIxNDc0ODc4MDgsMTU0MDA5Njo2NCwxNjA1NjMyOjIxNDc0ODM3MTIsMTY3MTE2ODo0MDk2LDE3MzY3MDQ6MjE0NzQ4Nzc0NCwxODAyMjQwOjIxNTE2NzgwMTYsMTg2Nzc3Njo0MTYwLDE5MzMzMTI6MjE1MTY4MjA0OCwxOTk4ODQ4OjQxOTQzMDQsMjA2NDM4NDo0MTk4NDY0fSx7XCIwXCI6MTI4LDQwOTY6MTcwMzkzNjAsODE5MjoyNjIxNDQsMTIyODg6NTM2ODcwOTEyLDE2Mzg0OjUzNzEzMzE4NCwyMDQ4MDoxNjc3NzM0NCwyNDU3Njo1NTM2NDgyNTYsMjg2NzI6MjYyMjcyLDMyNzY4OjE2Nzc3MjE2LDM2ODY0OjUzNzEzMzA1Niw0MDk2MDo1MzY4NzEwNDAsNDUwNTY6NTUzOTEwNDAwLDQ5MTUyOjU1MzkxMDI3Miw1MzI0ODowLDU3MzQ0OjE3MDM5NDg4LDYxNDQwOjU1MzY0ODEyOCwyMDQ4OjE3MDM5NDg4LDYxNDQ6NTUzNjQ4MjU2LFxuMTAyNDA6MTI4LDE0MzM2OjE3MDM5MzYwLDE4NDMyOjI2MjE0NCwyMjUyODo1MzcxMzMxODQsMjY2MjQ6NTUzOTEwMjcyLDMwNzIwOjUzNjg3MDkxMiwzNDgxNjo1MzcxMzMwNTYsMzg5MTI6MCw0MzAwODo1NTM5MTA0MDAsNDcxMDQ6MTY3NzczNDQsNTEyMDA6NTM2ODcxMDQwLDU1Mjk2OjU1MzY0ODEyOCw1OTM5MjoxNjc3NzIxNiw2MzQ4ODoyNjIyNzIsNjU1MzY6MjYyMTQ0LDY5NjMyOjEyOCw3MzcyODo1MzY4NzA5MTIsNzc4MjQ6NTUzNjQ4MjU2LDgxOTIwOjE2Nzc3MzQ0LDg2MDE2OjU1MzkxMDI3Miw5MDExMjo1MzcxMzMxODQsOTQyMDg6MTY3NzcyMTYsOTgzMDQ6NTUzOTEwNDAwLDEwMjQwMDo1NTM2NDgxMjgsMTA2NDk2OjE3MDM5MzYwLDExMDU5Mjo1MzcxMzMwNTYsMTE0Njg4OjI2MjI3MiwxMTg3ODQ6NTM2ODcxMDQwLDEyMjg4MDowLDEyNjk3NjoxNzAzOTQ4OCw2NzU4NDo1NTM2NDgyNTYsNzE2ODA6MTY3NzcyMTYsNzU3NzY6MTcwMzkzNjAsNzk4NzI6NTM3MTMzMTg0LFxuODM5Njg6NTM2ODcwOTEyLDg4MDY0OjE3MDM5NDg4LDkyMTYwOjEyOCw5NjI1Njo1NTM5MTAyNzIsMTAwMzUyOjI2MjI3MiwxMDQ0NDg6NTUzOTEwNDAwLDEwODU0NDowLDExMjY0MDo1NTM2NDgxMjgsMTE2NzM2OjE2Nzc3MzQ0LDEyMDgzMjoyNjIxNDQsMTI0OTI4OjUzNzEzMzA1NiwxMjkwMjQ6NTM2ODcxMDQwfSx7XCIwXCI6MjY4NDM1NDY0LDI1Njo4MTkyLDUxMjoyNzA1MzI2MDgsNzY4OjI3MDU0MDgwOCwxMDI0OjI2ODQ0MzY0OCwxMjgwOjIwOTcxNTIsMTUzNjoyMDk3MTYwLDE3OTI6MjY4NDM1NDU2LDIwNDg6MCwyMzA0OjI2ODQ0MzY1NiwyNTYwOjIxMDUzNDQsMjgxNjo4LDMwNzI6MjcwNTMyNjE2LDMzMjg6MjEwNTM1MiwzNTg0OjgyMDAsMzg0MDoyNzA1NDA4MDAsMTI4OjI3MDUzMjYwOCwzODQ6MjcwNTQwODA4LDY0MDo4LDg5NjoyMDk3MTUyLDExNTI6MjEwNTM1MiwxNDA4OjI2ODQzNTQ2NCwxNjY0OjI2ODQ0MzY0OCwxOTIwOjgyMDAsMjE3NjoyMDk3MTYwLDI0MzI6ODE5MixcbjI2ODg6MjY4NDQzNjU2LDI5NDQ6MjcwNTMyNjE2LDMyMDA6MCwzNDU2OjI3MDU0MDgwMCwzNzEyOjIxMDUzNDQsMzk2ODoyNjg0MzU0NTYsNDA5NjoyNjg0NDM2NDgsNDM1MjoyNzA1MzI2MTYsNDYwODoyNzA1NDA4MDgsNDg2NDo4MjAwLDUxMjA6MjA5NzE1Miw1Mzc2OjI2ODQzNTQ1Niw1NjMyOjI2ODQzNTQ2NCw1ODg4OjIxMDUzNDQsNjE0NDoyMTA1MzUyLDY0MDA6MCw2NjU2OjgsNjkxMjoyNzA1MzI2MDgsNzE2ODo4MTkyLDc0MjQ6MjY4NDQzNjU2LDc2ODA6MjcwNTQwODAwLDc5MzY6MjA5NzE2MCw0MjI0OjgsNDQ4MDoyMTA1MzQ0LDQ3MzY6MjA5NzE1Miw0OTkyOjI2ODQzNTQ2NCw1MjQ4OjI2ODQ0MzY0OCw1NTA0OjgyMDAsNTc2MDoyNzA1NDA4MDgsNjAxNjoyNzA1MzI2MDgsNjI3MjoyNzA1NDA4MDAsNjUyODoyNzA1MzI2MTYsNjc4NDo4MTkyLDcwNDA6MjEwNTM1Miw3Mjk2OjIwOTcxNjAsNzU1MjowLDc4MDg6MjY4NDM1NDU2LDgwNjQ6MjY4NDQzNjU2fSx7XCIwXCI6MTA0ODU3NixcbjE2OjMzNTU1NDU3LDMyOjEwMjQsNDg6MTA0OTYwMSw2NDozNDYwNDAzMyw4MDowLDk2OjEsMTEyOjM0NjAzMDA5LDEyODozMzU1NTQ1NiwxNDQ6MTA0ODU3NywxNjA6MzM1NTQ0MzMsMTc2OjM0NjA0MDMyLDE5MjozNDYwMzAwOCwyMDg6MTAyNSwyMjQ6MTA0OTYwMCwyNDA6MzM1NTQ0MzIsODozNDYwMzAwOSwyNDowLDQwOjMzNTU1NDU3LDU2OjM0NjA0MDMyLDcyOjEwNDg1NzYsODg6MzM1NTQ0MzMsMTA0OjMzNTU0NDMyLDEyMDoxMDI1LDEzNjoxMDQ5NjAxLDE1MjozMzU1NTQ1NiwxNjg6MzQ2MDMwMDgsMTg0OjEwNDg1NzcsMjAwOjEwMjQsMjE2OjM0NjA0MDMzLDIzMjoxLDI0ODoxMDQ5NjAwLDI1NjozMzU1NDQzMiwyNzI6MTA0ODU3NiwyODg6MzM1NTU0NTcsMzA0OjM0NjAzMDA5LDMyMDoxMDQ4NTc3LDMzNjozMzU1NTQ1NiwzNTI6MzQ2MDQwMzIsMzY4OjEwNDk2MDEsMzg0OjEwMjUsNDAwOjM0NjA0MDMzLDQxNjoxMDQ5NjAwLDQzMjoxLDQ0ODowLDQ2NDozNDYwMzAwOCw0ODA6MzM1NTQ0MzMsXG40OTY6MTAyNCwyNjQ6MTA0OTYwMCwyODA6MzM1NTU0NTcsMjk2OjM0NjAzMDA5LDMxMjoxLDMyODozMzU1NDQzMiwzNDQ6MTA0ODU3NiwzNjA6MTAyNSwzNzY6MzQ2MDQwMzIsMzkyOjMzNTU0NDMzLDQwODozNDYwMzAwOCw0MjQ6MCw0NDA6MzQ2MDQwMzMsNDU2OjEwNDk2MDEsNDcyOjEwMjQsNDg4OjMzNTU1NDU2LDUwNDoxMDQ4NTc3fSx7XCIwXCI6MTM0MjE5ODA4LDE6MTMxMDcyLDI6MTM0MjE3NzI4LDM6MzIsNDoxMzExMDQsNToxMzQzNTA4ODAsNjoxMzQzNTA4NDgsNzoyMDQ4LDg6MTM0MzQ4ODAwLDk6MTM0MjE5Nzc2LDEwOjEzMzEyMCwxMToxMzQzNDg4MzIsMTI6MjA4MCwxMzowLDE0OjEzNDIxNzc2MCwxNToxMzMxNTIsMjE0NzQ4MzY0ODoyMDQ4LDIxNDc0ODM2NDk6MTM0MzUwODgwLDIxNDc0ODM2NTA6MTM0MjE5ODA4LDIxNDc0ODM2NTE6MTM0MjE3NzI4LDIxNDc0ODM2NTI6MTM0MzQ4ODAwLDIxNDc0ODM2NTM6MTMzMTIwLDIxNDc0ODM2NTQ6MTMzMTUyLDIxNDc0ODM2NTU6MzIsXG4yMTQ3NDgzNjU2OjEzNDIxNzc2MCwyMTQ3NDgzNjU3OjIwODAsMjE0NzQ4MzY1ODoxMzExMDQsMjE0NzQ4MzY1OToxMzQzNTA4NDgsMjE0NzQ4MzY2MDowLDIxNDc0ODM2NjE6MTM0MzQ4ODMyLDIxNDc0ODM2NjI6MTM0MjE5Nzc2LDIxNDc0ODM2NjM6MTMxMDcyLDE2OjEzMzE1MiwxNzoxMzQzNTA4NDgsMTg6MzIsMTk6MjA0OCwyMDoxMzQyMTk3NzYsMjE6MTM0MjE3NzYwLDIyOjEzNDM0ODgzMiwyMzoxMzEwNzIsMjQ6MCwyNToxMzExMDQsMjY6MTM0MzQ4ODAwLDI3OjEzNDIxOTgwOCwyODoxMzQzNTA4ODAsMjk6MTMzMTIwLDMwOjIwODAsMzE6MTM0MjE3NzI4LDIxNDc0ODM2NjQ6MTMxMDcyLDIxNDc0ODM2NjU6MjA0OCwyMTQ3NDgzNjY2OjEzNDM0ODgzMiwyMTQ3NDgzNjY3OjEzMzE1MiwyMTQ3NDgzNjY4OjMyLDIxNDc0ODM2Njk6MTM0MzQ4ODAwLDIxNDc0ODM2NzA6MTM0MjE3NzI4LDIxNDc0ODM2NzE6MTM0MjE5ODA4LDIxNDc0ODM2NzI6MTM0MzUwODgwLDIxNDc0ODM2NzM6MTM0MjE3NzYwLFxuMjE0NzQ4MzY3NDoxMzQyMTk3NzYsMjE0NzQ4MzY3NTowLDIxNDc0ODM2NzY6MTMzMTIwLDIxNDc0ODM2Nzc6MjA4MCwyMTQ3NDgzNjc4OjEzMTEwNCwyMTQ3NDgzNjc5OjEzNDM1MDg0OH1dLHQ9WzQxNjA3NDk1NjksNTI4NDgyMzA0LDMzMDMwMTQ0LDIwNjQzODQsMTI5MDI0LDgwNjQsNTA0LDIxNDc0ODM2NzldLG09Zy5ERVM9ZS5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX2tleS53b3JkcyxjPVtdLGE9MDs1Nj5hO2ErKyl7dmFyIGY9cVthXS0xO2NbYV09YltmPj4+NV0+Pj4zMS1mJTMyJjF9Yj10aGlzLl9zdWJLZXlzPVtdO2ZvcihmPTA7MTY+ZjtmKyspe2Zvcih2YXIgZD1iW2ZdPVtdLGU9cltmXSxhPTA7MjQ+YTthKyspZFthLzZ8MF18PWNbKHBbYV0tMStlKSUyOF08PDMxLWElNixkWzQrKGEvNnwwKV18PWNbMjgrKHBbYSsyNF0tMStlKSUyOF08PDMxLWElNjtkWzBdPWRbMF08PDF8ZFswXT4+PjMxO2ZvcihhPTE7Nz5hO2ErKylkW2FdPj4+PVxuNCooYS0xKSszO2RbN109ZFs3XTw8NXxkWzddPj4+Mjd9Yz10aGlzLl9pbnZTdWJLZXlzPVtdO2ZvcihhPTA7MTY+YTthKyspY1thXT1iWzE1LWFdfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kb0NyeXB0QmxvY2soYixjLHRoaXMuX3N1YktleXMpfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kb0NyeXB0QmxvY2soYixjLHRoaXMuX2ludlN1YktleXMpfSxfZG9DcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyxhKXt0aGlzLl9sQmxvY2s9YltjXTt0aGlzLl9yQmxvY2s9YltjKzFdO2ouY2FsbCh0aGlzLDQsMjUyNjQ1MTM1KTtqLmNhbGwodGhpcywxNiw2NTUzNSk7bC5jYWxsKHRoaXMsMiw4NTg5OTM0NTkpO2wuY2FsbCh0aGlzLDgsMTY3MTE5MzUpO2ouY2FsbCh0aGlzLDEsMTQzMTY1NTc2NSk7Zm9yKHZhciBmPTA7MTY+ZjtmKyspe2Zvcih2YXIgZD1hW2ZdLGU9dGhpcy5fbEJsb2NrLGg9dGhpcy5fckJsb2NrLGc9MCxrPTA7OD5rO2srKylnfD1zW2tdWygoaF5cbmRba10pJnRba10pPj4+MF07dGhpcy5fbEJsb2NrPWg7dGhpcy5fckJsb2NrPWVeZ31hPXRoaXMuX2xCbG9jazt0aGlzLl9sQmxvY2s9dGhpcy5fckJsb2NrO3RoaXMuX3JCbG9jaz1hO2ouY2FsbCh0aGlzLDEsMTQzMTY1NTc2NSk7bC5jYWxsKHRoaXMsOCwxNjcxMTkzNSk7bC5jYWxsKHRoaXMsMiw4NTg5OTM0NTkpO2ouY2FsbCh0aGlzLDE2LDY1NTM1KTtqLmNhbGwodGhpcyw0LDI1MjY0NTEzNSk7YltjXT10aGlzLl9sQmxvY2s7YltjKzFdPXRoaXMuX3JCbG9ja30sa2V5U2l6ZToyLGl2U2l6ZToyLGJsb2NrU2l6ZToyfSk7aC5ERVM9ZS5fY3JlYXRlSGVscGVyKG0pO2c9Zy5UcmlwbGVERVM9ZS5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fa2V5LndvcmRzO3RoaXMuX2RlczE9bS5jcmVhdGVFbmNyeXB0b3Iobi5jcmVhdGUoYi5zbGljZSgwLDIpKSk7dGhpcy5fZGVzMj1tLmNyZWF0ZUVuY3J5cHRvcihuLmNyZWF0ZShiLnNsaWNlKDIsNCkpKTt0aGlzLl9kZXMzPVxubS5jcmVhdGVFbmNyeXB0b3Iobi5jcmVhdGUoYi5zbGljZSg0LDYpKSl9LGVuY3J5cHRCbG9jazpmdW5jdGlvbihiLGMpe3RoaXMuX2RlczEuZW5jcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMi5kZWNyeXB0QmxvY2soYixjKTt0aGlzLl9kZXMzLmVuY3J5cHRCbG9jayhiLGMpfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kZXMzLmRlY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczIuZW5jcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMS5kZWNyeXB0QmxvY2soYixjKX0sa2V5U2l6ZTo2LGl2U2l6ZToyLGJsb2NrU2l6ZToyfSk7aC5UcmlwbGVERVM9ZS5fY3JlYXRlSGVscGVyKGcpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBlbmMtYmFzZTY0LmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe3ZhciBoPUNyeXB0b0pTLGo9aC5saWIuV29yZEFycmF5O2guZW5jLkJhc2U2ND17c3RyaW5naWZ5OmZ1bmN0aW9uKGIpe3ZhciBlPWIud29yZHMsZj1iLnNpZ0J5dGVzLGM9dGhpcy5fbWFwO2IuY2xhbXAoKTtiPVtdO2Zvcih2YXIgYT0wO2E8ZjthKz0zKWZvcih2YXIgZD0oZVthPj4+Ml0+Pj4yNC04KihhJTQpJjI1NSk8PDE2fChlW2ErMT4+PjJdPj4+MjQtOCooKGErMSklNCkmMjU1KTw8OHxlW2ErMj4+PjJdPj4+MjQtOCooKGErMiklNCkmMjU1LGc9MDs0PmcmJmErMC43NSpnPGY7ZysrKWIucHVzaChjLmNoYXJBdChkPj4+NiooMy1nKSY2MykpO2lmKGU9Yy5jaGFyQXQoNjQpKWZvcig7Yi5sZW5ndGglNDspYi5wdXNoKGUpO3JldHVybiBiLmpvaW4oXCJcIil9LHBhcnNlOmZ1bmN0aW9uKGIpe3ZhciBlPWIubGVuZ3RoLGY9dGhpcy5fbWFwLGM9Zi5jaGFyQXQoNjQpO2MmJihjPWIuaW5kZXhPZihjKSwtMSE9YyYmKGU9YykpO2Zvcih2YXIgYz1bXSxhPTAsZD0wO2Q8XG5lO2QrKylpZihkJTQpe3ZhciBnPWYuaW5kZXhPZihiLmNoYXJBdChkLTEpKTw8MiooZCU0KSxoPWYuaW5kZXhPZihiLmNoYXJBdChkKSk+Pj42LTIqKGQlNCk7Y1thPj4+Ml18PShnfGgpPDwyNC04KihhJTQpO2ErK31yZXR1cm4gai5jcmVhdGUoYyxhKX0sX21hcDpcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCJ9fSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBtZDUuanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKEUpe2Z1bmN0aW9uIGgoYSxmLGcsaixwLGgsayl7YT1hKyhmJmd8fmYmaikrcCtrO3JldHVybihhPDxofGE+Pj4zMi1oKStmfWZ1bmN0aW9uIGsoYSxmLGcsaixwLGgsayl7YT1hKyhmJmp8ZyZ+aikrcCtrO3JldHVybihhPDxofGE+Pj4zMi1oKStmfWZ1bmN0aW9uIGwoYSxmLGcsaixoLGssbCl7YT1hKyhmXmdeaikraCtsO3JldHVybihhPDxrfGE+Pj4zMi1rKStmfWZ1bmN0aW9uIG4oYSxmLGcsaixoLGssbCl7YT1hKyhnXihmfH5qKSkraCtsO3JldHVybihhPDxrfGE+Pj4zMi1rKStmfWZvcih2YXIgcj1DcnlwdG9KUyxxPXIubGliLEY9cS5Xb3JkQXJyYXkscz1xLkhhc2hlcixxPXIuYWxnbyxhPVtdLHQ9MDs2ND50O3QrKylhW3RdPTQyOTQ5NjcyOTYqRS5hYnMoRS5zaW4odCsxKSl8MDtxPXEuTUQ1PXMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IEYuaW5pdChbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4XSl9LFxuX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKG0sZil7Zm9yKHZhciBnPTA7MTY+ZztnKyspe3ZhciBqPWYrZyxwPW1bal07bVtqXT0ocDw8OHxwPj4+MjQpJjE2NzExOTM1fChwPDwyNHxwPj4+OCkmNDI3ODI1NTM2MH12YXIgZz10aGlzLl9oYXNoLndvcmRzLGo9bVtmKzBdLHA9bVtmKzFdLHE9bVtmKzJdLHI9bVtmKzNdLHM9bVtmKzRdLHQ9bVtmKzVdLHU9bVtmKzZdLHY9bVtmKzddLHc9bVtmKzhdLHg9bVtmKzldLHk9bVtmKzEwXSx6PW1bZisxMV0sQT1tW2YrMTJdLEI9bVtmKzEzXSxDPW1bZisxNF0sRD1tW2YrMTVdLGI9Z1swXSxjPWdbMV0sZD1nWzJdLGU9Z1szXSxiPWgoYixjLGQsZSxqLDcsYVswXSksZT1oKGUsYixjLGQscCwxMixhWzFdKSxkPWgoZCxlLGIsYyxxLDE3LGFbMl0pLGM9aChjLGQsZSxiLHIsMjIsYVszXSksYj1oKGIsYyxkLGUscyw3LGFbNF0pLGU9aChlLGIsYyxkLHQsMTIsYVs1XSksZD1oKGQsZSxiLGMsdSwxNyxhWzZdKSxjPWgoYyxkLGUsYix2LDIyLGFbN10pLFxuYj1oKGIsYyxkLGUsdyw3LGFbOF0pLGU9aChlLGIsYyxkLHgsMTIsYVs5XSksZD1oKGQsZSxiLGMseSwxNyxhWzEwXSksYz1oKGMsZCxlLGIseiwyMixhWzExXSksYj1oKGIsYyxkLGUsQSw3LGFbMTJdKSxlPWgoZSxiLGMsZCxCLDEyLGFbMTNdKSxkPWgoZCxlLGIsYyxDLDE3LGFbMTRdKSxjPWgoYyxkLGUsYixELDIyLGFbMTVdKSxiPWsoYixjLGQsZSxwLDUsYVsxNl0pLGU9ayhlLGIsYyxkLHUsOSxhWzE3XSksZD1rKGQsZSxiLGMseiwxNCxhWzE4XSksYz1rKGMsZCxlLGIsaiwyMCxhWzE5XSksYj1rKGIsYyxkLGUsdCw1LGFbMjBdKSxlPWsoZSxiLGMsZCx5LDksYVsyMV0pLGQ9ayhkLGUsYixjLEQsMTQsYVsyMl0pLGM9ayhjLGQsZSxiLHMsMjAsYVsyM10pLGI9ayhiLGMsZCxlLHgsNSxhWzI0XSksZT1rKGUsYixjLGQsQyw5LGFbMjVdKSxkPWsoZCxlLGIsYyxyLDE0LGFbMjZdKSxjPWsoYyxkLGUsYix3LDIwLGFbMjddKSxiPWsoYixjLGQsZSxCLDUsYVsyOF0pLGU9ayhlLGIsXG5jLGQscSw5LGFbMjldKSxkPWsoZCxlLGIsYyx2LDE0LGFbMzBdKSxjPWsoYyxkLGUsYixBLDIwLGFbMzFdKSxiPWwoYixjLGQsZSx0LDQsYVszMl0pLGU9bChlLGIsYyxkLHcsMTEsYVszM10pLGQ9bChkLGUsYixjLHosMTYsYVszNF0pLGM9bChjLGQsZSxiLEMsMjMsYVszNV0pLGI9bChiLGMsZCxlLHAsNCxhWzM2XSksZT1sKGUsYixjLGQscywxMSxhWzM3XSksZD1sKGQsZSxiLGMsdiwxNixhWzM4XSksYz1sKGMsZCxlLGIseSwyMyxhWzM5XSksYj1sKGIsYyxkLGUsQiw0LGFbNDBdKSxlPWwoZSxiLGMsZCxqLDExLGFbNDFdKSxkPWwoZCxlLGIsYyxyLDE2LGFbNDJdKSxjPWwoYyxkLGUsYix1LDIzLGFbNDNdKSxiPWwoYixjLGQsZSx4LDQsYVs0NF0pLGU9bChlLGIsYyxkLEEsMTEsYVs0NV0pLGQ9bChkLGUsYixjLEQsMTYsYVs0Nl0pLGM9bChjLGQsZSxiLHEsMjMsYVs0N10pLGI9bihiLGMsZCxlLGosNixhWzQ4XSksZT1uKGUsYixjLGQsdiwxMCxhWzQ5XSksZD1uKGQsZSxiLGMsXG5DLDE1LGFbNTBdKSxjPW4oYyxkLGUsYix0LDIxLGFbNTFdKSxiPW4oYixjLGQsZSxBLDYsYVs1Ml0pLGU9bihlLGIsYyxkLHIsMTAsYVs1M10pLGQ9bihkLGUsYixjLHksMTUsYVs1NF0pLGM9bihjLGQsZSxiLHAsMjEsYVs1NV0pLGI9bihiLGMsZCxlLHcsNixhWzU2XSksZT1uKGUsYixjLGQsRCwxMCxhWzU3XSksZD1uKGQsZSxiLGMsdSwxNSxhWzU4XSksYz1uKGMsZCxlLGIsQiwyMSxhWzU5XSksYj1uKGIsYyxkLGUscyw2LGFbNjBdKSxlPW4oZSxiLGMsZCx6LDEwLGFbNjFdKSxkPW4oZCxlLGIsYyxxLDE1LGFbNjJdKSxjPW4oYyxkLGUsYix4LDIxLGFbNjNdKTtnWzBdPWdbMF0rYnwwO2dbMV09Z1sxXStjfDA7Z1syXT1nWzJdK2R8MDtnWzNdPWdbM10rZXwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2RhdGEsZj1hLndvcmRzLGc9OCp0aGlzLl9uRGF0YUJ5dGVzLGo9OCphLnNpZ0J5dGVzO2Zbaj4+PjVdfD0xMjg8PDI0LWolMzI7dmFyIGg9RS5mbG9vcihnL1xuNDI5NDk2NzI5Nik7Zlsoais2ND4+Pjk8PDQpKzE1XT0oaDw8OHxoPj4+MjQpJjE2NzExOTM1fChoPDwyNHxoPj4+OCkmNDI3ODI1NTM2MDtmWyhqKzY0Pj4+OTw8NCkrMTRdPShnPDw4fGc+Pj4yNCkmMTY3MTE5MzV8KGc8PDI0fGc+Pj44KSY0Mjc4MjU1MzYwO2Euc2lnQnl0ZXM9NCooZi5sZW5ndGgrMSk7dGhpcy5fcHJvY2VzcygpO2E9dGhpcy5faGFzaDtmPWEud29yZHM7Zm9yKGc9MDs0Pmc7ZysrKWo9ZltnXSxmW2ddPShqPDw4fGo+Pj4yNCkmMTY3MTE5MzV8KGo8PDI0fGo+Pj44KSY0Mjc4MjU1MzYwO3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPXMuY2xvbmUuY2FsbCh0aGlzKTthLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gYX19KTtyLk1ENT1zLl9jcmVhdGVIZWxwZXIocSk7ci5IbWFjTUQ1PXMuX2NyZWF0ZUhtYWNIZWxwZXIocSl9KShNYXRoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGExLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgaz1DcnlwdG9KUyxiPWsubGliLG09Yi5Xb3JkQXJyYXksbD1iLkhhc2hlcixkPVtdLGI9ay5hbGdvLlNIQTE9bC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgbS5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24obixwKXtmb3IodmFyIGE9dGhpcy5faGFzaC53b3JkcyxlPWFbMF0sZj1hWzFdLGg9YVsyXSxqPWFbM10sYj1hWzRdLGM9MDs4MD5jO2MrKyl7aWYoMTY+YylkW2NdPW5bcCtjXXwwO2Vsc2V7dmFyIGc9ZFtjLTNdXmRbYy04XV5kW2MtMTRdXmRbYy0xNl07ZFtjXT1nPDwxfGc+Pj4zMX1nPShlPDw1fGU+Pj4yNykrYitkW2NdO2c9MjA+Yz9nKygoZiZofH5mJmopKzE1MTg1MDAyNDkpOjQwPmM/ZysoKGZeaF5qKSsxODU5Nzc1MzkzKTo2MD5jP2crKChmJmh8ZiZqfGgmaiktMTg5NDAwNzU4OCk6ZysoKGZeaF5cbmopLTg5OTQ5NzUxNCk7Yj1qO2o9aDtoPWY8PDMwfGY+Pj4yO2Y9ZTtlPWd9YVswXT1hWzBdK2V8MDthWzFdPWFbMV0rZnwwO2FbMl09YVsyXStofDA7YVszXT1hWzNdK2p8MDthWzRdPWFbNF0rYnwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2RhdGEsZD1iLndvcmRzLGE9OCp0aGlzLl9uRGF0YUJ5dGVzLGU9OCpiLnNpZ0J5dGVzO2RbZT4+PjVdfD0xMjg8PDI0LWUlMzI7ZFsoZSs2ND4+Pjk8PDQpKzE0XT1NYXRoLmZsb29yKGEvNDI5NDk2NzI5Nik7ZFsoZSs2ND4+Pjk8PDQpKzE1XT1hO2Iuc2lnQnl0ZXM9NCpkLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9bC5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2suU0hBMT1sLl9jcmVhdGVIZWxwZXIoYik7ay5IbWFjU0hBMT1sLl9jcmVhdGVIbWFjSGVscGVyKGIpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGEyNTYtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbihrKXtmb3IodmFyIGc9Q3J5cHRvSlMsaD1nLmxpYix2PWguV29yZEFycmF5LGo9aC5IYXNoZXIsaD1nLmFsZ28scz1bXSx0PVtdLHU9ZnVuY3Rpb24ocSl7cmV0dXJuIDQyOTQ5NjcyOTYqKHEtKHF8MCkpfDB9LGw9MixiPTA7NjQ+Yjspe3ZhciBkO2E6e2Q9bDtmb3IodmFyIHc9ay5zcXJ0KGQpLHI9MjtyPD13O3IrKylpZighKGQlcikpe2Q9ITE7YnJlYWsgYX1kPSEwfWQmJig4PmImJihzW2JdPXUoay5wb3cobCwwLjUpKSksdFtiXT11KGsucG93KGwsMS8zKSksYisrKTtsKyt9dmFyIG49W10saD1oLlNIQTI1Nj1qLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyB2LmluaXQocy5zbGljZSgwKSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihxLGgpe2Zvcih2YXIgYT10aGlzLl9oYXNoLndvcmRzLGM9YVswXSxkPWFbMV0sYj1hWzJdLGs9YVszXSxmPWFbNF0sZz1hWzVdLGo9YVs2XSxsPWFbN10sZT0wOzY0PmU7ZSsrKXtpZigxNj5lKW5bZV09XG5xW2grZV18MDtlbHNle3ZhciBtPW5bZS0xNV0scD1uW2UtMl07bltlXT0oKG08PDI1fG0+Pj43KV4obTw8MTR8bT4+PjE4KV5tPj4+MykrbltlLTddKygocDw8MTV8cD4+PjE3KV4ocDw8MTN8cD4+PjE5KV5wPj4+MTApK25bZS0xNl19bT1sKygoZjw8MjZ8Zj4+PjYpXihmPDwyMXxmPj4+MTEpXihmPDw3fGY+Pj4yNSkpKyhmJmdefmYmaikrdFtlXStuW2VdO3A9KChjPDwzMHxjPj4+MileKGM8PDE5fGM+Pj4xMyleKGM8PDEwfGM+Pj4yMikpKyhjJmReYyZiXmQmYik7bD1qO2o9ZztnPWY7Zj1rK218MDtrPWI7Yj1kO2Q9YztjPW0rcHwwfWFbMF09YVswXStjfDA7YVsxXT1hWzFdK2R8MDthWzJdPWFbMl0rYnwwO2FbM109YVszXStrfDA7YVs0XT1hWzRdK2Z8MDthWzVdPWFbNV0rZ3wwO2FbNl09YVs2XStqfDA7YVs3XT1hWzddK2x8MH0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLl9kYXRhLGI9ZC53b3JkcyxhPTgqdGhpcy5fbkRhdGFCeXRlcyxjPTgqZC5zaWdCeXRlcztcbmJbYz4+PjVdfD0xMjg8PDI0LWMlMzI7YlsoYys2ND4+Pjk8PDQpKzE0XT1rLmZsb29yKGEvNDI5NDk2NzI5Nik7YlsoYys2ND4+Pjk8PDQpKzE1XT1hO2Quc2lnQnl0ZXM9NCpiLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9ai5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2cuU0hBMjU2PWouX2NyZWF0ZUhlbHBlcihoKTtnLkhtYWNTSEEyNTY9ai5fY3JlYXRlSG1hY0hlbHBlcihoKX0pKE1hdGgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTIyNC1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGI9Q3J5cHRvSlMsZD1iLmxpYi5Xb3JkQXJyYXksYT1iLmFsZ28sYz1hLlNIQTI1NixhPWEuU0hBMjI0PWMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGQuaW5pdChbMzIzODM3MTAzMiw5MTQxNTA2NjMsODEyNzAyOTk5LDQxNDQ5MTI2OTcsNDI5MDc3NTg1NywxNzUwNjAzMDI1LDE2OTQwNzY4MzksMzIwNDA3NTQyOF0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWMuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT00O3JldHVybiBhfX0pO2IuU0hBMjI0PWMuX2NyZWF0ZUhlbHBlcihhKTtiLkhtYWNTSEEyMjQ9Yy5fY3JlYXRlSG1hY0hlbHBlcihhKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhNTEyLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7cmV0dXJuIGQuY3JlYXRlLmFwcGx5KGQsYXJndW1lbnRzKX1mb3IodmFyIG49Q3J5cHRvSlMscj1uLmxpYi5IYXNoZXIsZT1uLng2NCxkPWUuV29yZCxUPWUuV29yZEFycmF5LGU9bi5hbGdvLGVhPVthKDExMTYzNTI0MDgsMzYwOTc2NzQ1OCksYSgxODk5NDQ3NDQxLDYwMjg5MTcyNSksYSgzMDQ5MzIzNDcxLDM5NjQ0ODQzOTkpLGEoMzkyMTAwOTU3MywyMTczMjk1NTQ4KSxhKDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxhKDE1MDg5NzA5OTMsMzA1MzgzNDI2NSksYSgyNDUzNjM1NzQ4LDI5Mzc2NzE1NzkpLGEoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxhKDM2MjQzODEwODAsMjczNDg4MzM5NCksYSgzMTA1OTg0MDEsMTE2NDk5NjU0MiksYSg2MDcyMjUyNzgsMTMyMzYxMDc2NCksYSgxNDI2ODgxOTg3LDM1OTAzMDQ5OTQpLGEoMTkyNTA3ODM4OCw0MDY4MTgyMzgzKSxhKDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxhKDI2MTQ4ODgxMDMsNjMzODAzMzE3KSxcbmEoMzI0ODIyMjU4MCwzNDc5Nzc0ODY4KSxhKDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCksYSg0MDIyMjI0Nzc0LDk0NDcxMTEzOSksYSgyNjQzNDcwNzgsMjM0MTI2Mjc3MyksYSg2MDQ4MDc2MjgsMjAwNzgwMDkzMyksYSg3NzAyNTU5ODMsMTQ5NTk5MDkwMSksYSgxMjQ5MTUwMTIyLDE4NTY0MzEyMzUpLGEoMTU1NTA4MTY5MiwzMTc1MjE4MTMyKSxhKDE5OTYwNjQ5ODYsMjE5ODk1MDgzNyksYSgyNTU0MjIwODgyLDM5OTk3MTkzMzkpLGEoMjgyMTgzNDM0OSw3NjY3ODQwMTYpLGEoMjk1Mjk5NjgwOCwyNTY2NTk0ODc5KSxhKDMyMTAzMTM2NzEsMzIwMzMzNzk1NiksYSgzMzM2NTcxODkxLDEwMzQ0NTcwMjYpLGEoMzU4NDUyODcxMSwyNDY2OTQ4OTAxKSxhKDExMzkyNjk5MywzNzU4MzI2MzgzKSxhKDMzODI0MTg5NSwxNjg3MTc5MzYpLGEoNjY2MzA3MjA1LDExODgxNzk5NjQpLGEoNzczNTI5OTEyLDE1NDYwNDU3MzQpLGEoMTI5NDc1NzM3MiwxNTIyODA1NDg1KSxhKDEzOTYxODIyOTEsXG4yNjQzODMzODIzKSxhKDE2OTUxODM3MDAsMjM0MzUyNzM5MCksYSgxOTg2NjYxMDUxLDEwMTQ0Nzc0ODApLGEoMjE3NzAyNjM1MCwxMjA2NzU5MTQyKSxhKDI0NTY5NTYwMzcsMzQ0MDc3NjI3KSxhKDI3MzA0ODU5MjEsMTI5MDg2MzQ2MCksYSgyODIwMzAyNDExLDMxNTg0NTQyNzMpLGEoMzI1OTczMDgwMCwzNTA1OTUyNjU3KSxhKDMzNDU3NjQ3NzEsMTA2MjE3MDA4KSxhKDM1MTYwNjU4MTcsMzYwNjAwODM0NCksYSgzNjAwMzUyODA0LDE0MzI3MjU3NzYpLGEoNDA5NDU3MTkwOSwxNDY3MDMxNTk0KSxhKDI3NTQyMzM0NCw4NTExNjk3MjApLGEoNDMwMjI3NzM0LDMxMDA4MjM3NTIpLGEoNTA2OTQ4NjE2LDEzNjMyNTgxOTUpLGEoNjU5MDYwNTU2LDM3NTA2ODU1OTMpLGEoODgzOTk3ODc3LDM3ODUwNTAyODApLGEoOTU4MTM5NTcxLDMzMTgzMDc0MjcpLGEoMTMyMjgyMjIxOCwzODEyNzIzNDAzKSxhKDE1MzcwMDIwNjMsMjAwMzAzNDk5NSksYSgxNzQ3ODczNzc5LDM2MDIwMzY4OTkpLFxuYSgxOTU1NTYyMjIyLDE1NzU5OTAwMTIpLGEoMjAyNDEwNDgxNSwxMTI1NTkyOTI4KSxhKDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksYSgyMzYxODUyNDI0LDQ0Mjc3NjA0NCksYSgyNDI4NDM2NDc0LDU5MzY5ODM0NCksYSgyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLGEoMzIwNDAzMTQ3OSwyOTk5MzUxNTczKSxhKDMzMjkzMjUyOTgsMzgxNTkyMDQyNyksYSgzMzkxNTY5NjE0LDM5MjgzODM5MDApLGEoMzUxNTI2NzI3MSw1NjYyODA3MTEpLGEoMzk0MDE4NzYwNiwzNDU0MDY5NTM0KSxhKDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksYSgxMTY0MTg0NzQsMTkxNDEzODU1NCksYSgxNzQyOTI0MjEsMjczMTA1NTI3MCksYSgyODkzODAzNTYsMzIwMzk5MzAwNiksYSg0NjAzOTMyNjksMzIwNjIwMzE1KSxhKDY4NTQ3MTczMyw1ODc0OTY4MzYpLGEoODUyMTQyOTcxLDEwODY3OTI4NTEpLGEoMTAxNzAzNjI5OCwzNjU1NDMxMDApLGEoMTEyNjAwMDU4MCwyNjE4Mjk3Njc2KSxhKDEyODgwMzM0NzAsXG4zNDA5ODU1MTU4KSxhKDE1MDE1MDU5NDgsNDIzNDUwOTg2NiksYSgxNjA3MTY3OTE1LDk4NzE2NzQ2OCksYSgxODE2NDAyMzE2LDEyNDYxODk1OTEpXSx2PVtdLHc9MDs4MD53O3crKyl2W3ddPWEoKTtlPWUuU0hBNTEyPXIuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IFQuaW5pdChbbmV3IGQuaW5pdCgxNzc5MDMzNzAzLDQwODkyMzU3MjApLG5ldyBkLmluaXQoMzE0NDEzNDI3NywyMjI3ODczNTk1KSxuZXcgZC5pbml0KDEwMTM5MDQyNDIsNDI3MTE3NTcyMyksbmV3IGQuaW5pdCgyNzczNDgwNzYyLDE1OTU3NTAxMjkpLG5ldyBkLmluaXQoMTM1OTg5MzExOSwyOTE3NTY1MTM3KSxuZXcgZC5pbml0KDI2MDA4MjI5MjQsNzI1NTExMTk5KSxuZXcgZC5pbml0KDUyODczNDYzNSw0MjE1Mzg5NTQ3KSxuZXcgZC5pbml0KDE1NDE0NTkyMjUsMzI3MDMzMjA5KV0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxkKXtmb3IodmFyIGY9dGhpcy5faGFzaC53b3JkcyxcbkY9ZlswXSxlPWZbMV0sbj1mWzJdLHI9ZlszXSxHPWZbNF0sSD1mWzVdLEk9Zls2XSxmPWZbN10sdz1GLmhpZ2gsSj1GLmxvdyxYPWUuaGlnaCxLPWUubG93LFk9bi5oaWdoLEw9bi5sb3csWj1yLmhpZ2gsTT1yLmxvdywkPUcuaGlnaCxOPUcubG93LGFhPUguaGlnaCxPPUgubG93LGJhPUkuaGlnaCxQPUkubG93LGNhPWYuaGlnaCxRPWYubG93LGs9dyxnPUosej1YLHg9SyxBPVkseT1MLFU9WixCPU0sbD0kLGg9TixSPWFhLEM9TyxTPWJhLEQ9UCxWPWNhLEU9USxtPTA7ODA+bTttKyspe3ZhciBzPXZbbV07aWYoMTY+bSl2YXIgaj1zLmhpZ2g9YVtkKzIqbV18MCxiPXMubG93PWFbZCsyKm0rMV18MDtlbHNle3ZhciBqPXZbbS0xNV0sYj1qLmhpZ2gscD1qLmxvdyxqPShiPj4+MXxwPDwzMSleKGI+Pj44fHA8PDI0KV5iPj4+NyxwPShwPj4+MXxiPDwzMSleKHA+Pj44fGI8PDI0KV4ocD4+Pjd8Yjw8MjUpLHU9dlttLTJdLGI9dS5oaWdoLGM9dS5sb3csdT0oYj4+PjE5fGM8PDEzKV4oYjw8XG4zfGM+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/MTpcbjApLGM9Yyt0LHE9cStXKyhjPj4+MDx0Pj4+MD8xOjApLGM9YytkYSxxPXErZmErKGM+Pj4wPGRhPj4+MD8xOjApLGM9YytiLHE9cStqKyhjPj4+MDxiPj4+MD8xOjApLGI9dStULHM9cCtzKyhiPj4+MDx1Pj4+MD8xOjApLFY9UyxFPUQsUz1SLEQ9QyxSPWwsQz1oLGg9QitjfDAsbD1VK3ErKGg+Pj4wPEI+Pj4wPzE6MCl8MCxVPUEsQj15LEE9eix5PXgsej1rLHg9ZyxnPWMrYnwwLGs9cStzKyhnPj4+MDxjPj4+MD8xOjApfDB9Sj1GLmxvdz1KK2c7Ri5oaWdoPXcraysoSj4+PjA8Zz4+PjA/MTowKTtLPWUubG93PUsreDtlLmhpZ2g9WCt6KyhLPj4+MDx4Pj4+MD8xOjApO0w9bi5sb3c9TCt5O24uaGlnaD1ZK0ErKEw+Pj4wPHk+Pj4wPzE6MCk7TT1yLmxvdz1NK0I7ci5oaWdoPVorVSsoTT4+PjA8Qj4+PjA/MTowKTtOPUcubG93PU4raDtHLmhpZ2g9JCtsKyhOPj4+MDxoPj4+MD8xOjApO089SC5sb3c9TytDO0guaGlnaD1hYStSKyhPPj4+MDxDPj4+MD8xOjApO1A9SS5sb3c9UCtEO1xuSS5oaWdoPWJhK1MrKFA+Pj4wPEQ+Pj4wPzE6MCk7UT1mLmxvdz1RK0U7Zi5oaWdoPWNhK1YrKFE+Pj4wPEU+Pj4wPzE6MCl9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fZGF0YSxkPWEud29yZHMsZj04KnRoaXMuX25EYXRhQnl0ZXMsZT04KmEuc2lnQnl0ZXM7ZFtlPj4+NV18PTEyODw8MjQtZSUzMjtkWyhlKzEyOD4+PjEwPDw1KSszMF09TWF0aC5mbG9vcihmLzQyOTQ5NjcyOTYpO2RbKGUrMTI4Pj4+MTA8PDUpKzMxXT1mO2Euc2lnQnl0ZXM9NCpkLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2gudG9YMzIoKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYT1yLmNsb25lLmNhbGwodGhpcyk7YS5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGF9LGJsb2NrU2l6ZTozMn0pO24uU0hBNTEyPXIuX2NyZWF0ZUhlbHBlcihlKTtuLkhtYWNTSEE1MTI9ci5fY3JlYXRlSG1hY0hlbHBlcihlKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhMzg0LW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxhPWMueDY0LGI9YS5Xb3JkLGU9YS5Xb3JkQXJyYXksYT1jLmFsZ28sZD1hLlNIQTUxMixhPWEuU0hBMzg0PWQuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGUuaW5pdChbbmV3IGIuaW5pdCgzNDE4MDcwMzY1LDMyMzgzNzEwMzIpLG5ldyBiLmluaXQoMTY1NDI3MDI1MCw5MTQxNTA2NjMpLG5ldyBiLmluaXQoMjQzODUyOTM3MCw4MTI3MDI5OTkpLG5ldyBiLmluaXQoMzU1NDYyMzYwLDQxNDQ5MTI2OTcpLG5ldyBiLmluaXQoMTczMTQwNTQxNSw0MjkwNzc1ODU3KSxuZXcgYi5pbml0KDIzOTQxODAyMzEsMTc1MDYwMzAyNSksbmV3IGIuaW5pdCgzNjc1MDA4NTI1LDE2OTQwNzY4MzkpLG5ldyBiLmluaXQoMTIwMzA2MjgxMywzMjA0MDc1NDI4KV0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWQuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT0xNjtyZXR1cm4gYX19KTtjLlNIQTM4ND1cbmQuX2NyZWF0ZUhlbHBlcihhKTtjLkhtYWNTSEEzODQ9ZC5fY3JlYXRlSG1hY0hlbHBlcihhKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgcmlwZW1kMTYwLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4vKlxuXG4oYykgMjAxMiBieSBDZWRyaWMgTWVzbmlsLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbihmdW5jdGlvbigpe3ZhciBxPUNyeXB0b0pTLGQ9cS5saWIsbj1kLldvcmRBcnJheSxwPWQuSGFzaGVyLGQ9cS5hbGdvLHg9bi5jcmVhdGUoWzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10pLHk9bi5jcmVhdGUoWzUsMTQsNywwLDksMiwxMSw0LDEzLDYsMTUsOCwxLDEwLDMsMTIsNiwxMSwzLDcsMCwxMyw1LDEwLDE0LDE1LDgsMTIsNCw5LDEsMiwxNSw1LDEsMyw3LDE0LDYsOSwxMSw4LDEyLDIsMTAsMCw0LDEzLDgsNiw0LDEsMywxMSwxNSwwLDUsMTIsMiwxMyw5LDcsMTAsMTQsMTIsMTUsMTAsNCwxLDUsOCw3LDYsMiwxMywxNCwwLDMsOSwxMV0pLHo9bi5jcmVhdGUoWzExLDE0LDE1LDEyLFxuNSw4LDcsOSwxMSwxMywxNCwxNSw2LDcsOSw4LDcsNiw4LDEzLDExLDksNywxNSw3LDEyLDE1LDksMTEsNywxMywxMiwxMSwxMyw2LDcsMTQsOSwxMywxNSwxNCw4LDEzLDYsNSwxMiw3LDUsMTEsMTIsMTQsMTUsMTQsMTUsOSw4LDksMTQsNSw2LDgsNiw1LDEyLDksMTUsNSwxMSw2LDgsMTMsMTIsNSwxMiwxMywxNCwxMSw4LDUsNl0pLEE9bi5jcmVhdGUoWzgsOSw5LDExLDEzLDE1LDE1LDUsNyw3LDgsMTEsMTQsMTQsMTIsNiw5LDEzLDE1LDcsMTIsOCw5LDExLDcsNywxMiw3LDYsMTUsMTMsMTEsOSw3LDE1LDExLDgsNiw2LDE0LDEyLDEzLDUsMTQsMTMsMTMsNyw1LDE1LDUsOCwxMSwxNCwxNCw2LDE0LDYsOSwxMiw5LDEyLDUsMTUsOCw4LDUsMTIsOSwxMiw1LDE0LDYsOCwxMyw2LDUsMTUsMTMsMTEsMTFdKSxCPW4uY3JlYXRlKFswLDE1MTg1MDAyNDksMTg1OTc3NTM5MywyNDAwOTU5NzA4LDI4NDA4NTM4MzhdKSxDPW4uY3JlYXRlKFsxMzUyODI5OTI2LDE1NDg2MDM2ODQsMTgzNjA3MjY5MSxcbjIwNTM5OTQyMTcsMF0pLGQ9ZC5SSVBFTUQxNjA9cC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uLmNyZWF0ZShbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGUsdil7Zm9yKHZhciBiPTA7MTY+YjtiKyspe3ZhciBjPXYrYixmPWVbY107ZVtjXT0oZjw8OHxmPj4+MjQpJjE2NzExOTM1fChmPDwyNHxmPj4+OCkmNDI3ODI1NTM2MH12YXIgYz10aGlzLl9oYXNoLndvcmRzLGY9Qi53b3JkcyxkPUMud29yZHMsbj14LndvcmRzLHE9eS53b3JkcyxwPXoud29yZHMsdz1BLndvcmRzLHQsZyxoLGoscix1LGssbCxtLHM7dT10PWNbMF07az1nPWNbMV07bD1oPWNbMl07bT1qPWNbM107cz1yPWNbNF07Zm9yKHZhciBhLGI9MDs4MD5iO2IrPTEpYT10K2VbdituW2JdXXwwLGE9MTY+Yj9hKygoZ15oXmopK2ZbMF0pOjMyPmI/YSsoKGcmaHx+ZyZqKStmWzFdKTo0OD5iP1xuYSsoKChnfH5oKV5qKStmWzJdKTo2ND5iP2ErKChnJmp8aCZ+aikrZlszXSk6YSsoKGdeKGh8fmopKStmWzRdKSxhfD0wLGE9YTw8cFtiXXxhPj4+MzItcFtiXSxhPWErcnwwLHQ9cixyPWosaj1oPDwxMHxoPj4+MjIsaD1nLGc9YSxhPXUrZVt2K3FbYl1dfDAsYT0xNj5iP2ErKChrXihsfH5tKSkrZFswXSk6MzI+Yj9hKygoayZtfGwmfm0pK2RbMV0pOjQ4PmI/YSsoKChrfH5sKV5tKStkWzJdKTo2ND5iP2ErKChrJmx8fmsmbSkrZFszXSk6YSsoKGtebF5tKStkWzRdKSxhfD0wLGE9YTw8d1tiXXxhPj4+MzItd1tiXSxhPWErc3wwLHU9cyxzPW0sbT1sPDwxMHxsPj4+MjIsbD1rLGs9YTthPWNbMV0raCttfDA7Y1sxXT1jWzJdK2orc3wwO2NbMl09Y1szXStyK3V8MDtjWzNdPWNbNF0rdCtrfDA7Y1s0XT1jWzBdK2crbHwwO2NbMF09YX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9kYXRhLGQ9ZS53b3JkcyxiPTgqdGhpcy5fbkRhdGFCeXRlcyxjPTgqZS5zaWdCeXRlcztcbmRbYz4+PjVdfD0xMjg8PDI0LWMlMzI7ZFsoYys2ND4+Pjk8PDQpKzE0XT0oYjw8OHxiPj4+MjQpJjE2NzExOTM1fChiPDwyNHxiPj4+OCkmNDI3ODI1NTM2MDtlLnNpZ0J5dGVzPTQqKGQubGVuZ3RoKzEpO3RoaXMuX3Byb2Nlc3MoKTtlPXRoaXMuX2hhc2g7ZD1lLndvcmRzO2ZvcihiPTA7NT5iO2IrKyljPWRbYl0sZFtiXT0oYzw8OHxjPj4+MjQpJjE2NzExOTM1fChjPDwyNHxjPj4+OCkmNDI3ODI1NTM2MDtyZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgZD1wLmNsb25lLmNhbGwodGhpcyk7ZC5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGR9fSk7cS5SSVBFTUQxNjA9cC5fY3JlYXRlSGVscGVyKGQpO3EuSG1hY1JJUEVNRDE2MD1wLl9jcmVhdGVIbWFjSGVscGVyKGQpfSkoTWF0aCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgaG1hYy5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxrPWMuZW5jLlV0Zjg7Yy5hbGdvLkhNQUM9Yy5saWIuQmFzZS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSxiKXthPXRoaXMuX2hhc2hlcj1uZXcgYS5pbml0O1wic3RyaW5nXCI9PXR5cGVvZiBiJiYoYj1rLnBhcnNlKGIpKTt2YXIgYz1hLmJsb2NrU2l6ZSxlPTQqYztiLnNpZ0J5dGVzPmUmJihiPWEuZmluYWxpemUoYikpO2IuY2xhbXAoKTtmb3IodmFyIGY9dGhpcy5fb0tleT1iLmNsb25lKCksZz10aGlzLl9pS2V5PWIuY2xvbmUoKSxoPWYud29yZHMsaj1nLndvcmRzLGQ9MDtkPGM7ZCsrKWhbZF1ePTE1NDk1NTY4MjgsaltkXV49OTA5NTIyNDg2O2Yuc2lnQnl0ZXM9Zy5zaWdCeXRlcz1lO3RoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9oYXNoZXI7YS5yZXNldCgpO2EudXBkYXRlKHRoaXMuX2lLZXkpfSx1cGRhdGU6ZnVuY3Rpb24oYSl7dGhpcy5faGFzaGVyLnVwZGF0ZShhKTtyZXR1cm4gdGhpc30sZmluYWxpemU6ZnVuY3Rpb24oYSl7dmFyIGI9XG50aGlzLl9oYXNoZXI7YT1iLmZpbmFsaXplKGEpO2IucmVzZXQoKTtyZXR1cm4gYi5maW5hbGl6ZSh0aGlzLl9vS2V5LmNsb25lKCkuY29uY2F0KGEpKX19KX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgcGJrZGYyLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYj1DcnlwdG9KUyxhPWIubGliLGQ9YS5CYXNlLG09YS5Xb3JkQXJyYXksYT1iLmFsZ28scT1hLkhNQUMsbD1hLlBCS0RGMj1kLmV4dGVuZCh7Y2ZnOmQuZXh0ZW5kKHtrZXlTaXplOjQsaGFzaGVyOmEuU0hBMSxpdGVyYXRpb25zOjF9KSxpbml0OmZ1bmN0aW9uKGEpe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChhKX0sY29tcHV0ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz10aGlzLmNmZyxmPXEuY3JlYXRlKGMuaGFzaGVyLGEpLGc9bS5jcmVhdGUoKSxkPW0uY3JlYXRlKFsxXSksbD1nLndvcmRzLHI9ZC53b3JkcyxuPWMua2V5U2l6ZSxjPWMuaXRlcmF0aW9ucztsLmxlbmd0aDxuOyl7dmFyIGg9Zi51cGRhdGUoYikuZmluYWxpemUoZCk7Zi5yZXNldCgpO2Zvcih2YXIgaj1oLndvcmRzLHM9ai5sZW5ndGgsaz1oLHA9MTtwPGM7cCsrKXtrPWYuZmluYWxpemUoayk7Zi5yZXNldCgpO2Zvcih2YXIgdD1rLndvcmRzLGU9MDtlPHM7ZSsrKWpbZV1ePXRbZV19Zy5jb25jYXQoaCk7XG5yWzBdKyt9Zy5zaWdCeXRlcz00Km47cmV0dXJuIGd9fSk7Yi5QQktERjI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBsLmNyZWF0ZShjKS5jb21wdXRlKGEsYil9fSkoKTtcblxuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbnZhciBiNjRtYXA9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7dmFyIGI2NHBhZD1cIj1cIjtmdW5jdGlvbiBoZXgyYjY0KGQpe3ZhciBiO3ZhciBlO3ZhciBhPVwiXCI7Zm9yKGI9MDtiKzM8PWQubGVuZ3RoO2IrPTMpe2U9cGFyc2VJbnQoZC5zdWJzdHJpbmcoYixiKzMpLDE2KTthKz1iNjRtYXAuY2hhckF0KGU+PjYpK2I2NG1hcC5jaGFyQXQoZSY2Myl9aWYoYisxPT1kLmxlbmd0aCl7ZT1wYXJzZUludChkLnN1YnN0cmluZyhiLGIrMSksMTYpO2ErPWI2NG1hcC5jaGFyQXQoZTw8Mil9ZWxzZXtpZihiKzI9PWQubGVuZ3RoKXtlPXBhcnNlSW50KGQuc3Vic3RyaW5nKGIsYisyKSwxNik7YSs9YjY0bWFwLmNoYXJBdChlPj4yKStiNjRtYXAuY2hhckF0KChlJjMpPDw0KX19aWYoYjY0cGFkKXt3aGlsZSgoYS5sZW5ndGgmMyk+MCl7YSs9YjY0cGFkfX1yZXR1cm4gYX1mdW5jdGlvbiBiNjR0b2hleChmKXt2YXIgZD1cIlwiO3ZhciBlO3ZhciBiPTA7dmFyIGM7dmFyIGE7Zm9yKGU9MDtlPGYubGVuZ3RoOysrZSl7aWYoZi5jaGFyQXQoZSk9PWI2NHBhZCl7YnJlYWt9YT1iNjRtYXAuaW5kZXhPZihmLmNoYXJBdChlKSk7aWYoYTwwKXtjb250aW51ZX1pZihiPT0wKXtkKz1pbnQyY2hhcihhPj4yKTtjPWEmMztiPTF9ZWxzZXtpZihiPT0xKXtkKz1pbnQyY2hhcigoYzw8Mil8KGE+PjQpKTtjPWEmMTU7Yj0yfWVsc2V7aWYoYj09Mil7ZCs9aW50MmNoYXIoYyk7ZCs9aW50MmNoYXIoYT4+Mik7Yz1hJjM7Yj0zfWVsc2V7ZCs9aW50MmNoYXIoKGM8PDIpfChhPj40KSk7ZCs9aW50MmNoYXIoYSYxNSk7Yj0wfX19fWlmKGI9PTEpe2QrPWludDJjaGFyKGM8PDIpfXJldHVybiBkfWZ1bmN0aW9uIGI2NHRvQkEoZSl7dmFyIGQ9YjY0dG9oZXgoZSk7dmFyIGM7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKGM9MDsyKmM8ZC5sZW5ndGg7KytjKXtiW2NdPXBhcnNlSW50KGQuc3Vic3RyaW5nKDIqYywyKmMrMiksMTYpfXJldHVybiBifTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG52YXIgZGJpdHM7dmFyIGNhbmFyeT0yNDQ4Mzc4MTQwOTQ1OTA7dmFyIGpfbG09KChjYW5hcnkmMTY3NzcyMTUpPT0xNTcxNTA3MCk7ZnVuY3Rpb24gQmlnSW50ZWdlcihlLGQsZil7aWYoZSE9bnVsbCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpe3RoaXMuZnJvbU51bWJlcihlLGQsZil9ZWxzZXtpZihkPT1udWxsJiZcInN0cmluZ1wiIT10eXBlb2YgZSl7dGhpcy5mcm9tU3RyaW5nKGUsMjU2KX1lbHNle3RoaXMuZnJvbVN0cmluZyhlLGQpfX19fWZ1bmN0aW9uIG5iaSgpe3JldHVybiBuZXcgQmlnSW50ZWdlcihudWxsKX1mdW5jdGlvbiBhbTEoZixhLGIsZSxoLGcpe3doaWxlKC0tZz49MCl7dmFyIGQ9YSp0aGlzW2YrK10rYltlXStoO2g9TWF0aC5mbG9vcihkLzY3MTA4ODY0KTtiW2UrK109ZCY2NzEwODg2M31yZXR1cm4gaH1mdW5jdGlvbiBhbTIoZixxLHIsZSxvLGEpe3ZhciBrPXEmMzI3NjcscD1xPj4xNTt3aGlsZSgtLWE+PTApe3ZhciBkPXRoaXNbZl0mMzI3Njc7dmFyIGc9dGhpc1tmKytdPj4xNTt2YXIgYj1wKmQrZyprO2Q9aypkKygoYiYzMjc2Nyk8PDE1KStyW2VdKyhvJjEwNzM3NDE4MjMpO289KGQ+Pj4zMCkrKGI+Pj4xNSkrcCpnKyhvPj4+MzApO3JbZSsrXT1kJjEwNzM3NDE4MjN9cmV0dXJuIG99ZnVuY3Rpb24gYW0zKGYscSxyLGUsbyxhKXt2YXIgaz1xJjE2MzgzLHA9cT4+MTQ7d2hpbGUoLS1hPj0wKXt2YXIgZD10aGlzW2ZdJjE2MzgzO3ZhciBnPXRoaXNbZisrXT4+MTQ7dmFyIGI9cCpkK2cqaztkPWsqZCsoKGImMTYzODMpPDwxNCkrcltlXStvO289KGQ+PjI4KSsoYj4+MTQpK3AqZztyW2UrK109ZCYyNjg0MzU0NTV9cmV0dXJuIG99aWYoal9sbSYmKG5hdmlnYXRvci5hcHBOYW1lPT1cIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlclwiKSl7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0yO2RiaXRzPTMwfWVsc2V7aWYoal9sbSYmKG5hdmlnYXRvci5hcHBOYW1lIT1cIk5ldHNjYXBlXCIpKXtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbT1hbTE7ZGJpdHM9MjZ9ZWxzZXtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbT1hbTM7ZGJpdHM9Mjh9fUJpZ0ludGVnZXIucHJvdG90eXBlLkRCPWRiaXRzO0JpZ0ludGVnZXIucHJvdG90eXBlLkRNPSgoMTw8ZGJpdHMpLTEpO0JpZ0ludGVnZXIucHJvdG90eXBlLkRWPSgxPDxkYml0cyk7dmFyIEJJX0ZQPTUyO0JpZ0ludGVnZXIucHJvdG90eXBlLkZWPU1hdGgucG93KDIsQklfRlApO0JpZ0ludGVnZXIucHJvdG90eXBlLkYxPUJJX0ZQLWRiaXRzO0JpZ0ludGVnZXIucHJvdG90eXBlLkYyPTIqZGJpdHMtQklfRlA7dmFyIEJJX1JNPVwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7dmFyIEJJX1JDPW5ldyBBcnJheSgpO3ZhciBycix2djtycj1cIjBcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0wO3Z2PD05OysrdnYpe0JJX1JDW3JyKytdPXZ2fXJyPVwiYVwiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpe0JJX1JDW3JyKytdPXZ2fXJyPVwiQVwiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpe0JJX1JDW3JyKytdPXZ2fWZ1bmN0aW9uIGludDJjaGFyKGEpe3JldHVybiBCSV9STS5jaGFyQXQoYSl9ZnVuY3Rpb24gaW50QXQoYixhKXt2YXIgZD1CSV9SQ1tiLmNoYXJDb2RlQXQoYSldO3JldHVybihkPT1udWxsKT8tMTpkfWZ1bmN0aW9uIGJucENvcHlUbyhiKXtmb3IodmFyIGE9dGhpcy50LTE7YT49MDstLWEpe2JbYV09dGhpc1thXX1iLnQ9dGhpcy50O2Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wRnJvbUludChhKXt0aGlzLnQ9MTt0aGlzLnM9KGE8MCk/LTE6MDtpZihhPjApe3RoaXNbMF09YX1lbHNle2lmKGE8LTEpe3RoaXNbMF09YSt0aGlzLkRWfWVsc2V7dGhpcy50PTB9fX1mdW5jdGlvbiBuYnYoYSl7dmFyIGI9bmJpKCk7Yi5mcm9tSW50KGEpO3JldHVybiBifWZ1bmN0aW9uIGJucEZyb21TdHJpbmcoaCxjKXt2YXIgZTtpZihjPT0xNil7ZT00fWVsc2V7aWYoYz09OCl7ZT0zfWVsc2V7aWYoYz09MjU2KXtlPTh9ZWxzZXtpZihjPT0yKXtlPTF9ZWxzZXtpZihjPT0zMil7ZT01fWVsc2V7aWYoYz09NCl7ZT0yfWVsc2V7dGhpcy5mcm9tUmFkaXgoaCxjKTtyZXR1cm59fX19fX10aGlzLnQ9MDt0aGlzLnM9MDt2YXIgZz1oLmxlbmd0aCxkPWZhbHNlLGY9MDt3aGlsZSgtLWc+PTApe3ZhciBhPShlPT04KT9oW2ddJjI1NTppbnRBdChoLGcpO2lmKGE8MCl7aWYoaC5jaGFyQXQoZyk9PVwiLVwiKXtkPXRydWV9Y29udGludWV9ZD1mYWxzZTtpZihmPT0wKXt0aGlzW3RoaXMudCsrXT1hfWVsc2V7aWYoZitlPnRoaXMuREIpe3RoaXNbdGhpcy50LTFdfD0oYSYoKDE8PCh0aGlzLkRCLWYpKS0xKSk8PGY7dGhpc1t0aGlzLnQrK109KGE+Pih0aGlzLkRCLWYpKX1lbHNle3RoaXNbdGhpcy50LTFdfD1hPDxmfX1mKz1lO2lmKGY+PXRoaXMuREIpe2YtPXRoaXMuREJ9fWlmKGU9PTgmJihoWzBdJjEyOCkhPTApe3RoaXMucz0tMTtpZihmPjApe3RoaXNbdGhpcy50LTFdfD0oKDE8PCh0aGlzLkRCLWYpKS0xKTw8Zn19dGhpcy5jbGFtcCgpO2lmKGQpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpfX1mdW5jdGlvbiBibnBDbGFtcCgpe3ZhciBhPXRoaXMucyZ0aGlzLkRNO3doaWxlKHRoaXMudD4wJiZ0aGlzW3RoaXMudC0xXT09YSl7LS10aGlzLnR9fWZ1bmN0aW9uIGJuVG9TdHJpbmcoYyl7aWYodGhpcy5zPDApe3JldHVyblwiLVwiK3RoaXMubmVnYXRlKCkudG9TdHJpbmcoYyl9dmFyIGU7aWYoYz09MTYpe2U9NH1lbHNle2lmKGM9PTgpe2U9M31lbHNle2lmKGM9PTIpe2U9MX1lbHNle2lmKGM9PTMyKXtlPTV9ZWxzZXtpZihjPT00KXtlPTJ9ZWxzZXtyZXR1cm4gdGhpcy50b1JhZGl4KGMpfX19fX12YXIgZz0oMTw8ZSktMSxsLGE9ZmFsc2UsaD1cIlwiLGY9dGhpcy50O3ZhciBqPXRoaXMuREItKGYqdGhpcy5EQiklZTtpZihmLS0+MCl7aWYoajx0aGlzLkRCJiYobD10aGlzW2ZdPj5qKT4wKXthPXRydWU7aD1pbnQyY2hhcihsKX13aGlsZShmPj0wKXtpZihqPGUpe2w9KHRoaXNbZl0mKCgxPDxqKS0xKSk8PChlLWopO2x8PXRoaXNbLS1mXT4+KGorPXRoaXMuREItZSl9ZWxzZXtsPSh0aGlzW2ZdPj4oai09ZSkpJmc7aWYoajw9MCl7ais9dGhpcy5EQjstLWZ9fWlmKGw+MCl7YT10cnVlfWlmKGEpe2grPWludDJjaGFyKGwpfX19cmV0dXJuIGE/aDpcIjBcIn1mdW5jdGlvbiBibk5lZ2F0ZSgpe3ZhciBhPW5iaSgpO0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuQWJzKCl7cmV0dXJuKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXN9ZnVuY3Rpb24gYm5Db21wYXJlVG8oYil7dmFyIGQ9dGhpcy5zLWIucztpZihkIT0wKXtyZXR1cm4gZH12YXIgYz10aGlzLnQ7ZD1jLWIudDtpZihkIT0wKXtyZXR1cm4odGhpcy5zPDApPy1kOmR9d2hpbGUoLS1jPj0wKXtpZigoZD10aGlzW2NdLWJbY10pIT0wKXtyZXR1cm4gZH19cmV0dXJuIDB9ZnVuY3Rpb24gbmJpdHMoYSl7dmFyIGM9MSxiO2lmKChiPWE+Pj4xNikhPTApe2E9YjtjKz0xNn1pZigoYj1hPj44KSE9MCl7YT1iO2MrPTh9aWYoKGI9YT4+NCkhPTApe2E9YjtjKz00fWlmKChiPWE+PjIpIT0wKXthPWI7Yys9Mn1pZigoYj1hPj4xKSE9MCl7YT1iO2MrPTF9cmV0dXJuIGN9ZnVuY3Rpb24gYm5CaXRMZW5ndGgoKXtpZih0aGlzLnQ8PTApe3JldHVybiAwfXJldHVybiB0aGlzLkRCKih0aGlzLnQtMSkrbmJpdHModGhpc1t0aGlzLnQtMV1eKHRoaXMucyZ0aGlzLkRNKSl9ZnVuY3Rpb24gYm5wRExTaGlmdFRvKGMsYil7dmFyIGE7Zm9yKGE9dGhpcy50LTE7YT49MDstLWEpe2JbYStjXT10aGlzW2FdfWZvcihhPWMtMTthPj0wOy0tYSl7YlthXT0wfWIudD10aGlzLnQrYztiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucERSU2hpZnRUbyhjLGIpe2Zvcih2YXIgYT1jO2E8dGhpcy50OysrYSl7YlthLWNdPXRoaXNbYV19Yi50PU1hdGgubWF4KHRoaXMudC1jLDApO2Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wTFNoaWZ0VG8oaixlKXt2YXIgYj1qJXRoaXMuREI7dmFyIGE9dGhpcy5EQi1iO3ZhciBnPSgxPDxhKS0xO3ZhciBmPU1hdGguZmxvb3Ioai90aGlzLkRCKSxoPSh0aGlzLnM8PGIpJnRoaXMuRE0sZDtmb3IoZD10aGlzLnQtMTtkPj0wOy0tZCl7ZVtkK2YrMV09KHRoaXNbZF0+PmEpfGg7aD0odGhpc1tkXSZnKTw8Yn1mb3IoZD1mLTE7ZD49MDstLWQpe2VbZF09MH1lW2ZdPWg7ZS50PXRoaXMudCtmKzE7ZS5zPXRoaXMucztlLmNsYW1wKCl9ZnVuY3Rpb24gYm5wUlNoaWZ0VG8oZyxkKXtkLnM9dGhpcy5zO3ZhciBlPU1hdGguZmxvb3IoZy90aGlzLkRCKTtpZihlPj10aGlzLnQpe2QudD0wO3JldHVybn12YXIgYj1nJXRoaXMuREI7dmFyIGE9dGhpcy5EQi1iO3ZhciBmPSgxPDxiKS0xO2RbMF09dGhpc1tlXT4+Yjtmb3IodmFyIGM9ZSsxO2M8dGhpcy50OysrYyl7ZFtjLWUtMV18PSh0aGlzW2NdJmYpPDxhO2RbYy1lXT10aGlzW2NdPj5ifWlmKGI+MCl7ZFt0aGlzLnQtZS0xXXw9KHRoaXMucyZmKTw8YX1kLnQ9dGhpcy50LWU7ZC5jbGFtcCgpfWZ1bmN0aW9uIGJucFN1YlRvKGQsZil7dmFyIGU9MCxnPTAsYj1NYXRoLm1pbihkLnQsdGhpcy50KTt3aGlsZShlPGIpe2crPXRoaXNbZV0tZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWlmKGQudDx0aGlzLnQpe2ctPWQuczt3aGlsZShlPHRoaXMudCl7Zys9dGhpc1tlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWcrPXRoaXMuc31lbHNle2crPXRoaXMuczt3aGlsZShlPGQudCl7Zy09ZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWctPWQuc31mLnM9KGc8MCk/LTE6MDtpZihnPC0xKXtmW2UrK109dGhpcy5EVitnfWVsc2V7aWYoZz4wKXtmW2UrK109Z319Zi50PWU7Zi5jbGFtcCgpfWZ1bmN0aW9uIGJucE11bHRpcGx5VG8oYyxlKXt2YXIgYj10aGlzLmFicygpLGY9Yy5hYnMoKTt2YXIgZD1iLnQ7ZS50PWQrZi50O3doaWxlKC0tZD49MCl7ZVtkXT0wfWZvcihkPTA7ZDxmLnQ7KytkKXtlW2QrYi50XT1iLmFtKDAsZltkXSxlLGQsMCxiLnQpfWUucz0wO2UuY2xhbXAoKTtpZih0aGlzLnMhPWMucyl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKGUsZSl9fWZ1bmN0aW9uIGJucFNxdWFyZVRvKGQpe3ZhciBhPXRoaXMuYWJzKCk7dmFyIGI9ZC50PTIqYS50O3doaWxlKC0tYj49MCl7ZFtiXT0wfWZvcihiPTA7YjxhLnQtMTsrK2Ipe3ZhciBlPWEuYW0oYixhW2JdLGQsMipiLDAsMSk7aWYoKGRbYithLnRdKz1hLmFtKGIrMSwyKmFbYl0sZCwyKmIrMSxlLGEudC1iLTEpKT49YS5EVil7ZFtiK2EudF0tPWEuRFY7ZFtiK2EudCsxXT0xfX1pZihkLnQ+MCl7ZFtkLnQtMV0rPWEuYW0oYixhW2JdLGQsMipiLDAsMSl9ZC5zPTA7ZC5jbGFtcCgpfWZ1bmN0aW9uIGJucERpdlJlbVRvKG4saCxnKXt2YXIgdz1uLmFicygpO2lmKHcudDw9MCl7cmV0dXJufXZhciBrPXRoaXMuYWJzKCk7aWYoay50PHcudCl7aWYoaCE9bnVsbCl7aC5mcm9tSW50KDApfWlmKGchPW51bGwpe3RoaXMuY29weVRvKGcpfXJldHVybn1pZihnPT1udWxsKXtnPW5iaSgpfXZhciBkPW5iaSgpLGE9dGhpcy5zLGw9bi5zO3ZhciB2PXRoaXMuREItbmJpdHMod1t3LnQtMV0pO2lmKHY+MCl7dy5sU2hpZnRUbyh2LGQpO2subFNoaWZ0VG8odixnKX1lbHNle3cuY29weVRvKGQpO2suY29weVRvKGcpfXZhciBwPWQudDt2YXIgYj1kW3AtMV07aWYoYj09MCl7cmV0dXJufXZhciBvPWIqKDE8PHRoaXMuRjEpKygocD4xKT9kW3AtMl0+PnRoaXMuRjI6MCk7dmFyIEE9dGhpcy5GVi9vLHo9KDE8PHRoaXMuRjEpL28seD0xPDx0aGlzLkYyO3ZhciB1PWcudCxzPXUtcCxmPShoPT1udWxsKT9uYmkoKTpoO2QuZGxTaGlmdFRvKHMsZik7aWYoZy5jb21wYXJlVG8oZik+PTApe2dbZy50KytdPTE7Zy5zdWJUbyhmLGcpfUJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbyhwLGYpO2Yuc3ViVG8oZCxkKTt3aGlsZShkLnQ8cCl7ZFtkLnQrK109MH13aGlsZSgtLXM+PTApe3ZhciBjPShnWy0tdV09PWIpP3RoaXMuRE06TWF0aC5mbG9vcihnW3VdKkErKGdbdS0xXSt4KSp6KTtpZigoZ1t1XSs9ZC5hbSgwLGMsZyxzLDAscCkpPGMpe2QuZGxTaGlmdFRvKHMsZik7Zy5zdWJUbyhmLGcpO3doaWxlKGdbdV08LS1jKXtnLnN1YlRvKGYsZyl9fX1pZihoIT1udWxsKXtnLmRyU2hpZnRUbyhwLGgpO2lmKGEhPWwpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyhoLGgpfX1nLnQ9cDtnLmNsYW1wKCk7aWYodj4wKXtnLnJTaGlmdFRvKHYsZyl9aWYoYTwwKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8oZyxnKX19ZnVuY3Rpb24gYm5Nb2QoYil7dmFyIGM9bmJpKCk7dGhpcy5hYnMoKS5kaXZSZW1UbyhiLG51bGwsYyk7aWYodGhpcy5zPDAmJmMuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk+MCl7Yi5zdWJUbyhjLGMpfXJldHVybiBjfWZ1bmN0aW9uIENsYXNzaWMoYSl7dGhpcy5tPWF9ZnVuY3Rpb24gY0NvbnZlcnQoYSl7aWYoYS5zPDB8fGEuY29tcGFyZVRvKHRoaXMubSk+PTApe3JldHVybiBhLm1vZCh0aGlzLm0pfWVsc2V7cmV0dXJuIGF9fWZ1bmN0aW9uIGNSZXZlcnQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gY1JlZHVjZShhKXthLmRpdlJlbVRvKHRoaXMubSxudWxsLGEpfWZ1bmN0aW9uIGNNdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYik7dGhpcy5yZWR1Y2UoYil9ZnVuY3Rpb24gY1NxclRvKGEsYil7YS5zcXVhcmVUbyhiKTt0aGlzLnJlZHVjZShiKX1DbGFzc2ljLnByb3RvdHlwZS5jb252ZXJ0PWNDb252ZXJ0O0NsYXNzaWMucHJvdG90eXBlLnJldmVydD1jUmV2ZXJ0O0NsYXNzaWMucHJvdG90eXBlLnJlZHVjZT1jUmVkdWNlO0NsYXNzaWMucHJvdG90eXBlLm11bFRvPWNNdWxUbztDbGFzc2ljLnByb3RvdHlwZS5zcXJUbz1jU3FyVG87ZnVuY3Rpb24gYm5wSW52RGlnaXQoKXtpZih0aGlzLnQ8MSl7cmV0dXJuIDB9dmFyIGE9dGhpc1swXTtpZigoYSYxKT09MCl7cmV0dXJuIDB9dmFyIGI9YSYzO2I9KGIqKDItKGEmMTUpKmIpKSYxNTtiPShiKigyLShhJjI1NSkqYikpJjI1NTtiPShiKigyLSgoKGEmNjU1MzUpKmIpJjY1NTM1KSkpJjY1NTM1O2I9KGIqKDItYSpiJXRoaXMuRFYpKSV0aGlzLkRWO3JldHVybihiPjApP3RoaXMuRFYtYjotYn1mdW5jdGlvbiBNb250Z29tZXJ5KGEpe3RoaXMubT1hO3RoaXMubXA9YS5pbnZEaWdpdCgpO3RoaXMubXBsPXRoaXMubXAmMzI3Njc7dGhpcy5tcGg9dGhpcy5tcD4+MTU7dGhpcy51bT0oMTw8KGEuREItMTUpKS0xO3RoaXMubXQyPTIqYS50fWZ1bmN0aW9uIG1vbnRDb252ZXJ0KGEpe3ZhciBiPW5iaSgpO2EuYWJzKCkuZGxTaGlmdFRvKHRoaXMubS50LGIpO2IuZGl2UmVtVG8odGhpcy5tLG51bGwsYik7aWYoYS5zPDAmJmIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk+MCl7dGhpcy5tLnN1YlRvKGIsYil9cmV0dXJuIGJ9ZnVuY3Rpb24gbW9udFJldmVydChhKXt2YXIgYj1uYmkoKTthLmNvcHlUbyhiKTt0aGlzLnJlZHVjZShiKTtyZXR1cm4gYn1mdW5jdGlvbiBtb250UmVkdWNlKGEpe3doaWxlKGEudDw9dGhpcy5tdDIpe2FbYS50KytdPTB9Zm9yKHZhciBjPTA7Yzx0aGlzLm0udDsrK2Mpe3ZhciBiPWFbY10mMzI3Njc7dmFyIGQ9KGIqdGhpcy5tcGwrKCgoYip0aGlzLm1waCsoYVtjXT4+MTUpKnRoaXMubXBsKSZ0aGlzLnVtKTw8MTUpKSZhLkRNO2I9Yyt0aGlzLm0udDthW2JdKz10aGlzLm0uYW0oMCxkLGEsYywwLHRoaXMubS50KTt3aGlsZShhW2JdPj1hLkRWKXthW2JdLT1hLkRWO2FbKytiXSsrfX1hLmNsYW1wKCk7YS5kclNoaWZ0VG8odGhpcy5tLnQsYSk7aWYoYS5jb21wYXJlVG8odGhpcy5tKT49MCl7YS5zdWJUbyh0aGlzLm0sYSl9fWZ1bmN0aW9uIG1vbnRTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9ZnVuY3Rpb24gbW9udE11bFRvKGEsYyxiKXthLm11bHRpcGx5VG8oYyxiKTt0aGlzLnJlZHVjZShiKX1Nb250Z29tZXJ5LnByb3RvdHlwZS5jb252ZXJ0PW1vbnRDb252ZXJ0O01vbnRnb21lcnkucHJvdG90eXBlLnJldmVydD1tb250UmV2ZXJ0O01vbnRnb21lcnkucHJvdG90eXBlLnJlZHVjZT1tb250UmVkdWNlO01vbnRnb21lcnkucHJvdG90eXBlLm11bFRvPW1vbnRNdWxUbztNb250Z29tZXJ5LnByb3RvdHlwZS5zcXJUbz1tb250U3FyVG87ZnVuY3Rpb24gYm5wSXNFdmVuKCl7cmV0dXJuKCh0aGlzLnQ+MCk/KHRoaXNbMF0mMSk6dGhpcy5zKT09MH1mdW5jdGlvbiBibnBFeHAoaCxqKXtpZihoPjQyOTQ5NjcyOTV8fGg8MSl7cmV0dXJuIEJpZ0ludGVnZXIuT05FfXZhciBmPW5iaSgpLGE9bmJpKCksZD1qLmNvbnZlcnQodGhpcyksYz1uYml0cyhoKS0xO2QuY29weVRvKGYpO3doaWxlKC0tYz49MCl7ai5zcXJUbyhmLGEpO2lmKChoJigxPDxjKSk+MCl7ai5tdWxUbyhhLGQsZil9ZWxzZXt2YXIgYj1mO2Y9YTthPWJ9fXJldHVybiBqLnJldmVydChmKX1mdW5jdGlvbiBibk1vZFBvd0ludChiLGEpe3ZhciBjO2lmKGI8MjU2fHxhLmlzRXZlbigpKXtjPW5ldyBDbGFzc2ljKGEpfWVsc2V7Yz1uZXcgTW9udGdvbWVyeShhKX1yZXR1cm4gdGhpcy5leHAoYixjKX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5jb3B5VG89Ym5wQ29weVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21JbnQ9Ym5wRnJvbUludDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tU3RyaW5nPWJucEZyb21TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUuY2xhbXA9Ym5wQ2xhbXA7QmlnSW50ZWdlci5wcm90b3R5cGUuZGxTaGlmdFRvPWJucERMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5kclNoaWZ0VG89Ym5wRFJTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmxTaGlmdFRvPWJucExTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLnJTaGlmdFRvPWJucFJTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLnN1YlRvPWJucFN1YlRvO0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VG89Ym5wTXVsdGlwbHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmVUbz1ibnBTcXVhcmVUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZSZW1Ubz1ibnBEaXZSZW1UbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnZEaWdpdD1ibnBJbnZEaWdpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc0V2ZW49Ym5wSXNFdmVuO0JpZ0ludGVnZXIucHJvdG90eXBlLmV4cD1ibnBFeHA7QmlnSW50ZWdlci5wcm90b3R5cGUudG9TdHJpbmc9Ym5Ub1N0cmluZztCaWdJbnRlZ2VyLnByb3RvdHlwZS5uZWdhdGU9Ym5OZWdhdGU7QmlnSW50ZWdlci5wcm90b3R5cGUuYWJzPWJuQWJzO0JpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbz1ibkNvbXBhcmVUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRMZW5ndGg9Ym5CaXRMZW5ndGg7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kPWJuTW9kO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvd0ludD1ibk1vZFBvd0ludDtCaWdJbnRlZ2VyLlpFUk89bmJ2KDApO0JpZ0ludGVnZXIuT05FPW5idigxKTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBibkNsb25lKCl7dmFyIGE9bmJpKCk7dGhpcy5jb3B5VG8oYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5JbnRWYWx1ZSgpe2lmKHRoaXMuczwwKXtpZih0aGlzLnQ9PTEpe3JldHVybiB0aGlzWzBdLXRoaXMuRFZ9ZWxzZXtpZih0aGlzLnQ9PTApe3JldHVybiAtMX19fWVsc2V7aWYodGhpcy50PT0xKXtyZXR1cm4gdGhpc1swXX1lbHNle2lmKHRoaXMudD09MCl7cmV0dXJuIDB9fX1yZXR1cm4oKHRoaXNbMV0mKCgxPDwoMzItdGhpcy5EQikpLTEpKTw8dGhpcy5EQil8dGhpc1swXX1mdW5jdGlvbiBibkJ5dGVWYWx1ZSgpe3JldHVybih0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MjQpPj4yNH1mdW5jdGlvbiBiblNob3J0VmFsdWUoKXtyZXR1cm4odGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDE2KT4+MTZ9ZnVuY3Rpb24gYm5wQ2h1bmtTaXplKGEpe3JldHVybiBNYXRoLmZsb29yKE1hdGguTE4yKnRoaXMuREIvTWF0aC5sb2coYSkpfWZ1bmN0aW9uIGJuU2lnTnVtKCl7aWYodGhpcy5zPDApe3JldHVybiAtMX1lbHNle2lmKHRoaXMudDw9MHx8KHRoaXMudD09MSYmdGhpc1swXTw9MCkpe3JldHVybiAwfWVsc2V7cmV0dXJuIDF9fX1mdW5jdGlvbiBibnBUb1JhZGl4KGMpe2lmKGM9PW51bGwpe2M9MTB9aWYodGhpcy5zaWdudW0oKT09MHx8YzwyfHxjPjM2KXtyZXR1cm5cIjBcIn12YXIgZj10aGlzLmNodW5rU2l6ZShjKTt2YXIgZT1NYXRoLnBvdyhjLGYpO3ZhciBpPW5idihlKSxqPW5iaSgpLGg9bmJpKCksZz1cIlwiO3RoaXMuZGl2UmVtVG8oaSxqLGgpO3doaWxlKGouc2lnbnVtKCk+MCl7Zz0oZStoLmludFZhbHVlKCkpLnRvU3RyaW5nKGMpLnN1YnN0cigxKStnO2ouZGl2UmVtVG8oaSxqLGgpfXJldHVybiBoLmludFZhbHVlKCkudG9TdHJpbmcoYykrZ31mdW5jdGlvbiBibnBGcm9tUmFkaXgobSxoKXt0aGlzLmZyb21JbnQoMCk7aWYoaD09bnVsbCl7aD0xMH12YXIgZj10aGlzLmNodW5rU2l6ZShoKTt2YXIgZz1NYXRoLnBvdyhoLGYpLGU9ZmFsc2UsYT0wLGw9MDtmb3IodmFyIGM9MDtjPG0ubGVuZ3RoOysrYyl7dmFyIGs9aW50QXQobSxjKTtpZihrPDApe2lmKG0uY2hhckF0KGMpPT1cIi1cIiYmdGhpcy5zaWdudW0oKT09MCl7ZT10cnVlfWNvbnRpbnVlfWw9aCpsK2s7aWYoKythPj1mKXt0aGlzLmRNdWx0aXBseShnKTt0aGlzLmRBZGRPZmZzZXQobCwwKTthPTA7bD0wfX1pZihhPjApe3RoaXMuZE11bHRpcGx5KE1hdGgucG93KGgsYSkpO3RoaXMuZEFkZE9mZnNldChsLDApfWlmKGUpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpfX1mdW5jdGlvbiBibnBGcm9tTnVtYmVyKGYsZSxoKXtpZihcIm51bWJlclwiPT10eXBlb2YgZSl7aWYoZjwyKXt0aGlzLmZyb21JbnQoMSl9ZWxzZXt0aGlzLmZyb21OdW1iZXIoZixoKTtpZighdGhpcy50ZXN0Qml0KGYtMSkpe3RoaXMuYml0d2lzZVRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChmLTEpLG9wX29yLHRoaXMpfWlmKHRoaXMuaXNFdmVuKCkpe3RoaXMuZEFkZE9mZnNldCgxLDApfXdoaWxlKCF0aGlzLmlzUHJvYmFibGVQcmltZShlKSl7dGhpcy5kQWRkT2Zmc2V0KDIsMCk7aWYodGhpcy5iaXRMZW5ndGgoKT5mKXt0aGlzLnN1YlRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChmLTEpLHRoaXMpfX19fWVsc2V7dmFyIGQ9bmV3IEFycmF5KCksZz1mJjc7ZC5sZW5ndGg9KGY+PjMpKzE7ZS5uZXh0Qnl0ZXMoZCk7aWYoZz4wKXtkWzBdJj0oKDE8PGcpLTEpfWVsc2V7ZFswXT0wfXRoaXMuZnJvbVN0cmluZyhkLDI1Nil9fWZ1bmN0aW9uIGJuVG9CeXRlQXJyYXkoKXt2YXIgYj10aGlzLnQsYz1uZXcgQXJyYXkoKTtjWzBdPXRoaXMuczt2YXIgZT10aGlzLkRCLShiKnRoaXMuREIpJTgsZixhPTA7aWYoYi0tPjApe2lmKGU8dGhpcy5EQiYmKGY9dGhpc1tiXT4+ZSkhPSh0aGlzLnMmdGhpcy5ETSk+PmUpe2NbYSsrXT1mfCh0aGlzLnM8PCh0aGlzLkRCLWUpKX13aGlsZShiPj0wKXtpZihlPDgpe2Y9KHRoaXNbYl0mKCgxPDxlKS0xKSk8PCg4LWUpO2Z8PXRoaXNbLS1iXT4+KGUrPXRoaXMuREItOCl9ZWxzZXtmPSh0aGlzW2JdPj4oZS09OCkpJjI1NTtpZihlPD0wKXtlKz10aGlzLkRCOy0tYn19aWYoKGYmMTI4KSE9MCl7Znw9LTI1Nn1pZihhPT0wJiYodGhpcy5zJjEyOCkhPShmJjEyOCkpeysrYX1pZihhPjB8fGYhPXRoaXMucyl7Y1thKytdPWZ9fX1yZXR1cm4gY31mdW5jdGlvbiBibkVxdWFscyhiKXtyZXR1cm4odGhpcy5jb21wYXJlVG8oYik9PTApfWZ1bmN0aW9uIGJuTWluKGIpe3JldHVybih0aGlzLmNvbXBhcmVUbyhiKTwwKT90aGlzOmJ9ZnVuY3Rpb24gYm5NYXgoYil7cmV0dXJuKHRoaXMuY29tcGFyZVRvKGIpPjApP3RoaXM6Yn1mdW5jdGlvbiBibnBCaXR3aXNlVG8oYyxoLGUpe3ZhciBkLGcsYj1NYXRoLm1pbihjLnQsdGhpcy50KTtmb3IoZD0wO2Q8YjsrK2Qpe2VbZF09aCh0aGlzW2RdLGNbZF0pfWlmKGMudDx0aGlzLnQpe2c9Yy5zJnRoaXMuRE07Zm9yKGQ9YjtkPHRoaXMudDsrK2Qpe2VbZF09aCh0aGlzW2RdLGcpfWUudD10aGlzLnR9ZWxzZXtnPXRoaXMucyZ0aGlzLkRNO2ZvcihkPWI7ZDxjLnQ7KytkKXtlW2RdPWgoZyxjW2RdKX1lLnQ9Yy50fWUucz1oKHRoaXMucyxjLnMpO2UuY2xhbXAoKX1mdW5jdGlvbiBvcF9hbmQoYSxiKXtyZXR1cm4gYSZifWZ1bmN0aW9uIGJuQW5kKGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3BfYW5kLGMpO3JldHVybiBjfWZ1bmN0aW9uIG9wX29yKGEsYil7cmV0dXJuIGF8Yn1mdW5jdGlvbiBibk9yKGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3Bfb3IsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gb3BfeG9yKGEsYil7cmV0dXJuIGFeYn1mdW5jdGlvbiBiblhvcihiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX3hvcixjKTtyZXR1cm4gY31mdW5jdGlvbiBvcF9hbmRub3QoYSxiKXtyZXR1cm4gYSZ+Yn1mdW5jdGlvbiBibkFuZE5vdChiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX2FuZG5vdCxjKTtyZXR1cm4gY31mdW5jdGlvbiBibk5vdCgpe3ZhciBiPW5iaSgpO2Zvcih2YXIgYT0wO2E8dGhpcy50OysrYSl7YlthXT10aGlzLkRNJn50aGlzW2FdfWIudD10aGlzLnQ7Yi5zPX50aGlzLnM7cmV0dXJuIGJ9ZnVuY3Rpb24gYm5TaGlmdExlZnQoYil7dmFyIGE9bmJpKCk7aWYoYjwwKXt0aGlzLnJTaGlmdFRvKC1iLGEpfWVsc2V7dGhpcy5sU2hpZnRUbyhiLGEpfXJldHVybiBhfWZ1bmN0aW9uIGJuU2hpZnRSaWdodChiKXt2YXIgYT1uYmkoKTtpZihiPDApe3RoaXMubFNoaWZ0VG8oLWIsYSl9ZWxzZXt0aGlzLnJTaGlmdFRvKGIsYSl9cmV0dXJuIGF9ZnVuY3Rpb24gbGJpdChhKXtpZihhPT0wKXtyZXR1cm4gLTF9dmFyIGI9MDtpZigoYSY2NTUzNSk9PTApe2E+Pj0xNjtiKz0xNn1pZigoYSYyNTUpPT0wKXthPj49ODtiKz04fWlmKChhJjE1KT09MCl7YT4+PTQ7Yis9NH1pZigoYSYzKT09MCl7YT4+PTI7Yis9Mn1pZigoYSYxKT09MCl7KytifXJldHVybiBifWZ1bmN0aW9uIGJuR2V0TG93ZXN0U2V0Qml0KCl7Zm9yKHZhciBhPTA7YTx0aGlzLnQ7KythKXtpZih0aGlzW2FdIT0wKXtyZXR1cm4gYSp0aGlzLkRCK2xiaXQodGhpc1thXSl9fWlmKHRoaXMuczwwKXtyZXR1cm4gdGhpcy50KnRoaXMuREJ9cmV0dXJuIC0xfWZ1bmN0aW9uIGNiaXQoYSl7dmFyIGI9MDt3aGlsZShhIT0wKXthJj1hLTE7KytifXJldHVybiBifWZ1bmN0aW9uIGJuQml0Q291bnQoKXt2YXIgYz0wLGE9dGhpcy5zJnRoaXMuRE07Zm9yKHZhciBiPTA7Yjx0aGlzLnQ7KytiKXtjKz1jYml0KHRoaXNbYl1eYSl9cmV0dXJuIGN9ZnVuY3Rpb24gYm5UZXN0Qml0KGIpe3ZhciBhPU1hdGguZmxvb3IoYi90aGlzLkRCKTtpZihhPj10aGlzLnQpe3JldHVybih0aGlzLnMhPTApfXJldHVybigodGhpc1thXSYoMTw8KGIldGhpcy5EQikpKSE9MCl9ZnVuY3Rpb24gYm5wQ2hhbmdlQml0KGMsYil7dmFyIGE9QmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGMpO3RoaXMuYml0d2lzZVRvKGEsYixhKTtyZXR1cm4gYX1mdW5jdGlvbiBiblNldEJpdChhKXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQoYSxvcF9vcil9ZnVuY3Rpb24gYm5DbGVhckJpdChhKXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQoYSxvcF9hbmRub3QpfWZ1bmN0aW9uIGJuRmxpcEJpdChhKXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQoYSxvcF94b3IpfWZ1bmN0aW9uIGJucEFkZFRvKGQsZil7dmFyIGU9MCxnPTAsYj1NYXRoLm1pbihkLnQsdGhpcy50KTt3aGlsZShlPGIpe2crPXRoaXNbZV0rZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWlmKGQudDx0aGlzLnQpe2crPWQuczt3aGlsZShlPHRoaXMudCl7Zys9dGhpc1tlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWcrPXRoaXMuc31lbHNle2crPXRoaXMuczt3aGlsZShlPGQudCl7Zys9ZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWcrPWQuc31mLnM9KGc8MCk/LTE6MDtpZihnPjApe2ZbZSsrXT1nfWVsc2V7aWYoZzwtMSl7ZltlKytdPXRoaXMuRFYrZ319Zi50PWU7Zi5jbGFtcCgpfWZ1bmN0aW9uIGJuQWRkKGIpe3ZhciBjPW5iaSgpO3RoaXMuYWRkVG8oYixjKTtyZXR1cm4gY31mdW5jdGlvbiBiblN1YnRyYWN0KGIpe3ZhciBjPW5iaSgpO3RoaXMuc3ViVG8oYixjKTtyZXR1cm4gY31mdW5jdGlvbiBibk11bHRpcGx5KGIpe3ZhciBjPW5iaSgpO3RoaXMubXVsdGlwbHlUbyhiLGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuU3F1YXJlKCl7dmFyIGE9bmJpKCk7dGhpcy5zcXVhcmVUbyhhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkRpdmlkZShiKXt2YXIgYz1uYmkoKTt0aGlzLmRpdlJlbVRvKGIsYyxudWxsKTtyZXR1cm4gY31mdW5jdGlvbiBiblJlbWFpbmRlcihiKXt2YXIgYz1uYmkoKTt0aGlzLmRpdlJlbVRvKGIsbnVsbCxjKTtyZXR1cm4gY31mdW5jdGlvbiBibkRpdmlkZUFuZFJlbWFpbmRlcihiKXt2YXIgZD1uYmkoKSxjPW5iaSgpO3RoaXMuZGl2UmVtVG8oYixkLGMpO3JldHVybiBuZXcgQXJyYXkoZCxjKX1mdW5jdGlvbiBibnBETXVsdGlwbHkoYSl7dGhpc1t0aGlzLnRdPXRoaXMuYW0oMCxhLTEsdGhpcywwLDAsdGhpcy50KTsrK3RoaXMudDt0aGlzLmNsYW1wKCl9ZnVuY3Rpb24gYm5wREFkZE9mZnNldChiLGEpe2lmKGI9PTApe3JldHVybn13aGlsZSh0aGlzLnQ8PWEpe3RoaXNbdGhpcy50KytdPTB9dGhpc1thXSs9Yjt3aGlsZSh0aGlzW2FdPj10aGlzLkRWKXt0aGlzW2FdLT10aGlzLkRWO2lmKCsrYT49dGhpcy50KXt0aGlzW3RoaXMudCsrXT0wfSsrdGhpc1thXX19ZnVuY3Rpb24gTnVsbEV4cCgpe31mdW5jdGlvbiBuTm9wKGEpe3JldHVybiBhfWZ1bmN0aW9uIG5NdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYil9ZnVuY3Rpb24gblNxclRvKGEsYil7YS5zcXVhcmVUbyhiKX1OdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0PW5Ob3A7TnVsbEV4cC5wcm90b3R5cGUucmV2ZXJ0PW5Ob3A7TnVsbEV4cC5wcm90b3R5cGUubXVsVG89bk11bFRvO051bGxFeHAucHJvdG90eXBlLnNxclRvPW5TcXJUbztmdW5jdGlvbiBiblBvdyhhKXtyZXR1cm4gdGhpcy5leHAoYSxuZXcgTnVsbEV4cCgpKX1mdW5jdGlvbiBibnBNdWx0aXBseUxvd2VyVG8oYixmLGUpe3ZhciBkPU1hdGgubWluKHRoaXMudCtiLnQsZik7ZS5zPTA7ZS50PWQ7d2hpbGUoZD4wKXtlWy0tZF09MH12YXIgYztmb3IoYz1lLnQtdGhpcy50O2Q8YzsrK2Qpe2VbZCt0aGlzLnRdPXRoaXMuYW0oMCxiW2RdLGUsZCwwLHRoaXMudCl9Zm9yKGM9TWF0aC5taW4oYi50LGYpO2Q8YzsrK2Qpe3RoaXMuYW0oMCxiW2RdLGUsZCwwLGYtZCl9ZS5jbGFtcCgpfWZ1bmN0aW9uIGJucE11bHRpcGx5VXBwZXJUbyhiLGUsZCl7LS1lO3ZhciBjPWQudD10aGlzLnQrYi50LWU7ZC5zPTA7d2hpbGUoLS1jPj0wKXtkW2NdPTB9Zm9yKGM9TWF0aC5tYXgoZS10aGlzLnQsMCk7YzxiLnQ7KytjKXtkW3RoaXMudCtjLWVdPXRoaXMuYW0oZS1jLGJbY10sZCwwLDAsdGhpcy50K2MtZSl9ZC5jbGFtcCgpO2QuZHJTaGlmdFRvKDEsZCl9ZnVuY3Rpb24gQmFycmV0dChhKXt0aGlzLnIyPW5iaSgpO3RoaXMucTM9bmJpKCk7QmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKDIqYS50LHRoaXMucjIpO3RoaXMubXU9dGhpcy5yMi5kaXZpZGUoYSk7dGhpcy5tPWF9ZnVuY3Rpb24gYmFycmV0dENvbnZlcnQoYSl7aWYoYS5zPDB8fGEudD4yKnRoaXMubS50KXtyZXR1cm4gYS5tb2QodGhpcy5tKX1lbHNle2lmKGEuY29tcGFyZVRvKHRoaXMubSk8MCl7cmV0dXJuIGF9ZWxzZXt2YXIgYj1uYmkoKTthLmNvcHlUbyhiKTt0aGlzLnJlZHVjZShiKTtyZXR1cm4gYn19fWZ1bmN0aW9uIGJhcnJldHRSZXZlcnQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gYmFycmV0dFJlZHVjZShhKXthLmRyU2hpZnRUbyh0aGlzLm0udC0xLHRoaXMucjIpO2lmKGEudD50aGlzLm0udCsxKXthLnQ9dGhpcy5tLnQrMTthLmNsYW1wKCl9dGhpcy5tdS5tdWx0aXBseVVwcGVyVG8odGhpcy5yMix0aGlzLm0udCsxLHRoaXMucTMpO3RoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO3doaWxlKGEuY29tcGFyZVRvKHRoaXMucjIpPDApe2EuZEFkZE9mZnNldCgxLHRoaXMubS50KzEpfWEuc3ViVG8odGhpcy5yMixhKTt3aGlsZShhLmNvbXBhcmVUbyh0aGlzLm0pPj0wKXthLnN1YlRvKHRoaXMubSxhKX19ZnVuY3Rpb24gYmFycmV0dFNxclRvKGEsYil7YS5zcXVhcmVUbyhiKTt0aGlzLnJlZHVjZShiKX1mdW5jdGlvbiBiYXJyZXR0TXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpO3RoaXMucmVkdWNlKGIpfUJhcnJldHQucHJvdG90eXBlLmNvbnZlcnQ9YmFycmV0dENvbnZlcnQ7QmFycmV0dC5wcm90b3R5cGUucmV2ZXJ0PWJhcnJldHRSZXZlcnQ7QmFycmV0dC5wcm90b3R5cGUucmVkdWNlPWJhcnJldHRSZWR1Y2U7QmFycmV0dC5wcm90b3R5cGUubXVsVG89YmFycmV0dE11bFRvO0JhcnJldHQucHJvdG90eXBlLnNxclRvPWJhcnJldHRTcXJUbztmdW5jdGlvbiBibk1vZFBvdyhxLGYpe3ZhciBvPXEuYml0TGVuZ3RoKCksaCxiPW5idigxKSx2O2lmKG88PTApe3JldHVybiBifWVsc2V7aWYobzwxOCl7aD0xfWVsc2V7aWYobzw0OCl7aD0zfWVsc2V7aWYobzwxNDQpe2g9NH1lbHNle2lmKG88NzY4KXtoPTV9ZWxzZXtoPTZ9fX19fWlmKG88OCl7dj1uZXcgQ2xhc3NpYyhmKX1lbHNle2lmKGYuaXNFdmVuKCkpe3Y9bmV3IEJhcnJldHQoZil9ZWxzZXt2PW5ldyBNb250Z29tZXJ5KGYpfX12YXIgcD1uZXcgQXJyYXkoKSxkPTMscz1oLTEsYT0oMTw8aCktMTtwWzFdPXYuY29udmVydCh0aGlzKTtpZihoPjEpe3ZhciBBPW5iaSgpO3Yuc3FyVG8ocFsxXSxBKTt3aGlsZShkPD1hKXtwW2RdPW5iaSgpO3YubXVsVG8oQSxwW2QtMl0scFtkXSk7ZCs9Mn19dmFyIGw9cS50LTEseCx1PXRydWUsYz1uYmkoKSx5O289bmJpdHMocVtsXSktMTt3aGlsZShsPj0wKXtpZihvPj1zKXt4PShxW2xdPj4oby1zKSkmYX1lbHNle3g9KHFbbF0mKCgxPDwobysxKSktMSkpPDwocy1vKTtpZihsPjApe3h8PXFbbC0xXT4+KHRoaXMuREIrby1zKX19ZD1oO3doaWxlKCh4JjEpPT0wKXt4Pj49MTstLWR9aWYoKG8tPWQpPDApe28rPXRoaXMuREI7LS1sfWlmKHUpe3BbeF0uY29weVRvKGIpO3U9ZmFsc2V9ZWxzZXt3aGlsZShkPjEpe3Yuc3FyVG8oYixjKTt2LnNxclRvKGMsYik7ZC09Mn1pZihkPjApe3Yuc3FyVG8oYixjKX1lbHNle3k9YjtiPWM7Yz15fXYubXVsVG8oYyxwW3hdLGIpfXdoaWxlKGw+PTAmJihxW2xdJigxPDxvKSk9PTApe3Yuc3FyVG8oYixjKTt5PWI7Yj1jO2M9eTtpZigtLW88MCl7bz10aGlzLkRCLTE7LS1sfX19cmV0dXJuIHYucmV2ZXJ0KGIpfWZ1bmN0aW9uIGJuR0NEKGMpe3ZhciBiPSh0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzLmNsb25lKCk7dmFyIGg9KGMuczwwKT9jLm5lZ2F0ZSgpOmMuY2xvbmUoKTtpZihiLmNvbXBhcmVUbyhoKTwwKXt2YXIgZT1iO2I9aDtoPWV9dmFyIGQ9Yi5nZXRMb3dlc3RTZXRCaXQoKSxmPWguZ2V0TG93ZXN0U2V0Qml0KCk7aWYoZjwwKXtyZXR1cm4gYn1pZihkPGYpe2Y9ZH1pZihmPjApe2IuclNoaWZ0VG8oZixiKTtoLnJTaGlmdFRvKGYsaCl9d2hpbGUoYi5zaWdudW0oKT4wKXtpZigoZD1iLmdldExvd2VzdFNldEJpdCgpKT4wKXtiLnJTaGlmdFRvKGQsYil9aWYoKGQ9aC5nZXRMb3dlc3RTZXRCaXQoKSk+MCl7aC5yU2hpZnRUbyhkLGgpfWlmKGIuY29tcGFyZVRvKGgpPj0wKXtiLnN1YlRvKGgsYik7Yi5yU2hpZnRUbygxLGIpfWVsc2V7aC5zdWJUbyhiLGgpO2guclNoaWZ0VG8oMSxoKX19aWYoZj4wKXtoLmxTaGlmdFRvKGYsaCl9cmV0dXJuIGh9ZnVuY3Rpb24gYm5wTW9kSW50KGUpe2lmKGU8PTApe3JldHVybiAwfXZhciBjPXRoaXMuRFYlZSxiPSh0aGlzLnM8MCk/ZS0xOjA7aWYodGhpcy50PjApe2lmKGM9PTApe2I9dGhpc1swXSVlfWVsc2V7Zm9yKHZhciBhPXRoaXMudC0xO2E+PTA7LS1hKXtiPShjKmIrdGhpc1thXSklZX19fXJldHVybiBifWZ1bmN0aW9uIGJuTW9kSW52ZXJzZShmKXt2YXIgaj1mLmlzRXZlbigpO2lmKCh0aGlzLmlzRXZlbigpJiZqKXx8Zi5zaWdudW0oKT09MCl7cmV0dXJuIEJpZ0ludGVnZXIuWkVST312YXIgaT1mLmNsb25lKCksaD10aGlzLmNsb25lKCk7dmFyIGc9bmJ2KDEpLGU9bmJ2KDApLGw9bmJ2KDApLGs9bmJ2KDEpO3doaWxlKGkuc2lnbnVtKCkhPTApe3doaWxlKGkuaXNFdmVuKCkpe2kuclNoaWZ0VG8oMSxpKTtpZihqKXtpZighZy5pc0V2ZW4oKXx8IWUuaXNFdmVuKCkpe2cuYWRkVG8odGhpcyxnKTtlLnN1YlRvKGYsZSl9Zy5yU2hpZnRUbygxLGcpfWVsc2V7aWYoIWUuaXNFdmVuKCkpe2Uuc3ViVG8oZixlKX19ZS5yU2hpZnRUbygxLGUpfXdoaWxlKGguaXNFdmVuKCkpe2guclNoaWZ0VG8oMSxoKTtpZihqKXtpZighbC5pc0V2ZW4oKXx8IWsuaXNFdmVuKCkpe2wuYWRkVG8odGhpcyxsKTtrLnN1YlRvKGYsayl9bC5yU2hpZnRUbygxLGwpfWVsc2V7aWYoIWsuaXNFdmVuKCkpe2suc3ViVG8oZixrKX19ay5yU2hpZnRUbygxLGspfWlmKGkuY29tcGFyZVRvKGgpPj0wKXtpLnN1YlRvKGgsaSk7aWYoail7Zy5zdWJUbyhsLGcpfWUuc3ViVG8oayxlKX1lbHNle2guc3ViVG8oaSxoKTtpZihqKXtsLnN1YlRvKGcsbCl9ay5zdWJUbyhlLGspfX1pZihoLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTApe3JldHVybiBCaWdJbnRlZ2VyLlpFUk99aWYoay5jb21wYXJlVG8oZik+PTApe3JldHVybiBrLnN1YnRyYWN0KGYpfWlmKGsuc2lnbnVtKCk8MCl7ay5hZGRUbyhmLGspfWVsc2V7cmV0dXJuIGt9aWYoay5zaWdudW0oKTwwKXtyZXR1cm4gay5hZGQoZil9ZWxzZXtyZXR1cm4ga319dmFyIGxvd3ByaW1lcz1bMiwzLDUsNywxMSwxMywxNywxOSwyMywyOSwzMSwzNyw0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OSwyMTEsMjIzLDIyNywyMjksMjMzLDIzOSwyNDEsMjUxLDI1NywyNjMsMjY5LDI3MSwyNzcsMjgxLDI4MywyOTMsMzA3LDMxMSwzMTMsMzE3LDMzMSwzMzcsMzQ3LDM0OSwzNTMsMzU5LDM2NywzNzMsMzc5LDM4MywzODksMzk3LDQwMSw0MDksNDE5LDQyMSw0MzEsNDMzLDQzOSw0NDMsNDQ5LDQ1Nyw0NjEsNDYzLDQ2Nyw0NzksNDg3LDQ5MSw0OTksNTAzLDUwOSw1MjEsNTIzLDU0MSw1NDcsNTU3LDU2Myw1NjksNTcxLDU3Nyw1ODcsNTkzLDU5OSw2MDEsNjA3LDYxMyw2MTcsNjE5LDYzMSw2NDEsNjQzLDY0Nyw2NTMsNjU5LDY2MSw2NzMsNjc3LDY4Myw2OTEsNzAxLDcwOSw3MTksNzI3LDczMyw3MzksNzQzLDc1MSw3NTcsNzYxLDc2OSw3NzMsNzg3LDc5Nyw4MDksODExLDgyMSw4MjMsODI3LDgyOSw4MzksODUzLDg1Nyw4NTksODYzLDg3Nyw4ODEsODgzLDg4Nyw5MDcsOTExLDkxOSw5MjksOTM3LDk0MSw5NDcsOTUzLDk2Nyw5NzEsOTc3LDk4Myw5OTEsOTk3XTt2YXIgbHBsaW09KDE8PDI2KS9sb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXTtmdW5jdGlvbiBibklzUHJvYmFibGVQcmltZShlKXt2YXIgZCxiPXRoaXMuYWJzKCk7aWYoYi50PT0xJiZiWzBdPD1sb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXSl7Zm9yKGQ9MDtkPGxvd3ByaW1lcy5sZW5ndGg7KytkKXtpZihiWzBdPT1sb3dwcmltZXNbZF0pe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9aWYoYi5pc0V2ZW4oKSl7cmV0dXJuIGZhbHNlfWQ9MTt3aGlsZShkPGxvd3ByaW1lcy5sZW5ndGgpe3ZhciBhPWxvd3ByaW1lc1tkXSxjPWQrMTt3aGlsZShjPGxvd3ByaW1lcy5sZW5ndGgmJmE8bHBsaW0pe2EqPWxvd3ByaW1lc1tjKytdfWE9Yi5tb2RJbnQoYSk7d2hpbGUoZDxjKXtpZihhJWxvd3ByaW1lc1tkKytdPT0wKXtyZXR1cm4gZmFsc2V9fX1yZXR1cm4gYi5taWxsZXJSYWJpbihlKX1mdW5jdGlvbiBibnBNaWxsZXJSYWJpbihmKXt2YXIgZz10aGlzLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgYz1nLmdldExvd2VzdFNldEJpdCgpO2lmKGM8PTApe3JldHVybiBmYWxzZX12YXIgaD1nLnNoaWZ0UmlnaHQoYyk7Zj0oZisxKT4+MTtpZihmPmxvd3ByaW1lcy5sZW5ndGgpe2Y9bG93cHJpbWVzLmxlbmd0aH12YXIgYj1uYmkoKTtmb3IodmFyIGU9MDtlPGY7KytlKXtiLmZyb21JbnQobG93cHJpbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsb3dwcmltZXMubGVuZ3RoKV0pO3ZhciBsPWIubW9kUG93KGgsdGhpcyk7aWYobC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpIT0wJiZsLmNvbXBhcmVUbyhnKSE9MCl7dmFyIGQ9MTt3aGlsZShkKys8YyYmbC5jb21wYXJlVG8oZykhPTApe2w9bC5tb2RQb3dJbnQoMix0aGlzKTtpZihsLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk9PTApe3JldHVybiBmYWxzZX19aWYobC5jb21wYXJlVG8oZykhPTApe3JldHVybiBmYWxzZX19fXJldHVybiB0cnVlfUJpZ0ludGVnZXIucHJvdG90eXBlLmNodW5rU2l6ZT1ibnBDaHVua1NpemU7QmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeD1ibnBUb1JhZGl4O0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeD1ibnBGcm9tUmFkaXg7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbU51bWJlcj1ibnBGcm9tTnVtYmVyO0JpZ0ludGVnZXIucHJvdG90eXBlLmJpdHdpc2VUbz1ibnBCaXR3aXNlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuY2hhbmdlQml0PWJucENoYW5nZUJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGRUbz1ibnBBZGRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5kTXVsdGlwbHk9Ym5wRE11bHRpcGx5O0JpZ0ludGVnZXIucHJvdG90eXBlLmRBZGRPZmZzZXQ9Ym5wREFkZE9mZnNldDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseUxvd2VyVG89Ym5wTXVsdGlwbHlMb3dlclRvO0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VXBwZXJUbz1ibnBNdWx0aXBseVVwcGVyVG87QmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW50PWJucE1vZEludDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5taWxsZXJSYWJpbj1ibnBNaWxsZXJSYWJpbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbG9uZT1ibkNsb25lO0JpZ0ludGVnZXIucHJvdG90eXBlLmludFZhbHVlPWJuSW50VmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuYnl0ZVZhbHVlPWJuQnl0ZVZhbHVlO0JpZ0ludGVnZXIucHJvdG90eXBlLnNob3J0VmFsdWU9Ym5TaG9ydFZhbHVlO0JpZ0ludGVnZXIucHJvdG90eXBlLnNpZ251bT1iblNpZ051bTtCaWdJbnRlZ2VyLnByb3RvdHlwZS50b0J5dGVBcnJheT1iblRvQnl0ZUFycmF5O0JpZ0ludGVnZXIucHJvdG90eXBlLmVxdWFscz1ibkVxdWFscztCaWdJbnRlZ2VyLnByb3RvdHlwZS5taW49Ym5NaW47QmlnSW50ZWdlci5wcm90b3R5cGUubWF4PWJuTWF4O0JpZ0ludGVnZXIucHJvdG90eXBlLmFuZD1ibkFuZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5vcj1ibk9yO0JpZ0ludGVnZXIucHJvdG90eXBlLnhvcj1iblhvcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmROb3Q9Ym5BbmROb3Q7QmlnSW50ZWdlci5wcm90b3R5cGUubm90PWJuTm90O0JpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdD1iblNoaWZ0TGVmdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdFJpZ2h0PWJuU2hpZnRSaWdodDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5nZXRMb3dlc3RTZXRCaXQ9Ym5HZXRMb3dlc3RTZXRCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuYml0Q291bnQ9Ym5CaXRDb3VudDtCaWdJbnRlZ2VyLnByb3RvdHlwZS50ZXN0Qml0PWJuVGVzdEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zZXRCaXQ9Ym5TZXRCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuY2xlYXJCaXQ9Ym5DbGVhckJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mbGlwQml0PWJuRmxpcEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGQ9Ym5BZGQ7QmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3Q9Ym5TdWJ0cmFjdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseT1ibk11bHRpcGx5O0JpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZT1ibkRpdmlkZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5yZW1haW5kZXI9Ym5SZW1haW5kZXI7QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlQW5kUmVtYWluZGVyPWJuRGl2aWRlQW5kUmVtYWluZGVyO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvdz1ibk1vZFBvdztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlPWJuTW9kSW52ZXJzZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3c9Ym5Qb3c7QmlnSW50ZWdlci5wcm90b3R5cGUuZ2NkPWJuR0NEO0JpZ0ludGVnZXIucHJvdG90eXBlLmlzUHJvYmFibGVQcmltZT1ibklzUHJvYmFibGVQcmltZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmU9Ym5TcXVhcmU7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gQXJjZm91cigpe3RoaXMuaT0wO3RoaXMuaj0wO3RoaXMuUz1uZXcgQXJyYXkoKX1mdW5jdGlvbiBBUkM0aW5pdChkKXt2YXIgYyxhLGI7Zm9yKGM9MDtjPDI1NjsrK2Mpe3RoaXMuU1tjXT1jfWE9MDtmb3IoYz0wO2M8MjU2OysrYyl7YT0oYSt0aGlzLlNbY10rZFtjJWQubGVuZ3RoXSkmMjU1O2I9dGhpcy5TW2NdO3RoaXMuU1tjXT10aGlzLlNbYV07dGhpcy5TW2FdPWJ9dGhpcy5pPTA7dGhpcy5qPTB9ZnVuY3Rpb24gQVJDNG5leHQoKXt2YXIgYTt0aGlzLmk9KHRoaXMuaSsxKSYyNTU7dGhpcy5qPSh0aGlzLmordGhpcy5TW3RoaXMuaV0pJjI1NTthPXRoaXMuU1t0aGlzLmldO3RoaXMuU1t0aGlzLmldPXRoaXMuU1t0aGlzLmpdO3RoaXMuU1t0aGlzLmpdPWE7cmV0dXJuIHRoaXMuU1soYSt0aGlzLlNbdGhpcy5pXSkmMjU1XX1BcmNmb3VyLnByb3RvdHlwZS5pbml0PUFSQzRpbml0O0FyY2ZvdXIucHJvdG90eXBlLm5leHQ9QVJDNG5leHQ7ZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpe3JldHVybiBuZXcgQXJjZm91cigpfXZhciBybmdfcHNpemU9MjU2O1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbnZhciBybmdfc3RhdGU7dmFyIHJuZ19wb29sO3ZhciBybmdfcHB0cjtmdW5jdGlvbiBybmdfc2VlZF9pbnQoYSl7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePWEmMjU1O3JuZ19wb29sW3JuZ19wcHRyKytdXj0oYT4+OCkmMjU1O3JuZ19wb29sW3JuZ19wcHRyKytdXj0oYT4+MTYpJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjI0KSYyNTU7aWYocm5nX3BwdHI+PXJuZ19wc2l6ZSl7cm5nX3BwdHItPXJuZ19wc2l6ZX19ZnVuY3Rpb24gcm5nX3NlZWRfdGltZSgpe3JuZ19zZWVkX2ludChuZXcgRGF0ZSgpLmdldFRpbWUoKSl9aWYocm5nX3Bvb2w9PW51bGwpe3JuZ19wb29sPW5ldyBBcnJheSgpO3JuZ19wcHRyPTA7dmFyIHQ7aWYod2luZG93LmNyeXB0byYmd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciB1YT1uZXcgVWludDhBcnJheSgzMik7d2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXModWEpO2Zvcih0PTA7dDwzMjsrK3Qpe3JuZ19wb29sW3JuZ19wcHRyKytdPXVhW3RdfX1pZihuYXZpZ2F0b3IuYXBwTmFtZT09XCJOZXRzY2FwZVwiJiZuYXZpZ2F0b3IuYXBwVmVyc2lvbjxcIjVcIiYmd2luZG93LmNyeXB0byl7dmFyIHo9d2luZG93LmNyeXB0by5yYW5kb20oMzIpO2Zvcih0PTA7dDx6Lmxlbmd0aDsrK3Qpe3JuZ19wb29sW3JuZ19wcHRyKytdPXouY2hhckNvZGVBdCh0KSYyNTV9fXdoaWxlKHJuZ19wcHRyPHJuZ19wc2l6ZSl7dD1NYXRoLmZsb29yKDY1NTM2Kk1hdGgucmFuZG9tKCkpO3JuZ19wb29sW3JuZ19wcHRyKytdPXQ+Pj44O3JuZ19wb29sW3JuZ19wcHRyKytdPXQmMjU1fXJuZ19wcHRyPTA7cm5nX3NlZWRfdGltZSgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZSgpe2lmKHJuZ19zdGF0ZT09bnVsbCl7cm5nX3NlZWRfdGltZSgpO3JuZ19zdGF0ZT1wcm5nX25ld3N0YXRlKCk7cm5nX3N0YXRlLmluaXQocm5nX3Bvb2wpO2ZvcihybmdfcHB0cj0wO3JuZ19wcHRyPHJuZ19wb29sLmxlbmd0aDsrK3JuZ19wcHRyKXtybmdfcG9vbFtybmdfcHB0cl09MH1ybmdfcHB0cj0wfXJldHVybiBybmdfc3RhdGUubmV4dCgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZXMoYil7dmFyIGE7Zm9yKGE9MDthPGIubGVuZ3RoOysrYSl7YlthXT1ybmdfZ2V0X2J5dGUoKX19ZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCl7fVNlY3VyZVJhbmRvbS5wcm90b3R5cGUubmV4dEJ5dGVzPXJuZ19nZXRfYnl0ZXM7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gcGFyc2VCaWdJbnQoYixhKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoYixhKX1mdW5jdGlvbiBsaW5lYnJrKGMsZCl7dmFyIGE9XCJcIjt2YXIgYj0wO3doaWxlKGIrZDxjLmxlbmd0aCl7YSs9Yy5zdWJzdHJpbmcoYixiK2QpK1wiXFxuXCI7Yis9ZH1yZXR1cm4gYStjLnN1YnN0cmluZyhiLGMubGVuZ3RoKX1mdW5jdGlvbiBieXRlMkhleChhKXtpZihhPDE2KXtyZXR1cm5cIjBcIithLnRvU3RyaW5nKDE2KX1lbHNle3JldHVybiBhLnRvU3RyaW5nKDE2KX19ZnVuY3Rpb24gcGtjczFwYWQyKGUsaCl7aWYoaDxlLmxlbmd0aCsxMSl7YWxlcnQoXCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0FcIik7cmV0dXJuIG51bGx9dmFyIGc9bmV3IEFycmF5KCk7dmFyIGQ9ZS5sZW5ndGgtMTt3aGlsZShkPj0wJiZoPjApe3ZhciBmPWUuY2hhckNvZGVBdChkLS0pO2lmKGY8MTI4KXtnWy0taF09Zn1lbHNle2lmKChmPjEyNykmJihmPDIwNDgpKXtnWy0taF09KGYmNjMpfDEyODtnWy0taF09KGY+PjYpfDE5Mn1lbHNle2dbLS1oXT0oZiY2Myl8MTI4O2dbLS1oXT0oKGY+PjYpJjYzKXwxMjg7Z1stLWhdPShmPj4xMil8MjI0fX19Z1stLWhdPTA7dmFyIGI9bmV3IFNlY3VyZVJhbmRvbSgpO3ZhciBhPW5ldyBBcnJheSgpO3doaWxlKGg+Mil7YVswXT0wO3doaWxlKGFbMF09PTApe2IubmV4dEJ5dGVzKGEpfWdbLS1oXT1hWzBdfWdbLS1oXT0yO2dbLS1oXT0wO3JldHVybiBuZXcgQmlnSW50ZWdlcihnKX1mdW5jdGlvbiBvYWVwX21nZjFfYXJyKGMsYSxlKXt2YXIgYj1cIlwiLGQ9MDt3aGlsZShiLmxlbmd0aDxhKXtiKz1lKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGMuY29uY2F0KFsoZCY0Mjc4MTkwMDgwKT4+MjQsKGQmMTY3MTE2ODApPj4xNiwoZCY2NTI4MCk+PjgsZCYyNTVdKSkpO2QrPTF9cmV0dXJuIGJ9dmFyIFNIQTFfU0laRT0yMDtmdW5jdGlvbiBvYWVwX3BhZChsLGEsYyl7aWYobC5sZW5ndGgrMipTSEExX1NJWkUrMj5hKXt0aHJvd1wiTWVzc2FnZSB0b28gbG9uZyBmb3IgUlNBXCJ9dmFyIGg9XCJcIixkO2ZvcihkPTA7ZDxhLWwubGVuZ3RoLTIqU0hBMV9TSVpFLTI7ZCs9MSl7aCs9XCJcXHgwMFwifXZhciBlPXJzdHJfc2hhMShcIlwiKStoK1wiXFx4MDFcIitsO3ZhciBmPW5ldyBBcnJheShTSEExX1NJWkUpO25ldyBTZWN1cmVSYW5kb20oKS5uZXh0Qnl0ZXMoZik7dmFyIGc9b2FlcF9tZ2YxX2FycihmLGUubGVuZ3RoLGN8fHJzdHJfc2hhMSk7dmFyIGs9W107Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrPTEpe2tbZF09ZS5jaGFyQ29kZUF0KGQpXmcuY2hhckNvZGVBdChkKX12YXIgaj1vYWVwX21nZjFfYXJyKGssZi5sZW5ndGgscnN0cl9zaGExKTt2YXIgYj1bMF07Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrPTEpe2JbZCsxXT1mW2RdXmouY2hhckNvZGVBdChkKX1yZXR1cm4gbmV3IEJpZ0ludGVnZXIoYi5jb25jYXQoaykpfWZ1bmN0aW9uIFJTQUtleSgpe3RoaXMubj1udWxsO3RoaXMuZT0wO3RoaXMuZD1udWxsO3RoaXMucD1udWxsO3RoaXMucT1udWxsO3RoaXMuZG1wMT1udWxsO3RoaXMuZG1xMT1udWxsO3RoaXMuY29lZmY9bnVsbH1mdW5jdGlvbiBSU0FTZXRQdWJsaWMoYixhKXt0aGlzLmlzUHVibGljPXRydWU7aWYodHlwZW9mIGIhPT1cInN0cmluZ1wiKXt0aGlzLm49Yjt0aGlzLmU9YX1lbHNle2lmKGIhPW51bGwmJmEhPW51bGwmJmIubGVuZ3RoPjAmJmEubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChiLDE2KTt0aGlzLmU9cGFyc2VJbnQoYSwxNil9ZWxzZXthbGVydChcIkludmFsaWQgUlNBIHB1YmxpYyBrZXlcIil9fX1mdW5jdGlvbiBSU0FEb1B1YmxpYyhhKXtyZXR1cm4gYS5tb2RQb3dJbnQodGhpcy5lLHRoaXMubil9ZnVuY3Rpb24gUlNBRW5jcnlwdChkKXt2YXIgYT1wa2NzMXBhZDIoZCwodGhpcy5uLmJpdExlbmd0aCgpKzcpPj4zKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgZT10aGlzLmRvUHVibGljKGEpO2lmKGU9PW51bGwpe3JldHVybiBudWxsfXZhciBiPWUudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCYxKT09MCl7cmV0dXJuIGJ9ZWxzZXtyZXR1cm5cIjBcIitifX1mdW5jdGlvbiBSU0FFbmNyeXB0T0FFUChlLGQpe3ZhciBhPW9hZXBfcGFkKGUsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+MyxkKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgZj10aGlzLmRvUHVibGljKGEpO2lmKGY9PW51bGwpe3JldHVybiBudWxsfXZhciBiPWYudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCYxKT09MCl7cmV0dXJuIGJ9ZWxzZXtyZXR1cm5cIjBcIitifX1SU0FLZXkucHJvdG90eXBlLmRvUHVibGljPVJTQURvUHVibGljO1JTQUtleS5wcm90b3R5cGUuc2V0UHVibGljPVJTQVNldFB1YmxpYztSU0FLZXkucHJvdG90eXBlLmVuY3J5cHQ9UlNBRW5jcnlwdDtSU0FLZXkucHJvdG90eXBlLmVuY3J5cHRPQUVQPVJTQUVuY3J5cHRPQUVQO1JTQUtleS5wcm90b3R5cGUudHlwZT1cIlJTQVwiO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIHBrY3MxdW5wYWQyKGcsail7dmFyIGE9Zy50b0J5dGVBcnJheSgpO3ZhciBmPTA7d2hpbGUoZjxhLmxlbmd0aCYmYVtmXT09MCl7KytmfWlmKGEubGVuZ3RoLWYhPWotMXx8YVtmXSE9Mil7cmV0dXJuIG51bGx9KytmO3doaWxlKGFbZl0hPTApe2lmKCsrZj49YS5sZW5ndGgpe3JldHVybiBudWxsfX12YXIgZT1cIlwiO3doaWxlKCsrZjxhLmxlbmd0aCl7dmFyIGg9YVtmXSYyNTU7aWYoaDwxMjgpe2UrPVN0cmluZy5mcm9tQ2hhckNvZGUoaCl9ZWxzZXtpZigoaD4xOTEpJiYoaDwyMjQpKXtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgoaCYzMSk8PDYpfChhW2YrMV0mNjMpKTsrK2Z9ZWxzZXtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgoaCYxNSk8PDEyKXwoKGFbZisxXSY2Myk8PDYpfChhW2YrMl0mNjMpKTtmKz0yfX19cmV0dXJuIGV9ZnVuY3Rpb24gb2FlcF9tZ2YxX3N0cihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9ZShjK1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLFsoZCY0Mjc4MTkwMDgwKT4+MjQsKGQmMTY3MTE2ODApPj4xNiwoZCY2NTI4MCk+PjgsZCYyNTVdKSk7ZCs9MX1yZXR1cm4gYn12YXIgU0hBMV9TSVpFPTIwO2Z1bmN0aW9uIG9hZXBfdW5wYWQobCxiLGUpe2w9bC50b0J5dGVBcnJheSgpO3ZhciBmO2ZvcihmPTA7ZjxsLmxlbmd0aDtmKz0xKXtsW2ZdJj0yNTV9d2hpbGUobC5sZW5ndGg8Yil7bC51bnNoaWZ0KDApfWw9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsbCk7aWYobC5sZW5ndGg8MipTSEExX1NJWkUrMil7dGhyb3dcIkNpcGhlciB0b28gc2hvcnRcIn12YXIgYz1sLnN1YnN0cigxLFNIQTFfU0laRSk7dmFyIG89bC5zdWJzdHIoU0hBMV9TSVpFKzEpO3ZhciBtPW9hZXBfbWdmMV9zdHIobyxTSEExX1NJWkUsZXx8cnN0cl9zaGExKTt2YXIgaD1bXSxmO2ZvcihmPTA7ZjxjLmxlbmd0aDtmKz0xKXtoW2ZdPWMuY2hhckNvZGVBdChmKV5tLmNoYXJDb2RlQXQoZil9dmFyIGo9b2FlcF9tZ2YxX3N0cihTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxoKSxsLmxlbmd0aC1TSEExX1NJWkUscnN0cl9zaGExKTt2YXIgZz1bXTtmb3IoZj0wO2Y8by5sZW5ndGg7Zis9MSl7Z1tmXT1vLmNoYXJDb2RlQXQoZileai5jaGFyQ29kZUF0KGYpfWc9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZyk7aWYoZy5zdWJzdHIoMCxTSEExX1NJWkUpIT09cnN0cl9zaGExKFwiXCIpKXt0aHJvd1wiSGFzaCBtaXNtYXRjaFwifWc9Zy5zdWJzdHIoU0hBMV9TSVpFKTt2YXIgYT1nLmluZGV4T2YoXCJcXHgwMVwiKTt2YXIgaz0oYSE9LTEpP2cuc3Vic3RyKDAsYSkubGFzdEluZGV4T2YoXCJcXHgwMFwiKTotMTtpZihrKzEhPWEpe3Rocm93XCJNYWxmb3JtZWQgZGF0YVwifXJldHVybiBnLnN1YnN0cihhKzEpfWZ1bmN0aW9uIFJTQVNldFByaXZhdGUoYyxhLGIpe3RoaXMuaXNQcml2YXRlPXRydWU7aWYodHlwZW9mIGMhPT1cInN0cmluZ1wiKXt0aGlzLm49Yzt0aGlzLmU9YTt0aGlzLmQ9Yn1lbHNle2lmKGMhPW51bGwmJmEhPW51bGwmJmMubGVuZ3RoPjAmJmEubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChjLDE2KTt0aGlzLmU9cGFyc2VJbnQoYSwxNik7dGhpcy5kPXBhcnNlQmlnSW50KGIsMTYpfWVsc2V7YWxlcnQoXCJJbnZhbGlkIFJTQSBwcml2YXRlIGtleVwiKX19fWZ1bmN0aW9uIFJTQVNldFByaXZhdGVFeChnLGQsZSxjLGIsYSxoLGYpe3RoaXMuaXNQcml2YXRlPXRydWU7aWYoZz09bnVsbCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBOID09IG51bGxcIn1pZihkPT1udWxsKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IEUgPT0gbnVsbFwifWlmKGcubGVuZ3RoPT0wKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IE4ubGVuZ3RoID09IDBcIn1pZihkLmxlbmd0aD09MCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBFLmxlbmd0aCA9PSAwXCJ9aWYoZyE9bnVsbCYmZCE9bnVsbCYmZy5sZW5ndGg+MCYmZC5sZW5ndGg+MCl7dGhpcy5uPXBhcnNlQmlnSW50KGcsMTYpO3RoaXMuZT1wYXJzZUludChkLDE2KTt0aGlzLmQ9cGFyc2VCaWdJbnQoZSwxNik7dGhpcy5wPXBhcnNlQmlnSW50KGMsMTYpO3RoaXMucT1wYXJzZUJpZ0ludChiLDE2KTt0aGlzLmRtcDE9cGFyc2VCaWdJbnQoYSwxNik7dGhpcy5kbXExPXBhcnNlQmlnSW50KGgsMTYpO3RoaXMuY29lZmY9cGFyc2VCaWdJbnQoZiwxNil9ZWxzZXthbGVydChcIkludmFsaWQgUlNBIHByaXZhdGUga2V5IGluIFJTQVNldFByaXZhdGVFeFwiKX19ZnVuY3Rpb24gUlNBR2VuZXJhdGUoYixpKXt2YXIgYT1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIGY9Yj4+MTt0aGlzLmU9cGFyc2VJbnQoaSwxNik7dmFyIGM9bmV3IEJpZ0ludGVnZXIoaSwxNik7Zm9yKDs7KXtmb3IoOzspe3RoaXMucD1uZXcgQmlnSW50ZWdlcihiLWYsMSxhKTtpZih0aGlzLnAuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpLmdjZChjKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wJiZ0aGlzLnAuaXNQcm9iYWJsZVByaW1lKDEwKSl7YnJlYWt9fWZvcig7Oyl7dGhpcy5xPW5ldyBCaWdJbnRlZ2VyKGYsMSxhKTtpZih0aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpLmdjZChjKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wJiZ0aGlzLnEuaXNQcm9iYWJsZVByaW1lKDEwKSl7YnJlYWt9fWlmKHRoaXMucC5jb21wYXJlVG8odGhpcy5xKTw9MCl7dmFyIGg9dGhpcy5wO3RoaXMucD10aGlzLnE7dGhpcy5xPWh9dmFyIGc9dGhpcy5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgZD10aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3ZhciBlPWcubXVsdGlwbHkoZCk7aWYoZS5nY2QoYykuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCl7dGhpcy5uPXRoaXMucC5tdWx0aXBseSh0aGlzLnEpO3RoaXMuZD1jLm1vZEludmVyc2UoZSk7dGhpcy5kbXAxPXRoaXMuZC5tb2QoZyk7dGhpcy5kbXExPXRoaXMuZC5tb2QoZCk7dGhpcy5jb2VmZj10aGlzLnEubW9kSW52ZXJzZSh0aGlzLnApO2JyZWFrfX19ZnVuY3Rpb24gUlNBRG9Qcml2YXRlKGEpe2lmKHRoaXMucD09bnVsbHx8dGhpcy5xPT1udWxsKXtyZXR1cm4gYS5tb2RQb3codGhpcy5kLHRoaXMubil9dmFyIGM9YS5tb2QodGhpcy5wKS5tb2RQb3codGhpcy5kbXAxLHRoaXMucCk7dmFyIGI9YS5tb2QodGhpcy5xKS5tb2RQb3codGhpcy5kbXExLHRoaXMucSk7d2hpbGUoYy5jb21wYXJlVG8oYik8MCl7Yz1jLmFkZCh0aGlzLnApfXJldHVybiBjLnN1YnRyYWN0KGIpLm11bHRpcGx5KHRoaXMuY29lZmYpLm1vZCh0aGlzLnApLm11bHRpcGx5KHRoaXMucSkuYWRkKGIpfWZ1bmN0aW9uIFJTQURlY3J5cHQoYil7dmFyIGQ9cGFyc2VCaWdJbnQoYiwxNik7dmFyIGE9dGhpcy5kb1ByaXZhdGUoZCk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9cmV0dXJuIHBrY3MxdW5wYWQyKGEsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+Myl9ZnVuY3Rpb24gUlNBRGVjcnlwdE9BRVAoZCxiKXt2YXIgZT1wYXJzZUJpZ0ludChkLDE2KTt2YXIgYT10aGlzLmRvUHJpdmF0ZShlKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gb2FlcF91bnBhZChhLCh0aGlzLm4uYml0TGVuZ3RoKCkrNyk+PjMsYil9UlNBS2V5LnByb3RvdHlwZS5kb1ByaXZhdGU9UlNBRG9Qcml2YXRlO1JTQUtleS5wcm90b3R5cGUuc2V0UHJpdmF0ZT1SU0FTZXRQcml2YXRlO1JTQUtleS5wcm90b3R5cGUuc2V0UHJpdmF0ZUV4PVJTQVNldFByaXZhdGVFeDtSU0FLZXkucHJvdG90eXBlLmdlbmVyYXRlPVJTQUdlbmVyYXRlO1JTQUtleS5wcm90b3R5cGUuZGVjcnlwdD1SU0FEZWNyeXB0O1JTQUtleS5wcm90b3R5cGUuZGVjcnlwdE9BRVA9UlNBRGVjcnlwdE9BRVA7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gRUNGaWVsZEVsZW1lbnRGcChiLGEpe3RoaXMueD1hO3RoaXMucT1ifWZ1bmN0aW9uIGZlRnBFcXVhbHMoYSl7aWYoYT09dGhpcyl7cmV0dXJuIHRydWV9cmV0dXJuKHRoaXMucS5lcXVhbHMoYS5xKSYmdGhpcy54LmVxdWFscyhhLngpKX1mdW5jdGlvbiBmZUZwVG9CaWdJbnRlZ2VyKCl7cmV0dXJuIHRoaXMueH1mdW5jdGlvbiBmZUZwTmVnYXRlKCl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLngubmVnYXRlKCkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBBZGQoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLnguYWRkKGEudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwU3VidHJhY3QoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLnguc3VidHJhY3QoYS50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBNdWx0aXBseShhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5tdWx0aXBseShhLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcFNxdWFyZSgpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LnNxdWFyZSgpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwRGl2aWRlKGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54Lm11bHRpcGx5KGEudG9CaWdJbnRlZ2VyKCkubW9kSW52ZXJzZSh0aGlzLnEpKS5tb2QodGhpcy5xKSl9RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZXF1YWxzPWZlRnBFcXVhbHM7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUudG9CaWdJbnRlZ2VyPWZlRnBUb0JpZ0ludGVnZXI7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUubmVnYXRlPWZlRnBOZWdhdGU7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuYWRkPWZlRnBBZGQ7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuc3VidHJhY3Q9ZmVGcFN1YnRyYWN0O0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLm11bHRpcGx5PWZlRnBNdWx0aXBseTtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5zcXVhcmU9ZmVGcFNxdWFyZTtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5kaXZpZGU9ZmVGcERpdmlkZTtmdW5jdGlvbiBFQ1BvaW50RnAoYyxhLGQsYil7dGhpcy5jdXJ2ZT1jO3RoaXMueD1hO3RoaXMueT1kO2lmKGI9PW51bGwpe3RoaXMuej1CaWdJbnRlZ2VyLk9ORX1lbHNle3RoaXMuej1ifXRoaXMuemludj1udWxsfWZ1bmN0aW9uIHBvaW50RnBHZXRYKCl7aWYodGhpcy56aW52PT1udWxsKXt0aGlzLnppbnY9dGhpcy56Lm1vZEludmVyc2UodGhpcy5jdXJ2ZS5xKX1yZXR1cm4gdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcih0aGlzLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56aW52KS5tb2QodGhpcy5jdXJ2ZS5xKSl9ZnVuY3Rpb24gcG9pbnRGcEdldFkoKXtpZih0aGlzLnppbnY9PW51bGwpe3RoaXMuemludj10aGlzLnoubW9kSW52ZXJzZSh0aGlzLmN1cnZlLnEpfXJldHVybiB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnppbnYpLm1vZCh0aGlzLmN1cnZlLnEpKX1mdW5jdGlvbiBwb2ludEZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfWlmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gYS5pc0luZmluaXR5KCl9aWYoYS5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKX12YXIgYyxiO2M9YS55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGEueikpLm1vZCh0aGlzLmN1cnZlLnEpO2lmKCFjLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKXtyZXR1cm4gZmFsc2V9Yj1hLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkoYS56KSkubW9kKHRoaXMuY3VydmUucSk7cmV0dXJuIGIuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTyl9ZnVuY3Rpb24gcG9pbnRGcElzSW5maW5pdHkoKXtpZigodGhpcy54PT1udWxsKSYmKHRoaXMueT09bnVsbCkpe3JldHVybiB0cnVlfXJldHVybiB0aGlzLnouZXF1YWxzKEJpZ0ludGVnZXIuWkVSTykmJiF0aGlzLnkudG9CaWdJbnRlZ2VyKCkuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTyl9ZnVuY3Rpb24gcG9pbnRGcE5lZ2F0ZSgpe3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy54LHRoaXMueS5uZWdhdGUoKSx0aGlzLnopfWZ1bmN0aW9uIHBvaW50RnBBZGQobCl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiBsfWlmKGwuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc312YXIgcD1sLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkobC56KSkubW9kKHRoaXMuY3VydmUucSk7dmFyIG89bC54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGwueikpLm1vZCh0aGlzLmN1cnZlLnEpO2lmKEJpZ0ludGVnZXIuWkVSTy5lcXVhbHMobykpe2lmKEJpZ0ludGVnZXIuWkVSTy5lcXVhbHMocCkpe3JldHVybiB0aGlzLnR3aWNlKCl9cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgaj1uZXcgQmlnSW50ZWdlcihcIjNcIik7dmFyIGU9dGhpcy54LnRvQmlnSW50ZWdlcigpO3ZhciBuPXRoaXMueS50b0JpZ0ludGVnZXIoKTt2YXIgYz1sLngudG9CaWdJbnRlZ2VyKCk7dmFyIGs9bC55LnRvQmlnSW50ZWdlcigpO3ZhciBtPW8uc3F1YXJlKCk7dmFyIGk9bS5tdWx0aXBseShvKTt2YXIgZD1lLm11bHRpcGx5KG0pO3ZhciBnPXAuc3F1YXJlKCkubXVsdGlwbHkodGhpcy56KTt2YXIgYT1nLnN1YnRyYWN0KGQuc2hpZnRMZWZ0KDEpKS5tdWx0aXBseShsLnopLnN1YnRyYWN0KGkpLm11bHRpcGx5KG8pLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBoPWQubXVsdGlwbHkoaikubXVsdGlwbHkocCkuc3VidHJhY3Qobi5tdWx0aXBseShpKSkuc3VidHJhY3QoZy5tdWx0aXBseShwKSkubXVsdGlwbHkobC56KS5hZGQocC5tdWx0aXBseShpKSkubW9kKHRoaXMuY3VydmUucSk7dmFyIGY9aS5tdWx0aXBseSh0aGlzLnopLm11bHRpcGx5KGwueikubW9kKHRoaXMuY3VydmUucSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGEpLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoaCksZil9ZnVuY3Rpb24gcG9pbnRGcFR3aWNlKCl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKHRoaXMueS50b0JpZ0ludGVnZXIoKS5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1uZXcgQmlnSW50ZWdlcihcIjNcIik7dmFyIGM9dGhpcy54LnRvQmlnSW50ZWdlcigpO3ZhciBoPXRoaXMueS50b0JpZ0ludGVnZXIoKTt2YXIgZT1oLm11bHRpcGx5KHRoaXMueik7dmFyIGo9ZS5tdWx0aXBseShoKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgaT10aGlzLmN1cnZlLmEudG9CaWdJbnRlZ2VyKCk7dmFyIGs9Yy5zcXVhcmUoKS5tdWx0aXBseShnKTtpZighQmlnSW50ZWdlci5aRVJPLmVxdWFscyhpKSl7az1rLmFkZCh0aGlzLnouc3F1YXJlKCkubXVsdGlwbHkoaSkpfWs9ay5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgYj1rLnNxdWFyZSgpLnN1YnRyYWN0KGMuc2hpZnRMZWZ0KDMpLm11bHRpcGx5KGopKS5zaGlmdExlZnQoMSkubXVsdGlwbHkoZSkubW9kKHRoaXMuY3VydmUucSk7dmFyIGY9ay5tdWx0aXBseShnKS5tdWx0aXBseShjKS5zdWJ0cmFjdChqLnNoaWZ0TGVmdCgxKSkuc2hpZnRMZWZ0KDIpLm11bHRpcGx5KGopLnN1YnRyYWN0KGsuc3F1YXJlKCkubXVsdGlwbHkoaykpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBkPWUuc3F1YXJlKCkubXVsdGlwbHkoZSkuc2hpZnRMZWZ0KDMpLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihiKSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGYpLGQpfWZ1bmN0aW9uIHBvaW50RnBNdWx0aXBseShiKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYoYi5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1iO3ZhciBmPWcubXVsdGlwbHkobmV3IEJpZ0ludGVnZXIoXCIzXCIpKTt2YXIgbD10aGlzLm5lZ2F0ZSgpO3ZhciBkPXRoaXM7dmFyIGM7Zm9yKGM9Zi5iaXRMZW5ndGgoKS0yO2M+MDstLWMpe2Q9ZC50d2ljZSgpO3ZhciBhPWYudGVzdEJpdChjKTt2YXIgaj1nLnRlc3RCaXQoYyk7aWYoYSE9ail7ZD1kLmFkZChhP3RoaXM6bCl9fXJldHVybiBkfWZ1bmN0aW9uIHBvaW50RnBNdWx0aXBseVR3byhjLGEsYil7dmFyIGQ7aWYoYy5iaXRMZW5ndGgoKT5iLmJpdExlbmd0aCgpKXtkPWMuYml0TGVuZ3RoKCktMX1lbHNle2Q9Yi5iaXRMZW5ndGgoKS0xfXZhciBmPXRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKTt2YXIgZT10aGlzLmFkZChhKTt3aGlsZShkPj0wKXtmPWYudHdpY2UoKTtpZihjLnRlc3RCaXQoZCkpe2lmKGIudGVzdEJpdChkKSl7Zj1mLmFkZChlKX1lbHNle2Y9Zi5hZGQodGhpcyl9fWVsc2V7aWYoYi50ZXN0Qml0KGQpKXtmPWYuYWRkKGEpfX0tLWR9cmV0dXJuIGZ9RUNQb2ludEZwLnByb3RvdHlwZS5nZXRYPXBvaW50RnBHZXRYO0VDUG9pbnRGcC5wcm90b3R5cGUuZ2V0WT1wb2ludEZwR2V0WTtFQ1BvaW50RnAucHJvdG90eXBlLmVxdWFscz1wb2ludEZwRXF1YWxzO0VDUG9pbnRGcC5wcm90b3R5cGUuaXNJbmZpbml0eT1wb2ludEZwSXNJbmZpbml0eTtFQ1BvaW50RnAucHJvdG90eXBlLm5lZ2F0ZT1wb2ludEZwTmVnYXRlO0VDUG9pbnRGcC5wcm90b3R5cGUuYWRkPXBvaW50RnBBZGQ7RUNQb2ludEZwLnByb3RvdHlwZS50d2ljZT1wb2ludEZwVHdpY2U7RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseT1wb2ludEZwTXVsdGlwbHk7RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseVR3bz1wb2ludEZwTXVsdGlwbHlUd287ZnVuY3Rpb24gRUNDdXJ2ZUZwKGUsZCxjKXt0aGlzLnE9ZTt0aGlzLmE9dGhpcy5mcm9tQmlnSW50ZWdlcihkKTt0aGlzLmI9dGhpcy5mcm9tQmlnSW50ZWdlcihjKTt0aGlzLmluZmluaXR5PW5ldyBFQ1BvaW50RnAodGhpcyxudWxsLG51bGwpfWZ1bmN0aW9uIGN1cnZlRnBHZXRRKCl7cmV0dXJuIHRoaXMucX1mdW5jdGlvbiBjdXJ2ZUZwR2V0QSgpe3JldHVybiB0aGlzLmF9ZnVuY3Rpb24gY3VydmVGcEdldEIoKXtyZXR1cm4gdGhpcy5ifWZ1bmN0aW9uIGN1cnZlRnBFcXVhbHMoYSl7aWYoYT09dGhpcyl7cmV0dXJuIHRydWV9cmV0dXJuKHRoaXMucS5lcXVhbHMoYS5xKSYmdGhpcy5hLmVxdWFscyhhLmEpJiZ0aGlzLmIuZXF1YWxzKGEuYikpfWZ1bmN0aW9uIGN1cnZlRnBHZXRJbmZpbml0eSgpe3JldHVybiB0aGlzLmluZmluaXR5fWZ1bmN0aW9uIGN1cnZlRnBGcm9tQmlnSW50ZWdlcihhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLGEpfWZ1bmN0aW9uIGN1cnZlRnBEZWNvZGVQb2ludEhleChkKXtzd2l0Y2gocGFyc2VJbnQoZC5zdWJzdHIoMCwyKSwxNikpe2Nhc2UgMDpyZXR1cm4gdGhpcy5pbmZpbml0eTtjYXNlIDI6Y2FzZSAzOnJldHVybiBudWxsO2Nhc2UgNDpjYXNlIDY6Y2FzZSA3OnZhciBhPShkLmxlbmd0aC0yKS8yO3ZhciBjPWQuc3Vic3RyKDIsYSk7dmFyIGI9ZC5zdWJzdHIoYSsyLGEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMsdGhpcy5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcihjLDE2KSksdGhpcy5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcihiLDE2KSkpO2RlZmF1bHQ6cmV0dXJuIG51bGx9fUVDQ3VydmVGcC5wcm90b3R5cGUuZ2V0UT1jdXJ2ZUZwR2V0UTtFQ0N1cnZlRnAucHJvdG90eXBlLmdldEE9Y3VydmVGcEdldEE7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRCPWN1cnZlRnBHZXRCO0VDQ3VydmVGcC5wcm90b3R5cGUuZXF1YWxzPWN1cnZlRnBFcXVhbHM7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRJbmZpbml0eT1jdXJ2ZUZwR2V0SW5maW5pdHk7RUNDdXJ2ZUZwLnByb3RvdHlwZS5mcm9tQmlnSW50ZWdlcj1jdXJ2ZUZwRnJvbUJpZ0ludGVnZXI7RUNDdXJ2ZUZwLnByb3RvdHlwZS5kZWNvZGVQb2ludEhleD1jdXJ2ZUZwRGVjb2RlUG9pbnRIZXg7XG4vKiEgKGMpIFN0ZWZhbiBUaG9tYXMgfCBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbmpzL2JpdGNvaW5qcy1saWJcbiAqL1xuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZ2V0Qnl0ZUxlbmd0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmZsb29yKCh0aGlzLnRvQmlnSW50ZWdlcigpLmJpdExlbmd0aCgpKzcpLzgpfTtFQ1BvaW50RnAucHJvdG90eXBlLmdldEVuY29kZWQ9ZnVuY3Rpb24oYyl7dmFyIGQ9ZnVuY3Rpb24oaCxmKXt2YXIgZz1oLnRvQnl0ZUFycmF5VW5zaWduZWQoKTtpZihmPGcubGVuZ3RoKXtnPWcuc2xpY2UoZy5sZW5ndGgtZil9ZWxzZXt3aGlsZShmPmcubGVuZ3RoKXtnLnVuc2hpZnQoMCl9fXJldHVybiBnfTt2YXIgYT10aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgZT10aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgYj1kKGEsMzIpO2lmKGMpe2lmKGUuaXNFdmVuKCkpe2IudW5zaGlmdCgyKX1lbHNle2IudW5zaGlmdCgzKX19ZWxzZXtiLnVuc2hpZnQoNCk7Yj1iLmNvbmNhdChkKGUsMzIpKX1yZXR1cm4gYn07RUNQb2ludEZwLmRlY29kZUZyb209ZnVuY3Rpb24oZyxjKXt2YXIgZj1jWzBdO3ZhciBlPWMubGVuZ3RoLTE7dmFyIGQ9Yy5zbGljZSgxLDErZS8yKTt2YXIgYj1jLnNsaWNlKDErZS8yLDErZSk7ZC51bnNoaWZ0KDApO2IudW5zaGlmdCgwKTt2YXIgYT1uZXcgQmlnSW50ZWdlcihkKTt2YXIgaD1uZXcgQmlnSW50ZWdlcihiKTtyZXR1cm4gbmV3IEVDUG9pbnRGcChnLGcuZnJvbUJpZ0ludGVnZXIoYSksZy5mcm9tQmlnSW50ZWdlcihoKSl9O0VDUG9pbnRGcC5kZWNvZGVGcm9tSGV4PWZ1bmN0aW9uKGcsYyl7dmFyIGY9Yy5zdWJzdHIoMCwyKTt2YXIgZT1jLmxlbmd0aC0yO3ZhciBkPWMuc3Vic3RyKDIsZS8yKTt2YXIgYj1jLnN1YnN0cigyK2UvMixlLzIpO3ZhciBhPW5ldyBCaWdJbnRlZ2VyKGQsMTYpO3ZhciBoPW5ldyBCaWdJbnRlZ2VyKGIsMTYpO3JldHVybiBuZXcgRUNQb2ludEZwKGcsZy5mcm9tQmlnSW50ZWdlcihhKSxnLmZyb21CaWdJbnRlZ2VyKGgpKX07RUNQb2ludEZwLnByb3RvdHlwZS5hZGQyRD1mdW5jdGlvbihjKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIGN9aWYoYy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKHRoaXMueC5lcXVhbHMoYy54KSl7aWYodGhpcy55LmVxdWFscyhjLnkpKXtyZXR1cm4gdGhpcy50d2ljZSgpfXJldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9Yy54LnN1YnRyYWN0KHRoaXMueCk7dmFyIGU9Yy55LnN1YnRyYWN0KHRoaXMueSk7dmFyIGE9ZS5kaXZpZGUoZyk7dmFyIGQ9YS5zcXVhcmUoKS5zdWJ0cmFjdCh0aGlzLngpLnN1YnRyYWN0KGMueCk7dmFyIGY9YS5tdWx0aXBseSh0aGlzLnguc3VidHJhY3QoZCkpLnN1YnRyYWN0KHRoaXMueSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSxkLGYpfTtFQ1BvaW50RnAucHJvdG90eXBlLnR3aWNlMkQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYodGhpcy55LnRvQmlnSW50ZWdlcigpLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBiPXRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDIpKTt2YXIgZT10aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZigzKSk7dmFyIGE9dGhpcy54LnNxdWFyZSgpLm11bHRpcGx5KGUpLmFkZCh0aGlzLmN1cnZlLmEpLmRpdmlkZSh0aGlzLnkubXVsdGlwbHkoYikpO3ZhciBjPWEuc3F1YXJlKCkuc3VidHJhY3QodGhpcy54Lm11bHRpcGx5KGIpKTt2YXIgZD1hLm11bHRpcGx5KHRoaXMueC5zdWJ0cmFjdChjKSkuc3VidHJhY3QodGhpcy55KTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLGMsZCl9O0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHkyRD1mdW5jdGlvbihiKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYoYi5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1iO3ZhciBmPWcubXVsdGlwbHkobmV3IEJpZ0ludGVnZXIoXCIzXCIpKTt2YXIgbD10aGlzLm5lZ2F0ZSgpO3ZhciBkPXRoaXM7dmFyIGM7Zm9yKGM9Zi5iaXRMZW5ndGgoKS0yO2M+MDstLWMpe2Q9ZC50d2ljZSgpO3ZhciBhPWYudGVzdEJpdChjKTt2YXIgaj1nLnRlc3RCaXQoYyk7aWYoYSE9ail7ZD1kLmFkZDJEKGE/dGhpczpsKX19cmV0dXJuIGR9O0VDUG9pbnRGcC5wcm90b3R5cGUuaXNPbkN1cnZlPWZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGk9dGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGY9dGhpcy5jdXJ2ZS5nZXRBKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGM9dGhpcy5jdXJ2ZS5nZXRCKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGg9dGhpcy5jdXJ2ZS5nZXRRKCk7dmFyIGU9aS5tdWx0aXBseShpKS5tb2QoaCk7dmFyIGc9ZC5tdWx0aXBseShkKS5tdWx0aXBseShkKS5hZGQoZi5tdWx0aXBseShkKSkuYWRkKGMpLm1vZChoKTtyZXR1cm4gZS5lcXVhbHMoZyl9O0VDUG9pbnRGcC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIihcIit0aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKS50b1N0cmluZygpK1wiLFwiK3RoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKCkrXCIpXCJ9O0VDUG9pbnRGcC5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXt2YXIgYz10aGlzLmN1cnZlLmdldFEoKTtpZih0aGlzLmlzSW5maW5pdHkoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgYXQgaW5maW5pdHkuXCIpfXZhciBhPXRoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBiPXRoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO2lmKGEuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKTwwfHxhLmNvbXBhcmVUbyhjLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk+MCl7dGhyb3cgbmV3IEVycm9yKFwieCBjb29yZGluYXRlIG91dCBvZiBib3VuZHNcIil9aWYoYi5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fGIuY29tcGFyZVRvKGMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKT4wKXt0aHJvdyBuZXcgRXJyb3IoXCJ5IGNvb3JkaW5hdGUgb3V0IG9mIGJvdW5kc1wiKX1pZighdGhpcy5pc09uQ3VydmUoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgbm90IG9uIHRoZSBjdXJ2ZS5cIil9aWYodGhpcy5tdWx0aXBseShjKS5pc0luZmluaXR5KCkpe3Rocm93IG5ldyBFcnJvcihcIlBvaW50IGlzIG5vdCBhIHNjYWxhciBtdWx0aXBsZSBvZiBHLlwiKX1yZXR1cm4gdHJ1ZX07XG4vKiEgTWlrZSBTYW11ZWwgKGMpIDIwMDkgfCBjb2RlLmdvb2dsZS5jb20vcC9qc29uLXNhbnMtZXZhbFxuICovXG52YXIganNvblBhcnNlPShmdW5jdGlvbigpe3ZhciBlPVwiKD86LT9cXFxcYig/OjB8WzEtOV1bMC05XSopKD86XFxcXC5bMC05XSspPyg/OltlRV1bKy1dP1swLTldKyk/XFxcXGIpXCI7dmFyIGo9Jyg/OlteXFxcXDAtXFxcXHgwOFxcXFx4MGEtXFxcXHgxZlwiXFxcXFxcXFxdfFxcXFxcXFxcKD86W1wiL1xcXFxcXFxcYmZucnRdfHVbMC05QS1GYS1mXXs0fSkpJzt2YXIgaT0nKD86XCInK2orJypcIiknO3ZhciBkPW5ldyBSZWdFeHAoXCIoPzpmYWxzZXx0cnVlfG51bGx8W1xcXFx7XFxcXH1cXFxcW1xcXFxdXXxcIitlK1wifFwiK2krXCIpXCIsXCJnXCIpO3ZhciBrPW5ldyBSZWdFeHAoXCJcXFxcXFxcXCg/OihbXnVdKXx1KC57NH0pKVwiLFwiZ1wiKTt2YXIgZz17J1wiJzonXCInLFwiL1wiOlwiL1wiLFwiXFxcXFwiOlwiXFxcXFwiLGI6XCJcXGJcIixmOlwiXFxmXCIsbjpcIlxcblwiLHI6XCJcXHJcIix0OlwiXFx0XCJ9O2Z1bmN0aW9uIGgobCxtLG4pe3JldHVybiBtP2dbbV06U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLDE2KSl9dmFyIGM9bmV3IFN0cmluZyhcIlwiKTt2YXIgYT1cIlxcXFxcIjt2YXIgZj17XCJ7XCI6T2JqZWN0LFwiW1wiOkFycmF5fTt2YXIgYj1PYmplY3QuaGFzT3duUHJvcGVydHk7cmV0dXJuIGZ1bmN0aW9uKHUscSl7dmFyIHA9dS5tYXRjaChkKTt2YXIgeDt2YXIgdj1wWzBdO3ZhciBsPWZhbHNlO2lmKFwie1wiPT09dil7eD17fX1lbHNle2lmKFwiW1wiPT09dil7eD1bXX1lbHNle3g9W107bD10cnVlfX12YXIgdDt2YXIgcj1beF07Zm9yKHZhciBvPTEtbCxtPXAubGVuZ3RoO288bTsrK28pe3Y9cFtvXTt2YXIgdztzd2l0Y2godi5jaGFyQ29kZUF0KDApKXtkZWZhdWx0Onc9clswXTt3W3R8fHcubGVuZ3RoXT0rKHYpO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMzQ6dj12LnN1YnN0cmluZygxLHYubGVuZ3RoLTEpO2lmKHYuaW5kZXhPZihhKSE9PS0xKXt2PXYucmVwbGFjZShrLGgpfXc9clswXTtpZighdCl7aWYodyBpbnN0YW5jZW9mIEFycmF5KXt0PXcubGVuZ3RofWVsc2V7dD12fHxjO2JyZWFrfX13W3RdPXY7dD12b2lkIDA7YnJlYWs7Y2FzZSA5MTp3PXJbMF07ci51bnNoaWZ0KHdbdHx8dy5sZW5ndGhdPVtdKTt0PXZvaWQgMDticmVhaztjYXNlIDkzOnIuc2hpZnQoKTticmVhaztjYXNlIDEwMjp3PXJbMF07d1t0fHx3Lmxlbmd0aF09ZmFsc2U7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTA6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPW51bGw7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTY6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPXRydWU7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjM6dz1yWzBdO3IudW5zaGlmdCh3W3R8fHcubGVuZ3RoXT17fSk7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjU6ci5zaGlmdCgpO2JyZWFrfX1pZihsKXtpZihyLmxlbmd0aCE9PTEpe3Rocm93IG5ldyBFcnJvcigpfXg9eFswXX1lbHNle2lmKHIubGVuZ3RoKXt0aHJvdyBuZXcgRXJyb3IoKX19aWYocSl7dmFyIHM9ZnVuY3Rpb24oQyxCKXt2YXIgRD1DW0JdO2lmKEQmJnR5cGVvZiBEPT09XCJvYmplY3RcIil7dmFyIG49bnVsbDtmb3IodmFyIHogaW4gRCl7aWYoYi5jYWxsKEQseikmJkQhPT1DKXt2YXIgeT1zKEQseik7aWYoeSE9PXZvaWQgMCl7RFt6XT15fWVsc2V7aWYoIW4pe249W119bi5wdXNoKHopfX19aWYobil7Zm9yKHZhciBBPW4ubGVuZ3RoOy0tQT49MDspe2RlbGV0ZSBEW25bQV1dfX19cmV0dXJuIHEuY2FsbChDLEIsRCl9O3g9cyh7XCJcIjp4fSxcIlwiKX1yZXR1cm4geH19KSgpO1xuLyohIGFzbjEtMS4wLjEwLmpzIChjKSAyMDEzLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1LSlVSLmFzbjEuQVNOMVV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5pbnRlZ2VyVG9CeXRlSGV4PWZ1bmN0aW9uKGEpe3ZhciBiPWEudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCUyKT09MSl7Yj1cIjBcIitifXJldHVybiBifTt0aGlzLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4PWZ1bmN0aW9uKGope3ZhciBmPWoudG9TdHJpbmcoMTYpO2lmKGYuc3Vic3RyKDAsMSkhPVwiLVwiKXtpZihmLmxlbmd0aCUyPT0xKXtmPVwiMFwiK2Z9ZWxzZXtpZighZi5tYXRjaCgvXlswLTddLykpe2Y9XCIwMFwiK2Z9fX1lbHNle3ZhciBhPWYuc3Vic3RyKDEpO3ZhciBlPWEubGVuZ3RoO2lmKGUlMj09MSl7ZSs9MX1lbHNle2lmKCFmLm1hdGNoKC9eWzAtN10vKSl7ZSs9Mn19dmFyIGc9XCJcIjtmb3IodmFyIGQ9MDtkPGU7ZCsrKXtnKz1cImZcIn12YXIgYz1uZXcgQmlnSW50ZWdlcihnLDE2KTt2YXIgYj1jLnhvcihqKS5hZGQoQmlnSW50ZWdlci5PTkUpO2Y9Yi50b1N0cmluZygxNikucmVwbGFjZSgvXi0vLFwiXCIpfXJldHVybiBmfTt0aGlzLmdldFBFTVN0cmluZ0Zyb21IZXg9ZnVuY3Rpb24oYSxiKXt2YXIgYz1oZXh0b2I2NChhKTt2YXIgZD1jLnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO2Q9ZC5yZXBsYWNlKC9cXHJcXG4kLyxcIlwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gXCIrYitcIi0tLS0tXFxyXFxuXCIrZCtcIlxcclxcbi0tLS0tRU5EIFwiK2IrXCItLS0tLVxcclxcblwifTt0aGlzLm5ld09iamVjdD1mdW5jdGlvbihiKXt2YXIgZz1LSlVSLmFzbjE7dmFyIGs9T2JqZWN0LmtleXMoYik7aWYoay5sZW5ndGghPTEpe3Rocm93XCJrZXkgb2YgcGFyYW0gc2hhbGwgYmUgb25seSBvbmUuXCJ9dmFyIGo9a1swXTtpZihcIjpib29sOmludDpiaXRzdHI6b2N0c3RyOm51bGw6b2lkOmVudW06dXRmOHN0cjpudW1zdHI6cHJuc3RyOnRlbHN0cjppYTVzdHI6dXRjdGltZTpnZW50aW1lOnNlcTpzZXQ6dGFnOlwiLmluZGV4T2YoXCI6XCIraitcIjpcIik9PS0xKXt0aHJvd1widW5kZWZpbmVkIGtleTogXCIran1pZihqPT1cImJvb2xcIil7cmV0dXJuIG5ldyBnLkRFUkJvb2xlYW4oYltqXSl9aWYoaj09XCJpbnRcIil7cmV0dXJuIG5ldyBnLkRFUkludGVnZXIoYltqXSl9aWYoaj09XCJiaXRzdHJcIil7cmV0dXJuIG5ldyBnLkRFUkJpdFN0cmluZyhiW2pdKX1pZihqPT1cIm9jdHN0clwiKXtyZXR1cm4gbmV3IGcuREVST2N0ZXRTdHJpbmcoYltqXSl9aWYoaj09XCJudWxsXCIpe3JldHVybiBuZXcgZy5ERVJOdWxsKGJbal0pfWlmKGo9PVwib2lkXCIpe3JldHVybiBuZXcgZy5ERVJPYmplY3RJZGVudGlmaWVyKGJbal0pfWlmKGo9PVwiZW51bVwiKXtyZXR1cm4gbmV3IGcuREVSRW51bWVyYXRlZChiW2pdKX1pZihqPT1cInV0ZjhzdHJcIil7cmV0dXJuIG5ldyBnLkRFUlVURjhTdHJpbmcoYltqXSl9aWYoaj09XCJudW1zdHJcIil7cmV0dXJuIG5ldyBnLkRFUk51bWVyaWNTdHJpbmcoYltqXSl9aWYoaj09XCJwcm5zdHJcIil7cmV0dXJuIG5ldyBnLkRFUlByaW50YWJsZVN0cmluZyhiW2pdKX1pZihqPT1cInRlbHN0clwiKXtyZXR1cm4gbmV3IGcuREVSVGVsZXRleFN0cmluZyhiW2pdKX1pZihqPT1cImlhNXN0clwiKXtyZXR1cm4gbmV3IGcuREVSSUE1U3RyaW5nKGJbal0pfWlmKGo9PVwidXRjdGltZVwiKXtyZXR1cm4gbmV3IGcuREVSVVRDVGltZShiW2pdKX1pZihqPT1cImdlbnRpbWVcIil7cmV0dXJuIG5ldyBnLkRFUkdlbmVyYWxpemVkVGltZShiW2pdKX1pZihqPT1cInNlcVwiKXt2YXIgbT1iW2pdO3ZhciBoPVtdO2Zvcih2YXIgZT0wO2U8bS5sZW5ndGg7ZSsrKXt2YXIgbD1nLkFTTjFVdGlsLm5ld09iamVjdChtW2VdKTtoLnB1c2gobCl9cmV0dXJuIG5ldyBnLkRFUlNlcXVlbmNlKHthcnJheTpofSl9aWYoaj09XCJzZXRcIil7dmFyIG09YltqXTt2YXIgaD1bXTtmb3IodmFyIGU9MDtlPG0ubGVuZ3RoO2UrKyl7dmFyIGw9Zy5BU04xVXRpbC5uZXdPYmplY3QobVtlXSk7aC5wdXNoKGwpfXJldHVybiBuZXcgZy5ERVJTZXQoe2FycmF5Omh9KX1pZihqPT1cInRhZ1wiKXt2YXIgYz1iW2pdO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjKT09PVwiW29iamVjdCBBcnJheV1cIiYmYy5sZW5ndGg9PTMpe3ZhciBkPWcuQVNOMVV0aWwubmV3T2JqZWN0KGNbMl0pO3JldHVybiBuZXcgZy5ERVJUYWdnZWRPYmplY3Qoe3RhZzpjWzBdLGV4cGxpY2l0OmNbMV0sb2JqOmR9KX1lbHNle3ZhciBmPXt9O2lmKGMuZXhwbGljaXQhPT11bmRlZmluZWQpe2YuZXhwbGljaXQ9Yy5leHBsaWNpdH1pZihjLnRhZyE9PXVuZGVmaW5lZCl7Zi50YWc9Yy50YWd9aWYoYy5vYmo9PT11bmRlZmluZWQpe3Rocm93XCJvYmogc2hhbGwgYmUgc3BlY2lmaWVkIGZvciAndGFnJy5cIn1mLm9iaj1nLkFTTjFVdGlsLm5ld09iamVjdChjLm9iaik7cmV0dXJuIG5ldyBnLkRFUlRhZ2dlZE9iamVjdChmKX19fTt0aGlzLmpzb25Ub0FTTjFIRVg9ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5uZXdPYmplY3QoYik7cmV0dXJuIGEuZ2V0RW5jb2RlZEhleCgpfX07S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50PWZ1bmN0aW9uKGEpe3ZhciBqPVwiXCI7dmFyIGs9cGFyc2VJbnQoYS5zdWJzdHIoMCwyKSwxNik7dmFyIGQ9TWF0aC5mbG9vcihrLzQwKTt2YXIgYz1rJTQwO3ZhciBqPWQrXCIuXCIrYzt2YXIgZT1cIlwiO2Zvcih2YXIgZj0yO2Y8YS5sZW5ndGg7Zis9Mil7dmFyIGc9cGFyc2VJbnQoYS5zdWJzdHIoZiwyKSwxNik7dmFyIGg9KFwiMDAwMDAwMDBcIitnLnRvU3RyaW5nKDIpKS5zbGljZSgtOCk7ZT1lK2guc3Vic3RyKDEsNyk7aWYoaC5zdWJzdHIoMCwxKT09XCIwXCIpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKGUsMik7aj1qK1wiLlwiK2IudG9TdHJpbmcoMTApO2U9XCJcIn19cmV0dXJuIGp9O0tKVVIuYXNuMS5BU04xVXRpbC5vaWRJbnRUb0hleD1mdW5jdGlvbihmKXt2YXIgZT1mdW5jdGlvbihhKXt2YXIgaz1hLnRvU3RyaW5nKDE2KTtpZihrLmxlbmd0aD09MSl7az1cIjBcIitrfXJldHVybiBrfTt2YXIgZD1mdW5jdGlvbihvKXt2YXIgbj1cIlwiO3ZhciBrPW5ldyBCaWdJbnRlZ2VyKG8sMTApO3ZhciBhPWsudG9TdHJpbmcoMik7dmFyIGw9Ny1hLmxlbmd0aCU3O2lmKGw9PTcpe2w9MH12YXIgcT1cIlwiO2Zvcih2YXIgbT0wO208bDttKyspe3ErPVwiMFwifWE9cSthO2Zvcih2YXIgbT0wO208YS5sZW5ndGgtMTttKz03KXt2YXIgcD1hLnN1YnN0cihtLDcpO2lmKG0hPWEubGVuZ3RoLTcpe3A9XCIxXCIrcH1uKz1lKHBhcnNlSW50KHAsMikpfXJldHVybiBufTtpZighZi5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJtYWxmb3JtZWQgb2lkIHN0cmluZzogXCIrZn12YXIgZz1cIlwiO3ZhciBiPWYuc3BsaXQoXCIuXCIpO3ZhciBqPXBhcnNlSW50KGJbMF0pKjQwK3BhcnNlSW50KGJbMV0pO2crPWUoaik7Yi5zcGxpY2UoMCwyKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7Zys9ZChiW2NdKX1yZXR1cm4gZ307S0pVUi5hc24xLkFTTjFPYmplY3Q9ZnVuY3Rpb24oKXt2YXIgYz10cnVlO3ZhciBiPW51bGw7dmFyIGQ9XCIwMFwiO3ZhciBlPVwiMDBcIjt2YXIgYT1cIlwiO3RoaXMuZ2V0TGVuZ3RoSGV4RnJvbVZhbHVlPWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFY9PVwidW5kZWZpbmVkXCJ8fHRoaXMuaFY9PW51bGwpe3Rocm93XCJ0aGlzLmhWIGlzIG51bGwgb3IgdW5kZWZpbmVkLlwifWlmKHRoaXMuaFYubGVuZ3RoJTI9PTEpe3Rocm93XCJ2YWx1ZSBoZXggbXVzdCBiZSBldmVuIGxlbmd0aDogbj1cIithLmxlbmd0aCtcIix2PVwiK3RoaXMuaFZ9dmFyIGk9dGhpcy5oVi5sZW5ndGgvMjt2YXIgaD1pLnRvU3RyaW5nKDE2KTtpZihoLmxlbmd0aCUyPT0xKXtoPVwiMFwiK2h9aWYoaTwxMjgpe3JldHVybiBofWVsc2V7dmFyIGc9aC5sZW5ndGgvMjtpZihnPjE1KXt0aHJvd1wiQVNOLjEgbGVuZ3RoIHRvbyBsb25nIHRvIHJlcHJlc2VudCBieSA4eDogbiA9IFwiK2kudG9TdHJpbmcoMTYpfXZhciBmPTEyOCtnO3JldHVybiBmLnRvU3RyaW5nKDE2KStofX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5oVExWPT1udWxsfHx0aGlzLmlzTW9kaWZpZWQpe3RoaXMuaFY9dGhpcy5nZXRGcmVzaFZhbHVlSGV4KCk7dGhpcy5oTD10aGlzLmdldExlbmd0aEhleEZyb21WYWx1ZSgpO3RoaXMuaFRMVj10aGlzLmhUK3RoaXMuaEwrdGhpcy5oVjt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5nZXRWYWx1ZUhleD1mdW5jdGlvbigpe3RoaXMuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhWfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm5cIlwifX07S0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMuZ2V0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc307dGhpcy5zZXRTdHJpbmc9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPWQ7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX07dGhpcy5zZXRTdHJpbmdIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiKXt0aGlzLnNldFN0cmluZyhjKX1lbHNle2lmKHR5cGVvZiBjLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRTdHJpbmcoYy5zdHIpfWVsc2V7aWYodHlwZW9mIGMuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFN0cmluZ0hleChjLmhleCl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLkRFUkFic3RyYWN0VGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMubG9jYWxEYXRlVG9VVEM9ZnVuY3Rpb24oZil7dXRjPWYuZ2V0VGltZSgpKyhmLmdldFRpbWV6b25lT2Zmc2V0KCkqNjAwMDApO3ZhciBlPW5ldyBEYXRlKHV0Yyk7cmV0dXJuIGV9O3RoaXMuZm9ybWF0RGF0ZT1mdW5jdGlvbihtLG8sZSl7dmFyIGc9dGhpcy56ZXJvUGFkZGluZzt2YXIgbj10aGlzLmxvY2FsRGF0ZVRvVVRDKG0pO3ZhciBwPVN0cmluZyhuLmdldEZ1bGxZZWFyKCkpO2lmKG89PVwidXRjXCIpe3A9cC5zdWJzdHIoMiwyKX12YXIgbD1nKFN0cmluZyhuLmdldE1vbnRoKCkrMSksMik7dmFyIHE9ZyhTdHJpbmcobi5nZXREYXRlKCkpLDIpO3ZhciBoPWcoU3RyaW5nKG4uZ2V0SG91cnMoKSksMik7dmFyIGk9ZyhTdHJpbmcobi5nZXRNaW51dGVzKCkpLDIpO3ZhciBqPWcoU3RyaW5nKG4uZ2V0U2Vjb25kcygpKSwyKTt2YXIgcj1wK2wrcStoK2krajtpZihlPT09dHJ1ZSl7dmFyIGY9bi5nZXRNaWxsaXNlY29uZHMoKTtpZihmIT0wKXt2YXIgaz1nKFN0cmluZyhmKSwzKTtrPWsucmVwbGFjZSgvWzBdKyQvLFwiXCIpO3I9citcIi5cIitrfX1yZXR1cm4gcitcIlpcIn07dGhpcy56ZXJvUGFkZGluZz1mdW5jdGlvbihlLGQpe2lmKGUubGVuZ3RoPj1kKXtyZXR1cm4gZX1yZXR1cm4gbmV3IEFycmF5KGQtZS5sZW5ndGgrMSkuam9pbihcIjBcIikrZX07dGhpcy5nZXRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfTt0aGlzLnNldFN0cmluZz1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9ZDt0aGlzLmhWPXN0b2hleChkKX07dGhpcy5zZXRCeURhdGVWYWx1ZT1mdW5jdGlvbihoLGosZSxkLGYsZyl7dmFyIGk9bmV3IERhdGUoRGF0ZS5VVEMoaCxqLTEsZSxkLGYsZywwKSk7dGhpcy5zZXRCeURhdGUoaSl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZD1mdW5jdGlvbihiKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRCeUFTTjFPYmplY3RBcnJheT1mdW5jdGlvbihjKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmFzbjFBcnJheT1jfTt0aGlzLmFwcGVuZEFTTjFPYmplY3Q9ZnVuY3Rpb24oYyl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5hc24xQXJyYXkucHVzaChjKX07dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFBcnJheT1iLmFycmF5fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCb29sZWFuPWZ1bmN0aW9uKCl7S0pVUi5hc24xLkRFUkJvb2xlYW4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMVwiO3RoaXMuaFRMVj1cIjAxMDFmZlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQm9vbGVhbixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkludGVnZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkludGVnZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMlwiO3RoaXMuc2V0QnlCaWdJbnRlZ2VyPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGIpfTt0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbihjKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihTdHJpbmcoYyksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGIpfTt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGIpe3RoaXMuaFY9Yn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5iaWdpbnQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGEuYmlnaW50KX1lbHNle2lmKHR5cGVvZiBhW1wiaW50XCJdIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5SW50ZWdlcihhW1wiaW50XCJdKX1lbHNle2lmKHR5cGVvZiBhPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5SW50ZWdlcihhKX1lbHNle2lmKHR5cGVvZiBhLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChhLmhleCl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkludGVnZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCaXRTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkJpdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAzXCI7dGhpcy5zZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHM9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1ifTt0aGlzLnNldFVudXNlZEJpdHNBbmRIZXhWYWx1ZT1mdW5jdGlvbihiLGQpe2lmKGI8MHx8NzxiKXt0aHJvd1widW51c2VkIGJpdHMgc2hhbGwgYmUgZnJvbSAwIHRvIDc6IHUgPSBcIitifXZhciBjPVwiMFwiK2I7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1jK2R9O3RoaXMuc2V0QnlCaW5hcnlTdHJpbmc9ZnVuY3Rpb24oZSl7ZT1lLnJlcGxhY2UoLzArJC8sXCJcIik7dmFyIGY9OC1lLmxlbmd0aCU4O2lmKGY9PTgpe2Y9MH1mb3IodmFyIGc9MDtnPD1mO2crKyl7ZSs9XCIwXCJ9dmFyIGo9XCJcIjtmb3IodmFyIGc9MDtnPGUubGVuZ3RoLTE7Zys9OCl7dmFyIGQ9ZS5zdWJzdHIoZyw4KTt2YXIgYz1wYXJzZUludChkLDIpLnRvU3RyaW5nKDE2KTtpZihjLmxlbmd0aD09MSl7Yz1cIjBcIitjfWorPWN9dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1cIjBcIitmK2p9O3RoaXMuc2V0QnlCb29sZWFuQXJyYXk9ZnVuY3Rpb24oZCl7dmFyIGM9XCJcIjtmb3IodmFyIGI9MDtiPGQubGVuZ3RoO2IrKyl7aWYoZFtiXT09dHJ1ZSl7Yys9XCIxXCJ9ZWxzZXtjKz1cIjBcIn19dGhpcy5zZXRCeUJpbmFyeVN0cmluZyhjKX07dGhpcy5uZXdGYWxzZUFycmF5PWZ1bmN0aW9uKGQpe3ZhciBiPW5ldyBBcnJheShkKTtmb3IodmFyIGM9MDtjPGQ7YysrKXtiW2NdPWZhbHNlfXJldHVybiBifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhPT1cInN0cmluZ1wiJiZhLnRvTG93ZXJDYXNlKCkubWF0Y2goL15bMC05YS1mXSskLykpe3RoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzKGEpfWVsc2V7aWYodHlwZW9mIGEuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyhhLmhleCl9ZWxzZXtpZih0eXBlb2YgYS5iaW4hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaW5hcnlTdHJpbmcoYS5iaW4pfWVsc2V7aWYodHlwZW9mIGEuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCb29sZWFuQXJyYXkoYS5hcnJheSl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkJpdFN0cmluZyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJPY3RldFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMDRcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUk51bGw9ZnVuY3Rpb24oKXtLSlVSLmFzbjEuREVSTnVsbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjA1XCI7dGhpcy5oVExWPVwiMDUwMFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVsbCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXI9ZnVuY3Rpb24oYyl7dmFyIGI9ZnVuY3Rpb24oZCl7dmFyIGU9ZC50b1N0cmluZygxNik7aWYoZS5sZW5ndGg9PTEpe2U9XCIwXCIrZX1yZXR1cm4gZX07dmFyIGE9ZnVuY3Rpb24oayl7dmFyIGo9XCJcIjt2YXIgZT1uZXcgQmlnSW50ZWdlcihrLDEwKTt2YXIgZD1lLnRvU3RyaW5nKDIpO3ZhciBmPTctZC5sZW5ndGglNztpZihmPT03KXtmPTB9dmFyIG09XCJcIjtmb3IodmFyIGc9MDtnPGY7ZysrKXttKz1cIjBcIn1kPW0rZDtmb3IodmFyIGc9MDtnPGQubGVuZ3RoLTE7Zys9Nyl7dmFyIGw9ZC5zdWJzdHIoZyw3KTtpZihnIT1kLmxlbmd0aC03KXtsPVwiMVwiK2x9ais9YihwYXJzZUludChsLDIpKX1yZXR1cm4gan07S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwNlwiO3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLnNldFZhbHVlT2lkU3RyaW5nPWZ1bmN0aW9uKGYpe2lmKCFmLm1hdGNoKC9eWzAtOS5dKyQvKSl7dGhyb3dcIm1hbGZvcm1lZCBvaWQgc3RyaW5nOiBcIitmfXZhciBnPVwiXCI7dmFyIGQ9Zi5zcGxpdChcIi5cIik7dmFyIGo9cGFyc2VJbnQoZFswXSkqNDArcGFyc2VJbnQoZFsxXSk7Zys9YihqKTtkLnNwbGljZSgwLDIpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXtnKz1hKGRbZV0pfXRoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1udWxsO3RoaXMuaFY9Z307dGhpcy5zZXRWYWx1ZU5hbWU9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbZV0hPVwidW5kZWZpbmVkXCIpe3ZhciBkPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbZV07dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhkKX1lbHNle3Rocm93XCJERVJPYmplY3RJZGVudGlmaWVyIG9pZE5hbWUgdW5kZWZpbmVkOiBcIitlfX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJzdHJpbmdcIiYmYy5tYXRjaCgvXlswLTJdLlswLTkuXSskLykpe3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoYyl9ZWxzZXtpZihLSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0W2NdIT09dW5kZWZpbmVkKXt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbY10pfWVsc2V7aWYodHlwZW9mIGMub2lkIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKGMub2lkKX1lbHNle2lmKHR5cGVvZiBjLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChjLmhleCl9ZWxzZXtpZih0eXBlb2YgYy5uYW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlTmFtZShjLm5hbWUpfX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkVudW1lcmF0ZWQ9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkVudW1lcmF0ZWQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwYVwiO3RoaXMuc2V0QnlCaWdJbnRlZ2VyPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGIpfTt0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbihjKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihTdHJpbmcoYyksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGIpfTt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGIpe3RoaXMuaFY9Yn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYVtcImludFwiXSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUludGVnZXIoYVtcImludFwiXSl9ZWxzZXtpZih0eXBlb2YgYT09XCJudW1iZXJcIil7dGhpcy5zZXRCeUludGVnZXIoYSl9ZWxzZXtpZih0eXBlb2YgYS5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVIZXgoYS5oZXgpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkVudW1lcmF0ZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJVVEY4U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJVVEY4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIwY1wifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRGOFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxMlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTNcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxNFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJJQTVTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUklBNVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTZcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUklBNVN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJVVENUaW1lPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJVVENUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxN1wiO3RoaXMuc2V0QnlEYXRlPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuZGF0ZT1iO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwidXRjXCIpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmRhdGU9PVwidW5kZWZpbmVkXCImJnR5cGVvZiB0aGlzLnM9PVwidW5kZWZpbmVkXCIpe3RoaXMuZGF0ZT1uZXcgRGF0ZSgpO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwidXRjXCIpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9cmV0dXJuIHRoaXMuaFZ9O2lmKGEhPT11bmRlZmluZWQpe2lmKGEuc3RyIT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZyhhLnN0cil9ZWxzZXtpZih0eXBlb2YgYT09XCJzdHJpbmdcIiYmYS5tYXRjaCgvXlswLTldezEyfVokLykpe3RoaXMuc2V0U3RyaW5nKGEpfWVsc2V7aWYoYS5oZXghPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nSGV4KGEuaGV4KX1lbHNle2lmKGEuZGF0ZSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRCeURhdGUoYS5kYXRlKX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRDVGltZSxLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lKTtLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE4XCI7dGhpcy53aXRoTWlsbGlzPWZhbHNlO3RoaXMuc2V0QnlEYXRlPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuZGF0ZT1iO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwiZ2VuXCIsdGhpcy53aXRoTWlsbGlzKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRhdGU9PT11bmRlZmluZWQmJnRoaXMucz09PXVuZGVmaW5lZCl7dGhpcy5kYXRlPW5ldyBEYXRlKCk7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJnZW5cIix0aGlzLndpdGhNaWxsaXMpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9cmV0dXJuIHRoaXMuaFZ9O2lmKGEhPT11bmRlZmluZWQpe2lmKGEuc3RyIT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZyhhLnN0cil9ZWxzZXtpZih0eXBlb2YgYT09XCJzdHJpbmdcIiYmYS5tYXRjaCgvXlswLTldezE0fVokLykpe3RoaXMuc2V0U3RyaW5nKGEpfWVsc2V7aWYoYS5oZXghPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nSGV4KGEuaGV4KX1lbHNle2lmKGEuZGF0ZSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRCeURhdGUoYS5kYXRlKX19fX1pZihhLm1pbGxpcz09PXRydWUpe3RoaXMud2l0aE1pbGxpcz10cnVlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUsS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSk7S0pVUi5hc24xLkRFUlNlcXVlbmNlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJTZXF1ZW5jZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMzBcIjt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYz1cIlwiO2Zvcih2YXIgYj0wO2I8dGhpcy5hc24xQXJyYXkubGVuZ3RoO2IrKyl7dmFyIGQ9dGhpcy5hc24xQXJyYXlbYl07Yys9ZC5nZXRFbmNvZGVkSGV4KCl9dGhpcy5oVj1jO3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlNlcXVlbmNlLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpO0tKVVIuYXNuMS5ERVJTZXQ9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlNldC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMzFcIjt0aGlzLnNvcnRGbGFnPXRydWU7dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKHZhciBjPTA7Yzx0aGlzLmFzbjFBcnJheS5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmFzbjFBcnJheVtjXTtiLnB1c2goZC5nZXRFbmNvZGVkSGV4KCkpfWlmKHRoaXMuc29ydEZsYWc9PXRydWUpe2Iuc29ydCgpfXRoaXMuaFY9Yi5qb2luKFwiXCIpO3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc29ydGZsYWchPVwidW5kZWZpbmVkXCImJmEuc29ydGZsYWc9PWZhbHNlKXt0aGlzLnNvcnRGbGFnPWZhbHNlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJTZXQsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCk7S0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiYTBcIjt0aGlzLmhWPVwiXCI7dGhpcy5pc0V4cGxpY2l0PXRydWU7dGhpcy5hc24xT2JqZWN0PW51bGw7dGhpcy5zZXRBU04xT2JqZWN0PWZ1bmN0aW9uKGIsYyxkKXt0aGlzLmhUPWM7dGhpcy5pc0V4cGxpY2l0PWI7dGhpcy5hc24xT2JqZWN0PWQ7aWYodGhpcy5pc0V4cGxpY2l0KXt0aGlzLmhWPXRoaXMuYXNuMU9iamVjdC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWV9ZWxzZXt0aGlzLmhWPW51bGw7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaFRMVj10aGlzLmhUTFYucmVwbGFjZSgvXi4uLyxjKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9fTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLnRhZyE9XCJ1bmRlZmluZWRcIil7dGhpcy5oVD1hLnRhZ31pZih0eXBlb2YgYS5leHBsaWNpdCE9XCJ1bmRlZmluZWRcIil7dGhpcy5pc0V4cGxpY2l0PWEuZXhwbGljaXR9aWYodHlwZW9mIGEub2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFPYmplY3Q9YS5vYmo7dGhpcy5zZXRBU04xT2JqZWN0KHRoaXMuaXNFeHBsaWNpdCx0aGlzLmhULHRoaXMuYXNuMU9iamVjdCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7XG4vKiEgYXNuMWhleC0xLjEuNi5qcyAoYykgMjAxMi0yMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBBU04xSEVYPW5ldyBmdW5jdGlvbigpe3RoaXMuZ2V0Qnl0ZUxlbmd0aE9mTF9BdE9iaj1mdW5jdGlvbihiLGMpe2lmKGIuc3Vic3RyaW5nKGMrMixjKzMpIT1cIjhcIil7cmV0dXJuIDF9dmFyIGE9cGFyc2VJbnQoYi5zdWJzdHJpbmcoYyszLGMrNCkpO2lmKGE9PTApe3JldHVybiAtMX1pZigwPGEmJmE8MTApe3JldHVybiBhKzF9cmV0dXJuIC0yfTt0aGlzLmdldEhleE9mTF9BdE9iaj1mdW5jdGlvbihiLGMpe3ZhciBhPXRoaXMuZ2V0Qnl0ZUxlbmd0aE9mTF9BdE9iaihiLGMpO2lmKGE8MSl7cmV0dXJuXCJcIn1yZXR1cm4gYi5zdWJzdHJpbmcoYysyLGMrMithKjIpfTt0aGlzLmdldEludE9mTF9BdE9iaj1mdW5jdGlvbihjLGQpe3ZhciBiPXRoaXMuZ2V0SGV4T2ZMX0F0T2JqKGMsZCk7aWYoYj09XCJcIil7cmV0dXJuIC0xfXZhciBhO2lmKHBhcnNlSW50KGIuc3Vic3RyaW5nKDAsMSkpPDgpe2E9bmV3IEJpZ0ludGVnZXIoYiwxNil9ZWxzZXthPW5ldyBCaWdJbnRlZ2VyKGIuc3Vic3RyaW5nKDIpLDE2KX1yZXR1cm4gYS5pbnRWYWx1ZSgpfTt0aGlzLmdldFN0YXJ0UG9zT2ZWX0F0T2JqPWZ1bmN0aW9uKGIsYyl7dmFyIGE9dGhpcy5nZXRCeXRlTGVuZ3RoT2ZMX0F0T2JqKGIsYyk7aWYoYTwwKXtyZXR1cm4gYX1yZXR1cm4gYysoYSsxKSoyfTt0aGlzLmdldEhleE9mVl9BdE9iaj1mdW5jdGlvbihjLGQpe3ZhciBiPXRoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmooYyxkKTt2YXIgYT10aGlzLmdldEludE9mTF9BdE9iaihjLGQpO3JldHVybiBjLnN1YnN0cmluZyhiLGIrYSoyKX07dGhpcy5nZXRIZXhPZlRMVl9BdE9iaj1mdW5jdGlvbihjLGUpe3ZhciBiPWMuc3Vic3RyKGUsMik7dmFyIGQ9dGhpcy5nZXRIZXhPZkxfQXRPYmooYyxlKTt2YXIgYT10aGlzLmdldEhleE9mVl9BdE9iaihjLGUpO3JldHVybiBiK2QrYX07dGhpcy5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqPWZ1bmN0aW9uKGMsZCl7dmFyIGI9dGhpcy5nZXRTdGFydFBvc09mVl9BdE9iaihjLGQpO3ZhciBhPXRoaXMuZ2V0SW50T2ZMX0F0T2JqKGMsZCk7cmV0dXJuIGIrYSoyfTt0aGlzLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaj1mdW5jdGlvbihmLGope3ZhciBjPW5ldyBBcnJheSgpO3ZhciBpPXRoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmooZixqKTtjLnB1c2goaSk7dmFyIGI9dGhpcy5nZXRJbnRPZkxfQXRPYmooZixqKTt2YXIgZz1pO3ZhciBkPTA7d2hpbGUoMSl7dmFyIGU9dGhpcy5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGYsZyk7aWYoZT09bnVsbHx8KGUtaT49KGIqMikpKXticmVha31pZihkPj0yMDApe2JyZWFrfWMucHVzaChlKTtnPWU7ZCsrfXJldHVybiBjfTt0aGlzLmdldE50aENoaWxkSW5kZXhfQXRPYmo9ZnVuY3Rpb24oZCxiLGUpe3ZhciBjPXRoaXMuZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsYik7cmV0dXJuIGNbZV19O3RoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3Q9ZnVuY3Rpb24oZSxkLGMpe2lmKGMubGVuZ3RoPT0wKXtyZXR1cm4gZH12YXIgZj1jLnNoaWZ0KCk7dmFyIGI9dGhpcy5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxkKTtyZXR1cm4gdGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChlLGJbZl0sYyl9O3RoaXMuZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0PWZ1bmN0aW9uKGQsYyxiKXt2YXIgYT10aGlzLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGQsYyxiKTtyZXR1cm4gdGhpcy5nZXRIZXhPZlRMVl9BdE9iaihkLGEpfTt0aGlzLmdldERlY2VuZGFudEhleFZCeU50aExpc3Q9ZnVuY3Rpb24oZCxjLGIpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO3JldHVybiB0aGlzLmdldEhleE9mVl9BdE9iaihkLGEpfX07QVNOMUhFWC5nZXRWYnlMaXN0PWZ1bmN0aW9uKGQsYyxiLGUpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO2lmKGE9PT11bmRlZmluZWQpe3Rocm93XCJjYW4ndCBmaW5kIG50aExpc3Qgb2JqZWN0XCJ9aWYoZSE9PXVuZGVmaW5lZCl7aWYoZC5zdWJzdHIoYSwyKSE9ZSl7dGhyb3dcImNoZWNraW5nIHRhZyBkb2Vzbid0IG1hdGNoOiBcIitkLnN1YnN0cihhLDIpK1wiIT1cIitlfX1yZXR1cm4gdGhpcy5nZXRIZXhPZlZfQXRPYmooZCxhKX07QVNOMUhFWC5oZXh0b29pZHN0cj1mdW5jdGlvbihlKXt2YXIgaD1mdW5jdGlvbihiLGEpe2lmKGIubGVuZ3RoPj1hKXtyZXR1cm4gYn1yZXR1cm4gbmV3IEFycmF5KGEtYi5sZW5ndGgrMSkuam9pbihcIjBcIikrYn07dmFyIGw9W107dmFyIG89ZS5zdWJzdHIoMCwyKTt2YXIgZj1wYXJzZUludChvLDE2KTtsWzBdPW5ldyBTdHJpbmcoTWF0aC5mbG9vcihmLzQwKSk7bFsxXT1uZXcgU3RyaW5nKGYlNDApO3ZhciBtPWUuc3Vic3RyKDIpO3ZhciBrPVtdO2Zvcih2YXIgZz0wO2c8bS5sZW5ndGgvMjtnKyspe2sucHVzaChwYXJzZUludChtLnN1YnN0cihnKjIsMiksMTYpKX12YXIgaj1bXTt2YXIgZD1cIlwiO2Zvcih2YXIgZz0wO2c8ay5sZW5ndGg7ZysrKXtpZihrW2ddJjEyOCl7ZD1kK2goKGtbZ10mMTI3KS50b1N0cmluZygyKSw3KX1lbHNle2Q9ZCtoKChrW2ddJjEyNykudG9TdHJpbmcoMiksNyk7ai5wdXNoKG5ldyBTdHJpbmcocGFyc2VJbnQoZCwyKSkpO2Q9XCJcIn19dmFyIG49bC5qb2luKFwiLlwiKTtpZihqLmxlbmd0aD4wKXtuPW4rXCIuXCIrai5qb2luKFwiLlwiKX1yZXR1cm4gbn07QVNOMUhFWC5kdW1wPWZ1bmN0aW9uKGUsYyxrLGcpe3ZhciBvPWZ1bmN0aW9uKHcsaSl7aWYody5sZW5ndGg8PWkqMil7cmV0dXJuIHd9ZWxzZXt2YXIgdj13LnN1YnN0cigwLGkpK1wiLi4odG90YWwgXCIrdy5sZW5ndGgvMitcImJ5dGVzKS4uXCIrdy5zdWJzdHIody5sZW5ndGgtaSxpKTtyZXR1cm4gdn19O2lmKGM9PT11bmRlZmluZWQpe2M9e29tbWl0X2xvbmdfb2N0ZXQ6MzJ9fWlmKGs9PT11bmRlZmluZWQpe2s9MH1pZihnPT09dW5kZWZpbmVkKXtnPVwiXCJ9dmFyIHI9Yy5vbW1pdF9sb25nX29jdGV0O2lmKGUuc3Vic3RyKGssMik9PVwiMDFcIil7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTtpZihoPT1cIjAwXCIpe3JldHVybiBnK1wiQk9PTEVBTiBGQUxTRVxcblwifWVsc2V7cmV0dXJuIGcrXCJCT09MRUFOIFRSVUVcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwMlwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO3JldHVybiBnK1wiSU5URUdFUiBcIitvKGgscikrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjAzXCIpe3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7cmV0dXJuIGcrXCJCSVRTVFJJTkcgXCIrbyhoLHIpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIwNFwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKEFTTjFIRVguaXNBU04xSEVYKGgpKXt2YXIgaj1nK1wiT0NURVRTVFJJTkcsIGVuY2Fwc3VsYXRlc1xcblwiO2o9aitBU04xSEVYLmR1bXAoaCxjLDAsZytcIiAgXCIpO3JldHVybiBqfWVsc2V7cmV0dXJuIGcrXCJPQ1RFVFNUUklORyBcIitvKGgscikrXCJcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwNVwiKXtyZXR1cm4gZytcIk5VTExcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjA2XCIpe3ZhciBsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGwpO3ZhciBuPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTt2YXIgYj1hLnJlcGxhY2UoL1xcLi9nLFwiIFwiKTtpZihuIT1cIlwiKXtyZXR1cm4gZytcIk9iamVjdElkZW50aWZpZXIgXCIrbitcIiAoXCIrYitcIilcXG5cIn1lbHNle3JldHVybiBnK1wiT2JqZWN0SWRlbnRpZmllciAoXCIrYitcIilcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwY1wiKXtyZXR1cm4gZytcIlVURjhTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjEzXCIpe3JldHVybiBnK1wiUHJpbnRhYmxlU3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxNFwiKXtyZXR1cm4gZytcIlRlbGV0ZXhTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE2XCIpe3JldHVybiBnK1wiSUE1U3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxN1wiKXtyZXR1cm4gZytcIlVUQ1RpbWUgXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxOFwiKXtyZXR1cm4gZytcIkdlbmVyYWxpemVkVGltZSBcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjMwXCIpe2lmKGUuc3Vic3RyKGssNCk9PVwiMzAwMFwiKXtyZXR1cm4gZytcIlNFUVVFTkNFIHt9XFxuXCJ9dmFyIGo9ZytcIlNFUVVFTkNFXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTt2YXIgZj1jO2lmKChkLmxlbmd0aD09Mnx8ZC5sZW5ndGg9PTMpJiZlLnN1YnN0cihkWzBdLDIpPT1cIjA2XCImJmUuc3Vic3RyKGRbZC5sZW5ndGgtMV0sMik9PVwiMDRcIil7dmFyIHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxkWzBdKTt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQodCk7dmFyIG49S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGEpO3ZhciBwPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYykpO3AueDUwOUV4dE5hbWU9bjtmPXB9Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe2o9aitBU04xSEVYLmR1bXAoZSxmLGRbcV0sZytcIiAgXCIpfXJldHVybiBqfWlmKGUuc3Vic3RyKGssMik9PVwiMzFcIil7dmFyIGo9ZytcIlNFVFxcblwiO3ZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsayk7Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe2o9aitBU04xSEVYLmR1bXAoZSxjLGRbcV0sZytcIiAgXCIpfXJldHVybiBqfXZhciB1PXBhcnNlSW50KGUuc3Vic3RyKGssMiksMTYpO2lmKCh1JjEyOCkhPTApe3ZhciBtPXUmMzE7aWYoKHUmMzIpIT0wKXt2YXIgaj1nK1wiW1wiK20rXCJdXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTtmb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7aj1qK0FTTjFIRVguZHVtcChlLGMsZFtxXSxnK1wiICBcIil9cmV0dXJuIGp9ZWxzZXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKGguc3Vic3RyKDAsOCk9PVwiNjg3NDc0NzBcIil7aD1oZXh0b3V0ZjgoaCl9aWYoYy54NTA5RXh0TmFtZT09PVwic3ViamVjdEFsdE5hbWVcIiYmbT09Mil7aD1oZXh0b3V0ZjgoaCl9dmFyIGo9ZytcIltcIittK1wiXSBcIitoK1wiXFxuXCI7cmV0dXJuIGp9fXJldHVybiBnK1wiVU5LTk9XTihcIitlLnN1YnN0cihrLDIpK1wiKSBcIitBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspK1wiXFxuXCJ9O0FTTjFIRVguaXNBU04xSEVYPWZ1bmN0aW9uKGQpe2lmKGQubGVuZ3RoJTI9PTEpe3JldHVybiBmYWxzZX12YXIgYz1BU04xSEVYLmdldEludE9mTF9BdE9iaihkLDApO3ZhciBiPWQuc3Vic3RyKDAsMik7dmFyIGU9QVNOMUhFWC5nZXRIZXhPZkxfQXRPYmooZCwwKTt2YXIgYT1kLmxlbmd0aC1iLmxlbmd0aC1lLmxlbmd0aDtpZihhPT1jKjIpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX07XG4vKiEgYXNuMXg1MDktMS4wLjE0LmpzIChjKSAyMDEzLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLng1MDk9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEueDUwOSl7S0pVUi5hc24xLng1MDk9e319S0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGU9ZnVuY3Rpb24oZyl7S0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGQ9bnVsbDt2YXIgZj1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt2YXIgZT1udWxsO3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzPWZ1bmN0aW9uKGksayl7dmFyIGg9UEtDUzVQS0VZLmdldERlY3J5cHRlZEtleUhleChpLGspO3ZhciBqPW5ldyBSU0FLZXkoKTtqLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoaCk7dGhpcy5wcnZLZXk9an07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnQuYXNuMVNpZ25hdHVyZUFsZztzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOlwiU0hBMXdpdGhSU0FcIn0pO3NpZy5pbml0KHRoaXMucHJ2S2V5KTtzaWcudXBkYXRlSGV4KHRoaXMuYXNuMVRCU0NlcnQuZ2V0RW5jb2RlZEhleCgpKTt0aGlzLmhleFNpZz1zaWcuc2lnbigpO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBoPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWguZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5zZXRTaWduYXR1cmVIZXg9ZnVuY3Rpb24oaCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnQuYXNuMVNpZ25hdHVyZUFsZzt0aGlzLmhleFNpZz1oO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBpPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWkuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBqPXRoaXMuZ2V0RW5jb2RlZEhleCgpO3ZhciBoPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uoaik7dmFyIGk9Q3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoaCk7dmFyIGs9aS5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcclxcblwiK2srXCJcXHJcXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXFxyXFxuXCJ9O2lmKHR5cGVvZiBnIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZy50YnNjZXJ0b2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFUQlNDZXJ0PWcudGJzY2VydG9ian1pZih0eXBlb2YgZy5wcnZrZXlvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMucHJ2S2V5PWcucHJ2a2V5b2JqfWVsc2V7aWYodHlwZW9mIGcucnNhcHJ2a2V5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnBydktleT1nLnJzYXBydmtleX1lbHNle2lmKCh0eXBlb2YgZy5yc2FwcnZwZW0hPVwidW5kZWZpbmVkXCIpJiYodHlwZW9mIGcucnNhcHJ2cGFzIT1cInVuZGVmaW5lZFwiKSl7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3MoZy5yc2FwcnZwZW0sZy5yc2FwcnZwYXMpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLl9pbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xVmVyc2lvbj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7b2JqOm5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjoyfSl9KTt0aGlzLmFzbjFTZXJpYWxOdW1iZXI9bnVsbDt0aGlzLmFzbjFTaWduYXR1cmVBbGc9bnVsbDt0aGlzLmFzbjFJc3N1ZXI9bnVsbDt0aGlzLmFzbjFOb3RCZWZvcmU9bnVsbDt0aGlzLmFzbjFOb3RBZnRlcj1udWxsO3RoaXMuYXNuMVN1YmplY3Q9bnVsbDt0aGlzLmFzbjFTdWJqUEtleT1udWxsO3RoaXMuZXh0ZW5zaW9uc0FycmF5PW5ldyBBcnJheSgpfTt0aGlzLnNldFNlcmlhbE51bWJlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU2VyaWFsTnVtYmVyPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihiKX07dGhpcy5zZXRTaWduYXR1cmVBbGdCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcihiKX07dGhpcy5zZXRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUlzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0Tm90QmVmb3JlQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFOb3RCZWZvcmU9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYil9O3RoaXMuc2V0Tm90QWZ0ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMU5vdEFmdGVyPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGIpfTt0aGlzLnNldFN1YmplY3RCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVN1YmplY3Q9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldFN1YmplY3RQdWJsaWNLZXlCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhiKX07dGhpcy5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXk9ZnVuY3Rpb24oYyl7dmFyIGI9S0VZVVRJTC5nZXRLZXkoYyk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKGIpfTt0aGlzLmFwcGVuZEV4dGVuc2lvbj1mdW5jdGlvbihiKXt0aGlzLmV4dGVuc2lvbnNBcnJheS5wdXNoKGIpfTt0aGlzLmFwcGVuZEV4dGVuc2lvbkJ5TmFtZT1mdW5jdGlvbihkLGIpe2lmKGQudG9Mb3dlckNhc2UoKT09XCJiYXNpY2NvbnN0cmFpbnRzXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImtleXVzYWdlXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5LZXlVc2FnZShiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJjcmxkaXN0cmlidXRpb25wb2ludHNcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cyhiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJleHRrZXl1c2FnZVwiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuRXh0S2V5VXNhZ2UoYik7dGhpcy5hcHBlbmRFeHRlbnNpb24oYyl9ZWxzZXtpZihkLnRvTG93ZXJDYXNlKCk9PVwiYXV0aG9yaXR5a2V5aWRlbnRpZmllclwiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllcihiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBleHRlbnNpb24gbmFtZTogXCIrZH19fX19fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmFzbjFOb3RCZWZvcmU9PW51bGx8fHRoaXMuYXNuMU5vdEFmdGVyPT1udWxsKXt0aHJvd1wibm90QmVmb3JlIGFuZC9vciBub3RBZnRlciBub3Qgc2V0XCJ9dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMU5vdEJlZm9yZSx0aGlzLmFzbjFOb3RBZnRlcl19KTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVZlcnNpb24pO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU2VyaWFsTnVtYmVyKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVNpZ25hdHVyZUFsZyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFJc3N1ZXIpO3RoaXMuYXNuMUFycmF5LnB1c2goYyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTdWJqZWN0KTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmpQS2V5KTtpZih0aGlzLmV4dGVuc2lvbnNBcnJheS5sZW5ndGg+MCl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5leHRlbnNpb25zQXJyYXl9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dHJ1ZSx0YWc6XCJhM1wiLG9iajpkfSk7dGhpcy5hc24xQXJyYXkucHVzaChiKX12YXIgZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2U7cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5faW5pdGlhbGl6ZSgpfTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5UQlNDZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkV4dGVuc2lvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDp0aGlzLm9pZH0pO3ZhciBlPW5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoe2hleDp0aGlzLmdldEV4dG5WYWx1ZUhleCgpfSk7dmFyIGQ9bmV3IEFycmF5KCk7ZC5wdXNoKGYpO2lmKHRoaXMuY3JpdGljYWwpe2QucHVzaChuZXcgS0pVUi5hc24xLkRFUkJvb2xlYW4oKSl9ZC5wdXNoKGUpO3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTtyZXR1cm4gYy5nZXRFbmNvZGVkSGV4KCl9O3RoaXMuY3JpdGljYWw9ZmFsc2U7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmNyaXRpY2FsIT1cInVuZGVmaW5lZFwiKXt0aGlzLmNyaXRpY2FsPWIuY3JpdGljYWx9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5LZXlVc2FnZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5LZXlVc2FnZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLm9pZD1cIjIuNS4yOS4xNVwiO2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5iaW4hPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyhhKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5LZXlVc2FnZSxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHM9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLng1MDkuQmFzaWNDb25zdHJhaW50cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjKTt2YXIgYT1mYWxzZTt2YXIgYj0tMTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBlPW5ldyBBcnJheSgpO2lmKHRoaXMuY0Epe2UucHVzaChuZXcgS0pVUi5hc24xLkRFUkJvb2xlYW4oKSl9aWYodGhpcy5wYXRoTGVuPi0xKXtlLnB1c2gobmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMucGF0aExlbn0pKX12YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5hc24xRXh0blZhbHVlPWQ7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjE5XCI7dGhpcy5jQT1mYWxzZTt0aGlzLnBhdGhMZW49LTE7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLmNBIT1cInVuZGVmaW5lZFwiKXt0aGlzLmNBPWMuY0F9aWYodHlwZW9mIGMucGF0aExlbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXRoTGVuPWMucGF0aExlbn19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLnNldEJ5RFBBcnJheT1mdW5jdGlvbihiKXt0aGlzLmFzbjFFeHRuVmFsdWU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Yn0pfTt0aGlzLnNldEJ5T25lVVJJPWZ1bmN0aW9uKGUpe3ZhciBiPW5ldyBLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMoW3t1cmk6ZX1dKTt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lKGIpO3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludCh7ZHBvYmo6ZH0pO3RoaXMuc2V0QnlEUEFycmF5KFtjXSl9O3RoaXMub2lkPVwiMi41LjI5LjMxXCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5RFBBcnJheShhLmFycmF5KX1lbHNle2lmKHR5cGVvZiBhLnVyaSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeU9uZVVSSShhLnVyaSl9fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cyxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuc2V0UHVycG9zZUFycmF5PWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKCk7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcihiW2NdKTt0aGlzLmFzbjFFeHRuVmFsdWUuYXBwZW5kQVNOMU9iamVjdChkKX19O3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjM3XCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFB1cnBvc2VBcnJheShhLmFycmF5KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5FeHRLZXlVc2FnZSxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmFzbjFLSUQ9bnVsbDt0aGlzLmFzbjFDZXJ0SXNzdWVyPW51bGw7dGhpcy5hc24xQ2VydFNOPW51bGw7dGhpcy5nZXRFeHRuVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYz1uZXcgQXJyYXkoKTtpZih0aGlzLmFzbjFLSUQpe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiODBcIixvYmo6dGhpcy5hc24xS0lEfSkpfWlmKHRoaXMuYXNuMUNlcnRJc3N1ZXIpe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiYTFcIixvYmo6dGhpcy5hc24xQ2VydElzc3Vlcn0pKX1pZih0aGlzLmFzbjFDZXJ0U04pe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiODJcIixvYmo6dGhpcy5hc24xQ2VydFNOfSkpfXZhciBiPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmN9KTt0aGlzLmFzbjFFeHRuVmFsdWU9YjtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5zZXRLSURCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUtJRD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKGIpfTt0aGlzLnNldENlcnRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUNlcnRJc3N1ZXI9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldENlcnRTTkJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xQ2VydFNOPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihiKX07dGhpcy5vaWQ9XCIyLjUuMjkuMzVcIjtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEua2lkIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEtJREJ5UGFyYW0oYS5raWQpfWlmKHR5cGVvZiBhLmlzc3VlciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0SXNzdWVyQnlQYXJhbShhLmlzc3Vlcil9aWYodHlwZW9mIGEuc24hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0Q2VydFNOQnlQYXJhbShhLnNuKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQ1JMPWZ1bmN0aW9uKGYpe0tKVVIuYXNuMS54NTA5LkNSTC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt2YXIgYz1udWxsO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt2YXIgZD1udWxsO3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzPWZ1bmN0aW9uKGgsail7dmFyIGc9UEtDUzVQS0VZLmdldERlY3J5cHRlZEtleUhleChoLGopO3ZhciBpPW5ldyBSU0FLZXkoKTtpLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoZyk7dGhpcy5yc2FQcnZLZXk9aX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnRMaXN0LmFzbjFTaWduYXR1cmVBbGc7c2lnPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpcIlNIQTF3aXRoUlNBXCIscHJvdjpcImNyeXB0b2pzL2pzcnNhXCJ9KTtzaWcuaW5pdFNpZ24odGhpcy5yc2FQcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xVEJTQ2VydExpc3QuZ2V0RW5jb2RlZEhleCgpKTt0aGlzLmhleFNpZz1zaWcuc2lnbigpO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBnPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0TGlzdCx0aGlzLmFzbjFTaWduYXR1cmVBbGcsdGhpcy5hc24xU2lnXX0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaXNNb2RpZmllZD09ZmFsc2UmJnRoaXMuaFRMViE9bnVsbCl7cmV0dXJuIHRoaXMuaFRMVn10aHJvd1wibm90IHNpZ25lZCB5ZXRcIn07dGhpcy5nZXRQRU1TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmdldEVuY29kZWRIZXgoKTt2YXIgZz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGkpO3ZhciBoPUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KGcpO3ZhciBqPWgucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7cmV0dXJuXCItLS0tLUJFR0lOIFg1MDkgQ1JMLS0tLS1cXHJcXG5cIitqK1wiXFxyXFxuLS0tLS1FTkQgWDUwOSBDUkwtLS0tLVxcclxcblwifTtpZih0eXBlb2YgZiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGYudGJzb2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFUQlNDZXJ0TGlzdD1mLnRic29ian1pZih0eXBlb2YgZi5yc2FwcnZrZXkhPVwidW5kZWZpbmVkXCIpe3RoaXMucnNhUHJ2S2V5PWYucnNhcHJ2a2V5fWlmKCh0eXBlb2YgZi5yc2FwcnZwZW0hPVwidW5kZWZpbmVkXCIpJiYodHlwZW9mIGYucnNhcHJ2cGFzIT1cInVuZGVmaW5lZFwiKSl7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3MoZi5yc2FwcnZwZW0sZi5yc2FwcnZwYXMpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3Q9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRTaWduYXR1cmVBbGdCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcihjKX07dGhpcy5zZXRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMUlzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYyl9O3RoaXMuc2V0VGhpc1VwZGF0ZUJ5UGFyYW09ZnVuY3Rpb24oYyl7dGhpcy5hc24xVGhpc1VwZGF0ZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShjKX07dGhpcy5zZXROZXh0VXBkYXRlQnlQYXJhbT1mdW5jdGlvbihjKXt0aGlzLmFzbjFOZXh0VXBkYXRlPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpfTt0aGlzLmFkZFJldm9rZWRDZXJ0PWZ1bmN0aW9uKGMsZCl7dmFyIGY9e307aWYoYyE9dW5kZWZpbmVkJiZjIT1udWxsKXtmLnNuPWN9aWYoZCE9dW5kZWZpbmVkJiZkIT1udWxsKXtmLnRpbWU9ZH12YXIgZT1uZXcgS0pVUi5hc24xLng1MDkuQ1JMRW50cnkoZik7dGhpcy5hUmV2b2tlZENlcnQucHVzaChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodGhpcy5hc24xVmVyc2lvbiE9bnVsbCl7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFWZXJzaW9uKX10aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVNpZ25hdHVyZUFsZyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFJc3N1ZXIpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xVGhpc1VwZGF0ZSk7aWYodGhpcy5hc24xTmV4dFVwZGF0ZSE9bnVsbCl7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFOZXh0VXBkYXRlKX1pZih0aGlzLmFSZXZva2VkQ2VydC5sZW5ndGg+MCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hUmV2b2tlZENlcnR9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGMpfXZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5hc24xVmVyc2lvbj1udWxsO3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1udWxsO3RoaXMuYXNuMUlzc3Vlcj1udWxsO3RoaXMuYXNuMVRoaXNVcGRhdGU9bnVsbDt0aGlzLmFzbjFOZXh0VXBkYXRlPW51bGw7dGhpcy5hUmV2b2tlZENlcnQ9bmV3IEFycmF5KCl9O3RoaXMuX2luaXRpYWxpemUoKX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3QsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkNSTEVudHJ5PWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS54NTA5LkNSTEVudHJ5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBhPW51bGw7dGhpcy5zZXRDZXJ0U2VyaWFsPWZ1bmN0aW9uKGQpe3RoaXMuc249bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGQpfTt0aGlzLnNldFJldm9jYXRpb25EYXRlPWZ1bmN0aW9uKGQpe3RoaXMudGltZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShkKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuc24sdGhpcy50aW1lXX0pO3RoaXMuVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLlRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnRpbWUhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0UmV2b2NhdGlvbkRhdGUoYy50aW1lKX1pZih0eXBlb2YgYy5zbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0U2VyaWFsKGMuc24pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTEVudHJ5LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5YNTAwTmFtZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5YNTAwTmFtZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5zZXRCeVN0cmluZz1mdW5jdGlvbihjKXt2YXIgZD1jLnNwbGl0KFwiL1wiKTtkLnNoaWZ0KCk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3RoaXMuYXNuMUFycmF5LnB1c2gobmV3IEtKVVIuYXNuMS54NTA5LlJETih7c3RyOmRbZV19KSl9fTt0aGlzLnNldEJ5T2JqZWN0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgYyBpbiBlKXtpZihlLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuUkROKHtzdHI6YytcIj1cIitlW2NdfSk7dGhpcy5hc24xQXJyYXk/dGhpcy5hc24xQXJyYXkucHVzaChkKTp0aGlzLmFzbjFBcnJheT1bZF19fX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFRMVj09XCJzdHJpbmdcIil7cmV0dXJuIHRoaXMuaFRMVn12YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5U3RyaW5nKGIuc3RyKX1lbHNle2lmKHR5cGVvZiBiPT09XCJvYmplY3RcIil7dGhpcy5zZXRCeU9iamVjdChiKX19aWYodHlwZW9mIGIuY2VydGlzc3VlciE9XCJ1bmRlZmluZWRcIil7dmFyIGE9bmV3IFg1MDkoKTthLmhleD1YNTA5LnBlbVRvSGV4KGIuY2VydGlzc3Vlcik7dGhpcy5oVExWPWEuZ2V0SXNzdWVySGV4KCl9aWYodHlwZW9mIGIuY2VydHN1YmplY3QhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBYNTA5KCk7YS5oZXg9WDUwOS5wZW1Ub0hleChiLmNlcnRzdWJqZWN0KTt0aGlzLmhUTFY9YS5nZXRTdWJqZWN0SGV4KCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuWDUwME5hbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlJETj1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5SRE4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYWRkQnlTdHJpbmc9ZnVuY3Rpb24oYil7dGhpcy5hc24xQXJyYXkucHVzaChuZXcgS0pVUi5hc24xLng1MDkuQXR0cmlidXRlVHlwZUFuZFZhbHVlKHtzdHI6Yn0pKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJTZXQoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5UTFY9Yi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuVExWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFkZEJ5U3RyaW5nKGEuc3RyKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5SRE4sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBkPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1cInV0ZjhcIjt0aGlzLnNldEJ5U3RyaW5nPWZ1bmN0aW9uKGUpe2lmKGUubWF0Y2goL14oW149XSspPSguKykkLykpe3RoaXMuc2V0QnlBdHRyVHlwZUFuZFZhbHVlU3RyKFJlZ0V4cC4kMSxSZWdFeHAuJDIpfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCBhdHRyVHlwZUFuZFZhbHVlU3RyOiBcIitlfX07dGhpcy5zZXRCeUF0dHJUeXBlQW5kVmFsdWVTdHI9ZnVuY3Rpb24oZyxmKXt0aGlzLnR5cGVPYmo9S0pVUi5hc24xLng1MDkuT0lELmF0eXBlMm9iaihnKTt2YXIgZT1hO2lmKGc9PVwiQ1wiKXtlPVwicHJuXCJ9dGhpcy52YWx1ZU9iaj10aGlzLmdldFZhbHVlT2JqKGUsZil9O3RoaXMuZ2V0VmFsdWVPYmo9ZnVuY3Rpb24oZixlKXtpZihmPT1cInV0ZjhcIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSVVRGOFN0cmluZyh7c3RyOmV9KX1pZihmPT1cInByblwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmcoe3N0cjplfSl9aWYoZj09XCJ0ZWxcIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZyh7c3RyOmV9KX1pZihmPT1cImlhNVwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjplfSl9dGhyb3dcInVuc3VwcG9ydGVkIGRpcmVjdG9yeSBzdHJpbmcgdHlwZTogdHlwZT1cIitmK1wiIHZhbHVlPVwiK2V9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLnR5cGVPYmosdGhpcy52YWx1ZU9ial19KTt0aGlzLlRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5zdHIhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlTdHJpbmcoYi5zdHIpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm89ZnVuY3Rpb24oZCl7S0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3RoaXMuc2V0UlNBS2V5PWZ1bmN0aW9uKGUpe2lmKCFSU0FLZXkucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZSkpe3Rocm93XCJhcmd1bWVudCBpcyBub3QgUlNBS2V5IGluc3RhbmNlXCJ9dGhpcy5yc2FLZXk9ZTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDplLm59KTt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6ZS5lfSk7dmFyIGk9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2csZl19KTt2YXIgaD1pLmdldEVuY29kZWRIZXgoKTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcInJzYUVuY3J5cHRpb25cIn0pO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK2h9KX07dGhpcy5zZXRSU0FQRU09ZnVuY3Rpb24oZyl7aWYoZy5tYXRjaCgvLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0vKSl7dmFyIG49ZztuPW4ucmVwbGFjZSgvXi0tLS0tW14tXSstLS0tLS8sXCJcIik7bj1uLnJlcGxhY2UoLy0tLS0tW14tXSstLS0tLVxccyokLyxcIlwiKTt2YXIgbT1uLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgZj1DcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKG0pO3ZhciBpPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KGYpO3ZhciBrPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGkpO3ZhciBoPWtbMV07dmFyIGw9aC5zdWJzdHIoMik7dmFyIGU9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgobCk7dmFyIGo9bmV3IFJTQUtleSgpO2ouc2V0UHVibGljKGVbMF0sZVsxXSk7dGhpcy5zZXRSU0FLZXkoail9ZWxzZXt0aHJvd1wia2V5IG5vdCBzdXBwb3J0ZWRcIn19O3RoaXMuZ2V0QVNOMU9iamVjdD1mdW5jdGlvbigpe2lmKHRoaXMuYXNuMUFsZ0lkPT1udWxsfHx0aGlzLmFzbjFTdWJqUEtleT09bnVsbCl7dGhyb3dcImFsZ0lkIGFuZC9vciBzdWJqUHViS2V5IG5vdCBzZXRcIn12YXIgZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xQWxnSWQsdGhpcy5hc24xU3VialBLZXldfSk7cmV0dXJuIGV9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QVNOMU9iamVjdCgpO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9zZXRSU0FLZXk9ZnVuY3Rpb24oZSl7dmFyIGc9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjp7YmlnaW50OmUubn19LHtcImludFwiOntcImludFwiOmUuZX19XX0pO3ZhciBmPWcuZ2V0RW5jb2RlZEhleCgpO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwicnNhRW5jcnlwdGlvblwifSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZn0pfTt0aGlzLl9zZXRFQz1mdW5jdGlvbihlKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe25hbWU6ZS5jdXJ2ZU5hbWV9KTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcImVjUHVibGljS2V5XCIsYXNuMXBhcmFtczpmfSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZS5wdWJLZXlIZXh9KX07dGhpcy5fc2V0RFNBPWZ1bmN0aW9uKGUpe3ZhciBmPW5ldyBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOntiaWdpbnQ6ZS5wfX0se1wiaW50XCI6e2JpZ2ludDplLnF9fSx7XCJpbnRcIjp7YmlnaW50OmUuZ319XX0pO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwiZHNhXCIsYXNuMXBhcmFtczpmfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6ZS55fSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZy5nZXRFbmNvZGVkSGV4KCl9KX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmQgaW5zdGFuY2VvZiBSU0FLZXkpe3RoaXMuX3NldFJTQUtleShkKX1lbHNle2lmKHR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmZCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXt0aGlzLl9zZXRFQyhkKX1lbHNle2lmKHR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3RoaXMuX3NldERTQShkKX1lbHNle2lmKHR5cGVvZiBkLnJzYWtleSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRSU0FLZXkoZC5yc2FrZXkpfWVsc2V7aWYodHlwZW9mIGQucnNhcGVtIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFJTQVBFTShkLnJzYXBlbSl9fX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5UaW1lPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS54NTA5LlRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLnNldFRpbWVQYXJhbXM9ZnVuY3Rpb24oZCl7dGhpcy50aW1lUGFyYW1zPWR9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBkPW51bGw7aWYodGhpcy50aW1lUGFyYW1zIT1udWxsKXtpZih0aGlzLnR5cGU9PVwidXRjXCIpe2Q9bmV3IEtKVVIuYXNuMS5ERVJVVENUaW1lKHRoaXMudGltZVBhcmFtcyl9ZWxzZXtkPW5ldyBLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lKHRoaXMudGltZVBhcmFtcyl9fWVsc2V7aWYodGhpcy50eXBlPT1cInV0Y1wiKXtkPW5ldyBLSlVSLmFzbjEuREVSVVRDVGltZSgpfWVsc2V7ZD1uZXcgS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZSgpfX10aGlzLlRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O3RoaXMudHlwZT1cInV0Y1wiO2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy50eXBlIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9Yy50eXBlfWVsc2V7aWYodHlwZW9mIGMuc3RyIT1cInVuZGVmaW5lZFwiKXtpZihjLnN0ci5tYXRjaCgvXlswLTldezEyfVokLykpe3RoaXMudHlwZT1cInV0Y1wifWlmKGMuc3RyLm1hdGNoKC9eWzAtOV17MTR9WiQvKSl7dGhpcy50eXBlPVwiZ2VuXCJ9fX10aGlzLnRpbWVQYXJhbXM9Y319O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlRpbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXI9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt2YXIgZD1udWxsO3ZhciBiPW51bGw7dmFyIGM9ZmFsc2U7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5uYW1lQWxnPT1udWxsJiZ0aGlzLmFzbjFBbGc9PW51bGwpe3Rocm93XCJhbGdvcml0aG0gbm90IHNwZWNpZmllZFwifWlmKHRoaXMubmFtZUFsZyE9bnVsbCYmdGhpcy5hc24xQWxnPT1udWxsKXt0aGlzLmFzbjFBbGc9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2JqKHRoaXMubmFtZUFsZyl9dmFyIGY9W3RoaXMuYXNuMUFsZ107aWYoIXRoaXMucGFyYW1FbXB0eSl7Zi5wdXNoKHRoaXMuYXNuMVBhcmFtcyl9dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Zn0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUubmFtZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5uYW1lQWxnPWUubmFtZX1pZih0eXBlb2YgZS5hc24xcGFyYW1zIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFQYXJhbXM9ZS5hc24xcGFyYW1zfWlmKHR5cGVvZiBlLnBhcmFtZW1wdHkhPVwidW5kZWZpbmVkXCIpe3RoaXMucGFyYW1FbXB0eT1lLnBhcmFtZW1wdHl9fWlmKHRoaXMuYXNuMVBhcmFtcz09bnVsbCl7dGhpcy5hc24xUGFyYW1zPW5ldyBLSlVSLmFzbjEuREVSTnVsbCgpfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWU9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBjPW51bGw7dmFyIGI9bnVsbDt2YXIgYT17cmZjODIyOlwiODFcIixkbnM6XCI4MlwiLGRuOlwiYTRcIix1cmk6XCI4NlwifTt0aGlzLmV4cGxpY2l0PWZhbHNlO3RoaXMuc2V0QnlQYXJhbT1mdW5jdGlvbihrKXt2YXIgaj1udWxsO3ZhciBnPW51bGw7aWYodHlwZW9mIGs9PVwidW5kZWZpbmVkXCIpe3JldHVybn1pZih0eXBlb2Ygay5yZmM4MjIhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cInJmYzgyMlwiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay5kbnMhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cImRuc1wiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay51cmkhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cInVyaVwiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay5jZXJ0aXNzdWVyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9XCJkblwiO3RoaXMuZXhwbGljaXQ9dHJ1ZTt2YXIgaD1rLmNlcnRpc3N1ZXI7dmFyIGY9bnVsbDtpZihoLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXtmPT1ofWlmKGguaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7Zj1YNTA5LnBlbVRvSGV4KGgpfWlmKGY9PW51bGwpe3Rocm93XCJjZXJ0aXNzdWVyIHBhcmFtIG5vdCBjZXJ0XCJ9dmFyIGU9bmV3IFg1MDkoKTtlLmhleD1mO3ZhciBpPWUuZ2V0SXNzdWVySGV4KCk7Zz1uZXcgS0pVUi5hc24xLkFTTjFPYmplY3QoKTtnLmhUTFY9aX1pZih0eXBlb2Ygay5jZXJ0c3ViaiE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwiZG5cIjt0aGlzLmV4cGxpY2l0PXRydWU7dmFyIGg9ay5jZXJ0c3Viajt2YXIgZj1udWxsO2lmKGgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe2Y9PWh9aWYoaC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXtmPVg1MDkucGVtVG9IZXgoaCl9aWYoZj09bnVsbCl7dGhyb3dcImNlcnRzdWJqIHBhcmFtIG5vdCBjZXJ0XCJ9dmFyIGU9bmV3IFg1MDkoKTtlLmhleD1mO3ZhciBpPWUuZ2V0U3ViamVjdEhleCgpO2c9bmV3IEtKVVIuYXNuMS5BU04xT2JqZWN0KCk7Zy5oVExWPWl9aWYodGhpcy50eXBlPT1udWxsKXt0aHJvd1widW5zdXBwb3J0ZWQgdHlwZSBpbiBwYXJhbXM9XCIra310aGlzLmFzbjFPYmo9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OnRoaXMuZXhwbGljaXQsdGFnOmFbdGhpcy50eXBlXSxvYmo6Z30pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc24xT2JqLmdldEVuY29kZWRIZXgoKX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlQYXJhbShkKX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXM9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWVzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3RoaXMuc2V0QnlQYXJhbUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgYz0wO2M8ZS5sZW5ndGg7YysrKXt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUoZVtjXSk7dGhpcy5hc24xQXJyYXkucHVzaChkKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7cmV0dXJuIGMuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeVBhcmFtQXJyYXkoYil9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBlPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBkPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy50eXBlIT1cImZ1bGxcIil7dGhyb3dcImN1cnJlbnRseSB0eXBlIHNoYWxsIGJlICdmdWxsJzogXCIrdGhpcy50eXBlfXRoaXMuYXNuMU9iaj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOnRoaXMudGFnLG9iajp0aGlzLmFzbjFWfSk7dGhpcy5oVExWPXRoaXMuYXNuMU9iai5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihiKSl7dGhpcy50eXBlPVwiZnVsbFwiO3RoaXMudGFnPVwiYTBcIjt0aGlzLmFzbjFWPWJ9ZWxzZXt0aHJvd1wiVGhpcyBjbGFzcyBzdXBwb3J0cyBHZW5lcmFsTmFtZXMgb25seSBhcyBhcmd1bWVudFwifX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSgpO2lmKHRoaXMuYXNuMURQIT1udWxsKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dHJ1ZSx0YWc6XCJhMFwiLG9iajp0aGlzLmFzbjFEUH0pO2MuYXBwZW5kQVNOMU9iamVjdChkKX10aGlzLmhUTFY9Yy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmRwb2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFEUD1iLmRwb2JqfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5PSUQ9bmV3IGZ1bmN0aW9uKGEpe3RoaXMuYXR5cGUyb2lkTGlzdD17QzpcIjIuNS40LjZcIixPOlwiMi41LjQuMTBcIixPVTpcIjIuNS40LjExXCIsU1Q6XCIyLjUuNC44XCIsTDpcIjIuNS40LjdcIixDTjpcIjIuNS40LjNcIixTTjpcIjIuNS40LjRcIixETjpcIjIuNS40LjQ5XCIsREM6XCIwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4yNVwiLH07dGhpcy5uYW1lMm9pZExpc3Q9e3NoYTE6XCIxLjMuMTQuMy4yLjI2XCIsc2hhMjU2OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuMVwiLHNoYTM4NDpcIjIuMTYuODQwLjEuMTAxLjMuNC4yLjJcIixzaGE1MTI6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4zXCIsc2hhMjI0OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuNFwiLG1kNTpcIjEuMi44NDAuMTEzNTQ5LjIuNVwiLG1kMjpcIjEuMy4xNC43LjIuMi4xXCIscmlwZW1kMTYwOlwiMS4zLjM2LjMuMi4xXCIsTUQyd2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4yXCIsTUQ0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4zXCIsTUQ1d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS40XCIsU0hBMXdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuNVwiLFNIQTIyNHdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTRcIixTSEEyNTZ3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjExXCIsU0hBMzg0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xMlwiLFNIQTUxMndpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTNcIixTSEExd2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjFcIixTSEEyMjR3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy4xXCIsU0hBMjU2d2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjMuMlwiLFNIQTM4NHdpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4zLjNcIixTSEE1MTJ3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy40XCIsZHNhOlwiMS4yLjg0MC4xMDA0MC40LjFcIixTSEExd2l0aERTQTpcIjEuMi44NDAuMTAwNDAuNC4zXCIsU0hBMjI0d2l0aERTQTpcIjIuMTYuODQwLjEuMTAxLjMuNC4zLjFcIixTSEEyNTZ3aXRoRFNBOlwiMi4xNi44NDAuMS4xMDEuMy40LjMuMlwiLHJzYUVuY3J5cHRpb246XCIxLjIuODQwLjExMzU0OS4xLjEuMVwiLGNvdW50cnlOYW1lOlwiMi41LjQuNlwiLG9yZ2FuaXphdGlvbjpcIjIuNS40LjEwXCIsb3JnYW5pemF0aW9uYWxVbml0OlwiMi41LjQuMTFcIixzdGF0ZU9yUHJvdmluY2VOYW1lOlwiMi41LjQuOFwiLGxvY2FsaXR5OlwiMi41LjQuN1wiLGNvbW1vbk5hbWU6XCIyLjUuNC4zXCIsc3ViamVjdEtleUlkZW50aWZpZXI6XCIyLjUuMjkuMTRcIixrZXlVc2FnZTpcIjIuNS4yOS4xNVwiLHN1YmplY3RBbHROYW1lOlwiMi41LjI5LjE3XCIsYmFzaWNDb25zdHJhaW50czpcIjIuNS4yOS4xOVwiLG5hbWVDb25zdHJhaW50czpcIjIuNS4yOS4zMFwiLGNSTERpc3RyaWJ1dGlvblBvaW50czpcIjIuNS4yOS4zMVwiLGNlcnRpZmljYXRlUG9saWNpZXM6XCIyLjUuMjkuMzJcIixhdXRob3JpdHlLZXlJZGVudGlmaWVyOlwiMi41LjI5LjM1XCIscG9saWN5Q29uc3RyYWludHM6XCIyLjUuMjkuMzZcIixleHRLZXlVc2FnZTpcIjIuNS4yOS4zN1wiLGF1dGhvcml0eUluZm9BY2Nlc3M6XCIxLjMuNi4xLjUuNS43LjEuMVwiLGFueUV4dGVuZGVkS2V5VXNhZ2U6XCIyLjUuMjkuMzcuMFwiLHNlcnZlckF1dGg6XCIxLjMuNi4xLjUuNS43LjMuMVwiLGNsaWVudEF1dGg6XCIxLjMuNi4xLjUuNS43LjMuMlwiLGNvZGVTaWduaW5nOlwiMS4zLjYuMS41LjUuNy4zLjNcIixlbWFpbFByb3RlY3Rpb246XCIxLjMuNi4xLjUuNS43LjMuNFwiLHRpbWVTdGFtcGluZzpcIjEuMy42LjEuNS41LjcuMy44XCIsb2NzcFNpZ25pbmc6XCIxLjMuNi4xLjUuNS43LjMuOVwiLGVjUHVibGljS2V5OlwiMS4yLjg0MC4xMDA0NS4yLjFcIixzZWNwMjU2cjE6XCIxLjIuODQwLjEwMDQ1LjMuMS43XCIsc2VjcDI1NmsxOlwiMS4zLjEzMi4wLjEwXCIsc2VjcDM4NHIxOlwiMS4zLjEzMi4wLjM0XCIscGtjczVQQkVTMjpcIjEuMi44NDAuMTEzNTQ5LjEuNS4xM1wiLHBrY3M1UEJLREYyOlwiMS4yLjg0MC4xMTM1NDkuMS41LjEyXCIsXCJkZXMtRURFMy1DQkNcIjpcIjEuMi44NDAuMTEzNTQ5LjMuN1wiLGRhdGE6XCIxLjIuODQwLjExMzU0OS4xLjcuMVwiLFwic2lnbmVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy4yXCIsXCJlbnZlbG9wZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjNcIixcImRpZ2VzdGVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy41XCIsXCJlbmNyeXB0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjZcIixcImF1dGhlbnRpY2F0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjEuMlwiLHRzdGluZm86XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMS40XCIsfTt0aGlzLm9iakNhY2hlPXt9O3RoaXMubmFtZTJvYmo9ZnVuY3Rpb24oYil7aWYodHlwZW9mIHRoaXMub2JqQ2FjaGVbYl0hPVwidW5kZWZpbmVkXCIpe3JldHVybiB0aGlzLm9iakNhY2hlW2JdfWlmKHR5cGVvZiB0aGlzLm5hbWUyb2lkTGlzdFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIk5hbWUgb2YgT2JqZWN0SWRlbnRpZmllciBub3QgZGVmaW5lZDogXCIrYn12YXIgYz10aGlzLm5hbWUyb2lkTGlzdFtiXTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDpjfSk7dGhpcy5vYmpDYWNoZVtiXT1kO3JldHVybiBkfTt0aGlzLmF0eXBlMm9iaj1mdW5jdGlvbihiKXtpZih0eXBlb2YgdGhpcy5vYmpDYWNoZVtiXSE9XCJ1bmRlZmluZWRcIil7cmV0dXJuIHRoaXMub2JqQ2FjaGVbYl19aWYodHlwZW9mIHRoaXMuYXR5cGUyb2lkTGlzdFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIkF0dHJpYnV0ZVR5cGUgbmFtZSB1bmRlZmluZWQ6IFwiK2J9dmFyIGM9dGhpcy5hdHlwZTJvaWRMaXN0W2JdO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmN9KTt0aGlzLm9iakNhY2hlW2JdPWQ7cmV0dXJuIGR9fTtLSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWU9ZnVuY3Rpb24oYil7dmFyIGM9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdDtmb3IodmFyIGEgaW4gYyl7aWYoY1thXT09Yil7cmV0dXJuIGF9fXJldHVyblwiXCJ9O0tKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZD1mdW5jdGlvbihhKXt2YXIgYj1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0O2lmKGJbYV09PT11bmRlZmluZWQpe3JldHVyblwiXCJ9cmV0dXJuIGJbYV19O0tKVVIuYXNuMS54NTA5Llg1MDlVdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuZ2V0UEtDUzhQdWJLZXlQRU1mcm9tUlNBS2V5PWZ1bmN0aW9uKGkpe3ZhciBoPW51bGw7dmFyIGY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGkubik7dmFyIGo9S0pVUi5hc24xLkFTTjFVdGlsLmludGVnZXJUb0J5dGVIZXgoaS5lKTt2YXIgYT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2hleDpmfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtoZXg6an0pO3ZhciBsPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OlthLGddfSk7dmFyIGM9bC5nZXRFbmNvZGVkSGV4KCk7dmFyIGQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJyc2FFbmNyeXB0aW9uXCJ9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitjfSk7dmFyIGs9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2QsYl19KTt2YXIgZT1rLmdldEVuY29kZWRIZXgoKTt2YXIgaD1LSlVSLmFzbjEuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChlLFwiUFVCTElDIEtFWVwiKTtyZXR1cm4gaH19O0tKVVIuYXNuMS54NTA5Llg1MDlVdGlsLm5ld0NlcnRQRU09ZnVuY3Rpb24oZil7dmFyIGM9S0pVUi5hc24xLng1MDk7dmFyIGU9bmV3IGMuVEJTQ2VydGlmaWNhdGUoKTtpZihmLnNlcmlhbCE9PXVuZGVmaW5lZCl7ZS5zZXRTZXJpYWxOdW1iZXJCeVBhcmFtKGYuc2VyaWFsKX1lbHNle3Rocm93XCJzZXJpYWwgbnVtYmVyIHVuZGVmaW5lZC5cIn1pZih0eXBlb2YgZi5zaWdhbGcubmFtZT09XCJzdHJpbmdcIil7ZS5zZXRTaWduYXR1cmVBbGdCeVBhcmFtKGYuc2lnYWxnKX1lbHNle3Rocm93XCJ1bnByb3BlciBzaWduYXR1cmUgYWxnb3JpdGhtIG5hbWVcIn1pZihmLmlzc3VlciE9PXVuZGVmaW5lZCl7ZS5zZXRJc3N1ZXJCeVBhcmFtKGYuaXNzdWVyKX1lbHNle3Rocm93XCJpc3N1ZXIgbmFtZSB1bmRlZmluZWQuXCJ9aWYoZi5ub3RiZWZvcmUhPT11bmRlZmluZWQpe2Uuc2V0Tm90QmVmb3JlQnlQYXJhbShmLm5vdGJlZm9yZSl9ZWxzZXt0aHJvd1wibm90YmVmb3JlIHVuZGVmaW5lZC5cIn1pZihmLm5vdGFmdGVyIT09dW5kZWZpbmVkKXtlLnNldE5vdEFmdGVyQnlQYXJhbShmLm5vdGFmdGVyKX1lbHNle3Rocm93XCJub3RhZnRlciB1bmRlZmluZWQuXCJ9aWYoZi5zdWJqZWN0IT09dW5kZWZpbmVkKXtlLnNldFN1YmplY3RCeVBhcmFtKGYuc3ViamVjdCl9ZWxzZXt0aHJvd1wic3ViamVjdCBuYW1lIHVuZGVmaW5lZC5cIn1pZihmLnNianB1YmtleSE9PXVuZGVmaW5lZCl7ZS5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXkoZi5zYmpwdWJrZXkpfWVsc2V7dGhyb3dcInN1YmplY3QgcHVibGljIGtleSB1bmRlZmluZWQuXCJ9aWYoZi5leHQhPT11bmRlZmluZWQmJmYuZXh0Lmxlbmd0aCE9PXVuZGVmaW5lZCl7Zm9yKHZhciBiPTA7YjxmLmV4dC5sZW5ndGg7YisrKXtmb3Ioa2V5IGluIGYuZXh0W2JdKXtlLmFwcGVuZEV4dGVuc2lvbkJ5TmFtZShrZXksZi5leHRbYl1ba2V5XSl9fX1pZihmLmNha2V5PT09dW5kZWZpbmVkJiZmLnNpZ2hleD09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtIGNha2V5IGFuZCBzaWdoZXggdW5kZWZpbmVkLlwifXZhciBkPW51bGw7dmFyIGE9bnVsbDtpZihmLmNha2V5KXtkPUtFWVVUSUwuZ2V0S2V5LmFwcGx5KG51bGwsZi5jYWtleSk7YT1uZXcgYy5DZXJ0aWZpY2F0ZSh7dGJzY2VydG9iajplLHBydmtleW9iajpkfSk7YS5zaWduKCl9aWYoZi5zaWdoZXgpe2E9bmV3IGMuQ2VydGlmaWNhdGUoe3Ric2NlcnRvYmo6ZX0pO2Euc2V0U2lnbmF0dXJlSGV4KGYuc2lnaGV4KX1yZXR1cm4gYS5nZXRQRU1TdHJpbmcoKX07XG4vKiEgYXNuMWNtcy0xLjAuMi5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS5jbXM9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEuY21zKXtLSlVSLmFzbjEuY21zPXt9fUtKVVIuYXNuMS5jbXMuQXR0cmlidXRlPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1bXTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZixlLGM7Zj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDp0aGlzLmF0dHJUeXBlT2lkfSk7ZT1uZXcgS0pVUi5hc24xLkRFUlNldCh7YXJyYXk6dGhpcy52YWx1ZUxpc3R9KTt0cnl7ZS5nZXRFbmNvZGVkSGV4KCl9Y2F0Y2goZCl7dGhyb3dcImZhaWwgdmFsdWVTZXQuZ2V0RW5jb2RlZEhleCBpbiBBdHRyaWJ1dGUoMSkvXCIrZH1jPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltmLGVdfSk7dHJ5e3RoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKX1jYXRjaChkKXt0aHJvd1wiZmFpbGVkIHNlcS5nZXRFbmNvZGVkSGV4IGluIEF0dHJpYnV0ZSgyKS9cIitkfXJldHVybiB0aGlzLmhUTFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5Db250ZW50VHlwZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEuY21zLkNvbnRlbnRUeXBlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjNcIjt2YXIgYT1udWxsO2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXt2YXIgYT1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoYik7dGhpcy52YWx1ZUxpc3Q9W2FdfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Db250ZW50VHlwZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5NZXNzYWdlRGlnZXN0PWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jbXMuTWVzc2FnZURpZ2VzdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS40XCI7aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKGUuZWNpT2JqIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbyYmdHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7dmFyIGI9ZS5lY2lPYmouZUNvbnRlbnRWYWx1ZUhleDt2YXIgYT1lLmhhc2hBbGc7dmFyIGM9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGIsYSk7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyh7aGV4OmN9KTtkLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bZF19ZWxzZXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKGUpO2QuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtkXX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLk1lc3NhZ2VEaWdlc3QsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuU2lnbmluZ1RpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5TaWduaW5nVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS41XCI7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpO3RyeXthLmdldEVuY29kZWRIZXgoKX1jYXRjaChiKXt0aHJvd1wiU2lnbmluZ1RpbWUuZ2V0RW5jb2RlZEhleCgpIGZhaWxlZC9cIitifXRoaXMudmFsdWVMaXN0PVthXX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ1RpbWUsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTJcIjt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLmNtczt2YXIgYj1LSlVSLmNyeXB0bzt0aGlzLnNldENlcnRzPWZ1bmN0aW9uKGwpe3ZhciBqPVtdO2Zvcih2YXIgaD0wO2g8bC5sZW5ndGg7aCsrKXt2YXIgZj1LRVlVVElMLmdldEhleEZyb21QRU0obFtoXSk7dmFyIGU9Yi5VdGlsLmhhc2hIZXgoZixcInNoYTFcIik7dmFyIG09bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDplfSk7bS5nZXRFbmNvZGVkSGV4KCk7dmFyIGs9bmV3IGMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyKHtjZXJ0OmxbaF19KTtrLmdldEVuY29kZWRIZXgoKTt2YXIgbj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6W20sa119KTtuLmdldEVuY29kZWRIZXgoKTtqLnB1c2gobil9dmFyIGc9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Omp9KTtnLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bZ119O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZC5hcnJheT09XCJvYmplY3RcIil7dGhpcy5zZXRDZXJ0cyhkLmFycmF5KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGVWMj1mdW5jdGlvbihlKXtLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZVYyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuNDdcIjt2YXIgYj1LSlVSLmFzbjE7dmFyIGY9S0pVUi5hc24xLng1MDk7dmFyIGQ9S0pVUi5hc24xLmNtczt2YXIgYz1LSlVSLmNyeXB0bzt0aGlzLnNldENlcnRzPWZ1bmN0aW9uKHAsaCl7dmFyIG49W107Zm9yKHZhciBsPTA7bDxwLmxlbmd0aDtsKyspe3ZhciBqPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShwW2xdKTt2YXIgcj1bXTtpZihoIT1cInNoYTI1NlwiKXtyLnB1c2gobmV3IGYuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpofSkpfXZhciBnPWMuVXRpbC5oYXNoSGV4KGosaCk7dmFyIHE9bmV3IGIuREVST2N0ZXRTdHJpbmcoe2hleDpnfSk7cS5nZXRFbmNvZGVkSGV4KCk7ci5wdXNoKHEpO3ZhciBtPW5ldyBkLklzc3VlckFuZFNlcmlhbE51bWJlcih7Y2VydDpwW2xdfSk7bS5nZXRFbmNvZGVkSGV4KCk7ci5wdXNoKG0pO3ZhciBvPW5ldyBiLkRFUlNlcXVlbmNlKHthcnJheTpyfSk7by5nZXRFbmNvZGVkSGV4KCk7bi5wdXNoKG8pfXZhciBrPW5ldyBiLkRFUlNlcXVlbmNlKHthcnJheTpufSk7ay5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2tdfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUuYXJyYXk9PVwib2JqZWN0XCIpe3ZhciBhPVwic2hhMjU2XCI7aWYodHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7YT1lLmhhc2hBbGd9dGhpcy5zZXRDZXJ0cyhlLmFycmF5LGEpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlVjIsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgZT1udWxsO3ZhciBiPW51bGw7dmFyIGE9S0pVUi5hc24xO3ZhciBkPWEueDUwOTt0aGlzLnNldEJ5Q2VydFBFTT1mdW5jdGlvbihpKXt2YXIgZz1LRVlVVElMLmdldEhleEZyb21QRU0oaSk7dmFyIGY9bmV3IFg1MDkoKTtmLmhleD1nO3ZhciBqPWYuZ2V0SXNzdWVySGV4KCk7dGhpcy5kSXNzdWVyPW5ldyBkLlg1MDBOYW1lKCk7dGhpcy5kSXNzdWVyLmhUTFY9ajt2YXIgaD1mLmdldFNlcmlhbE51bWJlckhleCgpO3RoaXMuZFNlcmlhbD1uZXcgYS5ERVJJbnRlZ2VyKHtoZXg6aH0pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kSXNzdWVyLHRoaXMuZFNlcmlhbF19KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiJiZjLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe3RoaXMuc2V0QnlDZXJ0UEVNKGMpfWlmKGMuaXNzdWVyJiZjLnNlcmlhbCl7aWYoYy5pc3N1ZXIgaW5zdGFuY2VvZiBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZSl7dGhpcy5kSXNzdWVyPWMuaXNzdWVyfWVsc2V7dGhpcy5kSXNzdWVyPW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShjLmlzc3Vlcil9aWYoYy5zZXJpYWwgaW5zdGFuY2VvZiBLSlVSLmFzbjEuREVSSW50ZWdlcil7dGhpcy5kU2VyaWFsPWMuc2VyaWFsfWVsc2V7dGhpcy5kU2VyaWFsPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihjLnNlcmlhbCl9fWlmKHR5cGVvZiBjLmNlcnQ9PVwic3RyaW5nXCIpe3RoaXMuc2V0QnlDZXJ0UEVNKGMuY2VydCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZUxpc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMubGlzdD1uZXcgQXJyYXkoKTt0aGlzLnNvcnRGbGFnPXRydWU7dGhpcy5hZGQ9ZnVuY3Rpb24oYil7aWYoYiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKXt0aGlzLmxpc3QucHVzaChiKX19O3RoaXMubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGlzdC5sZW5ndGh9O3RoaXMuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmxpc3Q9bmV3IEFycmF5KCk7dGhpcy5oVExWPW51bGw7dGhpcy5oVj1udWxsfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBiPW5ldyBLSlVSLmFzbjEuREVSU2V0KHthcnJheTp0aGlzLmxpc3Qsc29ydGZsYWc6dGhpcy5zb3J0RmxhZ30pO3RoaXMuaFRMVj1iLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc29ydGZsYWchPVwidW5kZWZpbmVkXCImJmEuc29ydGZsYWc9PWZhbHNlKXt0aGlzLnNvcnRGbGFnPWZhbHNlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5TaWduZXJJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuU2lnbmVySW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jbXM7dmFyIGQ9S0pVUi5hc24xLng1MDk7dGhpcy5kQ01TVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRTaWduZXJJZGVudGlmaWVyPW51bGw7dGhpcy5kRGlnZXN0QWxnb3JpdGhtPW51bGw7dGhpcy5kU2lnbmVkQXR0cnM9bmV3IGIuQXR0cmlidXRlTGlzdCgpO3RoaXMuZFNpZ0FsZz1udWxsO3RoaXMuZFNpZz1udWxsO3RoaXMuZFVuc2lnbmVkQXR0cnM9bmV3IGIuQXR0cmlidXRlTGlzdCgpO3RoaXMuc2V0U2lnbmVySWRlbnRpZmllcj1mdW5jdGlvbihmKXtpZih0eXBlb2YgZj09XCJzdHJpbmdcIiYmZi5pbmRleE9mKFwiQ0VSVElGSUNBVEVcIikhPS0xJiZmLmluZGV4T2YoXCJCRUdJTlwiKSE9LTEmJmYuaW5kZXhPZihcIkVORFwiKSE9LTEpe3ZhciBlPWY7dGhpcy5kU2lnbmVySWRlbnRpZmllcj1uZXcgYi5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoe2NlcnQ6Zn0pfX07dGhpcy5zZXRGb3JDb250ZW50QW5kSGFzaD1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYoZS5lY2lPYmogaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvKXt0aGlzLmRTaWduZWRBdHRycy5hZGQobmV3IGIuQ29udGVudFR5cGUoe29pZDpcIjEuMi44NDAuMTEzNTQ5LjEuNy4xXCJ9KSk7dGhpcy5kU2lnbmVkQXR0cnMuYWRkKG5ldyBiLk1lc3NhZ2VEaWdlc3Qoe2VjaU9iajplLmVjaU9iaixoYXNoQWxnOmUuaGFzaEFsZ30pKX1pZih0eXBlb2YgZS5zZE9iaiE9XCJ1bmRlZmluZWRcIiYmZS5zZE9iaiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YSl7aWYoZS5zZE9iai5kaWdlc3RBbGdOYW1lTGlzdC5qb2luKFwiOlwiKS5pbmRleE9mKGUuaGFzaEFsZyk9PS0xKXtlLnNkT2JqLmRpZ2VzdEFsZ05hbWVMaXN0LnB1c2goZS5oYXNoQWxnKX19aWYodHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7dGhpcy5kRGlnZXN0QWxnb3JpdGhtPW5ldyBkLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6ZS5oYXNoQWxnfSl9fX07dGhpcy5zaWduPWZ1bmN0aW9uKGosZil7dGhpcy5kU2lnQWxnPW5ldyBkLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6Zn0pO3ZhciBnPXRoaXMuZFNpZ25lZEF0dHJzLmdldEVuY29kZWRIZXgoKTt2YXIgZT1LRVlVVElMLmdldEtleShqKTt2YXIgaT1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6Zn0pO2kuaW5pdChlKTtpLnVwZGF0ZUhleChnKTt2YXIgaD1pLnNpZ24oKTt0aGlzLmRTaWc9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpofSl9O3RoaXMuYWRkVW5zaWduZWQ9ZnVuY3Rpb24oZSl7dGhpcy5oVExWPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycy5oVExWPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycy5hZGQoZSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZFNpZ25lZEF0dHJzIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGVMaXN0JiZ0aGlzLmRTaWduZWRBdHRycy5sZW5ndGgoKT09MCl7dGhyb3dcIlNpZ25lZEF0dHJzIGxlbmd0aCA9IDAgKGVtcHR5KVwifXZhciBlPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZFNpZ25lZEF0dHJzLHRhZzpcImEwXCIsZXhwbGljaXQ6ZmFsc2V9KTt2YXIgaD1udWxsO2lmKHRoaXMuZFVuc2lnbmVkQXR0cnMubGVuZ3RoKCk+MCl7aD1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajp0aGlzLmRVbnNpZ25lZEF0dHJzLHRhZzpcImExXCIsZXhwbGljaXQ6ZmFsc2V9KX12YXIgZz1bdGhpcy5kQ01TVmVyc2lvbix0aGlzLmRTaWduZXJJZGVudGlmaWVyLHRoaXMuZERpZ2VzdEFsZ29yaXRobSxlLHRoaXMuZFNpZ0FsZyx0aGlzLmRTaWcsXTtpZihoIT1udWxsKXtnLnB1c2goaCl9dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Omd9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmVySW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTpcImRhdGFcIn0pO3RoaXMuZEVDb250ZW50PW51bGw7dGhpcy5pc0RldGFjaGVkPWZhbHNlO3RoaXMuZUNvbnRlbnRWYWx1ZUhleD1udWxsO3RoaXMuc2V0Q29udGVudFR5cGU9ZnVuY3Rpb24oZSl7aWYoZS5tYXRjaCgvXlswLTJdWy5dWzAtOS5dKyQvKSl7dGhpcy5kRUNvbnRlbnRUeXBlPW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDplfSl9ZWxzZXt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTplfSl9fTt0aGlzLnNldENvbnRlbnRWYWx1ZT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUuaGV4PT1cInN0cmluZ1wiKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9ZS5oZXh9ZWxzZXtpZih0eXBlb2YgZS5zdHI9PVwic3RyaW5nXCIpe3RoaXMuZUNvbnRlbnRWYWx1ZUhleD11dGY4dG9oZXgoZS5zdHIpfX19fTt0aGlzLnNldENvbnRlbnRWYWx1ZUhleD1mdW5jdGlvbihlKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9ZX07dGhpcy5zZXRDb250ZW50VmFsdWVTdHI9ZnVuY3Rpb24oZSl7dGhpcy5lQ29udGVudFZhbHVlSGV4PXV0Zjh0b2hleChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuZUNvbnRlbnRWYWx1ZUhleCE9XCJzdHJpbmdcIil7dGhyb3dcImVDb250ZW50VmFsdWUgbm90IHlldCBzZXRcIn12YXIgZz1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OnRoaXMuZUNvbnRlbnRWYWx1ZUhleH0pO3RoaXMuZEVDb250ZW50PW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOmcsdGFnOlwiYTBcIixleHBsaWNpdDp0cnVlfSk7dmFyIGU9W3RoaXMuZEVDb250ZW50VHlwZV07aWYoIXRoaXMuaXNEZXRhY2hlZCl7ZS5wdXNoKHRoaXMuZEVDb250ZW50KX12YXIgZj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZX0pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5Db250ZW50SW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLkNvbnRlbnRJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRDb250ZW50VHlwZT1udWxsO3RoaXMuZENvbnRlbnQ9bnVsbDt0aGlzLnNldENvbnRlbnRUeXBlPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT1cInN0cmluZ1wiKXt0aGlzLmRDb250ZW50VHlwZT1kLk9JRC5uYW1lMm9iaihlKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZENvbnRlbnQsdGFnOlwiYTBcIixleHBsaWNpdDp0cnVlfSk7dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRDb250ZW50VHlwZSxmXX0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYoYy50eXBlKXt0aGlzLnNldENvbnRlbnRUeXBlKGMudHlwZSl9aWYoYy5vYmomJmMub2JqIGluc3RhbmNlb2YgYS5BU04xT2JqZWN0KXt0aGlzLmRDb250ZW50PWMub2JqfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQ29udGVudEluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YT1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLlNpZ25lZERhdGEuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY21zO3ZhciBkPUtKVVIuYXNuMS54NTA5O3RoaXMuZENNU1ZlcnNpb249bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjoxfSk7dGhpcy5kRGlnZXN0QWxncz1udWxsO3RoaXMuZGlnZXN0QWxnTmFtZUxpc3Q9W107dGhpcy5kRW5jYXBDb250ZW50SW5mbz1uZXcgYi5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbygpO3RoaXMuZENlcnRzPW51bGw7dGhpcy5jZXJ0aWZpY2F0ZUxpc3Q9W107dGhpcy5jcmxMaXN0PVtdO3RoaXMuc2lnbmVySW5mb0xpc3Q9W25ldyBiLlNpZ25lckluZm8oKV07dGhpcy5hZGRDZXJ0aWZpY2F0ZXNCeVBFTT1mdW5jdGlvbihlKXt2YXIgZj1LRVlVVElMLmdldEhleEZyb21QRU0oZSk7dmFyIGc9bmV3IGEuQVNOMU9iamVjdCgpO2cuaFRMVj1mO3RoaXMuY2VydGlmaWNhdGVMaXN0LnB1c2goZyl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhUTFY9PVwic3RyaW5nXCIpe3JldHVybiB0aGlzLmhUTFZ9aWYodGhpcy5kRGlnZXN0QWxncz09bnVsbCl7dmFyIGs9W107Zm9yKHZhciBqPTA7ajx0aGlzLmRpZ2VzdEFsZ05hbWVMaXN0Lmxlbmd0aDtqKyspe3ZhciBoPXRoaXMuZGlnZXN0QWxnTmFtZUxpc3Rbal07dmFyIG09bmV3IGQuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpofSk7ay5wdXNoKG0pfXRoaXMuZERpZ2VzdEFsZ3M9bmV3IGEuREVSU2V0KHthcnJheTprfSl9dmFyIGU9W3RoaXMuZENNU1ZlcnNpb24sdGhpcy5kRGlnZXN0QWxncyx0aGlzLmRFbmNhcENvbnRlbnRJbmZvXTtpZih0aGlzLmRDZXJ0cz09bnVsbCl7aWYodGhpcy5jZXJ0aWZpY2F0ZUxpc3QubGVuZ3RoPjApe3ZhciBsPW5ldyBhLkRFUlNldCh7YXJyYXk6dGhpcy5jZXJ0aWZpY2F0ZUxpc3R9KTt0aGlzLmRDZXJ0cz1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpsLHRhZzpcImEwXCIsZXhwbGljaXQ6ZmFsc2V9KX19aWYodGhpcy5kQ2VydHMhPW51bGwpe2UucHVzaCh0aGlzLmRDZXJ0cyl9dmFyIGc9bmV3IGEuREVSU2V0KHthcnJheTp0aGlzLnNpZ25lckluZm9MaXN0fSk7ZS5wdXNoKGcpO3ZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuZ2V0Q29udGVudEluZm89ZnVuY3Rpb24oKXt0aGlzLmdldEVuY29kZWRIZXgoKTt2YXIgZT1uZXcgYi5Db250ZW50SW5mbyh7dHlwZTpcInNpZ25lZC1kYXRhXCIsb2JqOnRoaXN9KTtyZXR1cm4gZX07dGhpcy5nZXRDb250ZW50SW5mb0VuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbnRlbnRJbmZvKCk7dmFyIGY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIGZ9O3RoaXMuZ2V0UEVNPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb250ZW50SW5mb0VuY29kZWRIZXgoKTt2YXIgZj1hLkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoZSxcIkNNU1wiKTtyZXR1cm4gZn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5DTVNVdGlsPW5ldyBmdW5jdGlvbigpe307S0pVUi5hc24xLmNtcy5DTVNVdGlsLm5ld1NpZ25lZERhdGE9ZnVuY3Rpb24oYSl7dmFyIGg9S0pVUi5hc24xLmNtczt2YXIgZz1LSlVSLmFzbjEuY2FkZXM7dmFyIGY9bmV3IGguU2lnbmVkRGF0YSgpO2YuZEVuY2FwQ29udGVudEluZm8uc2V0Q29udGVudFZhbHVlKGEuY29udGVudCk7aWYodHlwZW9mIGEuY2VydHM9PVwib2JqZWN0XCIpe2Zvcih2YXIgYj0wO2I8YS5jZXJ0cy5sZW5ndGg7YisrKXtmLmFkZENlcnRpZmljYXRlc0J5UEVNKGEuY2VydHNbYl0pfX1mLnNpZ25lckluZm9MaXN0PVtdO2Zvcih2YXIgYj0wO2I8YS5zaWduZXJJbmZvcy5sZW5ndGg7YisrKXt2YXIgZD1hLnNpZ25lckluZm9zW2JdO3ZhciBjPW5ldyBoLlNpZ25lckluZm8oKTtjLnNldFNpZ25lcklkZW50aWZpZXIoZC5zaWduZXJDZXJ0KTtjLnNldEZvckNvbnRlbnRBbmRIYXNoKHtzZE9iajpmLGVjaU9iajpmLmRFbmNhcENvbnRlbnRJbmZvLGhhc2hBbGc6ZC5oYXNoQWxnfSk7Zm9yKGF0dHJOYW1lIGluIGQuc0F0dHIpe3ZhciBqPWQuc0F0dHJbYXR0ck5hbWVdO2lmKGF0dHJOYW1lPT1cIlNpZ25pbmdUaW1lXCIpe3ZhciBlPW5ldyBoLlNpZ25pbmdUaW1lKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduaW5nQ2VydGlmaWNhdGVcIil7dmFyIGU9bmV3IGguU2lnbmluZ0NlcnRpZmljYXRlKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduaW5nQ2VydGlmaWNhdGVWMlwiKXt2YXIgZT1uZXcgaC5TaWduaW5nQ2VydGlmaWNhdGVWMihqKTtjLmRTaWduZWRBdHRycy5hZGQoZSl9aWYoYXR0ck5hbWU9PVwiU2lnbmF0dXJlUG9saWN5SWRlbnRpZmllclwiKXt2YXIgZT1uZXcgZy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX19Yy5zaWduKGQuc2lnbmVyUHJ2S2V5LGQuc2lnQWxnKTtmLnNpZ25lckluZm9MaXN0LnB1c2goYyl9cmV0dXJuIGZ9O1xuLyohIGFzbjF0c3AtMS4wLjEuanMgKGMpIDIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLnRzcD09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS50c3Ape0tKVVIuYXNuMS50c3A9e319S0pVUi5hc24xLnRzcC5BY2N1cmFjeT1mdW5jdGlvbihiKXtLSlVSLmFzbjEudHNwLkFjY3VyYWN5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dGhpcy5zZWNvbmRzPW51bGw7dGhpcy5taWxsaXM9bnVsbDt0aGlzLm1pY3Jvcz1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPW51bGw7dmFyIGc9bnVsbDt2YXIgaT1udWxsO3ZhciBjPVtdO2lmKHRoaXMuc2Vjb25kcyE9bnVsbCl7ZT1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMuc2Vjb25kc30pO2MucHVzaChlKX1pZih0aGlzLm1pbGxpcyE9bnVsbCl7dmFyIGg9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjp0aGlzLm1pbGxpc30pO2c9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6aCx0YWc6XCI4MFwiLGV4cGxpY2l0OmZhbHNlfSk7Yy5wdXNoKGcpfWlmKHRoaXMubWljcm9zIT1udWxsKXt2YXIgZj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMubWljcm9zfSk7aT1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpmLHRhZzpcIjgxXCIsZXhwbGljaXQ6ZmFsc2V9KTtjLnB1c2goaSl9dmFyIGQ9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmN9KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLnNlY29uZHM9PVwibnVtYmVyXCIpe3RoaXMuc2Vjb25kcz1iLnNlY29uZHN9aWYodHlwZW9mIGIubWlsbGlzPT1cIm51bWJlclwiKXt0aGlzLm1pbGxpcz1iLm1pbGxpc31pZih0eXBlb2YgYi5taWNyb3M9PVwibnVtYmVyXCIpe3RoaXMubWljcm9zPWIubWljcm9zfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuQWNjdXJhY3ksS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBjPUtKVVIuYXNuMS54NTA5O3RoaXMuZEhhc2hBbGc9bnVsbDt0aGlzLmRIYXNoVmFsdWU9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kSGFzaEFsZyx0aGlzLmRIYXNoVmFsdWVdfSk7cmV0dXJuIGQuZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuaGFzaEFsZz09XCJzdHJpbmdcIil7dGhpcy5kSGFzaEFsZz1uZXcgYy5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmIuaGFzaEFsZ30pfWlmKHR5cGVvZiBiLmhhc2hWYWx1ZT09XCJzdHJpbmdcIil7dGhpcy5kSGFzaFZhbHVlPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6Yi5oYXNoVmFsdWV9KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcT1mdW5jdGlvbihjKXtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRNZXNzYWdlSW1wcmludD1udWxsO3RoaXMuZFBvbGljeT1udWxsO3RoaXMuZE5vbmNlPW51bGw7dGhpcy5jZXJ0UmVxPXRydWU7dGhpcy5zZXRNZXNzYWdlSW1wcmludD1mdW5jdGlvbihkKXtpZihkIGluc3RhbmNlb2YgS0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludCl7dGhpcy5kTWVzc2FnZUltcHJpbnQ9ZDtyZXR1cm59aWYodHlwZW9mIGQ9PVwib2JqZWN0XCIpe3RoaXMuZE1lc3NhZ2VJbXByaW50PW5ldyBiLk1lc3NhZ2VJbXByaW50KGQpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kTWVzc2FnZUltcHJpbnQ9PW51bGwpe3Rocm93XCJtZXNzYWdlSW1wcmludCBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZD1bdGhpcy5kVmVyc2lvbix0aGlzLmRNZXNzYWdlSW1wcmludF07aWYodGhpcy5kUG9saWN5IT1udWxsKXtkLnB1c2godGhpcy5kUG9saWN5KX1pZih0aGlzLmROb25jZSE9bnVsbCl7ZC5wdXNoKHRoaXMuZE5vbmNlKX1pZih0aGlzLmNlcnRSZXEpe2QucHVzaChuZXcgYS5ERVJCb29sZWFuKCkpfXZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5taT09XCJvYmplY3RcIil7dGhpcy5zZXRNZXNzYWdlSW1wcmludChjLm1pKX1pZih0eXBlb2YgYy5wb2xpY3k9PVwib2JqZWN0XCIpe3RoaXMuZFBvbGljeT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKGMucG9saWN5KX1pZih0eXBlb2YgYy5ub25jZT09XCJvYmplY3RcIil7dGhpcy5kTm9uY2U9bmV3IGEuREVSSW50ZWdlcihjLm5vbmNlKX1pZih0eXBlb2YgYy5jZXJ0cmVxPT1cImJvb2xlYW5cIil7dGhpcy5jZXJ0UmVxPWMuY2VydHJlcX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5UU1RJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVFNUSW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBkPUtKVVIuYXNuMS54NTA5O3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRQb2xpY3k9bnVsbDt0aGlzLmRNZXNzYWdlSW1wcmludD1udWxsO3RoaXMuZFNlcmlhbE51bWJlcj1udWxsO3RoaXMuZEdlblRpbWU9bnVsbDt0aGlzLmRBY2N1cmFjeT1udWxsO3RoaXMuZE9yZGVyaW5nPW51bGw7dGhpcy5kTm9uY2U9bnVsbDt0aGlzLmRUc2E9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT1bdGhpcy5kVmVyc2lvbl07aWYodGhpcy5kUG9saWN5PT1udWxsKXt0aHJvd1wicG9saWN5IHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kUG9saWN5KTtpZih0aGlzLmRNZXNzYWdlSW1wcmludD09bnVsbCl7dGhyb3dcIm1lc3NhZ2VJbXByaW50IHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kTWVzc2FnZUltcHJpbnQpO2lmKHRoaXMuZFNlcmlhbE51bWJlcj09bnVsbCl7dGhyb3dcInNlcmlhbE51bWJlciBzaGFsbCBiZSBzcGVjaWZpZWQuXCJ9ZS5wdXNoKHRoaXMuZFNlcmlhbE51bWJlcik7aWYodGhpcy5kR2VuVGltZT09bnVsbCl7dGhyb3dcImdlblRpbWUgc2hhbGwgYmUgc3BlY2lmaWVkLlwifWUucHVzaCh0aGlzLmRHZW5UaW1lKTtpZih0aGlzLmRBY2N1cmFjeSE9bnVsbCl7ZS5wdXNoKHRoaXMuZEFjY3VyYWN5KX1pZih0aGlzLmRPcmRlcmluZyE9bnVsbCl7ZS5wdXNoKHRoaXMuZE9yZGVyaW5nKX1pZih0aGlzLmROb25jZSE9bnVsbCl7ZS5wdXNoKHRoaXMuZE5vbmNlKX1pZih0aGlzLmRUc2EhPW51bGwpe2UucHVzaCh0aGlzLmRUc2EpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5wb2xpY3k9PVwic3RyaW5nXCIpe2lmKCFjLnBvbGljeS5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJwb2xpY3kgc2hhbGwgYmUgb2lkIGxpa2UgMC4xLjQuMTM0XCJ9dGhpcy5kUG9saWN5PW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDpjLnBvbGljeX0pfWlmKHR5cGVvZiBjLm1lc3NhZ2VJbXByaW50IT1cInVuZGVmaW5lZFwiKXt0aGlzLmRNZXNzYWdlSW1wcmludD1uZXcgYi5NZXNzYWdlSW1wcmludChjLm1lc3NhZ2VJbXByaW50KX1pZih0eXBlb2YgYy5zZXJpYWxOdW1iZXIhPVwidW5kZWZpbmVkXCIpe3RoaXMuZFNlcmlhbE51bWJlcj1uZXcgYS5ERVJJbnRlZ2VyKGMuc2VyaWFsTnVtYmVyKX1pZih0eXBlb2YgYy5nZW5UaW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLmRHZW5UaW1lPW5ldyBhLkRFUkdlbmVyYWxpemVkVGltZShjLmdlblRpbWUpfWlmKHR5cGVvZiBjLmFjY3VyYWN5IT1cInVuZGVmaW5kXCIpe3RoaXMuZEFjY3VyYWN5PW5ldyBiLkFjY3VyYWN5KGMuYWNjdXJhY3kpfWlmKHR5cGVvZiBjLm9yZGVyaW5nIT1cInVuZGVmaW5lZFwiJiZjLm9yZGVyaW5nPT10cnVlKXt0aGlzLmRPcmRlcmluZz1uZXcgYS5ERVJCb29sZWFuKCl9aWYodHlwZW9mIGMubm9uY2UhPVwidW5kZWZpbmVkXCIpe3RoaXMuZE5vbmNlPW5ldyBhLkRFUkludGVnZXIoYy5ub25jZSl9aWYodHlwZW9mIGMudHNhIT1cInVuZGVmaW5lZFwiKXt0aGlzLmRUc2E9bmV3IGQuWDUwME5hbWUoYy50c2EpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuVFNUSW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVzcC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kU3RhdHVzPW51bGw7dGhpcy5kVFNUPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kU3RhdHVzPT1udWxsKXt0aHJvd1wic3RhdHVzIHNoYWxsIGJlIHNwZWNpZmllZFwifXZhciBkPVt0aGlzLmRTdGF0dXNdO2lmKHRoaXMuZFRTVCE9bnVsbCl7ZC5wdXNoKHRoaXMuZFRTVCl9dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnN0YXR1cz09XCJvYmplY3RcIil7dGhpcy5kU3RhdHVzPW5ldyBiLlBLSVN0YXR1c0luZm8oYy5zdGF0dXMpfWlmKHR5cGVvZiBjLnRzdCE9XCJ1bmRlZmluZWRcIiYmYy50c3QgaW5zdGFuY2VvZiBLSlVSLmFzbjEuQVNOMU9iamVjdCl7dGhpcy5kVFNUPWMudHN0LmdldENvbnRlbnRJbmZvKCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1c0luZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXNJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRTdGF0dXM9bnVsbDt0aGlzLmRTdGF0dXNTdHJpbmc9bnVsbDt0aGlzLmRGYWlsdXJlSW5mbz1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZFN0YXR1cz09bnVsbCl7dGhyb3dcInN0YXR1cyBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZD1bdGhpcy5kU3RhdHVzXTtpZih0aGlzLmRTdGF0dXNTdHJpbmchPW51bGwpe2QucHVzaCh0aGlzLmRTdGF0dXNTdHJpbmcpfWlmKHRoaXMuZEZhaWx1cmVJbmZvIT1udWxsKXtkLnB1c2godGhpcy5kRmFpbHVyZUluZm8pfXZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5zdGF0dXM9PVwib2JqZWN0XCIpe3RoaXMuZFN0YXR1cz1uZXcgYi5QS0lTdGF0dXMoYy5zdGF0dXMpfWlmKHR5cGVvZiBjLnN0YXRzdHI9PVwib2JqZWN0XCIpe3RoaXMuZFN0YXR1c1N0cmluZz1uZXcgYi5QS0lGcmVlVGV4dCh7YXJyYXk6Yy5zdGF0c3RyfSl9aWYodHlwZW9mIGMuZmFpbGluZm89PVwib2JqZWN0XCIpe3RoaXMuZEZhaWx1cmVJbmZvPW5ldyBiLlBLSUZhaWx1cmVJbmZvKGMuZmFpbGluZm8pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJU3RhdHVzSW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXM9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3ZhciBkPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5oVExWPXRoaXMuZFN0YXR1cy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBlLm5hbWUhPVwidW5kZWZpbmVkXCIpe3ZhciBjPWIuUEtJU3RhdHVzLnZhbHVlTGlzdDtpZih0eXBlb2YgY1tlLm5hbWVdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wibmFtZSB1bmRlZmluZWQ6IFwiK2UubmFtZX10aGlzLmRTdGF0dXM9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjpjW2UubmFtZV19KX1lbHNle3RoaXMuZFN0YXR1cz1uZXcgYS5ERVJJbnRlZ2VyKGUpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJU3RhdHVzLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1cy52YWx1ZUxpc3Q9e2dyYW50ZWQ6MCxncmFudGVkV2l0aE1vZHM6MSxyZWplY3Rpb246Mix3YWl0aW5nOjMscmV2b2NhdGlvbldhcm5pbmc6NCxyZXZvY2F0aW9uTm90aWZpY2F0aW9uOjV9O0tKVVIuYXNuMS50c3AuUEtJRnJlZVRleHQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLnRzcC5QS0lGcmVlVGV4dC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3RoaXMudGV4dExpc3Q9W107dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9W107Zm9yKHZhciBlPTA7ZTx0aGlzLnRleHRMaXN0Lmxlbmd0aDtlKyspe2MucHVzaChuZXcgYS5ERVJVVEY4U3RyaW5nKHtzdHI6dGhpcy50ZXh0TGlzdFtlXX0pKX12YXIgZD1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6Y30pO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuYXJyYXk9PVwib2JqZWN0XCIpe3RoaXMudGV4dExpc3Q9Yi5hcnJheX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSUZyZWVUZXh0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3RoaXMudmFsdWU9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLnZhbHVlPT1udWxsKXt0aHJvd1widmFsdWUgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9dmFyIGU9bmV3IE51bWJlcih0aGlzLnZhbHVlKS50b1N0cmluZygyKTt2YXIgZj1uZXcgYS5ERVJCaXRTdHJpbmcoKTtmLnNldEJ5QmluYXJ5U3RyaW5nKGUpO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGQubmFtZT09XCJzdHJpbmdcIil7dmFyIGM9Yi5QS0lGYWlsdXJlSW5mby52YWx1ZUxpc3Q7aWYodHlwZW9mIGNbZC5uYW1lXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIm5hbWUgdW5kZWZpbmVkOiBcIitkLm5hbWV9dGhpcy52YWx1ZT1jW2QubmFtZV19ZWxzZXtpZih0eXBlb2YgZFtcImludFwiXT09XCJudW1iZXJcIil7dGhpcy52YWx1ZT1kW1wiaW50XCJdfX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvLnZhbHVlTGlzdD17YmFkQWxnOjAsYmFkUmVxdWVzdDoyLGJhZERhdGFGb3JtYXQ6NSx0aW1lTm90QXZhaWxhYmxlOjE0LHVuYWNjZXB0ZWRQb2xpY3k6MTUsdW5hY2NlcHRlZEV4dGVuc2lvbjoxNixhZGRJbmZvTm90QXZhaWxhYmxlOjE3LHN5c3RlbUZhaWx1cmU6MjV9O0tKVVIuYXNuMS50c3AuQWJzdHJhY3RUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dGhyb3dcIm5vdCBpbXBsZW1lbnRlZCB5ZXRcIn19O0tKVVIuYXNuMS50c3AuU2ltcGxlVFNBQWRhcHRlcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEudHNwLlNpbXBsZVRTQUFkYXB0ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMucGFyYW1zPW51bGw7dGhpcy5zZXJpYWw9MDt0aGlzLmdldFRTVEhleD1mdW5jdGlvbihjLGIpe3ZhciBlPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChjLGIpO3RoaXMucGFyYW1zLnRzdEluZm8ubWVzc2FnZUltcHJpbnQ9e2hhc2hBbGc6YixoYXNoVmFsdWU6ZX07dGhpcy5wYXJhbXMudHN0SW5mby5zZXJpYWxOdW1iZXI9e1wiaW50XCI6dGhpcy5zZXJpYWwrK307dmFyIGQ9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjEwMDAwMDAwMDApO3RoaXMucGFyYW1zLnRzdEluZm8ubm9uY2U9e1wiaW50XCI6ZH07dmFyIGY9S0pVUi5hc24xLnRzcC5UU1BVdGlsLm5ld1RpbWVTdGFtcFRva2VuKHRoaXMucGFyYW1zKTtyZXR1cm4gZi5nZXRDb250ZW50SW5mb0VuY29kZWRIZXgoKX07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe3RoaXMucGFyYW1zPWF9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlNpbXBsZVRTQUFkYXB0ZXIsS0pVUi5hc24xLnRzcC5BYnN0cmFjdFRTQUFkYXB0ZXIpO0tKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLnBhcmFtcz1udWxsO3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dmFyIGQ9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGMsYik7dGhpcy5wYXJhbXMudHN0SW5mby5tZXNzYWdlSW1wcmludD17aGFzaEFsZzpiLGhhc2hWYWx1ZTpkfTt2YXIgZT1LSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW4odGhpcy5wYXJhbXMpO3JldHVybiBlLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXJhbXM9YX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyLEtKVVIuYXNuMS50c3AuQWJzdHJhY3RUU0FBZGFwdGVyKTtLSlVSLmFzbjEudHNwLlRTUFV0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW49ZnVuY3Rpb24oYil7dmFyIGo9S0pVUi5hc24xLmNtczt2YXIgYT1LSlVSLmFzbjEudHNwO3ZhciBnPW5ldyBqLlNpZ25lZERhdGEoKTt2YXIgZT1uZXcgYS5UU1RJbmZvKGIudHN0SW5mbyk7dmFyIGY9ZS5nZXRFbmNvZGVkSGV4KCk7Zy5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VmFsdWUoe2hleDpmfSk7Zy5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VHlwZShcInRzdGluZm9cIik7aWYodHlwZW9mIGIuY2VydHM9PVwib2JqZWN0XCIpe2Zvcih2YXIgYz0wO2M8Yi5jZXJ0cy5sZW5ndGg7YysrKXtnLmFkZENlcnRpZmljYXRlc0J5UEVNKGIuY2VydHNbY10pfX12YXIgZD1nLnNpZ25lckluZm9MaXN0WzBdO2Quc2V0U2lnbmVySWRlbnRpZmllcihiLnNpZ25lckNlcnQpO2Quc2V0Rm9yQ29udGVudEFuZEhhc2goe3NkT2JqOmcsZWNpT2JqOmcuZEVuY2FwQ29udGVudEluZm8saGFzaEFsZzpiLmhhc2hBbGd9KTt2YXIgaD1uZXcgai5TaWduaW5nQ2VydGlmaWNhdGUoe2FycmF5OltiLnNpZ25lckNlcnRdfSk7ZC5kU2lnbmVkQXR0cnMuYWRkKGgpO2Quc2lnbihiLnNpZ25lclBydktleSxiLnNpZ0FsZyk7cmV0dXJuIGd9O0tKVVIuYXNuMS50c3AuVFNQVXRpbC5wYXJzZVRpbWVTdGFtcFJlcT1mdW5jdGlvbihkKXt2YXIgZj17fTtmLmNlcnRyZXE9ZmFsc2U7dmFyIGg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCwwKTtpZihoLmxlbmd0aDwyKXt0aHJvd1wiVGltZVN0YW1wUmVxIG11c3QgaGF2ZSBhdCBsZWFzdCAyIGl0ZW1zXCJ9dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGhbMV0pO2YubWk9S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlTWVzc2FnZUltcHJpbnQoYyk7Zm9yKHZhciBlPTI7ZTxoLmxlbmd0aDtlKyspe3ZhciBiPWhbZV07dmFyIGE9ZC5zdWJzdHIoYiwyKTtpZihhPT1cIjA2XCIpe3ZhciBnPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGQsYik7Zi5wb2xpY3k9QVNOMUhFWC5oZXh0b29pZHN0cihnKX1pZihhPT1cIjAyXCIpe2Yubm9uY2U9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZCxiKX1pZihhPT1cIjAxXCIpe2YuY2VydHJlcT10cnVlfX1yZXR1cm4gZn07S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlTWVzc2FnZUltcHJpbnQ9ZnVuY3Rpb24oYyl7dmFyIGg9e307aWYoYy5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wiaGVhZCBvZiBtZXNzYWdlSW1wcmludCBoZXggc2hhbGwgYmUgJzMwJ1wifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7dmFyIGk9QVNOMUhFWC5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChjLDAsWzAsMF0pO3ZhciBkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsaSk7dmFyIGU9QVNOMUhFWC5oZXh0b29pZHN0cihkKTt2YXIgZz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoZSk7aWYoZz09XCJcIil7dGhyb3dcImhhc2hBbGcgbmFtZSB1bmRlZmluZWQ6IFwiK2V9dmFyIGI9Zzt2YXIgZj1BU04xSEVYLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGMsMCxbMV0pO2guaGFzaEFsZz1iO2guaGFzaFZhbHVlPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsZik7cmV0dXJuIGh9O1xuLyohIGFzbjFjYWRlcy0xLjAuMC5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS5jYWRlcz09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jYWRlcyl7S0pVUi5hc24xLmNhZGVzPXt9fUtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyPWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTVcIjt2YXIgYj1LSlVSLmFzbjE7dmFyIGQ9S0pVUi5hc24xLmNhZGVzO2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5vaWQ9PVwic3RyaW5nXCImJnR5cGVvZiBlLmhhc2g9PVwib2JqZWN0XCIpe3ZhciBmPW5ldyBiLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDplLm9pZH0pO3ZhciBhPW5ldyBkLk90aGVySGFzaEFsZ0FuZFZhbHVlKGUuaGFzaCk7dmFyIGM9bmV3IGIuREVSU2VxdWVuY2Uoe2FycmF5OltmLGFdfSk7dGhpcy52YWx1ZUxpc3Q9W2NdfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoQWxnQW5kVmFsdWU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaEFsZ0FuZFZhbHVlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLng1MDk7dGhpcy5kQWxnPW51bGw7dGhpcy5kSGFzaD1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kQWxnLHRoaXMuZEhhc2hdfSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5hbGc9PVwic3RyaW5nXCImJnR5cGVvZiBiLmhhc2g9PVwic3RyaW5nXCIpe3RoaXMuZEFsZz1uZXcgYy5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmIuYWxnfSk7dGhpcy5kSGFzaD1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OmIuaGFzaH0pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2hBbGdBbmRWYWx1ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVRpbWVTdGFtcD1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTRcIjt0aGlzLnRzdEhleD1udWxsO3ZhciBhPUtKVVIuYXNuMTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMucmVzIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5yZXM9PVwic3RyaW5nXCImJmMucmVzLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt9ZWxzZXtpZihjLnJlcyBpbnN0YW5jZW9mIEtKVVIuYXNuMS5BU04xT2JqZWN0KXt9ZWxzZXt0aHJvd1wicmVzIHBhcmFtIHNoYWxsIGJlIEFTTjFPYmplY3Qgb3IgaGV4IHN0cmluZ1wifX19aWYodHlwZW9mIGMudHN0IT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy50c3Q9PVwic3RyaW5nXCImJmMudHN0Lm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt2YXIgYj1uZXcgYS5BU04xT2JqZWN0KCk7dGhpcy50c3RIZXg9Yy50c3Q7Yi5oVExWPXRoaXMudHN0SGV4O2IuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtiXX1lbHNle2lmKGMudHN0IGluc3RhbmNlb2YgS0pVUi5hc24xLkFTTjFPYmplY3Qpe31lbHNle3Rocm93XCJ0c3QgcGFyYW0gc2hhbGwgYmUgQVNOMU9iamVjdCBvciBoZXggc3RyaW5nXCJ9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuQ29tcGxldGVDZXJ0aWZpY2F0ZVJlZnM9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNhZGVzLkNvbXBsZXRlQ2VydGlmaWNhdGVSZWZzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMjFcIjt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNhZGVzO3RoaXMuc2V0QnlBcnJheT1mdW5jdGlvbihkKXt0aGlzLnZhbHVlTGlzdD1bXTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9bmV3IGIuT3RoZXJDZXJ0SUQoZFtlXSk7dGhpcy52YWx1ZUxpc3QucHVzaChmKX19O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJvYmplY3RcIiYmdHlwZW9mIGMubGVuZ3RoPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5QXJyYXkoYyl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLkNvbXBsZXRlQ2VydGlmaWNhdGVSZWZzLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQ9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLmNhZGVzLk90aGVyQ2VydElELnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLmNtczt2YXIgYj1LSlVSLmFzbjEuY2FkZXM7dGhpcy5oYXNJc3N1ZXJTZXJpYWw9dHJ1ZTt0aGlzLmRPdGhlckNlcnRIYXNoPW51bGw7dGhpcy5kSXNzdWVyU2VyaWFsPW51bGw7dGhpcy5zZXRCeUNlcnRQRU09ZnVuY3Rpb24oZSl7dGhpcy5kT3RoZXJDZXJ0SGFzaD1uZXcgYi5PdGhlckhhc2goZSk7aWYodGhpcy5oYXNJc3N1ZXJTZXJpYWwpe3RoaXMuZElzc3VlclNlcmlhbD1uZXcgYy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoZSl9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmhUTFYhPW51bGwpe3JldHVybiB0aGlzLmhUTFZ9aWYodGhpcy5kT3RoZXJDZXJ0SGFzaD09bnVsbCl7dGhyb3dcIm90aGVyQ2VydEhhc2ggbm90IHNldFwifXZhciBlPVt0aGlzLmRPdGhlckNlcnRIYXNoXTtpZih0aGlzLmRJc3N1ZXJTZXJpYWwhPW51bGwpe2UucHVzaCh0aGlzLmRJc3N1ZXJTZXJpYWwpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZD09XCJzdHJpbmdcIiYmZC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0aGlzLnNldEJ5Q2VydFBFTShkKX1pZih0eXBlb2YgZD09XCJvYmplY3RcIil7aWYoZC5oYXNpcz09PWZhbHNlKXt0aGlzLmhhc0lzc3VlclNlcmlhbD1mYWxzZX1pZih0eXBlb2YgZC5jZXJ0PT1cInN0cmluZ1wiKXt0aGlzLnNldEJ5Q2VydFBFTShkLmNlcnQpfX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2g9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jYWRlczt0aGlzLmFsZz1cInNoYTI1NlwiO3RoaXMuZE90aGVySGFzaD1udWxsO3RoaXMuc2V0QnlDZXJ0UEVNPWZ1bmN0aW9uKGQpe2lmKGQuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpPT0tMSl7dGhyb3dcImNlcnRQRU0gbm90IHRvIHNlZW0gUEVNIGZvcm1hdFwifXZhciBlPVg1MDkucGVtVG9IZXgoZCk7dmFyIGY9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGUsdGhpcy5hbGcpO3RoaXMuZE90aGVySGFzaD1uZXcgYi5PdGhlckhhc2hBbGdBbmRWYWx1ZSh7YWxnOnRoaXMuYWxnLGhhc2g6Zn0pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRPdGhlckhhc2g9PW51bGwpe3Rocm93XCJPdGhlckhhc2ggbm90IHNldFwifXJldHVybiB0aGlzLmRPdGhlckhhc2guZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwic3RyaW5nXCIpe2lmKGMuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7dGhpcy5zZXRCeUNlcnRQRU0oYyl9ZWxzZXtpZihjLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt0aGlzLmRPdGhlckhhc2g9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpjfSl9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgc3RyaW5nIHZhbHVlIGZvciBwYXJhbXNcIn19fWVsc2V7aWYodHlwZW9mIGM9PVwib2JqZWN0XCIpe2lmKHR5cGVvZiBjLmNlcnQ9PVwic3RyaW5nXCIpe2lmKHR5cGVvZiBjLmFsZz09XCJzdHJpbmdcIil7dGhpcy5hbGc9Yy5hbGd9dGhpcy5zZXRCeUNlcnRQRU0oYy5jZXJ0KX1lbHNle3RoaXMuZE90aGVySGFzaD1uZXcgYi5PdGhlckhhc2hBbGdBbmRWYWx1ZShjKX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2gsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsLmFkZFNpZ1RTPWZ1bmN0aW9uKGMsYixhKXt9O0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWwucGFyc2VTaWduZWREYXRhRm9yQWRkaW5nVW5zaWduZWQ9ZnVuY3Rpb24oZCl7dmFyIHE9S0pVUi5hc24xO3ZhciBwPUtKVVIuYXNuMS5jbXM7dmFyIGM9S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbDt2YXIgYT17fTtpZihBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdChkLDAsWzBdKSE9XCIwNjA5MmE4NjQ4ODZmNzBkMDEwNzAyXCIpe3Rocm93XCJoZXggaXMgbm90IENNUyBTaWduZWREYXRhXCJ9dmFyIHM9QVNOMUhFWC5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChkLDAsWzEsMF0pO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQscyk7aWYoYi5sZW5ndGg8NCl7dGhyb3dcIm51bSBvZiBTaWduZWREYXRhIGVsZW0gc2hhbGwgYmUgNCBhdCBsZWFzdFwifXZhciBmPWIuc2hpZnQoKTthLnZlcnNpb249QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGYpO3ZhciBsPWIuc2hpZnQoKTthLmFsZ3M9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGwpO3ZhciBtPWIuc2hpZnQoKTthLmVuY2FwY29udGVudD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbSk7YS5jZXJ0cz1udWxsO2EucmV2cz1udWxsO2Euc2k9W107dmFyIG49Yi5zaGlmdCgpO2lmKGQuc3Vic3RyKG4sMik9PVwiYTBcIil7YS5jZXJ0cz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbik7bj1iLnNoaWZ0KCl9aWYoZC5zdWJzdHIobiwyKT09XCJhMVwiKXthLnJldnM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLG4pO249Yi5zaGlmdCgpfXZhciBrPW47aWYoZC5zdWJzdHIoaywyKSE9XCIzMVwiKXt0aHJvd1wiQ2FuJ3QgZmluZCBzaWduZXJJbmZvc1wifXZhciBqPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsayk7Zm9yKHZhciBoPTA7aDxqLmxlbmd0aDtoKyspe3ZhciBvPWpbaF07dmFyIGU9Yy5wYXJzZVNpZ25lckluZm9Gb3JBZGRpbmdVbnNpZ25lZChkLG8saCk7YS5zaVtoXT1lfXZhciBnPW51bGw7YS5vYmo9bmV3IHAuU2lnbmVkRGF0YSgpO2c9bmV3IHEuQVNOMU9iamVjdCgpO2cuaFRMVj1hLnZlcnNpb247YS5vYmouZENNU1ZlcnNpb249ZztnPW5ldyBxLkFTTjFPYmplY3QoKTtnLmhUTFY9YS5hbGdzO2Eub2JqLmREaWdlc3RBbGdzPWc7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEuZW5jYXBjb250ZW50O2Eub2JqLmRFbmNhcENvbnRlbnRJbmZvPWc7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEuY2VydHM7YS5vYmouZENlcnRzPWc7YS5vYmouc2lnbmVySW5mb0xpc3Q9W107Zm9yKHZhciBoPTA7aDxhLnNpLmxlbmd0aDtoKyspe2Eub2JqLnNpZ25lckluZm9MaXN0LnB1c2goYS5zaVtoXS5vYmopfXJldHVybiBhfTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsLnBhcnNlU2lnbmVySW5mb0ZvckFkZGluZ1Vuc2lnbmVkPWZ1bmN0aW9uKGQsayxhKXt2YXIgbT1LSlVSLmFzbjE7dmFyIGw9S0pVUi5hc24xLmNtczt2YXIgYj17fTt2YXIgZT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLGspO2lmKGUubGVuZ3RoIT02KXt0aHJvd1wibm90IHN1cHBvcnRlZCBpdGVtcyBmb3IgU2lnbmVySW5mbyAoIT02KVwifXZhciBmPWUuc2hpZnQoKTtiLnZlcnNpb249QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGYpO3ZhciBuPWUuc2hpZnQoKTtiLnNpPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxuKTt2YXIgaD1lLnNoaWZ0KCk7Yi5kaWdhbGc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGgpO3ZhciBjPWUuc2hpZnQoKTtiLnNhdHRycz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsYyk7dmFyIGk9ZS5zaGlmdCgpO2Iuc2lnYWxnPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxpKTt2YXIgaj1lLnNoaWZ0KCk7Yi5zaWc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGopO2Iuc2lndmFsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGQsaik7dmFyIGc9bnVsbDtiLm9iaj1uZXcgbC5TaWduZXJJbmZvKCk7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIudmVyc2lvbjtiLm9iai5kQ01TVmVyc2lvbj1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnNpO2Iub2JqLmRTaWduZXJJZGVudGlmaWVyPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuZGlnYWxnO2Iub2JqLmREaWdlc3RBbGdvcml0aG09ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zYXR0cnM7Yi5vYmouZFNpZ25lZEF0dHJzPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuc2lnYWxnO2Iub2JqLmRTaWdBbGc9ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zaWc7Yi5vYmouZFNpZz1nO2Iub2JqLmRVbnNpZ25lZEF0dHJzPW5ldyBsLkF0dHJpYnV0ZUxpc3QoKTtyZXR1cm4gYn07XG4vKiEgYXNuMWNzci0xLjAuMC5qcyAoYykgMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUi5hc24xLmNzcj09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jc3Ipe0tKVVIuYXNuMS5jc3I9e319S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdD1mdW5jdGlvbihmKXtLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBkPW51bGw7dmFyIGU9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dGhpcy5zaWduPWZ1bmN0aW9uKGksaCl7aWYodGhpcy5wcnZLZXk9PW51bGwpe3RoaXMucHJ2S2V5PWh9dGhpcy5hc24xU2lnbmF0dXJlQWxnPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOml9KTtzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOml9KTtzaWcuaW5pdFNpZ24odGhpcy5wcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xQ1NSSW5mby5nZXRFbmNvZGVkSGV4KCkpO3RoaXMuaGV4U2lnPXNpZy5zaWduKCk7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMUNTUkluZm8sdGhpcy5hc24xU2lnbmF0dXJlQWxnLHRoaXMuYXNuMVNpZ119KTt0aGlzLmhUTFY9Zy5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBnPUtKVVIuYXNuMS5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KHRoaXMuZ2V0RW5jb2RlZEhleCgpLFwiQ0VSVElGSUNBVEUgUkVRVUVTVFwiKTtyZXR1cm4gZ307dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTtpZih0eXBlb2YgZiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGYuY3NyaW5mbyE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xQ1NSSW5mbz1mLmNzcmluZm99fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm89ZnVuY3Rpb24oYSl7S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFWZXJzaW9uPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dGhpcy5hc24xU3ViamVjdD1udWxsO3RoaXMuYXNuMVN1YmpQS2V5PW51bGw7dGhpcy5leHRlbnNpb25zQXJyYXk9bmV3IEFycmF5KCl9O3RoaXMuc2V0U3ViamVjdEJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU3ViamVjdD1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5PWZ1bmN0aW9uKGMpe3ZhciBiPUtFWVVUSUwuZ2V0S2V5KGMpO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhiKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFWZXJzaW9uKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmplY3QpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU3VialBLZXkpO3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuZXh0ZW5zaW9uc0FycmF5fSk7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OmZhbHNlLHRhZzpcImEwXCIsb2JqOmN9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGIpO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplKCl9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY3NyLkNTUlV0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY3NyLkNTUlV0aWwubmV3Q1NSUEVNPWZ1bmN0aW9uKGYpe3ZhciBjPUtKVVIuYXNuMS5jc3I7aWYoZi5zdWJqZWN0PT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHN1YmplY3QgdW5kZWZpbmVkXCJ9aWYoZi5zYmpwdWJrZXk9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbWV0ZXIgc2JqcHVia2V5IHVuZGVmaW5lZFwifWlmKGYuc2lnYWxnPT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHNpZ2FsZyB1bmRlZmluZWRcIn1pZihmLnNianBydmtleT09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtZXRlciBzYmpwdWJrZXkgdW5kZWZpbmVkXCJ9dmFyIGI9bmV3IGMuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvKCk7Yi5zZXRTdWJqZWN0QnlQYXJhbShmLnN1YmplY3QpO2Iuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5KGYuc2JqcHVia2V5KTt2YXIgZD1uZXcgYy5DZXJ0aWZpY2F0aW9uUmVxdWVzdCh7Y3NyaW5mbzpifSk7dmFyIGE9S0VZVVRJTC5nZXRLZXkoZi5zYmpwcnZrZXkpO2Quc2lnbihmLnNpZ2FsZyxhKTt2YXIgZT1kLmdldFBFTVN0cmluZygpO3JldHVybiBlfTtcbi8qISBiYXNlNjR4LTEuMS43IChjKSAyMDEyLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIEtKVVI7aWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmxhbmc9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmxhbmcpe0tKVVIubGFuZz17fX1LSlVSLmxhbmcuU3RyaW5nPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBCYXNlNjR4KCl7fWZ1bmN0aW9uIHN0b0JBKGQpe3ZhciBiPW5ldyBBcnJheSgpO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXtiW2NdPWQuY2hhckNvZGVBdChjKX1yZXR1cm4gYn1mdW5jdGlvbiBCQXRvcyhiKXt2YXIgZD1cIlwiO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWQrU3RyaW5nLmZyb21DaGFyQ29kZShiW2NdKX1yZXR1cm4gZH1mdW5jdGlvbiBCQXRvaGV4KGIpe3ZhciBlPVwiXCI7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBjPWJbZF0udG9TdHJpbmcoMTYpO2lmKGMubGVuZ3RoPT0xKXtjPVwiMFwiK2N9ZT1lK2N9cmV0dXJuIGV9ZnVuY3Rpb24gc3RvaGV4KGEpe3JldHVybiBCQXRvaGV4KHN0b0JBKGEpKX1mdW5jdGlvbiBzdG9iNjQoYSl7cmV0dXJuIGhleDJiNjQoc3RvaGV4KGEpKX1mdW5jdGlvbiBzdG9iNjR1KGEpe3JldHVybiBiNjR0b2I2NHUoaGV4MmI2NChzdG9oZXgoYSkpKX1mdW5jdGlvbiBiNjR1dG9zKGEpe3JldHVybiBCQXRvcyhiNjR0b0JBKGI2NHV0b2I2NChhKSkpfWZ1bmN0aW9uIGI2NHRvYjY0dShhKXthPWEucmVwbGFjZSgvXFw9L2csXCJcIik7YT1hLnJlcGxhY2UoL1xcKy9nLFwiLVwiKTthPWEucmVwbGFjZSgvXFwvL2csXCJfXCIpO3JldHVybiBhfWZ1bmN0aW9uIGI2NHV0b2I2NChhKXtpZihhLmxlbmd0aCU0PT0yKXthPWErXCI9PVwifWVsc2V7aWYoYS5sZW5ndGglND09Myl7YT1hK1wiPVwifX1hPWEucmVwbGFjZSgvLS9nLFwiK1wiKTthPWEucmVwbGFjZSgvXy9nLFwiL1wiKTtyZXR1cm4gYX1mdW5jdGlvbiBoZXh0b2I2NHUoYSl7aWYoYS5sZW5ndGglMj09MSl7YT1cIjBcIithfXJldHVybiBiNjR0b2I2NHUoaGV4MmI2NChhKSl9ZnVuY3Rpb24gYjY0dXRvaGV4KGEpe3JldHVybiBiNjR0b2hleChiNjR1dG9iNjQoYSkpfXZhciB1dGY4dG9iNjR1LGI2NHV0b3V0Zjg7aWYodHlwZW9mIEJ1ZmZlcj09PVwiZnVuY3Rpb25cIil7dXRmOHRvYjY0dT1mdW5jdGlvbihhKXtyZXR1cm4gYjY0dG9iNjR1KG5ldyBCdWZmZXIoYSxcInV0ZjhcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpfTtiNjR1dG91dGY4PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgQnVmZmVyKGI2NHV0b2I2NChhKSxcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIil9fWVsc2V7dXRmOHRvYjY0dT1mdW5jdGlvbihhKXtyZXR1cm4gaGV4dG9iNjR1KHVyaWNtcHRvaGV4KGVuY29kZVVSSUNvbXBvbmVudEFsbChhKSkpfTtiNjR1dG91dGY4PWZ1bmN0aW9uKGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYjY0dXRvaGV4KGEpKSl9fWZ1bmN0aW9uIHV0Zjh0b2I2NChhKXtyZXR1cm4gaGV4MmI2NCh1cmljbXB0b2hleChlbmNvZGVVUklDb21wb25lbnRBbGwoYSkpKX1mdW5jdGlvbiBiNjR0b3V0ZjgoYSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChoZXh0b3VyaWNtcChiNjR0b2hleChhKSkpfWZ1bmN0aW9uIHV0Zjh0b2hleChhKXtyZXR1cm4gdXJpY21wdG9oZXgoZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpKX1mdW5jdGlvbiBoZXh0b3V0ZjgoYSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChoZXh0b3VyaWNtcChhKSl9ZnVuY3Rpb24gaGV4dG9yc3RyKGMpe3ZhciBiPVwiXCI7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aC0xO2ErPTIpe2IrPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoYy5zdWJzdHIoYSwyKSwxNikpfXJldHVybiBifWZ1bmN0aW9uIHJzdHJ0b2hleChjKXt2YXIgYT1cIlwiO2Zvcih2YXIgYj0wO2I8Yy5sZW5ndGg7YisrKXthKz0oXCIwXCIrYy5jaGFyQ29kZUF0KGIpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfXJldHVybiBhfWZ1bmN0aW9uIGhleHRvYjY0KGEpe3JldHVybiBoZXgyYjY0KGEpfWZ1bmN0aW9uIGhleHRvYjY0bmwoYil7dmFyIGE9aGV4dG9iNjQoYik7dmFyIGM9YS5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtjPWMucmVwbGFjZSgvXFxyXFxuJC8sXCJcIik7cmV0dXJuIGN9ZnVuY3Rpb24gYjY0bmx0b2hleChiKXt2YXIgYT1iLnJlcGxhY2UoL1teMC05QS1aYS16XFwvKz1dKi9nLFwiXCIpO3ZhciBjPWI2NHRvaGV4KGEpO3JldHVybiBjfWZ1bmN0aW9uIHVyaWNtcHRvaGV4KGEpe3JldHVybiBhLnJlcGxhY2UoLyUvZyxcIlwiKX1mdW5jdGlvbiBoZXh0b3VyaWNtcChhKXtyZXR1cm4gYS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIil9ZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpe3ZhciBkPWVuY29kZVVSSUNvbXBvbmVudChhKTt2YXIgYj1cIlwiO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXtpZihkW2NdPT1cIiVcIil7Yj1iK2Quc3Vic3RyKGMsMyk7Yz1jKzJ9ZWxzZXtiPWIrXCIlXCIrc3RvaGV4KGRbY10pfX1yZXR1cm4gYn1mdW5jdGlvbiBuZXdsaW5lX3RvVW5peChhKXthPWEucmVwbGFjZSgvXFxyXFxuL21nLFwiXFxuXCIpO3JldHVybiBhfWZ1bmN0aW9uIG5ld2xpbmVfdG9Eb3MoYSl7YT1hLnJlcGxhY2UoL1xcclxcbi9tZyxcIlxcblwiKTthPWEucmVwbGFjZSgvXFxuL21nLFwiXFxyXFxuXCIpO3JldHVybiBhfUtKVVIubGFuZy5TdHJpbmcuaXNJbnRlZ2VyPWZ1bmN0aW9uKGEpe2lmKGEubWF0Y2goL15bMC05XSskLykpe3JldHVybiB0cnVlfWVsc2V7aWYoYS5tYXRjaCgvXi1bMC05XSskLykpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX19O0tKVVIubGFuZy5TdHJpbmcuaXNIZXg9ZnVuY3Rpb24oYSl7aWYoYS5sZW5ndGglMj09MCYmKGEubWF0Y2goL15bMC05YS1mXSskLyl8fGEubWF0Y2goL15bMC05QS1GXSskLykpKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19O0tKVVIubGFuZy5TdHJpbmcuaXNCYXNlNjQ9ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoL1xccysvZyxcIlwiKTtpZihhLm1hdGNoKC9eWzAtOUEtWmEteitcXC9dKz17MCwzfSQvKSYmYS5sZW5ndGglND09MCl7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gZmFsc2V9fTtLSlVSLmxhbmcuU3RyaW5nLmlzQmFzZTY0VVJMPWZ1bmN0aW9uKGEpe2lmKGEubWF0Y2goL1srLz1dLykpe3JldHVybiBmYWxzZX1hPWI2NHV0b2I2NChhKTtyZXR1cm4gS0pVUi5sYW5nLlN0cmluZy5pc0Jhc2U2NChhKX07S0pVUi5sYW5nLlN0cmluZy5pc0ludGVnZXJBcnJheT1mdW5jdGlvbihhKXthPWEucmVwbGFjZSgvXFxzKy9nLFwiXCIpO2lmKGEubWF0Y2goL15cXFtbMC05LF0rXFxdJC8pKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19O2Z1bmN0aW9uIGludGFyeXN0cnRvaGV4KGIpe2I9Yi5yZXBsYWNlKC9eXFxzKlxcW1xccyovLFwiXCIpO2I9Yi5yZXBsYWNlKC9cXHMqXFxdXFxzKiQvLFwiXCIpO2I9Yi5yZXBsYWNlKC9cXHMqL2csXCJcIik7dHJ5e3ZhciBjPWIuc3BsaXQoLywvKS5tYXAoZnVuY3Rpb24oZyxlLGgpe3ZhciBmPXBhcnNlSW50KGcpO2lmKGY8MHx8MjU1PGYpe3Rocm93XCJpbnRlZ2VyIG5vdCBpbiByYW5nZSAwLTI1NVwifXZhciBkPShcIjAwXCIrZi50b1N0cmluZygxNikpLnNsaWNlKC0yKTtyZXR1cm4gZH0pLmpvaW4oXCJcIik7cmV0dXJuIGN9Y2F0Y2goYSl7dGhyb3dcIm1hbGZvcm1lZCBpbnRlZ2VyIGFycmF5IHN0cmluZzogXCIrYX19dmFyIHN0cmRpZmZpZHg9ZnVuY3Rpb24oYyxhKXt2YXIgZD1jLmxlbmd0aDtpZihjLmxlbmd0aD5hLmxlbmd0aCl7ZD1hLmxlbmd0aH1mb3IodmFyIGI9MDtiPGQ7YisrKXtpZihjLmNoYXJDb2RlQXQoYikhPWEuY2hhckNvZGVBdChiKSl7cmV0dXJuIGJ9fWlmKGMubGVuZ3RoIT1hLmxlbmd0aCl7cmV0dXJuIGR9cmV0dXJuIC0xfTtcbi8qISBjcnlwdG8tMS4xLjguanMgKGMpIDIwMTMtMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLlV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5ESUdFU1RJTkZPSEVBRD17c2hhMTpcIjMwMjEzMDA5MDYwNTJiMGUwMzAyMWEwNTAwMDQxNFwiLHNoYTIyNDpcIjMwMmQzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwNDA1MDAwNDFjXCIsc2hhMjU2OlwiMzAzMTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAxMDUwMDA0MjBcIixzaGEzODQ6XCIzMDQxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDIwNTAwMDQzMFwiLHNoYTUxMjpcIjMwNTEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMzA1MDAwNDQwXCIsbWQyOlwiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwMjA1MDAwNDEwXCIsbWQ1OlwiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwNTA1MDAwNDEwXCIscmlwZW1kMTYwOlwiMzAyMTMwMDkwNjA1MmIyNDAzMDIwMTA1MDAwNDE0XCIsfTt0aGlzLkRFRkFVTFRQUk9WSURFUj17bWQ1OlwiY3J5cHRvanNcIixzaGExOlwiY3J5cHRvanNcIixzaGEyMjQ6XCJjcnlwdG9qc1wiLHNoYTI1NjpcImNyeXB0b2pzXCIsc2hhMzg0OlwiY3J5cHRvanNcIixzaGE1MTI6XCJjcnlwdG9qc1wiLHJpcGVtZDE2MDpcImNyeXB0b2pzXCIsaG1hY21kNTpcImNyeXB0b2pzXCIsaG1hY3NoYTE6XCJjcnlwdG9qc1wiLGhtYWNzaGEyMjQ6XCJjcnlwdG9qc1wiLGhtYWNzaGEyNTY6XCJjcnlwdG9qc1wiLGhtYWNzaGEzODQ6XCJjcnlwdG9qc1wiLGhtYWNzaGE1MTI6XCJjcnlwdG9qc1wiLGhtYWNyaXBlbWQxNjA6XCJjcnlwdG9qc1wiLE1ENXdpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyNTZ3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixSSVBFTUQxNjB3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixNRDV3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTUxMndpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsTUQ1d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBNTEyd2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFJJUEVNRDE2MHdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIix9O3RoaXMuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRT17bWQ1OkNyeXB0b0pTLmFsZ28uTUQ1LHNoYTE6Q3J5cHRvSlMuYWxnby5TSEExLHNoYTIyNDpDcnlwdG9KUy5hbGdvLlNIQTIyNCxzaGEyNTY6Q3J5cHRvSlMuYWxnby5TSEEyNTYsc2hhMzg0OkNyeXB0b0pTLmFsZ28uU0hBMzg0LHNoYTUxMjpDcnlwdG9KUy5hbGdvLlNIQTUxMixyaXBlbWQxNjA6Q3J5cHRvSlMuYWxnby5SSVBFTUQxNjB9O3RoaXMuZ2V0RGlnZXN0SW5mb0hleD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiB0aGlzLkRJR0VTVElORk9IRUFEW2JdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiYWxnIG5vdCBzdXBwb3J0ZWQgaW4gVXRpbC5ESUdFU1RJTkZPSEVBRDogXCIrYn1yZXR1cm4gdGhpcy5ESUdFU1RJTkZPSEVBRFtiXSthfTt0aGlzLmdldFBhZGRlZERpZ2VzdEluZm9IZXg9ZnVuY3Rpb24oaCxhLGope3ZhciBjPXRoaXMuZ2V0RGlnZXN0SW5mb0hleChoLGEpO3ZhciBkPWovNDtpZihjLmxlbmd0aCsyMj5kKXt0aHJvd1wia2V5IGlzIHRvbyBzaG9ydCBmb3IgU2lnQWxnOiBrZXlsZW49XCIraitcIixcIithfXZhciBiPVwiMDAwMVwiO3ZhciBrPVwiMDBcIitjO3ZhciBnPVwiXCI7dmFyIGw9ZC1iLmxlbmd0aC1rLmxlbmd0aDtmb3IodmFyIGY9MDtmPGw7Zis9Mil7Zys9XCJmZlwifXZhciBlPWIrZytrO3JldHVybiBlfTt0aGlzLmhhc2hTdHJpbmc9ZnVuY3Rpb24oYSxjKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOmN9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuaGFzaEhleD1mdW5jdGlvbihiLGMpe3ZhciBhPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6Y30pO3JldHVybiBhLmRpZ2VzdEhleChiKX07dGhpcy5zaGExPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGExXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhMjU2PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGEyNTZcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5zaGEyNTZIZXg9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTI1NlwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0SGV4KGEpfTt0aGlzLnNoYTUxMj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhNTEyXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhNTEySGV4PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGE1MTJcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdEhleChhKX07dGhpcy5tZDU9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcIm1kNVwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnJpcGVtZDE2MD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwicmlwZW1kMTYwXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuZ2V0Q3J5cHRvSlNNREJ5TmFtZT1mdW5jdGlvbihhKXt9fTtLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0PWZ1bmN0aW9uKGMpe3ZhciBiPW51bGw7dmFyIGE9bnVsbDt2YXIgZD1udWxsO3RoaXMuc2V0QWxnQW5kUHJvdmlkZXI9ZnVuY3Rpb24oZyxmKXtpZihnIT1udWxsJiZmPT09dW5kZWZpbmVkKXtmPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW2ddfWlmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZihnKSE9LTEmJmY9PVwiY3J5cHRvanNcIil7dHJ5e3RoaXMubWQ9S0pVUi5jcnlwdG8uVXRpbC5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FW2ddLmNyZWF0ZSgpfWNhdGNoKGUpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBhbGc9XCIrZytcIi9cIitlfXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihoKXt2YXIgaT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGgpO3RoaXMubWQudXBkYXRlKGkpfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBoPXRoaXMubWQuZmluYWxpemUoKTtyZXR1cm4gaC50b1N0cmluZyhDcnlwdG9KUy5lbmMuSGV4KX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVTdHJpbmcoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9O3RoaXMuZGlnZXN0SGV4PWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlSGV4KGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfX1pZihcIjpzaGEyNTY6XCIuaW5kZXhPZihnKSE9LTEmJmY9PVwic2pjbFwiKXt0cnl7dGhpcy5tZD1uZXcgc2pjbC5oYXNoLnNoYTI1NigpfWNhdGNoKGUpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBhbGc9XCIrZytcIi9cIitlfXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihpKXt2YXIgaD1zamNsLmNvZGVjLmhleC50b0JpdHMoaSk7dGhpcy5tZC51cGRhdGUoaCl9O3RoaXMuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5tZC5maW5hbGl6ZSgpO3JldHVybiBzamNsLmNvZGVjLmhleC5mcm9tQml0cyhoKX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVTdHJpbmcoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9O3RoaXMuZGlnZXN0SGV4PWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlSGV4KGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfX19O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGUpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oZSl7dGhyb3dcInVwZGF0ZUhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3Rocm93XCJkaWdlc3QoKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oZSl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihlKXt0aHJvd1wiZGlnZXN0SGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O2lmKGMhPT11bmRlZmluZWQpe2lmKGMuYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9Yy5hbGc7aWYoYy5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19dGhpcy5zZXRBbGdBbmRQcm92aWRlcih0aGlzLmFsZ05hbWUsdGhpcy5wcm92TmFtZSl9fX07S0pVUi5jcnlwdG8uTWFjPWZ1bmN0aW9uKGQpe3ZhciBmPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKGssaSl7az1rLnRvTG93ZXJDYXNlKCk7aWYoaz09bnVsbCl7az1cImhtYWNzaGExXCJ9az1rLnRvTG93ZXJDYXNlKCk7aWYoay5zdWJzdHIoMCw0KSE9XCJobWFjXCIpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciB1bnN1cHBvcnRlZCBITUFDIGFsZzogXCIra31pZihpPT09dW5kZWZpbmVkKXtpPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW2tdfXRoaXMuYWxnUHJvdj1rK1wiL1wiK2k7dmFyIGc9ay5zdWJzdHIoNCk7aWYoXCI6bWQ1OnNoYTE6c2hhMjI0OnNoYTI1NjpzaGEzODQ6c2hhNTEyOnJpcGVtZDE2MDpcIi5pbmRleE9mKGcpIT0tMSYmaT09XCJjcnlwdG9qc1wiKXt0cnl7dmFyIGo9S0pVUi5jcnlwdG8uVXRpbC5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FW2ddO3RoaXMubWFjPUNyeXB0b0pTLmFsZ28uSE1BQy5jcmVhdGUoaix0aGlzLnBhc3MpfWNhdGNoKGgpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBoYXNoQWxnPVwiK2crXCIvXCIraH10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihsKXt0aGlzLm1hYy51cGRhdGUobCl9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGwpe3ZhciBtPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UobCk7dGhpcy5tYWMudXBkYXRlKG0pfTt0aGlzLmRvRmluYWw9ZnVuY3Rpb24oKXt2YXIgbD10aGlzLm1hYy5maW5hbGl6ZSgpO3JldHVybiBsLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5IZXgpfTt0aGlzLmRvRmluYWxTdHJpbmc9ZnVuY3Rpb24obCl7dGhpcy51cGRhdGVTdHJpbmcobCk7cmV0dXJuIHRoaXMuZG9GaW5hbCgpfTt0aGlzLmRvRmluYWxIZXg9ZnVuY3Rpb24obCl7dGhpcy51cGRhdGVIZXgobCk7cmV0dXJuIHRoaXMuZG9GaW5hbCgpfX19O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGcpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGcpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbD1mdW5jdGlvbigpe3Rocm93XCJkaWdlc3QoKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbFN0cmluZz1mdW5jdGlvbihnKXt0aHJvd1wiZGlnZXN0U3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWxIZXg9ZnVuY3Rpb24oZyl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5zZXRQYXNzd29yZD1mdW5jdGlvbihoKXtpZih0eXBlb2YgaD09XCJzdHJpbmdcIil7dmFyIGc9aDtpZihoLmxlbmd0aCUyPT0xfHwhaC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7Zz1yc3RydG9oZXgoaCl9dGhpcy5wYXNzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoZyk7cmV0dXJufWlmKHR5cGVvZiBoIT1cIm9iamVjdFwiKXt0aHJvd1wiS0pVUi5jcnlwdG8uTWFjIHVuc3VwcG9ydGVkIHBhc3N3b3JkIHR5cGU6IFwiK2h9dmFyIGc9bnVsbDtpZihoLmhleCE9PXVuZGVmaW5lZCl7aWYoaC5oZXgubGVuZ3RoJTIhPTB8fCFoLmhleC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7dGhyb3dcIk1hYzogd3JvbmcgaGV4IHBhc3N3b3JkOiBcIitoLmhleH1nPWguaGV4fWlmKGgudXRmOCE9PXVuZGVmaW5lZCl7Zz11dGY4dG9oZXgoaC51dGY4KX1pZihoLnJzdHIhPT11bmRlZmluZWQpe2c9cnN0cnRvaGV4KGgucnN0cil9aWYoaC5iNjQhPT11bmRlZmluZWQpe2c9YjY0dG9oZXgoaC5iNjQpfWlmKGguYjY0dSE9PXVuZGVmaW5lZCl7Zz1iNjR1dG9oZXgoaC5iNjR1KX1pZihnPT1udWxsKXt0aHJvd1wiS0pVUi5jcnlwdG8uTWFjIHVuc3VwcG9ydGVkIHBhc3N3b3JkIHR5cGU6IFwiK2h9dGhpcy5wYXNzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoZyl9O2lmKGQhPT11bmRlZmluZWQpe2lmKGQucGFzcyE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQYXNzd29yZChkLnBhc3MpfWlmKGQuYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9ZC5hbGc7aWYoZC5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19dGhpcy5zZXRBbGdBbmRQcm92aWRlcih0aGlzLmFsZ05hbWUsdGhpcy5wcm92TmFtZSl9fX07S0pVUi5jcnlwdG8uU2lnbmF0dXJlPWZ1bmN0aW9uKG8pe3ZhciBxPW51bGw7dmFyIG49bnVsbDt2YXIgcj1udWxsO3ZhciBjPW51bGw7dmFyIGw9bnVsbDt2YXIgZD1udWxsO3ZhciBrPW51bGw7dmFyIGg9bnVsbDt2YXIgcD1udWxsO3ZhciBlPW51bGw7dmFyIGI9LTE7dmFyIGc9bnVsbDt2YXIgaj1udWxsO3ZhciBhPW51bGw7dmFyIGk9bnVsbDt2YXIgZj1udWxsO3RoaXMuX3NldEFsZ05hbWVzPWZ1bmN0aW9uKCl7aWYodGhpcy5hbGdOYW1lLm1hdGNoKC9eKC4rKXdpdGgoLispJC8pKXt0aGlzLm1kQWxnTmFtZT1SZWdFeHAuJDEudG9Mb3dlckNhc2UoKTt0aGlzLnB1YmtleUFsZ05hbWU9UmVnRXhwLiQyLnRvTG93ZXJDYXNlKCl9fTt0aGlzLl96ZXJvUGFkZGluZ09mU2lnbmF0dXJlPWZ1bmN0aW9uKHgsdyl7dmFyIHY9XCJcIjt2YXIgdD13LzQteC5sZW5ndGg7Zm9yKHZhciB1PTA7dTx0O3UrKyl7dj12K1wiMFwifXJldHVybiB2K3h9O3RoaXMuc2V0QWxnQW5kUHJvdmlkZXI9ZnVuY3Rpb24odSx0KXt0aGlzLl9zZXRBbGdOYW1lcygpO2lmKHQhPVwiY3J5cHRvanMvanNyc2FcIil7dGhyb3dcInByb3ZpZGVyIG5vdCBzdXBwb3J0ZWQ6IFwiK3R9aWYoXCI6bWQ1OnNoYTE6c2hhMjI0OnNoYTI1NjpzaGEzODQ6c2hhNTEyOnJpcGVtZDE2MDpcIi5pbmRleE9mKHRoaXMubWRBbGdOYW1lKSE9LTEpe3RyeXt0aGlzLm1kPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6dGhpcy5tZEFsZ05hbWV9KX1jYXRjaChzKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK3RoaXMubWRBbGdOYW1lK1wiL1wiK3N9dGhpcy5pbml0PWZ1bmN0aW9uKHcseCl7dmFyIHk9bnVsbDt0cnl7aWYoeD09PXVuZGVmaW5lZCl7eT1LRVlVVElMLmdldEtleSh3KX1lbHNle3k9S0VZVVRJTC5nZXRLZXkodyx4KX19Y2F0Y2godil7dGhyb3dcImluaXQgZmFpbGVkOlwiK3Z9aWYoeS5pc1ByaXZhdGU9PT10cnVlKXt0aGlzLnBydktleT15O3RoaXMuc3RhdGU9XCJTSUdOXCJ9ZWxzZXtpZih5LmlzUHVibGljPT09dHJ1ZSl7dGhpcy5wdWJLZXk9eTt0aGlzLnN0YXRlPVwiVkVSSUZZXCJ9ZWxzZXt0aHJvd1wiaW5pdCBmYWlsZWQuOlwiK3l9fX07dGhpcy5pbml0U2lnbj1mdW5jdGlvbih2KXtpZih0eXBlb2Ygdi5lY3BydmhleD09XCJzdHJpbmdcIiYmdHlwZW9mIHYuZWNjdXJ2ZW5hbWU9PVwic3RyaW5nXCIpe3RoaXMuZWNwcnZoZXg9di5lY3BydmhleDt0aGlzLmVjY3VydmVuYW1lPXYuZWNjdXJ2ZW5hbWV9ZWxzZXt0aGlzLnBydktleT12fXRoaXMuc3RhdGU9XCJTSUdOXCJ9O3RoaXMuaW5pdFZlcmlmeUJ5UHVibGljS2V5PWZ1bmN0aW9uKHYpe2lmKHR5cGVvZiB2LmVjcHViaGV4PT1cInN0cmluZ1wiJiZ0eXBlb2Ygdi5lY2N1cnZlbmFtZT09XCJzdHJpbmdcIil7dGhpcy5lY3B1YmhleD12LmVjcHViaGV4O3RoaXMuZWNjdXJ2ZW5hbWU9di5lY2N1cnZlbmFtZX1lbHNle2lmKHYgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7dGhpcy5wdWJLZXk9dn1lbHNle2lmKHYgaW5zdGFuY2VvZiBSU0FLZXkpe3RoaXMucHViS2V5PXZ9fX10aGlzLnN0YXRlPVwiVkVSSUZZXCJ9O3RoaXMuaW5pdFZlcmlmeUJ5Q2VydGlmaWNhdGVQRU09ZnVuY3Rpb24odil7dmFyIHc9bmV3IFg1MDkoKTt3LnJlYWRDZXJ0UEVNKHYpO3RoaXMucHViS2V5PXcuc3ViamVjdFB1YmxpY0tleVJTQTt0aGlzLnN0YXRlPVwiVkVSSUZZXCJ9O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKHYpe3RoaXMubWQudXBkYXRlU3RyaW5nKHYpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbih2KXt0aGlzLm1kLnVwZGF0ZUhleCh2KX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5zSGFzaEhleD10aGlzLm1kLmRpZ2VzdCgpO2lmKHR5cGVvZiB0aGlzLmVjcHJ2aGV4IT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5lY2N1cnZlbmFtZSE9XCJ1bmRlZmluZWRcIil7dmFyIHY9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp0aGlzLmVjY3VydmVuYW1lfSk7dGhpcy5oU2lnbj12LnNpZ25IZXgodGhpcy5zSGFzaEhleCx0aGlzLmVjcHJ2aGV4KX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhYW5kbWdmMVwiKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2hQU1ModGhpcy5zSGFzaEhleCx0aGlzLm1kQWxnTmFtZSx0aGlzLnBzc1NhbHRMZW4pfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FcIil7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdGhpcy5tZEFsZ05hbWUpfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgpfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4KX1lbHNle3Rocm93XCJTaWduYXR1cmU6IHVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnOiBcIit0aGlzLnB1YmtleUFsZ05hbWV9fX19fXJldHVybiB0aGlzLmhTaWdufTt0aGlzLnNpZ25TdHJpbmc9ZnVuY3Rpb24odil7dGhpcy51cGRhdGVTdHJpbmcodik7cmV0dXJuIHRoaXMuc2lnbigpfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24odil7dGhpcy51cGRhdGVIZXgodik7cmV0dXJuIHRoaXMuc2lnbigpfTt0aGlzLnZlcmlmeT1mdW5jdGlvbih2KXt0aGlzLnNIYXNoSGV4PXRoaXMubWQuZGlnZXN0KCk7aWYodHlwZW9mIHRoaXMuZWNwdWJoZXghPVwidW5kZWZpbmVkXCImJnR5cGVvZiB0aGlzLmVjY3VydmVuYW1lIT1cInVuZGVmaW5lZFwiKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnRoaXMuZWNjdXJ2ZW5hbWV9KTtyZXR1cm4gdy52ZXJpZnlIZXgodGhpcy5zSGFzaEhleCx2LHRoaXMuZWNwdWJoZXgpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FhbmRtZ2YxXCIpe3JldHVybiB0aGlzLnB1YktleS52ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1ModGhpcy5zSGFzaEhleCx2LHRoaXMubWRBbGdOYW1lLHRoaXMucHNzU2FsdExlbil9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIFJTQUtleSYmdGhpcy5wdWJrZXlBbGdOYW1lPT1cInJzYVwiKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7dGhyb3dcIlNpZ25hdHVyZTogdW5zdXBwb3J0ZWQgcHVibGljIGtleSBhbGc6IFwiK3RoaXMucHVia2V5QWxnTmFtZX19fX19fX19O3RoaXMuaW5pdD1mdW5jdGlvbihzLHQpe3Rocm93XCJpbml0KGtleSwgcGFzcykgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRWZXJpZnlCeVB1YmxpY0tleT1mdW5jdGlvbihzKXt0aHJvd1wiaW5pdFZlcmlmeUJ5UHVibGljS2V5KHJzYVB1YktleXkpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0VmVyaWZ5QnlDZXJ0aWZpY2F0ZVBFTT1mdW5jdGlvbihzKXt0aHJvd1wiaW5pdFZlcmlmeUJ5Q2VydGlmaWNhdGVQRU0oY2VydFBFTSkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRTaWduPWZ1bmN0aW9uKHMpe3Rocm93XCJpbml0U2lnbihwcnZLZXkpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24ocyl7dGhyb3dcInVwZGF0ZVN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24ocyl7dGhyb3dcInVwZGF0ZUhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhyb3dcInNpZ24oKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuc2lnblN0cmluZz1mdW5jdGlvbihzKXt0aHJvd1wiZGlnZXN0U3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24ocyl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24ocyl7dGhyb3dcInZlcmlmeShoU2lnVmFsKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuaW5pdFBhcmFtcz1vO2lmKG8hPT11bmRlZmluZWQpe2lmKG8uYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9by5hbGc7aWYoby5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19ZWxzZXt0aGlzLnByb3ZOYW1lPW8ucHJvdn10aGlzLmFsZ1Byb3ZOYW1lPXRoaXMuYWxnTmFtZStcIjpcIit0aGlzLnByb3ZOYW1lO3RoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpO3RoaXMuX3NldEFsZ05hbWVzKCl9aWYoby5wc3NzYWx0bGVuIT09dW5kZWZpbmVkKXt0aGlzLnBzc1NhbHRMZW49by5wc3NzYWx0bGVufWlmKG8ucHJ2a2V5cGVtIT09dW5kZWZpbmVkKXtpZihvLnBydmtleXBhcyE9PXVuZGVmaW5lZCl7dGhyb3dcImJvdGggcHJ2a2V5cGVtIGFuZCBwcnZrZXlwYXMgcGFyYW1ldGVycyBub3Qgc3VwcG9ydGVkXCJ9ZWxzZXt0cnl7dmFyIHE9bmV3IFJTQUtleSgpO3EucmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nKG8ucHJ2a2V5cGVtKTt0aGlzLmluaXRTaWduKHEpfWNhdGNoKG0pe3Rocm93XCJmYXRhbCBlcnJvciB0byBsb2FkIHBlbSBwcml2YXRlIGtleTogXCIrbX19fX19O0tKVVIuY3J5cHRvLk9JRD1uZXcgZnVuY3Rpb24oKXt0aGlzLm9pZGhleDJuYW1lPXtcIjJhODY0ODg2ZjcwZDAxMDEwMVwiOlwicnNhRW5jcnlwdGlvblwiLFwiMmE4NjQ4Y2UzZDAyMDFcIjpcImVjUHVibGljS2V5XCIsXCIyYTg2NDhjZTM4MDQwMVwiOlwiZHNhXCIsXCIyYTg2NDhjZTNkMDMwMTA3XCI6XCJzZWNwMjU2cjFcIixcIjJiODEwNDAwMWZcIjpcInNlY3AxOTJrMVwiLFwiMmI4MTA0MDAyMVwiOlwic2VjcDIyNHIxXCIsXCIyYjgxMDQwMDBhXCI6XCJzZWNwMjU2azFcIixcIjJiODEwNDAwMjNcIjpcInNlY3A1MjFyMVwiLFwiMmI4MTA0MDAyMlwiOlwic2VjcDM4NHIxXCIsXCIyYTg2NDhjZTM4MDQwM1wiOlwiU0hBMXdpdGhEU0FcIixcIjYwODY0ODAxNjUwMzA0MDMwMVwiOlwiU0hBMjI0d2l0aERTQVwiLFwiNjA4NjQ4MDE2NTAzMDQwMzAyXCI6XCJTSEEyNTZ3aXRoRFNBXCIsfX07XG4vKiEgZWNkc2EtbW9kaWZpZWQtMS4wLjUuanMgKGMpIFN0ZXBoYW4gVGhvbWFzLCBLZW5qaSBVcnVzaGltYSB8IGdpdGh1Yi5jb20vYml0Y29pbmpzL2JpdGNvaW5qcy1saWIvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkVDRFNBPWZ1bmN0aW9uKGgpe3ZhciBlPVwic2VjcDI1NnIxXCI7dmFyIGc9bnVsbDt2YXIgYj1udWxsO3ZhciBmPW51bGw7dmFyIGE9bmV3IFNlY3VyZVJhbmRvbSgpO3ZhciBkPW51bGw7dGhpcy50eXBlPVwiRUNcIjtmdW5jdGlvbiBjKHMsbyxyLG4pe3ZhciBqPU1hdGgubWF4KG8uYml0TGVuZ3RoKCksbi5iaXRMZW5ndGgoKSk7dmFyIHQ9cy5hZGQyRChyKTt2YXIgcT1zLmN1cnZlLmdldEluZmluaXR5KCk7Zm9yKHZhciBwPWotMTtwPj0wOy0tcCl7cT1xLnR3aWNlMkQoKTtxLno9QmlnSW50ZWdlci5PTkU7aWYoby50ZXN0Qml0KHApKXtpZihuLnRlc3RCaXQocCkpe3E9cS5hZGQyRCh0KX1lbHNle3E9cS5hZGQyRChzKX19ZWxzZXtpZihuLnRlc3RCaXQocCkpe3E9cS5hZGQyRChyKX19fXJldHVybiBxfXRoaXMuZ2V0QmlnUmFuZG9tPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcgQmlnSW50ZWdlcihpLmJpdExlbmd0aCgpLGEpLm1vZChpLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSkuYWRkKEJpZ0ludGVnZXIuT05FKX07dGhpcy5zZXROYW1lZEN1cnZlPWZ1bmN0aW9uKGkpe3RoaXMuZWNwYXJhbXM9S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5nZXRCeU5hbWUoaSk7dGhpcy5wcnZLZXlIZXg9bnVsbDt0aGlzLnB1YktleUhleD1udWxsO3RoaXMuY3VydmVOYW1lPWl9O3RoaXMuc2V0UHJpdmF0ZUtleUhleD1mdW5jdGlvbihpKXt0aGlzLmlzUHJpdmF0ZT10cnVlO3RoaXMucHJ2S2V5SGV4PWl9O3RoaXMuc2V0UHVibGljS2V5SGV4PWZ1bmN0aW9uKGkpe3RoaXMuaXNQdWJsaWM9dHJ1ZTt0aGlzLnB1YktleUhleD1pfTt0aGlzLmdldFB1YmxpY0tleVhZSGV4PWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5wdWJLZXlIZXg7aWYoay5zdWJzdHIoMCwyKSE9PVwiMDRcIil7dGhyb3dcInRoaXMgbWV0aG9kIHN1cHBvcnRzIHVuY29tcHJlc3NlZCBmb3JtYXQoMDQpIG9ubHlcIn12YXIgaj10aGlzLmVjcGFyYW1zLmtleWxlbi80O2lmKGsubGVuZ3RoIT09MitqKjIpe3Rocm93XCJtYWxmb3JtZWQgcHVibGljIGtleSBoZXggbGVuZ3RoXCJ9dmFyIGk9e307aS54PWsuc3Vic3RyKDIsaik7aS55PWsuc3Vic3RyKDIraik7cmV0dXJuIGl9O3RoaXMuZ2V0U2hvcnROSVNUUEN1cnZlTmFtZT1mdW5jdGlvbigpe3ZhciBpPXRoaXMuY3VydmVOYW1lO2lmKGk9PT1cInNlY3AyNTZyMVwifHxpPT09XCJOSVNUIFAtMjU2XCJ8fGk9PT1cIlAtMjU2XCJ8fGk9PT1cInByaW1lMjU2djFcIil7cmV0dXJuXCJQLTI1NlwifWlmKGk9PT1cInNlY3AzODRyMVwifHxpPT09XCJOSVNUIFAtMzg0XCJ8fGk9PT1cIlAtMzg0XCIpe3JldHVyblwiUC0zODRcIn1yZXR1cm4gbnVsbH07dGhpcy5nZW5lcmF0ZUtleVBhaXJIZXg9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLmVjcGFyYW1zLm47dmFyIG49dGhpcy5nZXRCaWdSYW5kb20oayk7dmFyIGw9dGhpcy5lY3BhcmFtcy5HLm11bHRpcGx5KG4pO3ZhciBxPWwuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBvPWwuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBpPXRoaXMuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIG09KFwiMDAwMDAwMDAwMFwiK24udG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIHI9KFwiMDAwMDAwMDAwMFwiK3EudG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIHA9KFwiMDAwMDAwMDAwMFwiK28udG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIGo9XCIwNFwiK3IrcDt0aGlzLnNldFByaXZhdGVLZXlIZXgobSk7dGhpcy5zZXRQdWJsaWNLZXlIZXgoaik7cmV0dXJue2VjcHJ2aGV4Om0sZWNwdWJoZXg6an19O3RoaXMuc2lnbldpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5zaWduSGV4KGksdGhpcy5wcnZLZXlIZXgpfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24obyxqKXt2YXIgdD1uZXcgQmlnSW50ZWdlcihqLDE2KTt2YXIgbD10aGlzLmVjcGFyYW1zLm47dmFyIHE9bmV3IEJpZ0ludGVnZXIobywxNik7ZG97dmFyIG09dGhpcy5nZXRCaWdSYW5kb20obCk7dmFyIHU9dGhpcy5lY3BhcmFtcy5HO3ZhciBwPXUubXVsdGlwbHkobSk7dmFyIGk9cC5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGwpfXdoaWxlKGkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk8PTApO3ZhciB2PW0ubW9kSW52ZXJzZShsKS5tdWx0aXBseShxLmFkZCh0Lm11bHRpcGx5KGkpKSkubW9kKGwpO3JldHVybiBLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnKGksdil9O3RoaXMuc2lnbj1mdW5jdGlvbihtLHUpe3ZhciBxPXU7dmFyIGo9dGhpcy5lY3BhcmFtcy5uO3ZhciBwPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0pO2Rve3ZhciBsPXRoaXMuZ2V0QmlnUmFuZG9tKGopO3ZhciB0PXRoaXMuZWNwYXJhbXMuRzt2YXIgbz10Lm11bHRpcGx5KGwpO3ZhciBpPW8uZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZChqKX13aGlsZShpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPD0wKTt2YXIgdj1sLm1vZEludmVyc2UoaikubXVsdGlwbHkocC5hZGQocS5tdWx0aXBseShpKSkpLm1vZChqKTtyZXR1cm4gdGhpcy5zZXJpYWxpemVTaWcoaSx2KX07dGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24oaixpKXtyZXR1cm4gdGhpcy52ZXJpZnlIZXgoaixpLHRoaXMucHViS2V5SGV4KX07dGhpcy52ZXJpZnlIZXg9ZnVuY3Rpb24obSxpLHApe3ZhciBsLGo7dmFyIG89S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXgoaSk7bD1vLnI7aj1vLnM7dmFyIGs7az1FQ1BvaW50RnAuZGVjb2RlRnJvbUhleCh0aGlzLmVjcGFyYW1zLmN1cnZlLHApO3ZhciBuPW5ldyBCaWdJbnRlZ2VyKG0sMTYpO3JldHVybiB0aGlzLnZlcmlmeVJhdyhuLGwsaixrKX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24obyxwLGope3ZhciBsLGk7aWYoQml0Y29pbi5VdGlsLmlzQXJyYXkocCkpe3ZhciBuPXRoaXMucGFyc2VTaWcocCk7bD1uLnI7aT1uLnN9ZWxzZXtpZihcIm9iamVjdFwiPT09dHlwZW9mIHAmJnAuciYmcC5zKXtsPXAucjtpPXAuc31lbHNle3Rocm93XCJJbnZhbGlkIHZhbHVlIGZvciBzaWduYXR1cmVcIn19dmFyIGs7aWYoaiBpbnN0YW5jZW9mIEVDUG9pbnRGcCl7az1qfWVsc2V7aWYoQml0Y29pbi5VdGlsLmlzQXJyYXkoaikpe2s9RUNQb2ludEZwLmRlY29kZUZyb20odGhpcy5lY3BhcmFtcy5jdXJ2ZSxqKX1lbHNle3Rocm93XCJJbnZhbGlkIGZvcm1hdCBmb3IgcHVia2V5IHZhbHVlLCBtdXN0IGJlIGJ5dGUgYXJyYXkgb3IgRUNQb2ludEZwXCJ9fXZhciBtPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG8pO3JldHVybiB0aGlzLnZlcmlmeVJhdyhtLGwsaSxrKX07dGhpcy52ZXJpZnlSYXc9ZnVuY3Rpb24obyxpLHcsbSl7dmFyIGw9dGhpcy5lY3BhcmFtcy5uO3ZhciB1PXRoaXMuZWNwYXJhbXMuRztpZihpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8aS5jb21wYXJlVG8obCk+PTApe3JldHVybiBmYWxzZX1pZih3LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8dy5jb21wYXJlVG8obCk+PTApe3JldHVybiBmYWxzZX12YXIgcD13Lm1vZEludmVyc2UobCk7dmFyIGs9by5tdWx0aXBseShwKS5tb2QobCk7dmFyIGo9aS5tdWx0aXBseShwKS5tb2QobCk7dmFyIHE9dS5tdWx0aXBseShrKS5hZGQobS5tdWx0aXBseShqKSk7dmFyIHQ9cS5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGwpO3JldHVybiB0LmVxdWFscyhpKX07dGhpcy5zZXJpYWxpemVTaWc9ZnVuY3Rpb24oayxqKXt2YXIgbD1rLnRvQnl0ZUFycmF5U2lnbmVkKCk7dmFyIGk9ai50b0J5dGVBcnJheVNpZ25lZCgpO3ZhciBtPVtdO20ucHVzaCgyKTttLnB1c2gobC5sZW5ndGgpO209bS5jb25jYXQobCk7bS5wdXNoKDIpO20ucHVzaChpLmxlbmd0aCk7bT1tLmNvbmNhdChpKTttLnVuc2hpZnQobS5sZW5ndGgpO20udW5zaGlmdCg0OCk7cmV0dXJuIG19O3RoaXMucGFyc2VTaWc9ZnVuY3Rpb24obil7dmFyIG07aWYoblswXSE9NDgpe3Rocm93IG5ldyBFcnJvcihcIlNpZ25hdHVyZSBub3QgYSB2YWxpZCBERVJTZXF1ZW5jZVwiKX1tPTI7aWYoblttXSE9Mil7dGhyb3cgbmV3IEVycm9yKFwiRmlyc3QgZWxlbWVudCBpbiBzaWduYXR1cmUgbXVzdCBiZSBhIERFUkludGVnZXJcIil9dmFyIGw9bi5zbGljZShtKzIsbSsyK25bbSsxXSk7bSs9MituW20rMV07aWYoblttXSE9Mil7dGhyb3cgbmV3IEVycm9yKFwiU2Vjb25kIGVsZW1lbnQgaW4gc2lnbmF0dXJlIG11c3QgYmUgYSBERVJJbnRlZ2VyXCIpfXZhciBpPW4uc2xpY2UobSsyLG0rMituW20rMV0pO20rPTIrblttKzFdO3ZhciBrPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKGwpO3ZhciBqPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKGkpO3JldHVybntyOmssczpqfX07dGhpcy5wYXJzZVNpZ0NvbXBhY3Q9ZnVuY3Rpb24obSl7aWYobS5sZW5ndGghPT02NSl7dGhyb3dcIlNpZ25hdHVyZSBoYXMgdGhlIHdyb25nIGxlbmd0aFwifXZhciBqPW1bMF0tMjc7aWYoajwwfHxqPjcpe3Rocm93XCJJbnZhbGlkIHNpZ25hdHVyZSB0eXBlXCJ9dmFyIG89dGhpcy5lY3BhcmFtcy5uO3ZhciBsPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0uc2xpY2UoMSwzMykpLm1vZChvKTt2YXIgaz1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChtLnNsaWNlKDMzLDY1KSkubW9kKG8pO3JldHVybntyOmwsczprLGk6an19O2lmKGghPT11bmRlZmluZWQpe2lmKGguY3VydmUhPT11bmRlZmluZWQpe3RoaXMuY3VydmVOYW1lPWguY3VydmV9fWlmKHRoaXMuY3VydmVOYW1lPT09dW5kZWZpbmVkKXt0aGlzLmN1cnZlTmFtZT1lfXRoaXMuc2V0TmFtZWRDdXJ2ZSh0aGlzLmN1cnZlTmFtZSk7aWYoaCE9PXVuZGVmaW5lZCl7aWYoaC5wcnYhPT11bmRlZmluZWQpe3RoaXMuc2V0UHJpdmF0ZUtleUhleChoLnBydil9aWYoaC5wdWIhPT11bmRlZmluZWQpe3RoaXMuc2V0UHVibGljS2V5SGV4KGgucHViKX19fTtLSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleD1mdW5jdGlvbihhKXt2YXIgYj1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlMoYSk7dmFyIGQ9bmV3IEJpZ0ludGVnZXIoYi5yLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihiLnMsMTYpO3JldHVybntyOmQsczpjfX07S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXhJbkhleFJTPWZ1bmN0aW9uKGMpe2lmKGMuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcInNpZ25hdHVyZSBpcyBub3QgYSBBU04uMSBzZXF1ZW5jZVwifXZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7aWYoYi5sZW5ndGghPTIpe3Rocm93XCJudW1iZXIgb2Ygc2lnbmF0dXJlIEFTTi4xIHNlcXVlbmNlIGVsZW1lbnRzIHNlZW0gd3JvbmdcIn12YXIgZz1iWzBdO3ZhciBmPWJbMV07aWYoYy5zdWJzdHIoZywyKSE9XCIwMlwiKXt0aHJvd1wiMXN0IGl0ZW0gb2Ygc2VxdWVuZSBvZiBzaWduYXR1cmUgaXMgbm90IEFTTi4xIGludGVnZXJcIn1pZihjLnN1YnN0cihmLDIpIT1cIjAyXCIpe3Rocm93XCIybmQgaXRlbSBvZiBzZXF1ZW5lIG9mIHNpZ25hdHVyZSBpcyBub3QgQVNOLjEgaW50ZWdlclwifXZhciBlPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsZyk7dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxmKTtyZXR1cm57cjplLHM6ZH19O0tKVVIuY3J5cHRvLkVDRFNBLmFzbjFTaWdUb0NvbmNhdFNpZz1mdW5jdGlvbihjKXt2YXIgZD1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlMoYyk7dmFyIGI9ZC5yO3ZhciBhPWQucztpZihiLnN1YnN0cigwLDIpPT1cIjAwXCImJigoKGIubGVuZ3RoLzIpKjgpJSgxNio4KSk9PTgpe2I9Yi5zdWJzdHIoMil9aWYoYS5zdWJzdHIoMCwyKT09XCIwMFwiJiYoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpPT04KXthPWEuc3Vic3RyKDIpfWlmKCgoKGIubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyByIGxlbmd0aCBlcnJvclwifWlmKCgoKGEubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyBzIGxlbmd0aCBlcnJvclwifXJldHVybiBiK2F9O0tKVVIuY3J5cHRvLkVDRFNBLmNvbmNhdFNpZ1RvQVNOMVNpZz1mdW5jdGlvbihhKXtpZigoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpIT0wKXt0aHJvd1widW5rbm93biBFQ0RTQSBjb25jYXRpbmF0ZWQgci1zIHNpZyAgbGVuZ3RoIGVycm9yXCJ9dmFyIGM9YS5zdWJzdHIoMCxhLmxlbmd0aC8yKTt2YXIgYj1hLnN1YnN0cihhLmxlbmd0aC8yKTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWcoYyxiKX07S0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWc9ZnVuY3Rpb24oYixhKXt2YXIgZD1uZXcgQmlnSW50ZWdlcihiLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihhLDE2KTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuYmlSU1NpZ1RvQVNOMVNpZyhkLGMpfTtLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnPWZ1bmN0aW9uKGUsYyl7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6ZX0pO3ZhciBhPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmN9KTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbYixhXX0pO3JldHVybiBkLmdldEVuY29kZWRIZXgoKX07XG4vKiEgZWNwYXJhbS0xLjAuMC5qcyAoYykgMjAxMyBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREI9bmV3IGZ1bmN0aW9uKCl7dmFyIGI9e307dmFyIGM9e307ZnVuY3Rpb24gYShkKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoZCwxNil9dGhpcy5nZXRCeU5hbWU9ZnVuY3Rpb24oZSl7dmFyIGQ9ZTtpZih0eXBlb2YgY1tkXSE9XCJ1bmRlZmluZWRcIil7ZD1jW2VdfWlmKHR5cGVvZiBiW2RdIT1cInVuZGVmaW5lZFwiKXtyZXR1cm4gYltkXX10aHJvd1widW5yZWdpc3RlcmVkIEVDIGN1cnZlIG5hbWU6IFwiK2R9O3RoaXMucmVnaXN0PWZ1bmN0aW9uKEEsbCxvLGcsbSxlLGosZixrLHUsZCx4KXtiW0FdPXt9O3ZhciBzPWEobyk7dmFyIHo9YShnKTt2YXIgeT1hKG0pO3ZhciB0PWEoZSk7dmFyIHc9YShqKTt2YXIgcj1uZXcgRUNDdXJ2ZUZwKHMseix5KTt2YXIgcT1yLmRlY29kZVBvaW50SGV4KFwiMDRcIitmK2spO2JbQV1bXCJuYW1lXCJdPUE7YltBXVtcImtleWxlblwiXT1sO2JbQV1bXCJjdXJ2ZVwiXT1yO2JbQV1bXCJHXCJdPXE7YltBXVtcIm5cIl09dDtiW0FdW1wiaFwiXT13O2JbQV1bXCJvaWRcIl09ZDtiW0FdW1wiaW5mb1wiXT14O2Zvcih2YXIgdj0wO3Y8dS5sZW5ndGg7disrKXtjW3Vbdl1dPUF9fX07S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTI4cjFcIiwxMjgsXCJGRkZGRkZGREZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIkU4NzU3OUMxMTA3OUY0M0REODI0OTkzQzJDRUU1RUQzXCIsXCJGRkZGRkZGRTAwMDAwMDAwNzVBMzBEMUI5MDM4QTExNVwiLFwiMVwiLFwiMTYxRkY3NTI4Qjg5OUIyRDBDMjg2MDdDQTUyQzVCODZcIixcIkNGNUFDODM5NUJBRkVCMTNDMDJEQTI5MkRERUQ3QTgzXCIsW10sXCJcIixcInNlY3AxMjhyMSA6IFNFQ0cgY3VydmUgb3ZlciBhIDEyOCBiaXQgcHJpbWUgZmllbGRcIik7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTYwazFcIiwxNjAsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZBQzczXCIsXCIwXCIsXCI3XCIsXCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAxQjhGQTE2REZBQjlBQ0ExNkI2QjNcIixcIjFcIixcIjNCNEMzODJDRTM3QUExOTJBNDAxOUU3NjMwMzZGNEY1REQ0RDdFQkJcIixcIjkzOENGOTM1MzE4RkRDRUQ2QkMyODI4NjUzMTczM0MzRjAzQzRGRUVcIixbXSxcIlwiLFwic2VjcDE2MGsxIDogU0VDRyBjdXJ2ZSBvdmVyIGEgMTYwIGJpdCBwcmltZSBmaWVsZFwiKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxNjByMVwiLDE2MCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkNcIixcIjFDOTdCRUZDNTRCRDdBOEI2NUFDRjg5RjgxRDRENEFEQzU2NUZBNDVcIixcIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDFGNEM4RjkyN0FFRDNDQTc1MjI1N1wiLFwiMVwiLFwiNEE5NkI1Njg4RUY1NzMyODQ2NjQ2OTg5NjhDMzhCQjkxM0NCRkM4MlwiLFwiMjNBNjI4NTUzMTY4OTQ3RDU5RENDOTEyMDQyMzUxMzc3QUM1RkIzMlwiLFtdLFwiXCIsXCJzZWNwMTYwcjEgOiBTRUNHIGN1cnZlIG92ZXIgYSAxNjAgYml0IHByaW1lIGZpZWxkXCIpO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE5MmsxXCIsMTkyLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZFRTM3XCIsXCIwXCIsXCIzXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkUyNkYyRkMxNzBGNjk0NjZBNzRERUZEOERcIixcIjFcIixcIkRCNEZGMTBFQzA1N0U5QUUyNkIwN0QwMjgwQjdGNDM0MURBNUQxQjFFQUUwNkM3RFwiLFwiOUIyRjJGNkQ5QzU2MjhBNzg0NDE2M0QwMTVCRTg2MzQ0MDgyQUE4OEQ5NUUyRjlEXCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE5MnIxXCIsMTkyLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkNcIixcIjY0MjEwNTE5RTU5QzgwRTcwRkE3RTlBQjcyMjQzMDQ5RkVCOERFRUNDMTQ2QjlCMVwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGOTlERUY4MzYxNDZCQzlCMUI0RDIyODMxXCIsXCIxXCIsXCIxODhEQTgwRUIwMzA5MEY2N0NCRjIwRUI0M0ExODgwMEY0RkYwQUZEODJGRjEwMTJcIixcIjA3MTkyQjk1RkZDOERBNzg2MzEwMTFFRDZCMjRDREQ1NzNGOTc3QTExRTc5NDgxMVwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AyMjRyMVwiLDIyNCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRVwiLFwiQjQwNTBBODUwQzA0QjNBQkY1NDEzMjU2NTA0NEIwQjdEN0JGRDhCQTI3MEIzOTQzMjM1NUZGQjRcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYxNkEyRTBCOEYwM0UxM0REMjk0NTVDNUMyQTNEXCIsXCIxXCIsXCJCNzBFMENCRDZCQjRCRjdGMzIxMzkwQjk0QTAzQzFEMzU2QzIxMTIyMzQzMjgwRDYxMTVDMUQyMVwiLFwiQkQzNzYzODhCNUY3MjNGQjRDMjJERkU2Q0Q0Mzc1QTA1QTA3NDc2NDQ0RDU4MTk5ODUwMDdFMzRcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMjU2azFcIiwyNTYsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGQzJGXCIsXCIwXCIsXCI3XCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUJBQUVEQ0U2QUY0OEEwM0JCRkQyNUU4Q0QwMzY0MTQxXCIsXCIxXCIsXCI3OUJFNjY3RUY5RENCQkFDNTVBMDYyOTVDRTg3MEIwNzAyOUJGQ0RCMkRDRTI4RDk1OUYyODE1QjE2RjgxNzk4XCIsXCI0ODNBREE3NzI2QTNDNDY1NURBNEZCRkMwRTExMDhBOEZEMTdCNDQ4QTY4NTU0MTk5QzQ3RDA4RkZCMTBENEI4XCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDI1NnIxXCIsMjU2LFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiLFwiNUFDNjM1RDhBQTNBOTNFN0IzRUJCRDU1NzY5ODg2QkM2NTFEMDZCMENDNTNCMEY2M0JDRTNDM0UyN0QyNjA0QlwiLFwiRkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZCQ0U2RkFBREE3MTc5RTg0RjNCOUNBQzJGQzYzMjU1MVwiLFwiMVwiLFwiNkIxN0QxRjJFMTJDNDI0N0Y4QkNFNkU1NjNBNDQwRjI3NzAzN0Q4MTJERUIzM0EwRjRBMTM5NDVEODk4QzI5NlwiLFwiNEZFMzQyRTJGRTFBN0Y5QjhFRTdFQjRBN0MwRjlFMTYyQkNFMzM1NzZCMzE1RUNFQ0JCNjQwNjgzN0JGNTFGNVwiLFtcIk5JU1QgUC0yNTZcIixcIlAtMjU2XCIsXCJwcmltZTI1NnYxXCJdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AzODRyMVwiLDM4NCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZDXCIsXCJCMzMxMkZBN0UyM0VFN0U0OTg4RTA1NkJFM0Y4MkQxOTE4MUQ5QzZFRkU4MTQxMTIwMzE0MDg4RjUwMTM4NzVBQzY1NjM5OEQ4QTJFRDE5RDJBODVDOEVERDNFQzJBRUZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkM3NjM0RDgxRjQzNzJEREY1ODFBMERCMjQ4QjBBNzdBRUNFQzE5NkFDQ0M1Mjk3M1wiLFwiMVwiLFwiQUE4N0NBMjJCRThCMDUzNzhFQjFDNzFFRjMyMEFENzQ2RTFEM0I2MjhCQTc5Qjk4NTlGNzQxRTA4MjU0MkEzODU1MDJGMjVEQkY1NTI5NkMzQTU0NUUzODcyNzYwQUI3XCIsXCIzNjE3ZGU0YTk2MjYyYzZmNWQ5ZTk4YmY5MjkyZGMyOWY4ZjQxZGJkMjg5YTE0N2NlOWRhMzExM2I1ZjBiOGMwMGE2MGIxY2UxZDdlODE5ZDdhNDMxZDdjOTBlYTBlNWZcIixbXCJOSVNUIFAtMzg0XCIsXCJQLTM4NFwiXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwNTIxcjFcIiw1MjEsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIjA1MTk1M0VCOTYxOEUxQzlBMUY5MjlBMjFBMEI2ODU0MEVFQTJEQTcyNUI5OUIzMTVGM0I4QjQ4OTkxOEVGMTA5RTE1NjE5Mzk1MUVDN0U5MzdCMTY1MkMwQkQzQkIxQkYwNzM1NzNERjg4M0QyQzM0RjFFRjQ1MUZENDZCNTAzRjAwXCIsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZBNTE4Njg3ODNCRjJGOTY2QjdGQ0MwMTQ4RjcwOUE1RDAzQkI1QzlCODg5OUM0N0FFQkI2RkI3MUU5MTM4NjQwOVwiLFwiMVwiLFwiQzY4NThFMDZCNzA0MDRFOUNEOUUzRUNCNjYyMzk1QjQ0MjlDNjQ4MTM5MDUzRkI1MjFGODI4QUY2MDZCNEQzREJBQTE0QjVFNzdFRkU3NTkyOEZFMURDMTI3QTJGRkE4REUzMzQ4QjNDMTg1NkE0MjlCRjk3RTdFMzFDMkU1QkQ2NlwiLFwiMDExODM5Mjk2YTc4OWEzYmMwMDQ1YzhhNWZiNDJjN2QxYmQ5OThmNTQ0NDk1NzliNDQ2ODE3YWZiZDE3MjczZTY2MmM5N2VlNzI5OTVlZjQyNjQwYzU1MGI5MDEzZmFkMDc2MTM1M2M3MDg2YTI3MmMyNDA4OGJlOTQ3NjlmZDE2NjUwXCIsW1wiTklTVCBQLTUyMVwiLFwiUC01MjFcIl0pO1xuLyohIGRzYS1tb2RpZmllZC0xLjAuMS5qcyAoYykgUmVjdXJpdHkgTGFicyBHbWJILCBLZW5qaSBVcnVzaGltbWEgfCBnaXRodWIuY29tL29wZW5wZ3Bqcy9vcGVucGdwanMvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkRTQT1mdW5jdGlvbigpe3RoaXMucD1udWxsO3RoaXMucT1udWxsO3RoaXMuZz1udWxsO3RoaXMueT1udWxsO3RoaXMueD1udWxsO3RoaXMudHlwZT1cIkRTQVwiO3RoaXMuc2V0UHJpdmF0ZT1mdW5jdGlvbih6LHcsdixBLHUpe3RoaXMuaXNQcml2YXRlPXRydWU7dGhpcy5wPXo7dGhpcy5xPXc7dGhpcy5nPXY7dGhpcy55PUE7dGhpcy54PXV9O3RoaXMuc2V0UHVibGljPWZ1bmN0aW9uKHcsdix1LHope3RoaXMuaXNQdWJsaWM9dHJ1ZTt0aGlzLnA9dzt0aGlzLnE9djt0aGlzLmc9dTt0aGlzLnk9ejt0aGlzLng9bnVsbH07dGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKHope3ZhciB2PXRoaXMucDt2YXIgdT10aGlzLnE7dmFyIEM9dGhpcy5nO3ZhciBEPXRoaXMueTt2YXIgRT10aGlzLng7dmFyIEE9ei5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBCPW5ldyBCaWdJbnRlZ2VyKHosMTYpO3ZhciB3PW4oQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKSx1LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7dmFyIEc9KEMubW9kUG93KHcsdikpLm1vZCh1KTt2YXIgRj0ody5tb2RJbnZlcnNlKHUpLm11bHRpcGx5KEIuYWRkKEUubXVsdGlwbHkoRykpKSkubW9kKHUpO3ZhciBIPUtKVVIuYXNuMS5BU04xVXRpbC5qc29uVG9BU04xSEVYKHtzZXE6W3tcImludFwiOntiaWdpbnQ6R319LHtcImludFwiOntiaWdpbnQ6Rn19XX0pO3JldHVybiBIfTt0aGlzLnZlcmlmeVdpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihDLEIpe3ZhciB6PXRoaXMucDt2YXIgdT10aGlzLnE7dmFyIEc9dGhpcy5nO3ZhciBIPXRoaXMueTt2YXIgRT10aGlzLnBhcnNlQVNOMVNpZ25hdHVyZShCKTt2YXIgSz1FWzBdO3ZhciBKPUVbMV07dmFyIEM9Qy5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBEPW5ldyBCaWdJbnRlZ2VyKEMsMTYpO2lmKEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSyk+MHx8Sy5jb21wYXJlVG8odSk+MHx8QmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhKKT4wfHxKLmNvbXBhcmVUbyh1KT4wKXt0aHJvd1wiaW52YWxpZCBEU0Egc2lnbmF0dXJlXCJ9dmFyIEk9Si5tb2RJbnZlcnNlKHUpO3ZhciBBPUQubXVsdGlwbHkoSSkubW9kKHUpO3ZhciB2PUsubXVsdGlwbHkoSSkubW9kKHUpO3ZhciBGPUcubW9kUG93KEEseikubXVsdGlwbHkoSC5tb2RQb3codix6KSkubW9kKHopLm1vZCh1KTtyZXR1cm4gRi5jb21wYXJlVG8oSyk9PTB9O3RoaXMucGFyc2VBU04xU2lnbmF0dXJlPWZ1bmN0aW9uKHUpe3RyeXt2YXIgeT1uZXcgQmlnSW50ZWdlcihBU04xSEVYLmdldFZieUxpc3QodSwwLFswXSxcIjAyXCIpLDE2KTt2YXIgdj1uZXcgQmlnSW50ZWdlcihBU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpLDE2KTtyZXR1cm5beSx2XX1jYXRjaCh3KXt0aHJvd1wibWFsZm9ybWVkIERTQSBzaWduYXR1cmVcIn19O2Z1bmN0aW9uIGQoRSx3LEIsdix1LEMpe3ZhciB6PUtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyh3LEUudG9Mb3dlckNhc2UoKSk7dmFyIHo9ei5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBBPW5ldyBCaWdJbnRlZ2VyKHosMTYpO3ZhciB5PW4oQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKSx1LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7dmFyIEY9KEIubW9kUG93KHksdikpLm1vZCh1KTt2YXIgRD0oeS5tb2RJbnZlcnNlKHUpLm11bHRpcGx5KEEuYWRkKEMubXVsdGlwbHkoRikpKSkubW9kKHUpO3ZhciBHPW5ldyBBcnJheSgpO0dbMF09RjtHWzFdPUQ7cmV0dXJuIEd9ZnVuY3Rpb24gcih2KXt2YXIgdT1vcGVucGdwLmNvbmZpZy5jb25maWcucHJlZmVyX2hhc2hfYWxnb3JpdGhtO3N3aXRjaChNYXRoLnJvdW5kKHYuYml0TGVuZ3RoKCkvOCkpe2Nhc2UgMjA6aWYodSE9MiYmdT4xMSYmdSE9MTAmJnU8OCl7cmV0dXJuIDJ9cmV0dXJuIHU7Y2FzZSAyODppZih1PjExJiZ1PDgpe3JldHVybiAxMX1yZXR1cm4gdTtjYXNlIDMyOmlmKHU+MTAmJnU8OCl7cmV0dXJuIDh9cmV0dXJuIHU7ZGVmYXVsdDp1dGlsLnByaW50X2RlYnVnKFwiRFNBIHNlbGVjdCBoYXNoIGFsZ29yaXRobTogcmV0dXJuaW5nIG51bGwgZm9yIGFuIHVua25vd24gbGVuZ3RoIG9mIHFcIik7cmV0dXJuIG51bGx9fXRoaXMuc2VsZWN0X2hhc2hfYWxnb3JpdGhtPXI7ZnVuY3Rpb24gbShJLEssSixCLHosdSxGLEcpe3ZhciBDPUtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhCLEkudG9Mb3dlckNhc2UoKSk7dmFyIEM9Qy5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBEPW5ldyBCaWdJbnRlZ2VyKEMsMTYpO2lmKEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSyk+MHx8Sy5jb21wYXJlVG8odSk+MHx8QmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhKKT4wfHxKLmNvbXBhcmVUbyh1KT4wKXt1dGlsLnByaW50X2Vycm9yKFwiaW52YWxpZCBEU0EgU2lnbmF0dXJlXCIpO3JldHVybiBudWxsfXZhciBIPUoubW9kSW52ZXJzZSh1KTt2YXIgQT1ELm11bHRpcGx5KEgpLm1vZCh1KTt2YXIgdj1LLm11bHRpcGx5KEgpLm1vZCh1KTt2YXIgRT1GLm1vZFBvdyhBLHopLm11bHRpcGx5KEcubW9kUG93KHYseikpLm1vZCh6KS5tb2QodSk7cmV0dXJuIEUuY29tcGFyZVRvKEspPT0wfWZ1bmN0aW9uIGEoeil7dmFyIEE9bmV3IEJpZ0ludGVnZXIoeixwcmltZUNlbnRlcmllKTt2YXIgeT1qKHEsNTEyKTt2YXIgdT10KHAscSx6KTt2YXIgdjtkb3t2PW5ldyBCaWdJbnRlZ2VyKHEuYml0Q291bnQoKSxyYW5kKX13aGlsZSh4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pIT0xJiZ4LmNvbXBhcmVUbyhxKSE9LTEpO3ZhciB3PWcubW9kUG93KHgscCk7cmV0dXJue3g6dixxOkEscDp5LGc6dSx5Ond9fWZ1bmN0aW9uIGooeSx6LHcpe2lmKHolNjQhPTApe3JldHVybiBmYWxzZX12YXIgdTt2YXIgdjtkb3t1PXcoYml0Y291bnQsdHJ1ZSk7dj11LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt1PXUuc3VidHJhY3Qodi5yZW1haW5kZXIoeSkpfXdoaWxlKCF1LmlzUHJvYmFibGVQcmltZShwcmltZUNlbnRlcmllKXx8dS5iaXRMZW5ndGgoKSE9bCk7cmV0dXJuIHV9ZnVuY3Rpb24gdChCLHosQSx3KXt2YXIgdT1CLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgeT11LmRpdmlkZSh6KTt2YXIgdjtkb3t2PXcoQSl9d2hpbGUodi5jb21wYXJlVG8odSkhPS0xJiZ2LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTEpO3JldHVybiB2Lm1vZFBvdyh5LEIpfWZ1bmN0aW9uIG8odyx5LHUpe3ZhciB2O2Rve3Y9dSh5LGZhbHNlKX13aGlsZSh2LmNvbXBhcmVUbyh3KSE9LTEmJnYuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykhPTEpO3JldHVybiB2fWZ1bmN0aW9uIGkodix3KXtrPW8odik7dmFyIHU9Zy5tb2RQb3coayx3KS5tb2Qodik7cmV0dXJuIHV9ZnVuY3Rpb24gaChCLHcseSx2LHosdSl7dmFyIEE9Qih2KTtzPSh3Lm1vZEludmVyc2UoeikubXVsdGlwbHkoQS5hZGQodS5tdWx0aXBseSh5KSkpKS5tb2Qoeik7cmV0dXJuIHN9dGhpcy5zaWduPWQ7dGhpcy52ZXJpZnk9bTtmdW5jdGlvbiBuKHcsdSl7aWYodS5jb21wYXJlVG8odyk8PTApe3JldHVybn12YXIgdj11LnN1YnRyYWN0KHcpO3ZhciB5PWUodi5iaXRMZW5ndGgoKSk7d2hpbGUoeT52KXt5PWUodi5iaXRMZW5ndGgoKSl9cmV0dXJuIHcuYWRkKHkpfWZ1bmN0aW9uIGUodyl7aWYodzwwKXtyZXR1cm4gbnVsbH12YXIgdT1NYXRoLmZsb29yKCh3KzcpLzgpO3ZhciB2PWModSk7aWYodyU4PjApe3Y9U3RyaW5nLmZyb21DaGFyQ29kZSgoTWF0aC5wb3coMix3JTgpLTEpJnYuY2hhckNvZGVBdCgwKSkrdi5zdWJzdHJpbmcoMSl9cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGYodiksMTYpfWZ1bmN0aW9uIGModyl7dmFyIHU9XCJcIjtmb3IodmFyIHY9MDt2PHc7disrKXt1Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGIoKSl9cmV0dXJuIHV9ZnVuY3Rpb24gYigpe3ZhciB1PW5ldyBVaW50MzJBcnJheSgxKTt3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1KTtyZXR1cm4gdVswXSYyNTV9ZnVuY3Rpb24gZih5KXtpZih5PT1udWxsKXtyZXR1cm5cIlwifXZhciB2PVtdO3ZhciB3PXkubGVuZ3RoO3ZhciB6PTA7dmFyIHU7d2hpbGUoejx3KXt1PXlbeisrXS5jaGFyQ29kZUF0KCkudG9TdHJpbmcoMTYpO3doaWxlKHUubGVuZ3RoPDIpe3U9XCIwXCIrdX12LnB1c2goXCJcIit1KX1yZXR1cm4gdi5qb2luKFwiXCIpfXRoaXMuZ2V0UmFuZG9tQmlnSW50ZWdlckluUmFuZ2U9bjt0aGlzLmdldFJhbmRvbUJpZ0ludGVnZXI9ZTt0aGlzLmdldFJhbmRvbUJ5dGVzPWN9O1xuLyohIHBrY3M1cGtleS0xLjAuNi5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBQS0NTNVBLRVk9ZnVuY3Rpb24oKXt2YXIgYz1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGkoQ3J5cHRvSlMuQUVTLG4scCxvKX07dmFyIGQ9ZnVuY3Rpb24obixwLG8pe3JldHVybiBpKENyeXB0b0pTLlRyaXBsZURFUyxuLHAsbyl9O3ZhciBpPWZ1bmN0aW9uKHEsdixzLG8pe3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHU9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShzKTt2YXIgbj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKG8pO3ZhciByPXt9O3Iua2V5PXU7ci5pdj1uO3IuY2lwaGVydGV4dD1wO3ZhciB0PXEuZGVjcnlwdChyLHUse2l2Om59KTtyZXR1cm4gQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodCl9O3ZhciBqPWZ1bmN0aW9uKG4scCxvKXtyZXR1cm4gZShDcnlwdG9KUy5BRVMsbixwLG8pfTt2YXIgbT1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGUoQ3J5cHRvSlMuVHJpcGxlREVTLG4scCxvKX07dmFyIGU9ZnVuY3Rpb24ocyx4LHYscCl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocCk7dmFyIG49e307dmFyIHU9cy5lbmNyeXB0KHIsdyx7aXY6b30pO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodS50b1N0cmluZygpKTt2YXIgdD1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShxKTtyZXR1cm4gdH07dmFyIGc9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpjLGVwcm9jOmosa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6YyxlcHJvYzpqLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmMsZXByb2M6aixrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZCxlcHJvYzptLGtleWxlbjoyNCxpdmxlbjo4fX07dmFyIGI9ZnVuY3Rpb24obil7cmV0dXJuIGdbbl1bXCJwcm9jXCJdfTt2YXIgaz1mdW5jdGlvbihuKXt2YXIgcD1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbShuKTt2YXIgbz1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShwKTtyZXR1cm4gb307dmFyIGw9ZnVuY3Rpb24ocSl7dmFyIHI9e307aWYocS5tYXRjaChuZXcgUmVnRXhwKFwiREVLLUluZm86IChbXixdKyksKFswLTlBLUZhLWZdKylcIixcIm1cIikpKXtyLmNpcGhlcj1SZWdFeHAuJDE7ci5pdnNhbHQ9UmVnRXhwLiQyfWlmKHEubWF0Y2gobmV3IFJlZ0V4cChcIi0tLS0tQkVHSU4gKFtBLVpdKykgUFJJVkFURSBLRVktLS0tLVwiKSkpe3IudHlwZT1SZWdFeHAuJDF9dmFyIHA9LTE7dmFyIHQ9MDtpZihxLmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIikhPS0xKXtwPXEuaW5kZXhPZihcIlxcclxcblxcclxcblwiKTt0PTJ9aWYocS5pbmRleE9mKFwiXFxuXFxuXCIpIT0tMSl7cD1xLmluZGV4T2YoXCJcXG5cXG5cIik7dD0xfXZhciBvPXEuaW5kZXhPZihcIi0tLS0tRU5EXCIpO2lmKHAhPS0xJiZvIT0tMSl7dmFyIG49cS5zdWJzdHJpbmcocCt0KjIsby10KTtuPW4ucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3IuZGF0YT1ufXJldHVybiByfTt2YXIgaD1mdW5jdGlvbihvLHcsbil7dmFyIHQ9bi5zdWJzdHJpbmcoMCwxNik7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh0KTt2YXIgcD1DcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh3KTt2YXIgcz1nW29dW1wia2V5bGVuXCJdK2dbb11bXCJpdmxlblwiXTt2YXIgdj1cIlwiO3ZhciB1PW51bGw7Zm9yKDs7KXt2YXIgcT1DcnlwdG9KUy5hbGdvLk1ENS5jcmVhdGUoKTtpZih1IT1udWxsKXtxLnVwZGF0ZSh1KX1xLnVwZGF0ZShwKTtxLnVwZGF0ZShyKTt1PXEuZmluYWxpemUoKTt2PXYrQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodSk7aWYodi5sZW5ndGg+PXMqMil7YnJlYWt9fXZhciB4PXt9O3gua2V5aGV4PXYuc3Vic3RyKDAsZ1tvXVtcImtleWxlblwiXSoyKTt4Lml2aGV4PXYuc3Vic3RyKGdbb11bXCJrZXlsZW5cIl0qMixnW29dW1wiaXZsZW5cIl0qMik7cmV0dXJuIHh9O3ZhciBhPWZ1bmN0aW9uKG4sdCxwLHUpe3ZhciBxPUNyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2Uobik7dmFyIG89Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocSk7dmFyIHM9Z1t0XVtcInByb2NcIl07dmFyIHI9cyhvLHAsdSk7cmV0dXJuIHJ9O3ZhciBmPWZ1bmN0aW9uKG4scSxvLHMpe3ZhciBwPWdbcV1bXCJlcHJvY1wiXTt2YXIgcj1wKG4sbyxzKTtyZXR1cm4gcn07cmV0dXJue3ZlcnNpb246XCIxLjAuNVwiLGdldEhleEZyb21QRU06ZnVuY3Rpb24obyxyKXt2YXIgcD1vO2lmKHAuaW5kZXhPZihcIkJFR0lOIFwiK3IpPT0tMSl7dGhyb3dcImNhbid0IGZpbmQgUEVNIGhlYWRlcjogXCIrcn1wPXAucmVwbGFjZShcIi0tLS0tQkVHSU4gXCIrcitcIi0tLS0tXCIsXCJcIik7cD1wLnJlcGxhY2UoXCItLS0tLUVORCBcIityK1wiLS0tLS1cIixcIlwiKTt2YXIgcT1wLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgbj1iNjR0b2hleChxKTtyZXR1cm4gbn0sZ2V0RGVjcnlwdGVkS2V5SGV4QnlLZXlJVjpmdW5jdGlvbihvLHIscSxwKXt2YXIgbj1iKHIpO3JldHVybiBuKG8scSxwKX0scGFyc2VQS0NTNVBFTTpmdW5jdGlvbihuKXtyZXR1cm4gbChuKX0sZ2V0S2V5QW5kVW51c2VkSXZCeVBhc3Njb2RlQW5kSXZzYWx0OmZ1bmN0aW9uKG8sbixwKXtyZXR1cm4gaChvLG4scCl9LGRlY3J5cHRLZXlCNjQ6ZnVuY3Rpb24obixwLG8scSl7cmV0dXJuIGEobixwLG8scSl9LGdldERlY3J5cHRlZEtleUhleDpmdW5jdGlvbih3LHYpe3ZhciBvPWwodyk7dmFyIHI9by50eXBlO3ZhciBwPW8uY2lwaGVyO3ZhciBuPW8uaXZzYWx0O3ZhciBxPW8uZGF0YTt2YXIgdT1oKHAsdixuKTt2YXIgdD11LmtleWhleDt2YXIgcz1hKHEscCx0LG4pO3JldHVybiBzfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzVQRU06ZnVuY3Rpb24ocCxvKXt2YXIgcT10aGlzLmdldERlY3J5cHRlZEtleUhleChwLG8pO3ZhciBuPW5ldyBSU0FLZXkoKTtuLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcocSk7cmV0dXJuIG59LGdldEVyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXg6ZnVuY3Rpb24ocSx4LHIscCl7dmFyIG49XCJcIjtpZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7cj1cIkFFUy0yNTYtQ0JDXCJ9aWYodHlwZW9mIGdbcl09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJQS0NTNVBLRVkgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiBcIityfWlmKHR5cGVvZiBwPT1cInVuZGVmaW5lZFwifHxwPT1udWxsKXt2YXIgdD1nW3JdW1wiaXZsZW5cIl07dmFyIHM9ayh0KTtwPXMudG9VcHBlckNhc2UoKX12YXIgdz1oKHIseCxwKTt2YXIgdj13LmtleWhleDt2YXIgdT1mKHEscix2LHApO3ZhciBvPXUucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7dmFyIG49XCItLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tXFxyXFxuXCI7bis9XCJQcm9jLVR5cGU6IDQsRU5DUllQVEVEXFxyXFxuXCI7bis9XCJERUstSW5mbzogXCIrcitcIixcIitwK1wiXFxyXFxuXCI7bis9XCJcXHJcXG5cIjtuKz1vO24rPVwiXFxyXFxuLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtyZXR1cm4gbn0sZ2V0RXJ5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleTpmdW5jdGlvbihDLEQsbyxzKXt2YXIgQT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6MH0pO3ZhciB2PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMubn0pO3ZhciB6PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjpDLmV9KTt2YXIgQj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmR9KTt2YXIgdD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLnB9KTt2YXIgcj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLnF9KTt2YXIgeT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmRtcDF9KTt2YXIgdT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmRtcTF9KTt2YXIgeD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmNvZWZmfSk7dmFyIEU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W0Esdix6LEIsdCxyLHksdSx4XX0pO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmdldEVyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgodyxELG8scyl9LG5ld0VuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKG4sbyxyLHMpe2lmKHR5cGVvZiBvPT1cInVuZGVmaW5lZFwifHxvPT1udWxsKXtvPTEwMjR9aWYodHlwZW9mIHI9PVwidW5kZWZpbmVkXCJ8fHI9PW51bGwpe3I9XCIxMDAwMVwifXZhciBwPW5ldyBSU0FLZXkoKTtwLmdlbmVyYXRlKG8scik7dmFyIHE9bnVsbDtpZih0eXBlb2Ygcz09XCJ1bmRlZmluZWRcInx8cz09bnVsbCl7cT10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShwa2V5LG4pfWVsc2V7cT10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShwa2V5LG4scyl9cmV0dXJuIHF9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4UEVNOmZ1bmN0aW9uKHApe2lmKHAubWF0Y2goL0VOQ1JZUFRFRC8pKXt0aHJvd1wicGVtIHNoYWxsIGJlIG5vdCBFTkNSWVBURURcIn12YXIgbz10aGlzLmdldEhleEZyb21QRU0ocCxcIlBSSVZBVEUgS0VZXCIpO3ZhciBuPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgobyk7cmV0dXJuIG59LGdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTMpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDMgZWxlbWVudHM6IFwiK3AubGVuZ3RofXZhciBvPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzFdKTtpZihvIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWRlbnRpZmllciBpcyBub3QgcnNhRW5jOiBcIitvfXZhciBvPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzFdKTt2YXIgcj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHEscFsyXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoociwwKTt2YXIgbj1uZXcgUlNBS2V5KCk7bi5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHMpO3JldHVybiBufSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24odSl7dmFyIHE9e307dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSwwKTtpZihwLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDApLml0ZW1zICE9IDI6IFwiK3AubGVuZ3RofXEuY2lwaGVydGV4dD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih1LHBbMV0pO3ZhciB3PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUscFswXSk7aWYody5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjApLml0ZW1zICE9IDI6IFwiK3cubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsd1swXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBkXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQkVTMlwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUsd1sxXSk7aWYody5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrbi5sZW5ndGh9dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxuWzFdKTtpZihvLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjEpLml0ZW1zICE9IDI6IFwiK28ubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsb1swXSkhPVwiMmE4NjQ4ODZmNzBkMDMwN1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIFRyaXBsZURFU1wifXEuZW5jcnlwdGlvblNjaGVtZUFsZz1cIlRyaXBsZURFU1wiO3EuZW5jcnlwdGlvblNjaGVtZUlWPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsb1sxXSk7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxuWzBdKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjApLml0ZW1zICE9IDI6IFwiK3IubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsclswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBjXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQktERjJcIn12YXIgdj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LHJbMV0pO2lmKHYubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIrdi5sZW5ndGh9cS5wYmtkZjJTYWx0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsdlswXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSx2WzFdKTt0cnl7cS5wYmtkZjJJdGVyPXBhcnNlSW50KHMsMTYpfWNhdGNoKHQpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0IHBia2RmMkl0ZXI6IFwiK3N9cmV0dXJuIHF9LGdldFBCS0RGMktleUhleEZyb21QYXJhbTpmdW5jdGlvbihzLG4pe3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uocy5wYmtkZjJTYWx0KTt2YXIgbz1zLnBia2RmMkl0ZXI7dmFyIHE9Q3J5cHRvSlMuUEJLREYyKG4scix7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczpvfSk7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocSk7cmV0dXJuIHB9LGdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24odix3KXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0odixcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKTt2YXIgbj10aGlzLnBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTOChwKTt2YXIgcz1QS0NTNVBLRVkuZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtKG4sdyk7dmFyIHQ9e307dC5jaXBoZXJ0ZXh0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobi5jaXBoZXJ0ZXh0KTt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHMpO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobi5lbmNyeXB0aW9uU2NoZW1lSVYpO3ZhciB1PUNyeXB0b0pTLlRyaXBsZURFUy5kZWNyeXB0KHQscix7aXY6cX0pO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHUpO3JldHVybiBvfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocSxwKXt2YXIgbz10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocSxwKTt2YXIgbj10aGlzLmdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4KG8pO3JldHVybiBufSxnZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocSxvKXt2YXIgbj10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocSxvKTt2YXIgcD10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChuKTtyZXR1cm4gcH0scGFyc2VQbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgbz17fTtvLmFsZ3BhcmFtPW51bGw7aWYocS5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYocS5zdWJzdHIocFsxXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAzKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscFsxXSk7aWYobi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDQpXCJ9aWYocS5zdWJzdHIoblswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA1KVwifW8uYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblswXSk7aWYocS5zdWJzdHIoblsxXSwyKT09XCIwNlwiKXtvLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblsxXSl9aWYocS5zdWJzdHIocFsyXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA2KVwifW8ua2V5aWR4PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoocSxwWzJdKTtyZXR1cm4gb30sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFJJVkFURSBLRVlcIik7dmFyIHA9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgobik7cmV0dXJuIHB9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihuKXt2YXIgcD10aGlzLnBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXgobik7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3RoaXMucGFyc2VQcml2YXRlUmF3UlNBS2V5SGV4QXRPYmoobixwKTt2YXIgbz1wLmtleTt2YXIgcT1uZXcgUlNBS2V5KCk7cS5zZXRQcml2YXRlRXgoby5uLG8uZSxvLmQsby5wLG8ucSxvLmRwLG8uZHEsby5jbyk7cmV0dXJuIHF9ZWxzZXtpZihwLmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd0VDS2V5SGV4QXRPYmoobixwKTtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbcC5hbGdwYXJhbV09PT11bmRlZmluZWQpe3Rocm93XCJLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWUgdW5kZWZpbmVkOiBcIitwLmFsZ3BhcmFtfXZhciByPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXTt2YXIgcT1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnIscHJ2OnAua2V5fSk7cmV0dXJuIHF9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX0sZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFVCTElDIEtFWVwiKTt2YXIgbj10aGlzLmdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleChwKTtyZXR1cm4gbn0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFVCTElDIEtFWVwiKTt2YXIgbj10aGlzLmdldEtleUZyb21QdWJsaWNQS0NTOEhleChwKTtyZXR1cm4gbn0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMucGFyc2VQdWJsaWNQS0NTOEhleChvKTtpZihuLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dmFyIHI9dGhpcy5wYXJzZVB1YmxpY1Jhd1JTQUtleUhleChuLmtleSk7dmFyIHA9bmV3IFJTQUtleSgpO3Auc2V0UHVibGljKHIubixyLmUpO3JldHVybiBwfWVsc2V7aWYobi5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW24uYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrbi5hbGdwYXJhbX12YXIgcT1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbbi5hbGdwYXJhbV07dmFyIHA9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpxLHB1YjpuLmtleX0pO3JldHVybiBwfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnb3JpdGhtXCJ9fX0scGFyc2VQdWJsaWNSYXdSU0FLZXlIZXg6ZnVuY3Rpb24ocCl7dmFyIG49e307aWYocC5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDEpXCJ9dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocCwwKTtpZihvLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAyKVwifWlmKHAuc3Vic3RyKG9bMF0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAzKVwifW4ubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLG9bMF0pO2lmKHAuc3Vic3RyKG9bMV0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDA0KVwifW4uZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLG9bMV0pO3JldHVybiBufSxwYXJzZVByaXZhdGVSYXdSU0FLZXlIZXhBdE9iajpmdW5jdGlvbihvLHEpe3ZhciBwPXEua2V5aWR4O2lmKG8uc3Vic3RyKHAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobyxwKTtpZihuLmxlbmd0aCE9OSl7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9cS5rZXk9e307cS5rZXkubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMV0pO3Eua2V5LmU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzJdKTtxLmtleS5kPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sblszXSk7cS5rZXkucD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNF0pO3Eua2V5LnE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzVdKTtxLmtleS5kcD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNl0pO3Eua2V5LmRxPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls3XSk7cS5rZXkuY289QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzhdKX0scGFyc2VQcml2YXRlUmF3RUNLZXlIZXhBdE9iajpmdW5jdGlvbihvLHEpe3ZhciBwPXEua2V5aWR4O2lmKG8uc3Vic3RyKHAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBFQ0MgcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobyxwKTtpZihuLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBFQ0MgcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYoby5zdWJzdHIoblsxXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIEVDQyBwcml2YXRlIGtleShjb2RlOjAwMylcIn1xLmtleT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMV0pfSxwYXJzZVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBvPXt9O28uYWxncGFyYW09bnVsbDt2YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLDApO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitwLmxlbmd0aH12YXIgcj1wWzBdO2lmKHEuc3Vic3RyKHIsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAxKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscik7aWYobi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMilcIn1pZihxLnN1YnN0cihuWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMylcIn1vLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMF0pO2lmKHEuc3Vic3RyKG5bMV0sMik9PVwiMDZcIil7by5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMV0pfWlmKHEuc3Vic3RyKHBbMV0sMikhPVwiMDNcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDA0KVwifW8ua2V5PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsxXSkuc3Vic3RyKDIpO3JldHVybiBvfSxnZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24ocil7dmFyIHE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoociwwKTtpZihxLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrcS5sZW5ndGh9dmFyIHA9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihyLHFbMF0pO2lmKHAhPVwiMzAwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwXCIpe3Rocm93XCJQS0NTOCBBbGdvcml0aG1JZCBpcyBub3QgcnNhRW5jcnlwdGlvblwifWlmKHIuc3Vic3RyKHFbMV0sMikhPVwiMDNcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IEJJVFNUUklORyBlbmNhcHNsYXRlZC5cIn12YXIgdD1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHIscVsxXSkrMjtpZihyLnN1YnN0cih0LDIpIT1cIjMwXCIpe3Rocm93XCJQS0NTOCBQdWJsaWMgS2V5IGlzIG5vdCBTRVFVRU5DRS5cIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLHQpO2lmKG4ubGVuZ3RoIT0yKXt0aHJvd1wiaW5uZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIituLmxlbmd0aH1pZihyLnN1YnN0cihuWzBdLDIpIT1cIjAyXCIpe3Rocm93XCJOIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9aWYoci5zdWJzdHIoblsxXSwyKSE9XCIwMlwiKXt0aHJvd1wiRSBpcyBub3QgQVNOLjEgSU5URUdFUlwifXZhciB1PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIsblswXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixuWzFdKTt2YXIgbz1uZXcgUlNBS2V5KCk7by5zZXRQdWJsaWModSxzKTtyZXR1cm4gb30sfX0oKTtcbi8qISBrZXl1dGlsLTEuMC4xMy5qcyAoYykgMjAxMy0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBLRVlVVElMPWZ1bmN0aW9uKCl7dmFyIGQ9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBrKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBlPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gayhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgYT1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGsoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGs9ZnVuY3Rpb24ocyx4LHUscSl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHQ9e307dC5rZXk9dzt0Lml2PXA7dC5jaXBoZXJ0ZXh0PXI7dmFyIHY9cy5kZWNyeXB0KHQsdyx7aXY6cH0pO3JldHVybiBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh2KX07dmFyIGw9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBnKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBvPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gZyhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgZj1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGcoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGc9ZnVuY3Rpb24odCx5LHYscSl7dmFyIHM9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh5KTt2YXIgeD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHc9dC5lbmNyeXB0KHMseCx7aXY6cH0pO3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uody50b1N0cmluZygpKTt2YXIgdT1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShyKTtyZXR1cm4gdX07dmFyIGk9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpkLGVwcm9jOmwsa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6ZCxlcHJvYzpsLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmQsZXByb2M6bCxrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZSxlcHJvYzpvLGtleWxlbjoyNCxpdmxlbjo4fSxcIkRFUy1DQkNcIjp7cHJvYzphLGVwcm9jOmYsa2V5bGVuOjgsaXZsZW46OH19O3ZhciBjPWZ1bmN0aW9uKHApe3JldHVybiBpW3BdW1wicHJvY1wiXX07dmFyIG09ZnVuY3Rpb24ocCl7dmFyIHI9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20ocCk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocik7cmV0dXJuIHF9O3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciB1PXt9O2lmKHQubWF0Y2gobmV3IFJlZ0V4cChcIkRFSy1JbmZvOiAoW14sXSspLChbMC05QS1GYS1mXSspXCIsXCJtXCIpKSl7dS5jaXBoZXI9UmVnRXhwLiQxO3UuaXZzYWx0PVJlZ0V4cC4kMn1pZih0Lm1hdGNoKG5ldyBSZWdFeHAoXCItLS0tLUJFR0lOIChbQS1aXSspIFBSSVZBVEUgS0VZLS0tLS1cIikpKXt1LnR5cGU9UmVnRXhwLiQxfXZhciByPS0xO3ZhciB2PTA7aWYodC5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpIT0tMSl7cj10LmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIik7dj0yfWlmKHQuaW5kZXhPZihcIlxcblxcblwiKSE9LTEpe3I9dC5pbmRleE9mKFwiXFxuXFxuXCIpO3Y9MX12YXIgcT10LmluZGV4T2YoXCItLS0tLUVORFwiKTtpZihyIT0tMSYmcSE9LTEpe3ZhciBwPXQuc3Vic3RyaW5nKHIrdioyLHEtdik7cD1wLnJlcGxhY2UoL1xccysvZyxcIlwiKTt1LmRhdGE9cH1yZXR1cm4gdX07dmFyIGo9ZnVuY3Rpb24ocSx5LHApe3ZhciB2PXAuc3Vic3RyaW5nKDAsMTYpO3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHI9Q3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoeSk7dmFyIHU9aVtxXVtcImtleWxlblwiXStpW3FdW1wiaXZsZW5cIl07dmFyIHg9XCJcIjt2YXIgdz1udWxsO2Zvcig7Oyl7dmFyIHM9Q3J5cHRvSlMuYWxnby5NRDUuY3JlYXRlKCk7aWYodyE9bnVsbCl7cy51cGRhdGUodyl9cy51cGRhdGUocik7cy51cGRhdGUodCk7dz1zLmZpbmFsaXplKCk7eD14K0NyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHcpO2lmKHgubGVuZ3RoPj11KjIpe2JyZWFrfX12YXIgej17fTt6LmtleWhleD14LnN1YnN0cigwLGlbcV1bXCJrZXlsZW5cIl0qMik7ei5pdmhleD14LnN1YnN0cihpW3FdW1wia2V5bGVuXCJdKjIsaVtxXVtcIml2bGVuXCJdKjIpO3JldHVybiB6fTt2YXIgYj1mdW5jdGlvbihwLHYscix3KXt2YXIgcz1DcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHApO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3ZhciB1PWlbdl1bXCJwcm9jXCJdO3ZhciB0PXUocSxyLHcpO3JldHVybiB0fTt2YXIgaD1mdW5jdGlvbihwLHMscSx1KXt2YXIgcj1pW3NdW1wiZXByb2NcIl07dmFyIHQ9cihwLHEsdSk7cmV0dXJuIHR9O3JldHVybnt2ZXJzaW9uOlwiMS4wLjBcIixnZXRIZXhGcm9tUEVNOmZ1bmN0aW9uKHEsdSl7dmFyIHI9cTtpZihyLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKT09LTEpe3Rocm93XCJjYW4ndCBmaW5kIFBFTSBoZWFkZXI6IFwiK3V9aWYodHlwZW9mIHU9PVwic3RyaW5nXCImJnUhPVwiXCIpe3I9ci5yZXBsYWNlKFwiLS0tLS1CRUdJTiBcIit1K1wiLS0tLS1cIixcIlwiKTtyPXIucmVwbGFjZShcIi0tLS0tRU5EIFwiK3UrXCItLS0tLVwiLFwiXCIpfWVsc2V7cj1yLnJlcGxhY2UoLy0tLS0tQkVHSU4gW14tXSstLS0tLS8sXCJcIik7cj1yLnJlcGxhY2UoLy0tLS0tRU5EIFteLV0rLS0tLS0vLFwiXCIpfXZhciB0PXIucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBwPWI2NHRvaGV4KHQpO3JldHVybiBwfSxnZXREZWNyeXB0ZWRLZXlIZXhCeUtleUlWOmZ1bmN0aW9uKHEsdCxzLHIpe3ZhciBwPWModCk7cmV0dXJuIHAocSxzLHIpfSxwYXJzZVBLQ1M1UEVNOmZ1bmN0aW9uKHApe3JldHVybiBuKHApfSxnZXRLZXlBbmRVbnVzZWRJdkJ5UGFzc2NvZGVBbmRJdnNhbHQ6ZnVuY3Rpb24ocSxwLHIpe3JldHVybiBqKHEscCxyKX0sZGVjcnlwdEtleUI2NDpmdW5jdGlvbihwLHIscSxzKXtyZXR1cm4gYihwLHIscSxzKX0sZ2V0RGVjcnlwdGVkS2V5SGV4OmZ1bmN0aW9uKHkseCl7dmFyIHE9bih5KTt2YXIgdD1xLnR5cGU7dmFyIHI9cS5jaXBoZXI7dmFyIHA9cS5pdnNhbHQ7dmFyIHM9cS5kYXRhO3ZhciB3PWoocix4LHApO3ZhciB2PXcua2V5aGV4O3ZhciB1PWIocyxyLHYscCk7cmV0dXJuIHV9LGdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTNVBFTTpmdW5jdGlvbihyLHEpe3ZhciBzPXRoaXMuZ2V0RGVjcnlwdGVkS2V5SGV4KHIscSk7dmFyIHA9bmV3IFJTQUtleSgpO3AucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhzKTtyZXR1cm4gcH0sZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4OmZ1bmN0aW9uKHgscyxBLHQscil7dmFyIHA9XCJcIjtpZih0eXBlb2YgdD09XCJ1bmRlZmluZWRcInx8dD09bnVsbCl7dD1cIkFFUy0yNTYtQ0JDXCJ9aWYodHlwZW9mIGlbdF09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJLRVlVVElMIHVuc3VwcG9ydGVkIGFsZ29yaXRobTogXCIrdH1pZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7dmFyIHY9aVt0XVtcIml2bGVuXCJdO3ZhciB1PW0odik7cj11LnRvVXBwZXJDYXNlKCl9dmFyIHo9aih0LEEscik7dmFyIHk9ei5rZXloZXg7dmFyIHc9aChzLHQseSxyKTt2YXIgcT13LnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO3ZhciBwPVwiLS0tLS1CRUdJTiBcIit4K1wiIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtwKz1cIlByb2MtVHlwZTogNCxFTkNSWVBURURcXHJcXG5cIjtwKz1cIkRFSy1JbmZvOiBcIit0K1wiLFwiK3IrXCJcXHJcXG5cIjtwKz1cIlxcclxcblwiO3ArPXE7cCs9XCJcXHJcXG4tLS0tLUVORCBcIit4K1wiIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtyZXR1cm4gcH0sZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5OmZ1bmN0aW9uKEQsRSxyLHQpe3ZhciBCPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dmFyIHc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5ufSk7dmFyIEE9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOkQuZX0pO3ZhciBDPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZH0pO3ZhciB1PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQucH0pO3ZhciBzPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQucX0pO3ZhciB6PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZG1wMX0pO3ZhciB2PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZG1xMX0pO3ZhciB5PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuY29lZmZ9KTt2YXIgRj1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbQix3LEEsQyx1LHMseix2LHldfSk7dmFyIHg9Ri5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiUlNBXCIseCxFLHIsdCl9LG5ld0VuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKHAscSx0LHUpe2lmKHR5cGVvZiBxPT1cInVuZGVmaW5lZFwifHxxPT1udWxsKXtxPTEwMjR9aWYodHlwZW9mIHQ9PVwidW5kZWZpbmVkXCJ8fHQ9PW51bGwpe3Q9XCIxMDAwMVwifXZhciByPW5ldyBSU0FLZXkoKTtyLmdlbmVyYXRlKHEsdCk7dmFyIHM9bnVsbDtpZih0eXBlb2YgdT09XCJ1bmRlZmluZWRcInx8dT09bnVsbCl7cz10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShyLHApfWVsc2V7cz10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShyLHAsdSl9cmV0dXJuIHN9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4UEVNOmZ1bmN0aW9uKHIpe2lmKHIubWF0Y2goL0VOQ1JZUFRFRC8pKXt0aHJvd1wicGVtIHNoYWxsIGJlIG5vdCBFTkNSWVBURURcIn12YXIgcT10aGlzLmdldEhleEZyb21QRU0ocixcIlBSSVZBVEUgS0VZXCIpO3ZhciBwPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgocSk7cmV0dXJuIHB9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4OmZ1bmN0aW9uKHMpe3ZhciByPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsMCk7aWYoci5sZW5ndGghPTMpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDMgZWxlbWVudHM6IFwiK3IubGVuZ3RofXZhciBxPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzFdKTtpZihxIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWRlbnRpZmllciBpcyBub3QgcnNhRW5jOiBcIitxfXZhciBxPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzFdKTt2YXIgdD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHMsclsyXSk7dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodCwwKTt2YXIgcD1uZXcgUlNBS2V5KCk7cC5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHUpO3JldHVybiBwfSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24odyl7dmFyIHM9e307dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodywwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDApLml0ZW1zICE9IDI6IFwiK3IubGVuZ3RofXMuY2lwaGVydGV4dD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHJbMV0pO3ZhciB5PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcsclswXSk7aWYoeS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjApLml0ZW1zICE9IDI6IFwiK3kubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcseVswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBkXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQkVTMlwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcseVsxXSk7aWYoeS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrcC5sZW5ndGh9dmFyIHE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxwWzFdKTtpZihxLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjEpLml0ZW1zICE9IDI6IFwiK3EubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcscVswXSkhPVwiMmE4NjQ4ODZmNzBkMDMwN1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIFRyaXBsZURFU1wifXMuZW5jcnlwdGlvblNjaGVtZUFsZz1cIlRyaXBsZURFU1wiO3MuZW5jcnlwdGlvblNjaGVtZUlWPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcscVsxXSk7dmFyIHQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxwWzBdKTtpZih0Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjApLml0ZW1zICE9IDI6IFwiK3QubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcsdFswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBjXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQktERjJcIn12YXIgeD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHRbMV0pO2lmKHgubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIreC5sZW5ndGh9cy5wYmtkZjJTYWx0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcseFswXSk7dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx4WzFdKTt0cnl7cy5wYmtkZjJJdGVyPXBhcnNlSW50KHUsMTYpfWNhdGNoKHYpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0IHBia2RmMkl0ZXI6IFwiK3V9cmV0dXJuIHN9LGdldFBCS0RGMktleUhleEZyb21QYXJhbTpmdW5jdGlvbih1LHApe3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodS5wYmtkZjJTYWx0KTt2YXIgcT11LnBia2RmMkl0ZXI7dmFyIHM9Q3J5cHRvSlMuUEJLREYyKHAsdCx7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczpxfSk7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocyk7cmV0dXJuIHJ9LGdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24oeCx5KXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0oeCxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKTt2YXIgcD10aGlzLnBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTOChyKTt2YXIgdT1LRVlVVElMLmdldFBCS0RGMktleUhleEZyb21QYXJhbShwLHkpO3ZhciB2PXt9O3YuY2lwaGVydGV4dD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHAuY2lwaGVydGV4dCk7dmFyIHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh1KTt2YXIgcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHAuZW5jcnlwdGlvblNjaGVtZUlWKTt2YXIgdz1DcnlwdG9KUy5UcmlwbGVERVMuZGVjcnlwdCh2LHQse2l2OnN9KTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh3KTtyZXR1cm4gcX0sZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHMscil7dmFyIHE9dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHMscik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleChxKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHMscSl7dmFyIHA9dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHMscSk7dmFyIHI9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgocCk7cmV0dXJuIHJ9LHBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24ocyl7dmFyIHE9e307cS5hbGdwYXJhbT1udWxsO2lmKHMuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBwbGFpbiBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLDApO2lmKHIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAyKVwifWlmKHMuc3Vic3RyKHJbMV0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMylcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLHJbMV0pO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA0KVwifWlmKHMuc3Vic3RyKHBbMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNSlcIn1xLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMF0pO2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMDZcIil7cS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMV0pfWlmKHMuc3Vic3RyKHJbMl0sMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNilcIn1xLmtleWlkeD1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHMsclsyXSk7cmV0dXJuIHF9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0ocSxcIlBSSVZBVEUgS0VZXCIpO3ZhciByPXRoaXMuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4KHApO3JldHVybiByfSxnZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24ocCl7dmFyIHc9dGhpcy5wYXJzZVBsYWluUHJpdmF0ZVBLQ1M4SGV4KHApO2lmKHcuYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqKHAsdyk7dmFyIHU9dy5rZXk7dmFyIHo9bmV3IFJTQUtleSgpO3ouc2V0UHJpdmF0ZUV4KHUubix1LmUsdS5kLHUucCx1LnEsdS5kcCx1LmRxLHUuY28pO3JldHVybiB6fWVsc2V7aWYody5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7dGhpcy5wYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqKHAsdyk7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3cuYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrdy5hbGdwYXJhbX12YXIgdj1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbdy5hbGdwYXJhbV07dmFyIHo9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp2fSk7ei5zZXRQdWJsaWNLZXlIZXgody5wdWJrZXkpO3ouc2V0UHJpdmF0ZUtleUhleCh3LmtleSk7ei5pc1B1YmxpYz1mYWxzZTtyZXR1cm4gen1lbHNle2lmKHcuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciB0PUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwwXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwxXSxcIjAyXCIpO3ZhciB5PUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwyXSxcIjAyXCIpO3ZhciBCPUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzIsMF0sXCIwMlwiKTt2YXIgcj1uZXcgQmlnSW50ZWdlcih0LDE2KTt2YXIgcT1uZXcgQmlnSW50ZWdlcihzLDE2KTt2YXIgeD1uZXcgQmlnSW50ZWdlcih5LDE2KTt2YXIgQT1uZXcgQmlnSW50ZWdlcihCLDE2KTt2YXIgej1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7ei5zZXRQcml2YXRlKHIscSx4LG51bGwsQSk7cmV0dXJuIHp9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX19LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0ocSxcIlBVQkxJQyBLRVlcIik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXgocik7cmV0dXJuIHB9LGdldEtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0ocSxcIlBVQkxJQyBLRVlcIik7dmFyIHA9dGhpcy5nZXRLZXlGcm9tUHVibGljUEtDUzhIZXgocik7cmV0dXJuIHB9LGdldEtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgcD10aGlzLnBhcnNlUHVibGljUEtDUzhIZXgocSk7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3ZhciB1PXRoaXMucGFyc2VQdWJsaWNSYXdSU0FLZXlIZXgocC5rZXkpO3ZhciByPW5ldyBSU0FLZXkoKTtyLnNldFB1YmxpYyh1Lm4sdS5lKTtyZXR1cm4gcn1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXT09PXVuZGVmaW5lZCl7dGhyb3dcIktKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZSB1bmRlZmluZWQ6IFwiK3AuYWxncGFyYW19dmFyIHM9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3AuYWxncGFyYW1dO3ZhciByPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6cyxwdWI6cC5rZXl9KTtyZXR1cm4gcn1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciB0PXAuYWxncGFyYW07dmFyIHY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocC5rZXksMCk7dmFyIHI9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3Iuc2V0UHVibGljKG5ldyBCaWdJbnRlZ2VyKHQucCwxNiksbmV3IEJpZ0ludGVnZXIodC5xLDE2KSxuZXcgQmlnSW50ZWdlcih0LmcsMTYpLG5ldyBCaWdJbnRlZ2VyKHYsMTYpKTtyZXR1cm4gcn1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZ29yaXRobVwifX19fSxwYXJzZVB1YmxpY1Jhd1JTQUtleUhleDpmdW5jdGlvbihyKXt2YXIgcD17fTtpZihyLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMSlcIn12YXIgcT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLDApO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDIpXCJ9aWYoci5zdWJzdHIocVswXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDMpXCJ9cC5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIscVswXSk7aWYoci5zdWJzdHIocVsxXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDQpXCJ9cC5lPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIscVsxXSk7cmV0dXJuIHB9LHBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqOmZ1bmN0aW9uKHEscyl7dmFyIHI9cy5rZXlpZHg7aWYocS5zdWJzdHIociwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLHIpO2lmKHAubGVuZ3RoIT05KXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMilcIn1zLmtleT17fTtzLmtleS5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsxXSk7cy5rZXkuZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbMl0pO3Mua2V5LmQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzNdKTtzLmtleS5wPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs0XSk7cy5rZXkucT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbNV0pO3Mua2V5LmRwPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs2XSk7cy5rZXkuZHE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzddKTtzLmtleS5jbz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbOF0pfSxwYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqOmZ1bmN0aW9uKHAsdCl7dmFyIHE9dC5rZXlpZHg7dmFyIHI9QVNOMUhFWC5nZXRWYnlMaXN0KHAscSxbMV0sXCIwNFwiKTt2YXIgcz1BU04xSEVYLmdldFZieUxpc3QocCxxLFsyLDBdLFwiMDNcIikuc3Vic3RyKDIpO3Qua2V5PXI7dC5wdWJrZXk9c30scGFyc2VQdWJsaWNQS0NTOEhleDpmdW5jdGlvbihzKXt2YXIgcT17fTtxLmFsZ3BhcmFtPW51bGw7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocywwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrci5sZW5ndGh9dmFyIHQ9clswXTtpZihzLnN1YnN0cih0LDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMSlcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLHQpO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDIpXCJ9aWYocy5zdWJzdHIocFswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDMpXCJ9cS5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzBdKTtpZihzLnN1YnN0cihwWzFdLDIpPT1cIjA2XCIpe3EuYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzFdKX1lbHNle2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMzBcIil7cS5hbGdwYXJhbT17fTtxLmFsZ3BhcmFtLnA9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMF0sXCIwMlwiKTtxLmFsZ3BhcmFtLnE9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMV0sXCIwMlwiKTtxLmFsZ3BhcmFtLmc9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMl0sXCIwMlwiKX19aWYocy5zdWJzdHIoclsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDQpXCJ9cS5rZXk9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxyWzFdKS5zdWJzdHIoMik7cmV0dXJuIHF9LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbih0KXt2YXIgcz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih0LDApO2lmKHMubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitzLmxlbmd0aH12YXIgcj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHQsc1swXSk7aWYociE9XCIzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwMTA1MDBcIil7dGhyb3dcIlBLQ1M4IEFsZ29yaXRobUlkIGlzIG5vdCByc2FFbmNyeXB0aW9uXCJ9aWYodC5zdWJzdHIoc1sxXSwyKSE9XCIwM1wiKXt0aHJvd1wiUEtDUzggUHVibGljIEtleSBpcyBub3QgQklUU1RSSU5HIGVuY2Fwc2xhdGVkLlwifXZhciB2PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoodCxzWzFdKSsyO2lmKHQuc3Vic3RyKHYsMikhPVwiMzBcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IFNFUVVFTkNFLlwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHQsdik7aWYocC5sZW5ndGghPTIpe3Rocm93XCJpbm5lciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3AubGVuZ3RofWlmKHQuc3Vic3RyKHBbMF0sMikhPVwiMDJcIil7dGhyb3dcIk4gaXMgbm90IEFTTi4xIElOVEVHRVJcIn1pZih0LnN1YnN0cihwWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJFIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9dmFyIHc9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodCxwWzBdKTt2YXIgdT1BU04xSEVYLmdldEhleE9mVl9BdE9iaih0LHBbMV0pO3ZhciBxPW5ldyBSU0FLZXkoKTtxLnNldFB1YmxpYyh3LHUpO3JldHVybiBxfSx9fSgpO0tFWVVUSUwuZ2V0S2V5PWZ1bmN0aW9uKGYsZSxoKXtpZih0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZmIGluc3RhbmNlb2YgUlNBS2V5KXtyZXR1cm4gZn1pZih0eXBlb2YgS0pVUi5jcnlwdG8uRUNEU0EhPVwidW5kZWZpbmVkXCImJmYgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7cmV0dXJuIGZ9aWYodHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmZiBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7cmV0dXJuIGZ9aWYoZi5jdXJ2ZSE9PXVuZGVmaW5lZCYmZi54eSE9PXVuZGVmaW5lZCYmZi5kPT09dW5kZWZpbmVkKXtyZXR1cm4gbmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtwdWI6Zi54eSxjdXJ2ZTpmLmN1cnZlfSl9aWYoZi5jdXJ2ZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkKXtyZXR1cm4gbmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtwcnY6Zi5kLGN1cnZlOmYuY3VydmV9KX1pZihmLmt0eT09PXVuZGVmaW5lZCYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHVibGljKGYubixmLmUpO3JldHVybiB3fWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5kcCE9PXVuZGVmaW5lZCYmZi5kcSE9PXVuZGVmaW5lZCYmZi5jbyE9PXVuZGVmaW5lZCYmZi5xaT09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZUV4KGYubixmLmUsZi5kLGYucCxmLnEsZi5kcCxmLmRxLGYuY28pO3JldHVybiB3fWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnA9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGUoZi5uLGYuZSxmLmQpO3JldHVybiB3fWlmKGYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmchPT11bmRlZmluZWQmJmYueSE9PXVuZGVmaW5lZCYmZi54PT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQdWJsaWMoZi5wLGYucSxmLmcsZi55KTtyZXR1cm4gd31pZihmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5nIT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYueCE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShmLnAsZi5xLGYuZyxmLnksZi54KTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQ9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFB1YmxpYyhiNjR1dG9oZXgoZi5uKSxiNjR1dG9oZXgoZi5lKSk7cmV0dXJuIHd9aWYoZi5rdHk9PT1cIlJTQVwiJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5kcCE9PXVuZGVmaW5lZCYmZi5kcSE9PXVuZGVmaW5lZCYmZi5xaSE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZUV4KGI2NHV0b2hleChmLm4pLGI2NHV0b2hleChmLmUpLGI2NHV0b2hleChmLmQpLGI2NHV0b2hleChmLnApLGI2NHV0b2hleChmLnEpLGI2NHV0b2hleChmLmRwKSxiNjR1dG9oZXgoZi5kcSksYjY0dXRvaGV4KGYucWkpKTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGUoYjY0dXRvaGV4KGYubiksYjY0dXRvaGV4KGYuZSksYjY0dXRvaGV4KGYuZCkpO3JldHVybiB3fWlmKGYua3R5PT09XCJFQ1wiJiZmLmNydiE9PXVuZGVmaW5lZCYmZi54IT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIGQ9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpmLmNydn0pO3ZhciBsPWQuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIHI9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLngpKS5zbGljZSgtbCk7dmFyIG49KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLnkpKS5zbGljZSgtbCk7dmFyIG09XCIwNFwiK3IrbjtkLnNldFB1YmxpY0tleUhleChtKTtyZXR1cm4gZH1pZihmLmt0eT09PVwiRUNcIiYmZi5jcnYhPT11bmRlZmluZWQmJmYueCE9PXVuZGVmaW5lZCYmZi55IT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3ZhciBkPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6Zi5jcnZ9KTt2YXIgbD1kLmVjcGFyYW1zLmtleWxlbi80O3ZhciByPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgoZi54KSkuc2xpY2UoLWwpO3ZhciBuPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgoZi55KSkuc2xpY2UoLWwpO3ZhciBtPVwiMDRcIityK247dmFyIGE9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLmQpKS5zbGljZSgtbCk7ZC5zZXRQdWJsaWNLZXlIZXgobSk7ZC5zZXRQcml2YXRlS2V5SGV4KGEpO3JldHVybiBkfWlmKGYuaW5kZXhPZihcIi1FTkQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxmLmluZGV4T2YoXCItRU5EIFg1MDkgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxmLmluZGV4T2YoXCItRU5EIFRSVVNURUQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xKXtyZXR1cm4gWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTShmKX1pZihoPT09XCJwa2NzOHB1YlwiKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tUHVibGljUEtDUzhIZXgoZil9aWYoZi5pbmRleE9mKFwiLUVORCBQVUJMSUMgS0VZLVwiKSE9LTEpe3JldHVybiBLRVlVVElMLmdldEtleUZyb21QdWJsaWNQS0NTOFBFTShmKX1pZihoPT09XCJwa2NzNXBydlwiKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGYpO3JldHVybiB3fWlmKGg9PT1cInBrY3M1cHJ2XCIpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoZik7cmV0dXJuIHd9aWYoZi5pbmRleE9mKFwiLUVORCBSU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIik9PS0xKXt2YXIgaT1LRVlVVElMLmdldEhleEZyb21QRU0oZixcIlJTQSBQUklWQVRFIEtFWVwiKTtyZXR1cm4gS0VZVVRJTC5nZXRLZXkoaSxudWxsLFwicGtjczVwcnZcIil9aWYoZi5pbmRleE9mKFwiLUVORCBEU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIik9PS0xKXt2YXIgdT10aGlzLmdldEhleEZyb21QRU0oZixcIkRTQSBQUklWQVRFIEtFWVwiKTt2YXIgdD1BU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzJdLFwiMDJcIik7dmFyIHY9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbM10sXCIwMlwiKTt2YXIgaj1BU04xSEVYLmdldFZieUxpc3QodSwwLFs0XSxcIjAyXCIpO3ZhciBrPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzVdLFwiMDJcIik7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShuZXcgQmlnSW50ZWdlcih0LDE2KSxuZXcgQmlnSW50ZWdlcihzLDE2KSxuZXcgQmlnSW50ZWdlcih2LDE2KSxuZXcgQmlnSW50ZWdlcihqLDE2KSxuZXcgQmlnSW50ZWdlcihrLDE2KSk7cmV0dXJuIHd9aWYoZi5pbmRleE9mKFwiLUVORCBQUklWQVRFIEtFWS1cIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhQRU0oZil9aWYoZi5pbmRleE9mKFwiLUVORCBSU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzVQRU0oZixlKX1pZihmLmluZGV4T2YoXCItRU5EIEVDIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7dmFyIHU9S0VZVVRJTC5nZXREZWNyeXB0ZWRLZXlIZXgoZixlKTt2YXIgdz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjA0XCIpO3ZhciBjPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzIsMF0sXCIwNlwiKTt2YXIgbz1BU04xSEVYLmdldFZieUxpc3QodSwwLFszLDBdLFwiMDNcIikuc3Vic3RyKDIpO3ZhciBiPVwiXCI7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW2NdIT09dW5kZWZpbmVkKXtiPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtjXX1lbHNle3Rocm93XCJ1bmRlZmluZWQgT0lEKGhleCkgaW4gS0pVUi5jcnlwdG8uT0lEOiBcIitjfXZhciBkPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7bmFtZTpifSk7ZC5zZXRQdWJsaWNLZXlIZXgobyk7ZC5zZXRQcml2YXRlS2V5SGV4KHcpO2QuaXNQdWJsaWM9ZmFsc2U7cmV0dXJuIGR9aWYoZi5pbmRleE9mKFwiLUVORCBEU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIikhPS0xKXt2YXIgdT1LRVlVVElMLmdldERlY3J5cHRlZEtleUhleChmLGUpO3ZhciB0PUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzFdLFwiMDJcIik7dmFyIHM9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMl0sXCIwMlwiKTt2YXIgdj1BU04xSEVYLmdldFZieUxpc3QodSwwLFszXSxcIjAyXCIpO3ZhciBqPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzRdLFwiMDJcIik7dmFyIGs9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbNV0sXCIwMlwiKTt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQcml2YXRlKG5ldyBCaWdJbnRlZ2VyKHQsMTYpLG5ldyBCaWdJbnRlZ2VyKHMsMTYpLG5ldyBCaWdJbnRlZ2VyKHYsMTYpLG5ldyBCaWdJbnRlZ2VyKGosMTYpLG5ldyBCaWdJbnRlZ2VyKGssMTYpKTtyZXR1cm4gd31pZihmLmluZGV4T2YoXCItRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS1cIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU0oZixlKX10aHJvd1wibm90IHN1cHBvcnRlZCBhcmd1bWVudFwifTtLRVlVVElMLmdlbmVyYXRlS2V5cGFpcj1mdW5jdGlvbihhLGMpe2lmKGE9PVwiUlNBXCIpe3ZhciBiPWM7dmFyIGg9bmV3IFJTQUtleSgpO2guZ2VuZXJhdGUoYixcIjEwMDAxXCIpO2guaXNQcml2YXRlPXRydWU7aC5pc1B1YmxpYz10cnVlO3ZhciBmPW5ldyBSU0FLZXkoKTt2YXIgZT1oLm4udG9TdHJpbmcoMTYpO3ZhciBpPWguZS50b1N0cmluZygxNik7Zi5zZXRQdWJsaWMoZSxpKTtmLmlzUHJpdmF0ZT1mYWxzZTtmLmlzUHVibGljPXRydWU7dmFyIGs9e307ay5wcnZLZXlPYmo9aDtrLnB1YktleU9iaj1mO3JldHVybiBrfWVsc2V7aWYoYT09XCJFQ1wiKXt2YXIgZD1jO3ZhciBnPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZH0pO3ZhciBqPWcuZ2VuZXJhdGVLZXlQYWlySGV4KCk7dmFyIGg9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpkfSk7aC5zZXRQdWJsaWNLZXlIZXgoai5lY3B1YmhleCk7aC5zZXRQcml2YXRlS2V5SGV4KGouZWNwcnZoZXgpO2guaXNQcml2YXRlPXRydWU7aC5pc1B1YmxpYz1mYWxzZTt2YXIgZj1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmR9KTtmLnNldFB1YmxpY0tleUhleChqLmVjcHViaGV4KTtmLmlzUHJpdmF0ZT1mYWxzZTtmLmlzUHVibGljPXRydWU7dmFyIGs9e307ay5wcnZLZXlPYmo9aDtrLnB1YktleU9iaj1mO3JldHVybiBrfWVsc2V7dGhyb3dcInVua25vd24gYWxnb3JpdGhtOiBcIithfX19O0tFWVVUSUwuZ2V0UEVNPWZ1bmN0aW9uKGEscixvLGcsail7dmFyIHY9S0pVUi5hc24xO3ZhciB1PUtKVVIuY3J5cHRvO2Z1bmN0aW9uIHAocyl7dmFyIHc9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7XCJpbnRcIjp7YmlnaW50OnMubn19LHtcImludFwiOnMuZX0se1wiaW50XCI6e2JpZ2ludDpzLmR9fSx7XCJpbnRcIjp7YmlnaW50OnMucH19LHtcImludFwiOntiaWdpbnQ6cy5xfX0se1wiaW50XCI6e2JpZ2ludDpzLmRtcDF9fSx7XCJpbnRcIjp7YmlnaW50OnMuZG1xMX19LHtcImludFwiOntiaWdpbnQ6cy5jb2VmZn19XX0pO3JldHVybiB3fWZ1bmN0aW9uIHEodyl7dmFyIHM9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjoxfSx7b2N0c3RyOntoZXg6dy5wcnZLZXlIZXh9fSx7dGFnOltcImEwXCIsdHJ1ZSx7b2lkOntuYW1lOncuY3VydmVOYW1lfX1dfSx7dGFnOltcImExXCIsdHJ1ZSx7Yml0c3RyOntoZXg6XCIwMFwiK3cucHViS2V5SGV4fX1dfV19KTtyZXR1cm4gc31mdW5jdGlvbiBuKHMpe3ZhciB3PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se1wiaW50XCI6e2JpZ2ludDpzLnB9fSx7XCJpbnRcIjp7YmlnaW50OnMucX19LHtcImludFwiOntiaWdpbnQ6cy5nfX0se1wiaW50XCI6e2JpZ2ludDpzLnl9fSx7XCJpbnRcIjp7YmlnaW50OnMueH19XX0pO3JldHVybiB3fWlmKCgodHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSl8fCh0eXBlb2YgdS5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiB1LkRTQSl8fCh0eXBlb2YgdS5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIHUuRUNEU0EpKSYmYS5pc1B1YmxpYz09dHJ1ZSYmKHI9PT11bmRlZmluZWR8fHI9PVwiUEtDUzhQVUJcIikpe3ZhciB0PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQVUJMSUMgS0VZXCIpfWlmKHI9PVwiUEtDUzFQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSYmKG89PT11bmRlZmluZWR8fG89PW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9cChhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJSU0EgUFJJVkFURSBLRVlcIil9aWYocj09XCJQS0NTMVBSVlwiJiZ0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJihvPT09dW5kZWZpbmVkfHxvPT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBmPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTphLmN1cnZlTmFtZX0pO3ZhciBsPWYuZ2V0RW5jb2RlZEhleCgpO3ZhciBlPXEoYSk7dmFyIGs9ZS5nZXRFbmNvZGVkSGV4KCk7dmFyIGk9XCJcIjtpKz12LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobCxcIkVDIFBBUkFNRVRFUlNcIik7aSs9di5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFQyBQUklWQVRFIEtFWVwiKTtyZXR1cm4gaX1pZihyPT1cIlBLQ1MxUFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0EmJihvPT09dW5kZWZpbmVkfHxvPT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PW4oYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiRFNBIFBSSVZBVEUgS0VZXCIpfWlmKHI9PVwiUEtDUzVQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSYmKG8hPT11bmRlZmluZWQmJm8hPW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9cChhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihnPT09dW5kZWZpbmVkKXtnPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiUlNBXCIsbSxvLGcpfWlmKHI9PVwiUEtDUzVQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkVDRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJihvIT09dW5kZWZpbmVkJiZvIT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PXEoYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYoZz09PXVuZGVmaW5lZCl7Zz1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIkVDXCIsbSxvLGcpfWlmKHI9PVwiUEtDUzVQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSYmKG8hPT11bmRlZmluZWQmJm8hPW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9bihhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihnPT09dW5kZWZpbmVkKXtnPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiRFNBXCIsbSxvLGcpfXZhciBoPWZ1bmN0aW9uKHcscyl7dmFyIHk9Yih3LHMpO3ZhciB4PW5ldyBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tzZXE6W3tvaWQ6e25hbWU6XCJwa2NzNVBCRVMyXCJ9fSx7c2VxOlt7c2VxOlt7b2lkOntuYW1lOlwicGtjczVQQktERjJcIn19LHtzZXE6W3tvY3RzdHI6e2hleDp5LnBia2RmMlNhbHR9fSx7XCJpbnRcIjp5LnBia2RmMkl0ZXJ9XX1dfSx7c2VxOlt7b2lkOntuYW1lOlwiZGVzLUVERTMtQ0JDXCJ9fSx7b2N0c3RyOntoZXg6eS5lbmNyeXB0aW9uU2NoZW1lSVZ9fV19XX1dfSx7b2N0c3RyOntoZXg6eS5jaXBoZXJ0ZXh0fX1dfSk7cmV0dXJuIHguZ2V0RW5jb2RlZEhleCgpfTt2YXIgYj1mdW5jdGlvbihELEUpe3ZhciB4PTEwMDt2YXIgQz1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSg4KTt2YXIgQj1cIkRFUy1FREUzLUNCQ1wiO3ZhciBzPUNyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKDgpO3ZhciB5PUNyeXB0b0pTLlBCS0RGMihFLEMse2tleVNpemU6MTkyLzMyLGl0ZXJhdGlvbnM6eH0pO3ZhciB6PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoRCk7dmFyIEE9Q3J5cHRvSlMuVHJpcGxlREVTLmVuY3J5cHQoeix5LHtpdjpzfSkrXCJcIjt2YXIgdz17fTt3LmNpcGhlcnRleHQ9QTt3LnBia2RmMlNhbHQ9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkoQyk7dy5wYmtkZjJJdGVyPXg7dy5lbmNyeXB0aW9uU2NoZW1lQWxnPUI7dy5lbmNyeXB0aW9uU2NoZW1lSVY9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocyk7cmV0dXJuIHd9O2lmKHI9PVwiUEtDUzhQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBkPXAoYSk7dmFyIGM9ZC5nZXRFbmNvZGVkSGV4KCk7dmFyIHQ9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7c2VxOlt7b2lkOntuYW1lOlwicnNhRW5jcnlwdGlvblwifX0se1wibnVsbFwiOnRydWV9XX0se29jdHN0cjp7aGV4OmN9fV19KTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihvPT09dW5kZWZpbmVkfHxvPT1udWxsKXtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQUklWQVRFIEtFWVwiKX1lbHNle3ZhciBrPWgobSxvKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fWlmKHI9PVwiUEtDUzhQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkVDRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZD1uZXcgS0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjoxfSx7b2N0c3RyOntoZXg6YS5wcnZLZXlIZXh9fSx7dGFnOltcImExXCIsdHJ1ZSx7Yml0c3RyOntoZXg6XCIwMFwiK2EucHViS2V5SGV4fX1dfV19KTt2YXIgYz1kLmdldEVuY29kZWRIZXgoKTt2YXIgdD1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJlY1B1YmxpY0tleVwifX0se29pZDp7bmFtZTphLmN1cnZlTmFtZX19XX0se29jdHN0cjp7aGV4OmN9fV19KTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihvPT09dW5kZWZpbmVkfHxvPT1udWxsKXtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQUklWQVRFIEtFWVwiKX1lbHNle3ZhciBrPWgobSxvKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fWlmKHI9PVwiUEtDUzhQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmEueH0pO3ZhciBjPWQuZ2V0RW5jb2RlZEhleCgpO3ZhciB0PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcImRzYVwifX0se3NlcTpbe1wiaW50XCI6e2JpZ2ludDphLnB9fSx7XCJpbnRcIjp7YmlnaW50OmEucX19LHtcImludFwiOntiaWdpbnQ6YS5nfX1dfV19LHtvY3RzdHI6e2hleDpjfX1dfSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYobz09PXVuZGVmaW5lZHx8bz09bnVsbCl7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgaz1oKG0sbyk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX10aHJvd1widW5zdXBwb3J0ZWQgb2JqZWN0IG5vciBmb3JtYXRcIn07S0VZVVRJTC5nZXRLZXlGcm9tQ1NSUEVNPWZ1bmN0aW9uKGIpe3ZhciBhPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShiLFwiQ0VSVElGSUNBVEUgUkVRVUVTVFwiKTt2YXIgYz1LRVlVVElMLmdldEtleUZyb21DU1JIZXgoYSk7cmV0dXJuIGN9O0tFWVVUSUwuZ2V0S2V5RnJvbUNTUkhleD1mdW5jdGlvbihhKXt2YXIgYz1LRVlVVElMLnBhcnNlQ1NSSGV4KGEpO3ZhciBiPUtFWVVUSUwuZ2V0S2V5KGMucDhwdWJrZXloZXgsbnVsbCxcInBrY3M4cHViXCIpO3JldHVybiBifTtLRVlVVElMLnBhcnNlQ1NSSGV4PWZ1bmN0aW9uKGMpe3ZhciBiPXt9O3ZhciBlPWM7aWYoZS5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwMSlcIn12YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLDApO2lmKGQubGVuZ3RoPDEpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAyKVwifWlmKGUuc3Vic3RyKGRbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDMpXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxkWzBdKTtpZihhLmxlbmd0aDwzKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwNClcIn1iLnA4cHVia2V5aGV4PUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZSxhWzJdKTtyZXR1cm4gYn07S0VZVVRJTC5nZXRKV0tGcm9tS2V5PWZ1bmN0aW9uKGQpe3ZhciBiPXt9O2lmKGQgaW5zdGFuY2VvZiBSU0FLZXkmJmQuaXNQcml2YXRlKXtiLmt0eT1cIlJTQVwiO2Iubj1oZXh0b2I2NHUoZC5uLnRvU3RyaW5nKDE2KSk7Yi5lPWhleHRvYjY0dShkLmUudG9TdHJpbmcoMTYpKTtiLmQ9aGV4dG9iNjR1KGQuZC50b1N0cmluZygxNikpO2IucD1oZXh0b2I2NHUoZC5wLnRvU3RyaW5nKDE2KSk7Yi5xPWhleHRvYjY0dShkLnEudG9TdHJpbmcoMTYpKTtiLmRwPWhleHRvYjY0dShkLmRtcDEudG9TdHJpbmcoMTYpKTtiLmRxPWhleHRvYjY0dShkLmRtcTEudG9TdHJpbmcoMTYpKTtiLnFpPWhleHRvYjY0dShkLmNvZWZmLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGJ9ZWxzZXtpZihkIGluc3RhbmNlb2YgUlNBS2V5JiZkLmlzUHVibGljKXtiLmt0eT1cIlJTQVwiO2Iubj1oZXh0b2I2NHUoZC5uLnRvU3RyaW5nKDE2KSk7Yi5lPWhleHRvYjY0dShkLmUudG9TdHJpbmcoMTYpKTtyZXR1cm4gYn1lbHNle2lmKGQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSYmZC5pc1ByaXZhdGUpe3ZhciBhPWQuZ2V0U2hvcnROSVNUUEN1cnZlTmFtZSgpO2lmKGEhPT1cIlAtMjU2XCImJmEhPT1cIlAtMzg0XCIpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lIGZvciBKV1Q6IFwiK2F9dmFyIGM9ZC5nZXRQdWJsaWNLZXlYWUhleCgpO2Iua3R5PVwiRUNcIjtiLmNydj1hO2IueD1oZXh0b2I2NHUoYy54KTtiLnk9aGV4dG9iNjR1KGMueSk7Yi5kPWhleHRvYjY0dShkLnBydktleUhleCk7cmV0dXJuIGJ9ZWxzZXtpZihkIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJmQuaXNQdWJsaWMpe3ZhciBhPWQuZ2V0U2hvcnROSVNUUEN1cnZlTmFtZSgpO2lmKGEhPT1cIlAtMjU2XCImJmEhPT1cIlAtMzg0XCIpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lIGZvciBKV1Q6IFwiK2F9dmFyIGM9ZC5nZXRQdWJsaWNLZXlYWUhleCgpO2Iua3R5PVwiRUNcIjtiLmNydj1hO2IueD1oZXh0b2I2NHUoYy54KTtiLnk9aGV4dG9iNjR1KGMueSk7cmV0dXJuIGJ9fX19dGhyb3dcIm5vdCBzdXBwb3J0ZWQga2V5IG9iamVjdFwifTtcbi8qISByc2FwZW0tMS4xLmpzIChjKSAyMDEyIEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIF9yc2FwZW1fcGVtVG9CYXNlNjQoYil7dmFyIGE9YjthPWEucmVwbGFjZShcIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cIixcIlwiKTthPWEucmVwbGFjZShcIi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tXCIsXCJcIik7YT1hLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTtyZXR1cm4gYX1mdW5jdGlvbiBfcnNhcGVtX2dldFBvc0FycmF5T2ZDaGlsZHJlbkZyb21IZXgoZCl7dmFyIGo9bmV3IEFycmF5KCk7dmFyIGs9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihkLDApO3ZhciBmPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGspO3ZhciBoPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGYpO3ZhciBiPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGgpO3ZhciBsPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGIpO3ZhciBlPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGwpO3ZhciBnPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGUpO3ZhciBjPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGcpO3ZhciBpPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGMpO2oucHVzaChrLGYsaCxiLGwsZSxnLGMsaSk7cmV0dXJuIGp9ZnVuY3Rpb24gX3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoaSl7dmFyIG89X3JzYXBlbV9nZXRQb3NBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGkpO3ZhciByPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1swXSk7dmFyIGY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzFdKTt2YXIgaj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bMl0pO3ZhciBrPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1szXSk7dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzRdKTt2YXIgYj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bNV0pO3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s2XSk7dmFyIGc9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzddKTt2YXIgbD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bOF0pO3ZhciBtPW5ldyBBcnJheSgpO20ucHVzaChyLGYsaixrLGMsYixoLGcsbCk7cmV0dXJuIG19ZnVuY3Rpb24gX3JzYXBlbV9yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGMpe3ZhciBiPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGMpO3RoaXMuc2V0UHJpdmF0ZUV4KGJbMV0sYlsyXSxiWzNdLGJbNF0sYls1XSxiWzZdLGJbN10sYls4XSl9ZnVuY3Rpb24gX3JzYXBlbV9yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmcoZSl7dmFyIGM9X3JzYXBlbV9wZW1Ub0Jhc2U2NChlKTt2YXIgZD1iNjR0b2hleChjKTt2YXIgYj1fcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChkKTt0aGlzLnNldFByaXZhdGVFeChiWzFdLGJbMl0sYlszXSxiWzRdLGJbNV0sYls2XSxiWzddLGJbOF0pfVJTQUtleS5wcm90b3R5cGUucmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nPV9yc2FwZW1fcmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nO1JTQUtleS5wcm90b3R5cGUucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZz1fcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmc7XG4vKiEgcnNhc2lnbi0xLjIuNy5qcyAoYykgMjAxMiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG52YXIgX1JFX0hFWERFQ09OTFk9bmV3IFJlZ0V4cChcIlwiKTtfUkVfSEVYREVDT05MWS5jb21waWxlKFwiW14wLTlhLWZdXCIsXCJnaVwiKTtmdW5jdGlvbiBfcnNhc2lnbl9nZXRIZXhQYWRkZWREaWdlc3RJbmZvRm9yU3RyaW5nKGQsZSxhKXt2YXIgYj1mdW5jdGlvbihmKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGYsYSl9O3ZhciBjPWIoZCk7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuZ2V0UGFkZGVkRGlnZXN0SW5mb0hleChjLGEsZSl9ZnVuY3Rpb24gX3plcm9QYWRkaW5nT2ZTaWduYXR1cmUoZSxkKXt2YXIgYz1cIlwiO3ZhciBhPWQvNC1lLmxlbmd0aDtmb3IodmFyIGI9MDtiPGE7YisrKXtjPWMrXCIwXCJ9cmV0dXJuIGMrZX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduU3RyaW5nKGQsYSl7dmFyIGI9ZnVuY3Rpb24oZSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhlLGEpfTt2YXIgYz1iKGQpO3JldHVybiB0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2goYyxhKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduV2l0aE1lc3NhZ2VIYXNoKGUsYyl7dmFyIGY9S0pVUi5jcnlwdG8uVXRpbC5nZXRQYWRkZWREaWdlc3RJbmZvSGV4KGUsYyx0aGlzLm4uYml0TGVuZ3RoKCkpO3ZhciBiPXBhcnNlQmlnSW50KGYsMTYpO3ZhciBkPXRoaXMuZG9Qcml2YXRlKGIpO3ZhciBhPWQudG9TdHJpbmcoMTYpO3JldHVybiBfemVyb1BhZGRpbmdPZlNpZ25hdHVyZShhLHRoaXMubi5iaXRMZW5ndGgoKSl9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEExKGEpe3JldHVybiBfcnNhc2lnbl9zaWduU3RyaW5nLmNhbGwodGhpcyxhLFwic2hhMVwiKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTI1NihhKXtyZXR1cm4gX3JzYXNpZ25fc2lnblN0cmluZy5jYWxsKHRoaXMsYSxcInNoYTI1NlwiKX1mdW5jdGlvbiBwc3NfbWdmMV9zdHIoYyxhLGUpe3ZhciBiPVwiXCIsZD0wO3doaWxlKGIubGVuZ3RoPGEpe2IrPWhleHRvcnN0cihlKHJzdHJ0b2hleChjK1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLFsoZCY0Mjc4MTkwMDgwKT4+MjQsKGQmMTY3MTE2ODApPj4xNiwoZCY2NTI4MCk+PjgsZCYyNTVdKSkpKTtkKz0xfXJldHVybiBifWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmdQU1MoZSxhLGQpe3ZhciBjPWZ1bmN0aW9uKGYpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoZixhKX07dmFyIGI9Yyhyc3RydG9oZXgoZSkpO2lmKGQ9PT11bmRlZmluZWQpe2Q9LTF9cmV0dXJuIHRoaXMuc2lnbldpdGhNZXNzYWdlSGFzaFBTUyhiLGEsZCl9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnbldpdGhNZXNzYWdlSGFzaFBTUyhsLGEsayl7dmFyIGI9aGV4dG9yc3RyKGwpO3ZhciBnPWIubGVuZ3RoO3ZhciBtPXRoaXMubi5iaXRMZW5ndGgoKS0xO3ZhciBjPU1hdGguY2VpbChtLzgpO3ZhciBkO3ZhciBvPWZ1bmN0aW9uKGkpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoaSxhKX07aWYoaz09PS0xfHxrPT09dW5kZWZpbmVkKXtrPWd9ZWxzZXtpZihrPT09LTIpe2s9Yy1nLTJ9ZWxzZXtpZihrPC0yKXt0aHJvd1wiaW52YWxpZCBzYWx0IGxlbmd0aFwifX19aWYoYzwoZytrKzIpKXt0aHJvd1wiZGF0YSB0b28gbG9uZ1wifXZhciBmPVwiXCI7aWYoaz4wKXtmPW5ldyBBcnJheShrKTtuZXcgU2VjdXJlUmFuZG9tKCkubmV4dEJ5dGVzKGYpO2Y9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZil9dmFyIG49aGV4dG9yc3RyKG8ocnN0cnRvaGV4KFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiK2IrZikpKTt2YXIgaj1bXTtmb3IoZD0wO2Q8Yy1rLWctMjtkKz0xKXtqW2RdPTB9dmFyIGU9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaikrXCJcXHgwMVwiK2Y7dmFyIGg9cHNzX21nZjFfc3RyKG4sZS5sZW5ndGgsbyk7dmFyIHE9W107Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrPTEpe3FbZF09ZS5jaGFyQ29kZUF0KGQpXmguY2hhckNvZGVBdChkKX12YXIgcD0oNjUyODA+Pig4KmMtbSkpJjI1NTtxWzBdJj1+cDtmb3IoZD0wO2Q8ZztkKyspe3EucHVzaChuLmNoYXJDb2RlQXQoZCkpfXEucHVzaCgxODgpO3JldHVybiBfemVyb1BhZGRpbmdPZlNpZ25hdHVyZSh0aGlzLmRvUHJpdmF0ZShuZXcgQmlnSW50ZWdlcihxKSkudG9TdHJpbmcoMTYpLHRoaXMubi5iaXRMZW5ndGgoKSl9ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0RGVjcnlwdFNpZ25hdHVyZUJJKGEsZCxjKXt2YXIgYj1uZXcgUlNBS2V5KCk7Yi5zZXRQdWJsaWMoZCxjKTt2YXIgZT1iLmRvUHVibGljKGEpO3JldHVybiBlfWZ1bmN0aW9uIF9yc2FzaWduX2dldEhleERpZ2VzdEluZm9Gcm9tU2lnKGEsYyxiKXt2YXIgZT1fcnNhc2lnbl9nZXREZWNyeXB0U2lnbmF0dXJlQkkoYSxjLGIpO3ZhciBkPWUudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14xZiswMC8sXCJcIik7cmV0dXJuIGR9ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZil7Zm9yKHZhciBlIGluIEtKVVIuY3J5cHRvLlV0aWwuRElHRVNUSU5GT0hFQUQpe3ZhciBkPUtKVVIuY3J5cHRvLlV0aWwuRElHRVNUSU5GT0hFQURbZV07dmFyIGI9ZC5sZW5ndGg7aWYoZi5zdWJzdHJpbmcoMCxiKT09ZCl7dmFyIGM9W2UsZi5zdWJzdHJpbmcoYildO3JldHVybiBjfX1yZXR1cm5bXX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlTaWduYXR1cmVXaXRoQXJncyhmLGIsZyxqKXt2YXIgZT1fcnNhc2lnbl9nZXRIZXhEaWdlc3RJbmZvRnJvbVNpZyhiLGcsaik7dmFyIGg9X3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZSk7aWYoaC5sZW5ndGg9PTApe3JldHVybiBmYWxzZX12YXIgZD1oWzBdO3ZhciBpPWhbMV07dmFyIGE9ZnVuY3Rpb24oayl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhrLGQpfTt2YXIgYz1hKGYpO3JldHVybihpPT1jKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlIZXhTaWduYXR1cmVGb3JNZXNzYWdlKGMsYil7dmFyIGQ9cGFyc2VCaWdJbnQoYywxNik7dmFyIGE9X3JzYXNpZ25fdmVyaWZ5U2lnbmF0dXJlV2l0aEFyZ3MoYixkLHRoaXMubi50b1N0cmluZygxNiksdGhpcy5lLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGF9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5U3RyaW5nKGYsail7aj1qLnJlcGxhY2UoX1JFX0hFWERFQ09OTFksXCJcIik7aj1qLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTt2YXIgYj1wYXJzZUJpZ0ludChqLDE2KTtpZihiLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIDB9dmFyIGk9dGhpcy5kb1B1YmxpYyhiKTt2YXIgZT1pLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3ZhciBnPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGUpO2lmKGcubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9Z1swXTt2YXIgaD1nWzFdO3ZhciBhPWZ1bmN0aW9uKGspe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoayxkKX07dmFyIGM9YShmKTtyZXR1cm4oaD09Yyl9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKGUsYSl7YT1hLnJlcGxhY2UoX1JFX0hFWERFQ09OTFksXCJcIik7YT1hLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTt2YXIgYj1wYXJzZUJpZ0ludChhLDE2KTtpZihiLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIDB9dmFyIGg9dGhpcy5kb1B1YmxpYyhiKTt2YXIgZz1oLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3ZhciBjPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGcpO2lmKGMubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9Y1swXTt2YXIgZj1jWzFdO3JldHVybihmPT1lKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlTdHJpbmdQU1MoYyxiLGEsZil7dmFyIGU9ZnVuY3Rpb24oZyl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChnLGEpfTt2YXIgZD1lKHJzdHJ0b2hleChjKSk7aWYoZj09PXVuZGVmaW5lZCl7Zj0tMX1yZXR1cm4gdGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1MoZCxiLGEsZil9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTKGYscyxsLGMpe3ZhciBrPW5ldyBCaWdJbnRlZ2VyKHMsMTYpO2lmKGsuYml0TGVuZ3RoKCk+dGhpcy5uLmJpdExlbmd0aCgpKXtyZXR1cm4gZmFsc2V9dmFyIHI9ZnVuY3Rpb24oaSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChpLGwpfTt2YXIgaj1oZXh0b3JzdHIoZik7dmFyIGg9ai5sZW5ndGg7dmFyIGc9dGhpcy5uLmJpdExlbmd0aCgpLTE7dmFyIG09TWF0aC5jZWlsKGcvOCk7dmFyIHE7aWYoYz09PS0xfHxjPT09dW5kZWZpbmVkKXtjPWh9ZWxzZXtpZihjPT09LTIpe2M9bS1oLTJ9ZWxzZXtpZihjPC0yKXt0aHJvd1wiaW52YWxpZCBzYWx0IGxlbmd0aFwifX19aWYobTwoaCtjKzIpKXt0aHJvd1wiZGF0YSB0b28gbG9uZ1wifXZhciBhPXRoaXMuZG9QdWJsaWMoaykudG9CeXRlQXJyYXkoKTtmb3IocT0wO3E8YS5sZW5ndGg7cSs9MSl7YVtxXSY9MjU1fXdoaWxlKGEubGVuZ3RoPG0pe2EudW5zaGlmdCgwKX1pZihhW20tMV0hPT0xODgpe3Rocm93XCJlbmNvZGVkIG1lc3NhZ2UgZG9lcyBub3QgZW5kIGluIDB4YmNcIn1hPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGEpO3ZhciBkPWEuc3Vic3RyKDAsbS1oLTEpO3ZhciBlPWEuc3Vic3RyKGQubGVuZ3RoLGgpO3ZhciBwPSg2NTI4MD4+KDgqbS1nKSkmMjU1O2lmKChkLmNoYXJDb2RlQXQoMCkmcCkhPT0wKXt0aHJvd1wiYml0cyBiZXlvbmQga2V5c2l6ZSBub3QgemVyb1wifXZhciBuPXBzc19tZ2YxX3N0cihlLGQubGVuZ3RoLHIpO3ZhciBvPVtdO2ZvcihxPTA7cTxkLmxlbmd0aDtxKz0xKXtvW3FdPWQuY2hhckNvZGVBdChxKV5uLmNoYXJDb2RlQXQocSl9b1swXSY9fnA7dmFyIGI9bS1oLWMtMjtmb3IocT0wO3E8YjtxKz0xKXtpZihvW3FdIT09MCl7dGhyb3dcImxlZnRtb3N0IG9jdGV0cyBub3QgemVyb1wifX1pZihvW2JdIT09MSl7dGhyb3dcIjB4MDEgbWFya2VyIG5vdCBmb3VuZFwifXJldHVybiBlPT09aGV4dG9yc3RyKHIocnN0cnRvaGV4KFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiK2orU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsby5zbGljZSgtYykpKSkpfVJTQUtleS5wcm90b3R5cGUuc2lnbldpdGhNZXNzYWdlSGFzaD1fcnNhc2lnbl9zaWduV2l0aE1lc3NhZ2VIYXNoO1JTQUtleS5wcm90b3R5cGUuc2lnblN0cmluZz1fcnNhc2lnbl9zaWduU3RyaW5nO1JTQUtleS5wcm90b3R5cGUuc2lnblN0cmluZ1dpdGhTSEExPV9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMTtSU0FLZXkucHJvdG90eXBlLnNpZ25TdHJpbmdXaXRoU0hBMjU2PV9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMjU2O1JTQUtleS5wcm90b3R5cGUuc2lnbj1fcnNhc2lnbl9zaWduU3RyaW5nO1JTQUtleS5wcm90b3R5cGUuc2lnbldpdGhTSEExPV9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMTtSU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoU0hBMjU2PV9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMjU2O1JTQUtleS5wcm90b3R5cGUuc2lnbldpdGhNZXNzYWdlSGFzaFBTUz1fcnNhc2lnbl9zaWduV2l0aE1lc3NhZ2VIYXNoUFNTO1JTQUtleS5wcm90b3R5cGUuc2lnblN0cmluZ1BTUz1fcnNhc2lnbl9zaWduU3RyaW5nUFNTO1JTQUtleS5wcm90b3R5cGUuc2lnblBTUz1fcnNhc2lnbl9zaWduU3RyaW5nUFNTO1JTQUtleS5TQUxUX0xFTl9ITEVOPS0xO1JTQUtleS5TQUxUX0xFTl9NQVg9LTI7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlXaXRoTWVzc2FnZUhhc2g9X3JzYXNpZ25fdmVyaWZ5V2l0aE1lc3NhZ2VIYXNoO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5U3RyaW5nPV9yc2FzaWduX3ZlcmlmeVN0cmluZztSU0FLZXkucHJvdG90eXBlLnZlcmlmeUhleFNpZ25hdHVyZUZvck1lc3NhZ2U9X3JzYXNpZ25fdmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZTtSU0FLZXkucHJvdG90eXBlLnZlcmlmeT1fcnNhc2lnbl92ZXJpZnlTdHJpbmc7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlIZXhTaWduYXR1cmVGb3JCeXRlQXJyYXlNZXNzYWdlPV9yc2FzaWduX3ZlcmlmeUhleFNpZ25hdHVyZUZvck1lc3NhZ2U7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1M9X3JzYXNpZ25fdmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5U3RyaW5nUFNTPV9yc2FzaWduX3ZlcmlmeVN0cmluZ1BTUztSU0FLZXkucHJvdG90eXBlLnZlcmlmeVBTUz1fcnNhc2lnbl92ZXJpZnlTdHJpbmdQU1M7UlNBS2V5LlNBTFRfTEVOX1JFQ09WRVI9LTI7XG4vKiEgeDUwOS0xLjEuOS5qcyAoYykgMjAxMi0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIFg1MDkoKXt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0E9bnVsbDt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaE49bnVsbDt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaEU9bnVsbDt0aGlzLmhleD1udWxsO3RoaXMuZ2V0U2VyaWFsTnVtYmVySGV4PWZ1bmN0aW9uKCl7cmV0dXJuIEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDFdKX07dGhpcy5nZXRTaWduYXR1cmVBbGdvcml0aG1GaWVsZD1mdW5jdGlvbigpe3ZhciBiPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDIsMF0pO3ZhciBhPUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludChiKTt2YXIgYz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYSk7cmV0dXJuIGN9O3RoaXMuZ2V0SXNzdWVySGV4PWZ1bmN0aW9uKCl7cmV0dXJuIEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsM10pfTt0aGlzLmdldElzc3VlclN0cmluZz1mdW5jdGlvbigpe3JldHVybiBYNTA5LmhleDJkbihBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDNdKSl9O3RoaXMuZ2V0U3ViamVjdEhleD1mdW5jdGlvbigpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDVdKX07dGhpcy5nZXRTdWJqZWN0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFg1MDkuaGV4MmRuKEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsNV0pKX07dGhpcy5nZXROb3RCZWZvcmU9ZnVuY3Rpb24oKXt2YXIgYT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCw0LDBdKTthPWEucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpO2E9ZGVjb2RlVVJJQ29tcG9uZW50KGEpO3JldHVybiBhfTt0aGlzLmdldE5vdEFmdGVyPWZ1bmN0aW9uKCl7dmFyIGE9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsNCwxXSk7YT1hLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTthPWRlY29kZVVSSUNvbXBvbmVudChhKTtyZXR1cm4gYX07dGhpcy5yZWFkQ2VydFBFTT1mdW5jdGlvbihjKXt2YXIgZT1YNTA5LnBlbVRvSGV4KGMpO3ZhciBiPVg1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydEhleChlKTt2YXIgZD1uZXcgUlNBS2V5KCk7ZC5zZXRQdWJsaWMoYlswXSxiWzFdKTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0E9ZDt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaE49YlswXTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaEU9YlsxXTt0aGlzLmhleD1lfTt0aGlzLnJlYWRDZXJ0UEVNV2l0aG91dFJTQUluaXQ9ZnVuY3Rpb24oYyl7dmFyIGQ9WDUwOS5wZW1Ub0hleChjKTt2YXIgYj1YNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRIZXgoZCk7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBLnNldFB1YmxpYyhiWzBdLGJbMV0pO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oTj1iWzBdO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oRT1iWzFdO3RoaXMuaGV4PWR9O3RoaXMuZ2V0SW5mbz1mdW5jdGlvbigpe3ZhciBwPVwiQmFzaWMgRmllbGRzXFxuXCI7cCs9XCIgIHNlcmlhbCBudW1iZXI6IFwiK3RoaXMuZ2V0U2VyaWFsTnVtYmVySGV4KCkrXCJcXG5cIjtwKz1cIiAgc2lnbmF0dXJlIGFsZ29yaXRobTogXCIrdGhpcy5nZXRTaWduYXR1cmVBbGdvcml0aG1GaWVsZCgpK1wiXFxuXCI7cCs9XCIgIGlzc3VlcjogXCIrdGhpcy5nZXRJc3N1ZXJTdHJpbmcoKStcIlxcblwiO3ArPVwiICBub3RCZWZvcmU6IFwiK3RoaXMuZ2V0Tm90QmVmb3JlKCkrXCJcXG5cIjtwKz1cIiAgbm90QWZ0ZXI6IFwiK3RoaXMuZ2V0Tm90QWZ0ZXIoKStcIlxcblwiO3ArPVwiICBzdWJqZWN0OiBcIit0aGlzLmdldFN1YmplY3RTdHJpbmcoKStcIlxcblwiO3ArPVwiICBzdWJqZWN0IHB1YmxpYyBrZXkgaW5mbzogXFxuXCI7dmFyIGo9WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5SW5mb1Bvc0Zyb21DZXJ0SGV4KHRoaXMuaGV4KTt2YXIgZD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHRoaXMuaGV4LGopO3ZhciBuPUtFWVVUSUwuZ2V0S2V5KGQsbnVsbCxcInBrY3M4cHViXCIpO2lmKG4gaW5zdGFuY2VvZiBSU0FLZXkpe3ArPVwiICAgIGtleSBhbGdvcml0aG06IFJTQVxcblwiO3ArPVwiICAgIG49XCIrbi5uLnRvU3RyaW5nKDE2KS5zdWJzdHIoMCwxNikrXCIuLi5cXG5cIjtwKz1cIiAgICBlPVwiK24uZS50b1N0cmluZygxNikrXCJcXG5cIn1wKz1cIlg1MDl2MyBFeHRlbnNpb25zOlxcblwiO3ZhciBtPVg1MDkuZ2V0VjNFeHRJbmZvTGlzdE9mQ2VydEhleCh0aGlzLmhleCk7Zm9yKHZhciBlPTA7ZTxtLmxlbmd0aDtlKyspe3ZhciBiPW1bZV07dmFyIG89S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGIub2lkKTtpZihvPT09XCJcIil7bz1iLm9pZH12YXIgaz1cIlwiO2lmKGIuY3JpdGljYWw9PT10cnVlKXtrPVwiQ1JJVElDQUxcIn1wKz1cIiAgXCIrbytcIiBcIitrK1wiOlxcblwiO2lmKG89PT1cImJhc2ljQ29uc3RyYWludHNcIil7dmFyIGc9WDUwOS5nZXRFeHRCYXNpY0NvbnN0cmFpbnRzKHRoaXMuaGV4KTtpZihnLmNBPT09dW5kZWZpbmVkKXtwKz1cIiAgICB7fVxcblwifWVsc2V7cCs9XCIgICAgY0E9dHJ1ZVwiO2lmKGcucGF0aExlbiE9PXVuZGVmaW5lZCl7cCs9XCIsIHBhdGhMZW49XCIrZy5wYXRoTGVufXArPVwiXFxuXCJ9fWVsc2V7aWYobz09PVwia2V5VXNhZ2VcIil7cCs9XCIgICAgXCIrWDUwOS5nZXRFeHRLZXlVc2FnZVN0cmluZyh0aGlzLmhleCkrXCJcXG5cIn1lbHNle2lmKG89PT1cInN1YmplY3RLZXlJZGVudGlmaWVyXCIpe3ArPVwiICAgIFwiK1g1MDkuZ2V0RXh0U3ViamVjdEtleUlkZW50aWZpZXIodGhpcy5oZXgpK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJhdXRob3JpdHlLZXlJZGVudGlmaWVyXCIpe3ZhciBhPVg1MDkuZ2V0RXh0QXV0aG9yaXR5S2V5SWRlbnRpZmllcih0aGlzLmhleCk7aWYoYS5raWQhPT11bmRlZmluZWQpe3ArPVwiICAgIGtpZD1cIithLmtpZCtcIlxcblwifX1lbHNle2lmKG89PT1cImV4dEtleVVzYWdlXCIpe3ZhciBoPVg1MDkuZ2V0RXh0RXh0S2V5VXNhZ2VOYW1lKHRoaXMuaGV4KTtwKz1cIiAgICBcIitoLmpvaW4oXCIsIFwiKStcIlxcblwifWVsc2V7aWYobz09PVwic3ViamVjdEFsdE5hbWVcIil7dmFyIGY9WDUwOS5nZXRFeHRTdWJqZWN0QWx0TmFtZSh0aGlzLmhleCk7cCs9XCIgICAgXCIrZi5qb2luKFwiLCBcIikrXCJcXG5cIn1lbHNle2lmKG89PT1cImNSTERpc3RyaWJ1dGlvblBvaW50c1wiKXt2YXIgbD1YNTA5LmdldEV4dENSTERpc3RyaWJ1dGlvblBvaW50c1VSSSh0aGlzLmhleCk7cCs9XCIgICAgXCIrbCtcIlxcblwifWVsc2V7aWYobz09PVwiYXV0aG9yaXR5SW5mb0FjY2Vzc1wiKXt2YXIgYz1YNTA5LmdldEV4dEFJQUluZm8odGhpcy5oZXgpO2lmKGMub2NzcCE9PXVuZGVmaW5lZCl7cCs9XCIgICAgb2NzcDogXCIrYy5vY3NwLmpvaW4oXCIsXCIpK1wiXFxuXCJ9aWYoYy5jYWlzc3VlciE9PXVuZGVmaW5lZCl7cCs9XCIgICAgY2Fpc3N1ZXI6IFwiK2MuY2Fpc3N1ZXIuam9pbihcIixcIikrXCJcXG5cIn19fX19fX19fX1wKz1cInNpZ25hdHVyZSBhbGdvcml0aG06IFwiK1g1MDkuZ2V0U2lnbmF0dXJlQWxnb3JpdGhtTmFtZSh0aGlzLmhleCkrXCJcXG5cIjtwKz1cInNpZ25hdHVyZTogXCIrWDUwOS5nZXRTaWduYXR1cmVWYWx1ZUhleCh0aGlzLmhleCkuc3Vic3RyKDAsMTYpK1wiLi4uXFxuXCI7cmV0dXJuIHB9fVg1MDkucGVtVG9CYXNlNjQ9ZnVuY3Rpb24oYSl7dmFyIGI9YTtiPWIucmVwbGFjZShcIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVwiLFwiXCIpO2I9Yi5yZXBsYWNlKFwiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVwiLFwiXCIpO2I9Yi5yZXBsYWNlKC9bIFxcbl0rL2csXCJcIik7cmV0dXJuIGJ9O1g1MDkucGVtVG9IZXg9ZnVuY3Rpb24oYSl7dmFyIGM9WDUwOS5wZW1Ub0Jhc2U2NChhKTt2YXIgYj1iNjR0b2hleChjKTtyZXR1cm4gYn07WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5UG9zRnJvbUNlcnRIZXg9ZnVuY3Rpb24oZil7dmFyIGU9WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5SW5mb1Bvc0Zyb21DZXJ0SGV4KGYpO2lmKGU9PS0xKXtyZXR1cm4gLTF9dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixlKTtpZihiLmxlbmd0aCE9Mil7cmV0dXJuIC0xfXZhciBkPWJbMV07aWYoZi5zdWJzdHJpbmcoZCxkKzIpIT1cIjAzXCIpe3JldHVybiAtMX12YXIgYz1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGYsZCk7aWYoZi5zdWJzdHJpbmcoYyxjKzIpIT1cIjAwXCIpe3JldHVybiAtMX1yZXR1cm4gYysyfTtYNTA5LmdldFN1YmplY3RQdWJsaWNLZXlJbmZvUG9zRnJvbUNlcnRIZXg9ZnVuY3Rpb24oZCl7dmFyIGM9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihkLDApO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsYyk7aWYoYi5sZW5ndGg8MSl7cmV0dXJuIC0xfWlmKGQuc3Vic3RyaW5nKGJbMF0sYlswXSsxMCk9PVwiYTAwMzAyMDEwMlwiKXtpZihiLmxlbmd0aDw2KXtyZXR1cm4gLTF9cmV0dXJuIGJbNl19ZWxzZXtpZihiLmxlbmd0aDw1KXtyZXR1cm4gLTF9cmV0dXJuIGJbNV19fTtYNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRIZXg9ZnVuY3Rpb24oZil7dmFyIGU9WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5UG9zRnJvbUNlcnRIZXgoZik7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixlKTtpZihiLmxlbmd0aCE9Mil7cmV0dXJuW119dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixiWzBdKTt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGJbMV0pO2lmKGQhPW51bGwmJmMhPW51bGwpe3JldHVybltkLGNdfWVsc2V7cmV0dXJuW119fTtYNTA5LmdldEhleFRic0NlcnRpZmljYXRlRnJvbUNlcnQ9ZnVuY3Rpb24oYil7dmFyIGE9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihiLDApO3JldHVybiBhfTtYNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRQRU09ZnVuY3Rpb24oYyl7dmFyIGQ9WDUwOS5wZW1Ub0hleChjKTt2YXIgYj1YNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRIZXgoZCk7cmV0dXJuIGJ9O1g1MDkuaGV4MmRuPWZ1bmN0aW9uKGUpe3ZhciBmPVwiXCI7dmFyIGM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSwwKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGI9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihlLGNbZF0pO2Y9ZitcIi9cIitYNTA5LmhleDJyZG4oYil9cmV0dXJuIGZ9O1g1MDkuaGV4MnJkbj1mdW5jdGlvbihhKXt2YXIgZj1BU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdChhLDAsWzAsMF0pO3ZhciBlPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdChhLDAsWzAsMV0pO3ZhciBjPVwiXCI7dHJ5e2M9WDUwOS5ETl9BVFRSSEVYW2ZdfWNhdGNoKGIpe2M9Zn1lPWUucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpO3ZhciBkPWRlY29kZVVSSUNvbXBvbmVudChlKTtyZXR1cm4gYytcIj1cIitkfTtYNTA5LkROX0FUVFJIRVg9e1wiMDYwMzU1MDQwNlwiOlwiQ1wiLFwiMDYwMzU1MDQwYVwiOlwiT1wiLFwiMDYwMzU1MDQwYlwiOlwiT1VcIixcIjA2MDM1NTA0MDNcIjpcIkNOXCIsXCIwNjAzNTUwNDA1XCI6XCJTTlwiLFwiMDYwMzU1MDQwOFwiOlwiU1RcIixcIjA2MDM1NTA0MDdcIjpcIkxcIixcIjA2MDM1NTA0MDlcIjpcInN0cmVldEFkZHJlc3NcIixcIjA2MDM1NTA0MGZcIjpcImJ1c2luZXNzQ2F0ZWdvcnlcIixcIjA2MDM1NTA0MTFcIjpcInBvc3RhbENvZGVcIixcIjA2MGIyYjA2MDEwNDAxODIzNzNjMDIwMTAyXCI6XCJqdXJpc2RpY3Rpb25PZkluY29ycG9yYXRpb25TUFwiLFwiMDYwYjJiMDYwMTA0MDE4MjM3M2MwMjAxMDNcIjpcImp1cmlzZGljdGlvbk9mSW5jb3Jwb3JhdGlvbkNcIix9O1g1MDkuZ2V0UHVibGljS2V5RnJvbUNlcnRQRU09ZnVuY3Rpb24oZil7dmFyIGM9WDUwOS5nZXRQdWJsaWNLZXlJbmZvUHJvcE9mQ2VydFBFTShmKTtpZihjLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dmFyIGk9S0VZVVRJTC5wYXJzZVB1YmxpY1Jhd1JTQUtleUhleChjLmtleWhleCk7dmFyIGo9bmV3IFJTQUtleSgpO2ouc2V0UHVibGljKGkubixpLmUpO3JldHVybiBqfWVsc2V7aWYoYy5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7dmFyIGU9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW2MuYWxncGFyYW1dO3ZhciBqPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZSxpbmZvOmMua2V5aGV4fSk7ai5zZXRQdWJsaWNLZXlIZXgoYy5rZXloZXgpO3JldHVybiBqfWVsc2V7aWYoYy5hbGdvaWQ9PVwiMmE4NjQ4Y2UzODA0MDFcIil7dmFyIGI9QVNOMUhFWC5nZXRWYnlMaXN0KGMuYWxncGFyYW0sMCxbMF0sXCIwMlwiKTt2YXIgYT1BU04xSEVYLmdldFZieUxpc3QoYy5hbGdwYXJhbSwwLFsxXSxcIjAyXCIpO3ZhciBkPUFTTjFIRVguZ2V0VmJ5TGlzdChjLmFsZ3BhcmFtLDAsWzJdLFwiMDJcIik7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYy5rZXloZXgsMCk7aD1oLnN1YnN0cigyKTt2YXIgaj1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7ai5zZXRQdWJsaWMobmV3IEJpZ0ludGVnZXIoYiwxNiksbmV3IEJpZ0ludGVnZXIoYSwxNiksbmV3IEJpZ0ludGVnZXIoZCwxNiksbmV3IEJpZ0ludGVnZXIoaCwxNikpO3JldHVybiBqfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIGtleVwifX19fTtYNTA5LmdldFB1YmxpY0tleUluZm9Qcm9wT2ZDZXJ0UEVNPWZ1bmN0aW9uKGUpe3ZhciBpPXt9O2kuYWxncGFyYW09bnVsbDt2YXIgZj1YNTA5LnBlbVRvSGV4KGUpO3ZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsMCk7aWYoZC5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihmLnN1YnN0cihkWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGRbMF0pO3ZhciBnPTY7aWYoZi5zdWJzdHIoY1swXSwyKSE9PVwiYTBcIil7Zz01fWlmKGMubGVuZ3RoPGcrMSl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAzKVwifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsY1tnXSk7aWYoYS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNClcIn12YXIgaD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGFbMF0pO2lmKGgubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDUpXCJ9aS5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixoWzBdKTtpZihmLnN1YnN0cihoWzFdLDIpPT1cIjA2XCIpe2kuYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixoWzFdKX1lbHNle2lmKGYuc3Vic3RyKGhbMV0sMik9PVwiMzBcIil7aS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGYsaFsxXSl9fWlmKGYuc3Vic3RyKGFbMV0sMikhPVwiMDNcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA2KVwifXZhciBiPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsYVsxXSk7aS5rZXloZXg9Yi5zdWJzdHIoMik7cmV0dXJuIGl9O1g1MDkuZ2V0UHVibGljS2V5SW5mb1Bvc09mQ2VydEhFWD1mdW5jdGlvbihjKXt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihjLDApO2lmKGIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDEpXCJ9aWYoYy5zdWJzdHIoYlswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDIpXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooYyxiWzBdKTtpZihhLmxlbmd0aDw3KXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDMpXCJ9cmV0dXJuIGFbNl19O1g1MDkuZ2V0VjNFeHRJbmZvTGlzdE9mQ2VydEhleD1mdW5jdGlvbihnKXt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLDApO2lmKGIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDEpXCJ9aWYoZy5zdWJzdHIoYlswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDIpXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxiWzBdKTtpZihhLmxlbmd0aDw4KXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDMpXCJ9aWYoZy5zdWJzdHIoYVs3XSwyKSE9XCJhM1wiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDQpXCJ9dmFyIGg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxhWzddKTtpZihoLmxlbmd0aCE9MSl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA1KVwifWlmKGcuc3Vic3RyKGhbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA2KVwifXZhciBmPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsaFswXSk7dmFyIGU9Zi5sZW5ndGg7dmFyIGQ9bmV3IEFycmF5KGUpO2Zvcih2YXIgYz0wO2M8ZTtjKyspe2RbY109WDUwOS5nZXRWM0V4dEl0ZW1JbmZvX0F0T2JqKGcsZltjXSl9cmV0dXJuIGR9O1g1MDkuZ2V0VjNFeHRJdGVtSW5mb19BdE9iaj1mdW5jdGlvbihmLGcpe3ZhciBlPXt9O2UucG9zVExWPWc7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixnKTtpZihiLmxlbmd0aCE9MiYmYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDl2MyBFeHQgKGNvZGU6MDAxKVwifWlmKGYuc3Vic3RyKGJbMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOXYzIEV4dCAoY29kZTowMDIpXCJ9dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixiWzBdKTtlLm9pZD1BU04xSEVYLmhleHRvb2lkc3RyKGQpO2UuY3JpdGljYWw9ZmFsc2U7aWYoYi5sZW5ndGg9PTMpe2UuY3JpdGljYWw9dHJ1ZX12YXIgYz1iW2IubGVuZ3RoLTFdO2lmKGYuc3Vic3RyKGMsMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOXYzIEV4dCAoY29kZTowMDMpXCJ9ZS5wb3NWPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooZixjKTtyZXR1cm4gZX07WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlPWZ1bmN0aW9uKGIsYSl7dmFyIGM9WDUwOS5nZXRQb3NPZlRMVl9WM0V4dFZhbHVlKGIsYSk7aWYoYz09LTEpe3JldHVybiBudWxsfXJldHVybiBBU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGIsYyl9O1g1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWU9ZnVuY3Rpb24oYixhKXt2YXIgYz1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoYixhKTtpZihjPT0tMSl7cmV0dXJuIG51bGx9cmV0dXJuIEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGIsYyl9O1g1MDkuZ2V0UG9zT2ZUTFZfVjNFeHRWYWx1ZT1mdW5jdGlvbihmLGIpe3ZhciBkPWI7aWYoIWIubWF0Y2goL15bMC05Ll0rJC8pKXtkPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZChiKX1pZihkPT1cIlwiKXtyZXR1cm4gLTF9dmFyIGM9WDUwOS5nZXRWM0V4dEluZm9MaXN0T2ZDZXJ0SGV4KGYpO2Zvcih2YXIgYT0wO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZT1jW2FdO2lmKGUub2lkPT1kKXtyZXR1cm4gZS5wb3NWfX1yZXR1cm4gLTF9O1g1MDkuZ2V0RXh0QmFzaWNDb25zdHJhaW50cz1mdW5jdGlvbihkKXt2YXIgYT1YNTA5LmdldEhleE9mVl9WM0V4dFZhbHVlKGQsXCJiYXNpY0NvbnN0cmFpbnRzXCIpO2lmKGE9PT1udWxsKXtyZXR1cm4gbnVsbH1pZihhPT09XCJcIil7cmV0dXJue319aWYoYT09PVwiMDEwMWZmXCIpe3JldHVybntjQTp0cnVlfX1pZihhLnN1YnN0cigwLDgpPT09XCIwMTAxZmYwMlwiKXt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihhLDYpO3ZhciBiPXBhcnNlSW50KGMsMTYpO3JldHVybntjQTp0cnVlLHBhdGhMZW46Yn19dGhyb3dcInVua25vd24gZXJyb3JcIn07WDUwOS5LRVlVU0FHRV9OQU1FPVtcImRpZ2l0YWxTaWduYXR1cmVcIixcIm5vblJlcHVkaWF0aW9uXCIsXCJrZXlFbmNpcGhlcm1lbnRcIixcImRhdGFFbmNpcGhlcm1lbnRcIixcImtleUFncmVlbWVudFwiLFwia2V5Q2VydFNpZ25cIixcImNSTFNpZ25cIixcImVuY2lwaGVyT25seVwiLFwiZGVjaXBoZXJPbmx5XCJdO1g1MDkuZ2V0RXh0S2V5VXNhZ2VCaW49ZnVuY3Rpb24oZCl7dmFyIGI9WDUwOS5nZXRIZXhPZlZfVjNFeHRWYWx1ZShkLFwia2V5VXNhZ2VcIik7aWYoYj09XCJcIil7cmV0dXJuXCJcIn1pZihiLmxlbmd0aCUyIT0wfHxiLmxlbmd0aDw9Mil7dGhyb3dcIm1hbGZvcm1lZCBrZXkgdXNhZ2UgdmFsdWVcIn12YXIgYT1wYXJzZUludChiLnN1YnN0cigwLDIpKTt2YXIgYz1wYXJzZUludChiLnN1YnN0cigyKSwxNikudG9TdHJpbmcoMik7cmV0dXJuIGMuc3Vic3RyKDAsYy5sZW5ndGgtYSl9O1g1MDkuZ2V0RXh0S2V5VXNhZ2VTdHJpbmc9ZnVuY3Rpb24oZSl7dmFyIGQ9WDUwOS5nZXRFeHRLZXlVc2FnZUJpbihlKTt2YXIgYj1uZXcgQXJyYXkoKTtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7aWYoZC5zdWJzdHIoYywxKT09XCIxXCIpe2IucHVzaChYNTA5LktFWVVTQUdFX05BTUVbY10pfX1yZXR1cm4gYi5qb2luKFwiLFwiKX07WDUwOS5nZXRFeHRTdWJqZWN0S2V5SWRlbnRpZmllcj1mdW5jdGlvbihiKXt2YXIgYT1YNTA5LmdldEhleE9mVl9WM0V4dFZhbHVlKGIsXCJzdWJqZWN0S2V5SWRlbnRpZmllclwiKTtyZXR1cm4gYX07WDUwOS5nZXRFeHRBdXRob3JpdHlLZXlJZGVudGlmaWVyPWZ1bmN0aW9uKGYpe3ZhciBiPXt9O3ZhciBlPVg1MDkuZ2V0SGV4T2ZUTFZfVjNFeHRWYWx1ZShmLFwiYXV0aG9yaXR5S2V5SWRlbnRpZmllclwiKTtpZihlPT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSwwKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7aWYoZS5zdWJzdHIoY1tkXSwyKT09PVwiODBcIil7Yi5raWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxjW2RdKX19cmV0dXJuIGJ9O1g1MDkuZ2V0RXh0RXh0S2V5VXNhZ2VOYW1lPWZ1bmN0aW9uKGspe3ZhciBiPW5ldyBBcnJheSgpO3ZhciBmPVg1MDkuZ2V0SGV4T2ZUTFZfVjNFeHRWYWx1ZShrLFwiZXh0S2V5VXNhZ2VcIik7aWYoZj09PW51bGwpe3JldHVybiBudWxsfXZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsMCk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBqPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsY1tlXSk7dmFyIGc9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGopO3ZhciBkPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShnKTtiLnB1c2goZCl9cmV0dXJuIGJ9O1g1MDkuZ2V0RXh0U3ViamVjdEFsdE5hbWU9ZnVuY3Rpb24oZyl7dmFyIGI9bmV3IEFycmF5KCk7dmFyIGY9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKGcsXCJzdWJqZWN0QWx0TmFtZVwiKTt2YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLDApO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXtpZihmLnN1YnN0cihjW2VdLDIpPT09XCI4MlwiKXt2YXIgZD1oZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixjW2VdKSk7Yi5wdXNoKGQpfX1yZXR1cm4gYn07WDUwOS5nZXRFeHRDUkxEaXN0cmlidXRpb25Qb2ludHNVUkk9ZnVuY3Rpb24obil7dmFyIHA9bmV3IEFycmF5KCk7dmFyIGs9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKG4sXCJjUkxEaXN0cmlidXRpb25Qb2ludHNcIik7dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooaywwKTtmb3IodmFyIGc9MDtnPG8ubGVuZ3RoO2crKyl7dmFyIGw9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihrLG9bZ10pO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGwsMCk7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe2lmKGwuc3Vic3RyKGJbZV0sMik9PT1cImEwXCIpe3ZhciBmPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGwsYltlXSk7aWYoZi5zdWJzdHIoMCwyKT09PVwiYTBcIil7dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZiwwKTtpZihjLnN1YnN0cigwLDIpPT09XCI4NlwiKXt2YXIgbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihjLDApO3ZhciBkPWhleHRvdXRmOChtKTtwLnB1c2goZCl9fX19fXJldHVybiBwfTtYNTA5LmdldEV4dEFJQUluZm89ZnVuY3Rpb24oZyl7dmFyIGo9e307ai5vY3NwPVtdO2ouY2Fpc3N1ZXI9W107dmFyIGg9WDUwOS5nZXRQb3NPZlRMVl9WM0V4dFZhbHVlKGcsXCJhdXRob3JpdHlJbmZvQWNjZXNzXCIpO2lmKGg9PS0xKXtyZXR1cm4gbnVsbH1pZihnLnN1YnN0cihoLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgQUlBIEV4dG4gVmFsdWVcIn12YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGgpO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXt2YXIgYT1kW2NdO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsYSk7aWYoYi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgQWNjZXNzRGVzY3JpcHRpb24gb2YgQUlBIEV4dG5cIn12YXIgZT1iWzBdO3ZhciBmPWJbMV07aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxlKT09XCIyYjA2MDEwNTA1MDczMDAxXCIpe2lmKGcuc3Vic3RyKGYsMik9PVwiODZcIil7ai5vY3NwLnB1c2goaGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGcsZikpKX19aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxlKT09XCIyYjA2MDEwNTA1MDczMDAyXCIpe2lmKGcuc3Vic3RyKGYsMik9PVwiODZcIil7ai5jYWlzc3Vlci5wdXNoKGhleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGYpKSl9fX1yZXR1cm4gan07WDUwOS5nZXRTaWduYXR1cmVBbGdvcml0aG1OYW1lPWZ1bmN0aW9uKGQpe3ZhciBiPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdChkLDAsWzEsMF0pO3ZhciBhPUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludChiKTt2YXIgYz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYSk7cmV0dXJuIGN9O1g1MDkuZ2V0U2lnbmF0dXJlVmFsdWVIZXg9ZnVuY3Rpb24oYil7dmFyIGE9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KGIsMCxbMl0pO2lmKGEuc3Vic3RyKDAsMikhPT1cIjAwXCIpe3Rocm93XCJjYW4ndCBnZXQgc2lnbmF0dXJlIHZhbHVlXCJ9cmV0dXJuIGEuc3Vic3RyKDIpfTtYNTA5LmdldFNlcmlhbE51bWJlckhleD1mdW5jdGlvbihhKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KGEsMCxbMCwxXSl9O1xuLyohIGp3cy0zLjMuNCAoYykgMjAxMy0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5qd3M9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmp3cyl7S0pVUi5qd3M9e319S0pVUi5qd3MuSldTPWZ1bmN0aW9uKCl7dmFyIGE9S0pVUi5qd3MuSldTO3RoaXMucGFyc2VKV1M9ZnVuY3Rpb24oZSxnKXtpZigodGhpcy5wYXJzZWRKV1MhPT11bmRlZmluZWQpJiYoZ3x8KHRoaXMucGFyc2VkSldTLnNpZ3ZhbEghPT11bmRlZmluZWQpKSl7cmV0dXJufWlmKGUubWF0Y2goL14oW14uXSspXFwuKFteLl0rKVxcLihbXi5dKykkLyk9PW51bGwpe3Rocm93XCJKV1Mgc2lnbmF0dXJlIGlzIG5vdCBhIGZvcm0gb2YgJ0hlYWQuUGF5bG9hZC5TaWdWYWx1ZScuXCJ9dmFyIGg9UmVnRXhwLiQxO3ZhciBjPVJlZ0V4cC4kMjt2YXIgaT1SZWdFeHAuJDM7dmFyIGs9aCtcIi5cIitjO3RoaXMucGFyc2VkSldTPXt9O3RoaXMucGFyc2VkSldTLmhlYWRCNjRVPWg7dGhpcy5wYXJzZWRKV1MucGF5bG9hZEI2NFU9Yzt0aGlzLnBhcnNlZEpXUy5zaWd2YWxCNjRVPWk7dGhpcy5wYXJzZWRKV1Muc2k9aztpZighZyl7dmFyIGY9YjY0dXRvaGV4KGkpO3ZhciBkPXBhcnNlQmlnSW50KGYsMTYpO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEg9Zjt0aGlzLnBhcnNlZEpXUy5zaWd2YWxCST1kfXZhciBiPWI2NHV0b3V0ZjgoaCk7dmFyIGo9YjY0dXRvdXRmOChjKTt0aGlzLnBhcnNlZEpXUy5oZWFkUz1iO3RoaXMucGFyc2VkSldTLnBheWxvYWRTPWo7aWYoIWEuaXNTYWZlSlNPTlN0cmluZyhiLHRoaXMucGFyc2VkSldTLFwiaGVhZFBcIikpe3Rocm93XCJtYWxmb3JtZWQgSlNPTiBzdHJpbmcgZm9yIEpXUyBIZWFkOiBcIitifX19O0tKVVIuandzLkpXUy5zaWduPWZ1bmN0aW9uKGEsaSxjLG0sbCl7dmFyIGs9S0pVUi5qd3MuSldTO3ZhciBxLGUsajtpZih0eXBlb2YgaSE9XCJzdHJpbmdcIiYmdHlwZW9mIGkhPVwib2JqZWN0XCIpe3Rocm93XCJzcEhlYWRlciBtdXN0IGJlIEpTT04gc3RyaW5nIG9yIG9iamVjdDogXCIraX1pZih0eXBlb2YgaT09XCJvYmplY3RcIil7ZT1pO3E9SlNPTi5zdHJpbmdpZnkoZSl9aWYodHlwZW9mIGk9PVwic3RyaW5nXCIpe3E9aTtpZighay5pc1NhZmVKU09OU3RyaW5nKHEpKXt0aHJvd1wiSldTIEhlYWQgaXMgbm90IHNhZmUgSlNPTiBzdHJpbmc6IFwiK3F9ZT1rLnJlYWRTYWZlSlNPTlN0cmluZyhxKX1qPWM7aWYodHlwZW9mIGM9PVwib2JqZWN0XCIpe2o9SlNPTi5zdHJpbmdpZnkoYyl9aWYoKGE9PVwiXCJ8fGE9PW51bGwpJiZlLmFsZyE9PXVuZGVmaW5lZCl7YT1lLmFsZ31pZigoYSE9XCJcIiYmYSE9bnVsbCkmJmUuYWxnPT09dW5kZWZpbmVkKXtlLmFsZz1hO3E9SlNPTi5zdHJpbmdpZnkoZSl9aWYoYSE9PWUuYWxnKXt0aHJvd1wiYWxnIGFuZCBzSGVhZGVyLmFsZyBkb2Vzbid0IG1hdGNoOiBcIithK1wiIT1cIitlLmFsZ312YXIgZD1udWxsO2lmKGsuandzYWxnMnNpZ2FsZ1thXT09PXVuZGVmaW5lZCl7dGhyb3dcInVuc3VwcG9ydGVkIGFsZyBuYW1lOiBcIithfWVsc2V7ZD1rLmp3c2FsZzJzaWdhbGdbYV19dmFyIGI9dXRmOHRvYjY0dShxKTt2YXIgZz11dGY4dG9iNjR1KGopO3ZhciBvPWIrXCIuXCIrZzt2YXIgbj1cIlwiO2lmKGQuc3Vic3RyKDAsNCk9PVwiSG1hY1wiKXtpZihtPT09dW5kZWZpbmVkKXt0aHJvd1wibWFjIGtleSBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yIEhTKiBhbGdcIn12YXIgaD1uZXcgS0pVUi5jcnlwdG8uTWFjKHthbGc6ZCxwcm92OlwiY3J5cHRvanNcIixwYXNzOm19KTtoLnVwZGF0ZVN0cmluZyhvKTtuPWguZG9GaW5hbCgpfWVsc2V7aWYoZC5pbmRleE9mKFwid2l0aEVDRFNBXCIpIT0tMSl7dmFyIHA9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOmR9KTtwLmluaXQobSxsKTtwLnVwZGF0ZVN0cmluZyhvKTtoQVNOMVNpZz1wLnNpZ24oKTtuPUtKVVIuY3J5cHRvLkVDRFNBLmFzbjFTaWdUb0NvbmNhdFNpZyhoQVNOMVNpZyl9ZWxzZXtpZihkIT1cIm5vbmVcIil7dmFyIHA9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOmR9KTtwLmluaXQobSxsKTtwLnVwZGF0ZVN0cmluZyhvKTtuPXAuc2lnbigpfX19dmFyIGY9aGV4dG9iNjR1KG4pO3JldHVybiBvK1wiLlwiK2Z9O0tKVVIuandzLkpXUy52ZXJpZnk9ZnVuY3Rpb24ocCx0LGope3ZhciBtPUtKVVIuandzLkpXUzt2YXIgcT1wLnNwbGl0KFwiLlwiKTt2YXIgZD1xWzBdO3ZhciBsPXFbMV07dmFyIGI9ZCtcIi5cIitsO3ZhciByPWI2NHV0b2hleChxWzJdKTt2YXIgaT1tLnJlYWRTYWZlSlNPTlN0cmluZyhiNjR1dG91dGY4KHFbMF0pKTt2YXIgaD1udWxsO3ZhciBzPW51bGw7aWYoaS5hbGc9PT11bmRlZmluZWQpe3Rocm93XCJhbGdvcml0aG0gbm90IHNwZWNpZmllZCBpbiBoZWFkZXJcIn1lbHNle2g9aS5hbGc7cz1oLnN1YnN0cigwLDIpfWlmKGohPW51bGwmJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChqKT09PVwiW29iamVjdCBBcnJheV1cIiYmai5sZW5ndGg+MCl7dmFyIGM9XCI6XCIrai5qb2luKFwiOlwiKStcIjpcIjtpZihjLmluZGV4T2YoXCI6XCIraCtcIjpcIik9PS0xKXt0aHJvd1wiYWxnb3JpdGhtICdcIitoK1wiJyBub3QgYWNjZXB0ZWQgaW4gdGhlIGxpc3RcIn19aWYoaCE9XCJub25lXCImJnQ9PT1udWxsKXt0aHJvd1wia2V5IHNoYWxsIGJlIHNwZWNpZmllZCB0byB2ZXJpZnkuXCJ9aWYodHlwZW9mIHQ9PVwic3RyaW5nXCImJnQuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7dD1LRVlVVElMLmdldEtleSh0KX1pZihzPT1cIlJTXCJ8fHM9PVwiUFNcIil7aWYoISh0IGluc3RhbmNlb2YgUlNBS2V5KSl7dGhyb3dcImtleSBzaGFsbCBiZSBhIFJTQUtleSBvYmogZm9yIFJTKiBhbmQgUFMqIGFsZ3NcIn19aWYocz09XCJFU1wiKXtpZighKHQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSkpe3Rocm93XCJrZXkgc2hhbGwgYmUgYSBFQ0RTQSBvYmogZm9yIEVTKiBhbGdzXCJ9fWlmKGg9PVwibm9uZVwiKXt9dmFyIG49bnVsbDtpZihtLmp3c2FsZzJzaWdhbGdbaS5hbGddPT09dW5kZWZpbmVkKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnIG5hbWU6IFwiK2h9ZWxzZXtuPW0uandzYWxnMnNpZ2FsZ1toXX1pZihuPT1cIm5vbmVcIil7dGhyb3dcIm5vdCBzdXBwb3J0ZWRcIn1lbHNle2lmKG4uc3Vic3RyKDAsNCk9PVwiSG1hY1wiKXt2YXIgaz1udWxsO2lmKHQ9PT11bmRlZmluZWQpe3Rocm93XCJoZXhhZGVjaW1hbCBrZXkgc2hhbGwgYmUgc3BlY2lmaWVkIGZvciBITUFDXCJ9dmFyIGc9bmV3IEtKVVIuY3J5cHRvLk1hYyh7YWxnOm4scGFzczp0fSk7Zy51cGRhdGVTdHJpbmcoYik7az1nLmRvRmluYWwoKTtyZXR1cm4gcj09a31lbHNle2lmKG4uaW5kZXhPZihcIndpdGhFQ0RTQVwiKSE9LTEpe3ZhciBmPW51bGw7dHJ5e2Y9S0pVUi5jcnlwdG8uRUNEU0EuY29uY2F0U2lnVG9BU04xU2lnKHIpfWNhdGNoKG8pe3JldHVybiBmYWxzZX12YXIgZT1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6bn0pO2UuaW5pdCh0KTtlLnVwZGF0ZVN0cmluZyhiKTtyZXR1cm4gZS52ZXJpZnkoZil9ZWxzZXt2YXIgZT1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6bn0pO2UuaW5pdCh0KTtlLnVwZGF0ZVN0cmluZyhiKTtyZXR1cm4gZS52ZXJpZnkocil9fX19O0tKVVIuandzLkpXUy5wYXJzZT1mdW5jdGlvbihnKXt2YXIgYz1nLnNwbGl0KFwiLlwiKTt2YXIgYj17fTt2YXIgZixlLGQ7aWYoYy5sZW5ndGghPTImJmMubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIHNKV1M6IHdyb25nIG51bWJlciBvZiAnLicgc3BsaXR0ZWQgZWxlbWVudHNcIn1mPWNbMF07ZT1jWzFdO2lmKGMubGVuZ3RoPT0zKXtkPWNbMl19Yi5oZWFkZXJPYmo9S0pVUi5qd3MuSldTLnJlYWRTYWZlSlNPTlN0cmluZyhiNjR1dG91dGY4KGYpKTtiLnBheWxvYWRPYmo9S0pVUi5qd3MuSldTLnJlYWRTYWZlSlNPTlN0cmluZyhiNjR1dG91dGY4KGUpKTtiLmhlYWRlclBQPUpTT04uc3RyaW5naWZ5KGIuaGVhZGVyT2JqLG51bGwsXCIgIFwiKTtpZihiLnBheWxvYWRPYmo9PW51bGwpe2IucGF5bG9hZFBQPWI2NHV0b3V0ZjgoZSl9ZWxzZXtiLnBheWxvYWRQUD1KU09OLnN0cmluZ2lmeShiLnBheWxvYWRPYmosbnVsbCxcIiAgXCIpfWlmKGQhPT11bmRlZmluZWQpe2Iuc2lnSGV4PWI2NHV0b2hleChkKX1yZXR1cm4gYn07S0pVUi5qd3MuSldTLnZlcmlmeUpXVD1mdW5jdGlvbihkLGosbCl7dmFyIGg9S0pVUi5qd3MuSldTO3ZhciBpPWQuc3BsaXQoXCIuXCIpO3ZhciBjPWlbMF07dmFyIGc9aVsxXTt2YXIgbT1jK1wiLlwiK2c7dmFyIGs9YjY0dXRvaGV4KGlbMl0pO3ZhciBmPWgucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoYykpO3ZhciBlPWgucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZykpO2lmKGYuYWxnPT09dW5kZWZpbmVkKXtyZXR1cm4gZmFsc2V9aWYobC5hbGc9PT11bmRlZmluZWQpe3Rocm93XCJhY2NlcHRGaWVsZC5hbGcgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9aWYoIWguaW5BcnJheShmLmFsZyxsLmFsZykpe3JldHVybiBmYWxzZX1pZihlLmlzcyE9PXVuZGVmaW5lZCYmdHlwZW9mIGwuaXNzPT09XCJvYmplY3RcIil7aWYoIWguaW5BcnJheShlLmlzcyxsLmlzcykpe3JldHVybiBmYWxzZX19aWYoZS5zdWIhPT11bmRlZmluZWQmJnR5cGVvZiBsLnN1Yj09PVwib2JqZWN0XCIpe2lmKCFoLmluQXJyYXkoZS5zdWIsbC5zdWIpKXtyZXR1cm4gZmFsc2V9fWlmKGUuYXVkIT09dW5kZWZpbmVkJiZ0eXBlb2YgbC5hdWQ9PT1cIm9iamVjdFwiKXtpZih0eXBlb2YgZS5hdWQ9PVwic3RyaW5nXCIpe2lmKCFoLmluQXJyYXkoZS5hdWQsbC5hdWQpKXtyZXR1cm4gZmFsc2V9fWVsc2V7aWYodHlwZW9mIGUuYXVkPT1cIm9iamVjdFwiKXtpZighaC5pbmNsdWRlZEFycmF5KGUuYXVkLGwuYXVkKSl7cmV0dXJuIGZhbHNlfX19fXZhciBiPUtKVVIuandzLkludERhdGUuZ2V0Tm93KCk7aWYobC52ZXJpZnlBdCE9PXVuZGVmaW5lZCYmdHlwZW9mIGwudmVyaWZ5QXQ9PT1cIm51bWJlclwiKXtiPWwudmVyaWZ5QXR9aWYobC5ncmFjZVBlcmlvZD09PXVuZGVmaW5lZHx8dHlwZW9mIGwuZ3JhY2VQZXJpb2QhPT1cIm51bWJlclwiKXtsLmdyYWNlUGVyaW9kPTB9aWYoZS5leHAhPT11bmRlZmluZWQmJnR5cGVvZiBlLmV4cD09XCJudW1iZXJcIil7aWYoZS5leHArbC5ncmFjZVBlcmlvZDxiKXtyZXR1cm4gZmFsc2V9fWlmKGUubmJmIT09dW5kZWZpbmVkJiZ0eXBlb2YgZS5uYmY9PVwibnVtYmVyXCIpe2lmKGI8ZS5uYmYtbC5ncmFjZVBlcmlvZCl7cmV0dXJuIGZhbHNlfX1pZihlLmlhdCE9PXVuZGVmaW5lZCYmdHlwZW9mIGUuaWF0PT1cIm51bWJlclwiKXtpZihiPGUuaWF0LWwuZ3JhY2VQZXJpb2Qpe3JldHVybiBmYWxzZX19aWYoZS5qdGkhPT11bmRlZmluZWQmJmwuanRpIT09dW5kZWZpbmVkKXtpZihlLmp0aSE9PWwuanRpKXtyZXR1cm4gZmFsc2V9fWlmKCFLSlVSLmp3cy5KV1MudmVyaWZ5KGQsaixsLmFsZykpe3JldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX07S0pVUi5qd3MuSldTLmluY2x1ZGVkQXJyYXk9ZnVuY3Rpb24oYixhKXt2YXIgZD1LSlVSLmp3cy5KV1MuaW5BcnJheTtpZihiPT09bnVsbCl7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiIT09XCJvYmplY3RcIil7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiLmxlbmd0aCE9PVwibnVtYmVyXCIpe3JldHVybiBmYWxzZX1mb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7aWYoIWQoYltjXSxhKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX07S0pVUi5qd3MuSldTLmluQXJyYXk9ZnVuY3Rpb24oZCxiKXtpZihiPT09bnVsbCl7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiIT09XCJvYmplY3RcIil7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiLmxlbmd0aCE9PVwibnVtYmVyXCIpe3JldHVybiBmYWxzZX1mb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7aWYoYltjXT09ZCl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX07S0pVUi5qd3MuSldTLmp3c2FsZzJzaWdhbGc9e0hTMjU2OlwiSG1hY1NIQTI1NlwiLEhTMzg0OlwiSG1hY1NIQTM4NFwiLEhTNTEyOlwiSG1hY1NIQTUxMlwiLFJTMjU2OlwiU0hBMjU2d2l0aFJTQVwiLFJTMzg0OlwiU0hBMzg0d2l0aFJTQVwiLFJTNTEyOlwiU0hBNTEyd2l0aFJTQVwiLEVTMjU2OlwiU0hBMjU2d2l0aEVDRFNBXCIsRVMzODQ6XCJTSEEzODR3aXRoRUNEU0FcIixQUzI1NjpcIlNIQTI1NndpdGhSU0FhbmRNR0YxXCIsUFMzODQ6XCJTSEEzODR3aXRoUlNBYW5kTUdGMVwiLFBTNTEyOlwiU0hBNTEyd2l0aFJTQWFuZE1HRjFcIixub25lOlwibm9uZVwiLH07S0pVUi5qd3MuSldTLmlzU2FmZUpTT05TdHJpbmc9ZnVuY3Rpb24oYyxiLGQpe3ZhciBlPW51bGw7dHJ5e2U9anNvblBhcnNlKGMpO2lmKHR5cGVvZiBlIT1cIm9iamVjdFwiKXtyZXR1cm4gMH1pZihlLmNvbnN0cnVjdG9yPT09QXJyYXkpe3JldHVybiAwfWlmKGIpe2JbZF09ZX1yZXR1cm4gMX1jYXRjaChhKXtyZXR1cm4gMH19O0tKVVIuandzLkpXUy5yZWFkU2FmZUpTT05TdHJpbmc9ZnVuY3Rpb24oYil7dmFyIGM9bnVsbDt0cnl7Yz1qc29uUGFyc2UoYik7aWYodHlwZW9mIGMhPVwib2JqZWN0XCIpe3JldHVybiBudWxsfWlmKGMuY29uc3RydWN0b3I9PT1BcnJheSl7cmV0dXJuIG51bGx9cmV0dXJuIGN9Y2F0Y2goYSl7cmV0dXJuIG51bGx9fTtLSlVSLmp3cy5KV1MuZ2V0RW5jb2RlZFNpZ25hdHVyZVZhbHVlRnJvbUpXUz1mdW5jdGlvbihhKXtpZihhLm1hdGNoKC9eW14uXStcXC5bXi5dK1xcLihbXi5dKykkLyk9PW51bGwpe3Rocm93XCJKV1Mgc2lnbmF0dXJlIGlzIG5vdCBhIGZvcm0gb2YgJ0hlYWQuUGF5bG9hZC5TaWdWYWx1ZScuXCJ9cmV0dXJuIFJlZ0V4cC4kMX07S0pVUi5qd3MuSldTLmdldEpXS3RodW1icHJpbnQ9ZnVuY3Rpb24oZCl7aWYoZC5rdHkhPT1cIlJTQVwiJiZkLmt0eSE9PVwiRUNcIiYmZC5rdHkhPT1cIm9jdFwiKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnb3JpdGhtIGZvciBKV0sgVGh1bXByaW50XCJ9dmFyIGE9XCJ7XCI7aWYoZC5rdHk9PT1cIlJTQVwiKXtpZih0eXBlb2YgZC5uIT1cInN0cmluZ1wifHx0eXBlb2YgZC5lIT1cInN0cmluZ1wiKXt0aHJvd1wid3JvbmcgbiBhbmQgZSB2YWx1ZSBmb3IgUlNBIGtleVwifWErPSdcImVcIjpcIicrZC5lKydcIiwnO2ErPSdcImt0eVwiOlwiJytkLmt0eSsnXCIsJzthKz0nXCJuXCI6XCInK2QubisnXCJ9J31lbHNle2lmKGQua3R5PT09XCJFQ1wiKXtpZih0eXBlb2YgZC5jcnYhPVwic3RyaW5nXCJ8fHR5cGVvZiBkLnghPVwic3RyaW5nXCJ8fHR5cGVvZiBkLnkhPVwic3RyaW5nXCIpe3Rocm93XCJ3cm9uZyBjcnYsIHggYW5kIHkgdmFsdWUgZm9yIEVDIGtleVwifWErPSdcImNydlwiOlwiJytkLmNydisnXCIsJzthKz0nXCJrdHlcIjpcIicrZC5rdHkrJ1wiLCc7YSs9J1wieFwiOlwiJytkLngrJ1wiLCc7YSs9J1wieVwiOlwiJytkLnkrJ1wifSd9ZWxzZXtpZihkLmt0eT09PVwib2N0XCIpe2lmKHR5cGVvZiBkLmshPVwic3RyaW5nXCIpe3Rocm93XCJ3cm9uZyBrIHZhbHVlIGZvciBvY3Qoc3ltbWV0cmljKSBrZXlcIn1hKz0nXCJrdHlcIjpcIicrZC5rdHkrJ1wiLCc7YSs9J1wia1wiOlwiJytkLmsrJ1wifSd9fX12YXIgYj1yc3RydG9oZXgoYSk7dmFyIGM9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGIsXCJzaGEyNTZcIik7dmFyIGU9aGV4dG9iNjR1KGMpO3JldHVybiBlfTtLSlVSLmp3cy5JbnREYXRlPXt9O0tKVVIuandzLkludERhdGUuZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9PVwibm93XCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpfWVsc2V7aWYoYT09XCJub3cgKyAxaG91clwiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKSs2MCo2MH1lbHNle2lmKGE9PVwibm93ICsgMWRheVwiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKSs2MCo2MCoyNH1lbHNle2lmKGE9PVwibm93ICsgMW1vbnRoXCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpKzYwKjYwKjI0KjMwfWVsc2V7aWYoYT09XCJub3cgKyAxeWVhclwiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKSs2MCo2MCoyNCozNjV9ZWxzZXtpZihhLm1hdGNoKC9aJC8pKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXRadWx1KGEpfWVsc2V7aWYoYS5tYXRjaCgvXlswLTldKyQvKSl7cmV0dXJuIHBhcnNlSW50KGEpfX19fX19fXRocm93XCJ1bnN1cHBvcnRlZCBmb3JtYXQ6IFwiK2F9O0tKVVIuandzLkludERhdGUuZ2V0WnVsdT1mdW5jdGlvbihsKXt2YXIgaztpZihrPWwubWF0Y2goLyhcXGQrKShcXGRcXGQpKFxcZFxcZCkoXFxkXFxkKShcXGRcXGQpKFxcZFxcZClaLykpe3ZhciBiPVJlZ0V4cC4kMTt2YXIgaT1wYXJzZUludChiKTtpZihiLmxlbmd0aD09NCl7fWVsc2V7aWYoYi5sZW5ndGg9PTIpe2lmKDUwPD1pJiZpPDEwMCl7aT0xOTAwK2l9ZWxzZXtpZigwPD1pJiZpPDUwKXtpPTIwMDAraX1lbHNle3Rocm93XCJtYWxmb3JtZWQgeWVhciBzdHJpbmcgZm9yIFVUQ1RpbWVcIn19fWVsc2V7dGhyb3dcIm1hbGZvcm1lZCB5ZWFyIHN0cmluZ1wifX12YXIgZz1wYXJzZUludChSZWdFeHAuJDIpLTE7dmFyIGo9cGFyc2VJbnQoUmVnRXhwLiQzKTt2YXIgYz1wYXJzZUludChSZWdFeHAuJDQpO3ZhciBlPXBhcnNlSW50KFJlZ0V4cC4kNSk7dmFyIGY9cGFyc2VJbnQoUmVnRXhwLiQ2KTt2YXIgaD1uZXcgRGF0ZShEYXRlLlVUQyhpLGcsaixjLGUsZikpO3JldHVybiB+fihoLzEwMDApfXRocm93XCJ1bnN1cHBvcnRlZCBmb3JtYXQ6IFwiK2x9O0tKVVIuandzLkludERhdGUuZ2V0Tm93PWZ1bmN0aW9uKCl7dmFyIGE9fn4obmV3IERhdGUoKS8xMDAwKTtyZXR1cm4gYX07S0pVUi5qd3MuSW50RGF0ZS5pbnREYXRlMlVUQ1N0cmluZz1mdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZShhKjEwMDApO3JldHVybiBiLnRvVVRDU3RyaW5nKCl9O0tKVVIuandzLkludERhdGUuaW50RGF0ZTJadWx1PWZ1bmN0aW9uKGUpe3ZhciBpPW5ldyBEYXRlKGUqMTAwMCk7dmFyIGg9KFwiMDAwMFwiK2kuZ2V0VVRDRnVsbFllYXIoKSkuc2xpY2UoLTQpO3ZhciBnPShcIjAwXCIrKGkuZ2V0VVRDTW9udGgoKSsxKSkuc2xpY2UoLTIpO3ZhciBiPShcIjAwXCIraS5nZXRVVENEYXRlKCkpLnNsaWNlKC0yKTt2YXIgYT0oXCIwMFwiK2kuZ2V0VVRDSG91cnMoKSkuc2xpY2UoLTIpO3ZhciBjPShcIjAwXCIraS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKTt2YXIgZj0oXCIwMFwiK2kuZ2V0VVRDU2Vjb25kcygpKS5zbGljZSgtMik7cmV0dXJuIGgrZytiK2ErYytmK1wiWlwifTtcbi8qISBqd3Nqcy0yLjEuMCAoYykgMjAxMC0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5qd3M9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmp3cyl7S0pVUi5qd3M9e319S0pVUi5qd3MuSldTSlM9ZnVuY3Rpb24oKXt2YXIgYj1LSlVSLmp3cy5KV1M7dmFyIGE9S0pVUi5qd3MuSldTO3RoaXMuYUhlYWRlcj1bXTt0aGlzLnNQYXlsb2FkPVwiXCI7dGhpcy5hU2lnbmF0dXJlPVtdO3RoaXMuaW5pdD1mdW5jdGlvbigpe3RoaXMuYUhlYWRlcj1bXTt0aGlzLnNQYXlsb2FkPXVuZGVmaW5lZDt0aGlzLmFTaWduYXR1cmU9W119O3RoaXMuaW5pdFdpdGhKV1M9ZnVuY3Rpb24oZCl7dGhpcy5pbml0KCk7dmFyIGM9ZC5zcGxpdChcIi5cIik7aWYoYy5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgaW5wdXQgSldTXCJ9dGhpcy5hSGVhZGVyLnB1c2goY1swXSk7dGhpcy5zUGF5bG9hZD1jWzFdO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGNbMl0pfTt0aGlzLmFkZFNpZ25hdHVyZT1mdW5jdGlvbihjLGYsayxpKXtpZih0aGlzLnNQYXlsb2FkPT09dW5kZWZpbmVkfHx0aGlzLnNQYXlsb2FkPT09bnVsbCl7dGhyb3dcInRoZXJlJ3Mgbm8gSlNPTi1KUyBzaWduYXR1cmUgdG8gYWRkLlwifXZhciBqPXRoaXMuYUhlYWRlci5sZW5ndGg7aWYodGhpcy5hSGVhZGVyLmxlbmd0aCE9dGhpcy5hU2lnbmF0dXJlLmxlbmd0aCl7dGhyb3dcImFIZWFkZXIubGVuZ3RoICE9IGFTaWduYXR1cmUubGVuZ3RoXCJ9dHJ5e3ZhciBkPUtKVVIuandzLkpXUy5zaWduKGMsZix0aGlzLnNQYXlsb2FkLGssaSk7dmFyIGg9ZC5zcGxpdChcIi5cIik7dmFyIGw9aFswXTt2YXIgZT1oWzJdO3RoaXMuYUhlYWRlci5wdXNoKGhbMF0pO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGhbMl0pfWNhdGNoKGcpe2lmKHRoaXMuYUhlYWRlci5sZW5ndGg+ail7dGhpcy5hSGVhZGVyLnBvcCgpfWlmKHRoaXMuYVNpZ25hdHVyZS5sZW5ndGg+ail7dGhpcy5hU2lnbmF0dXJlLnBvcCgpfXRocm93XCJhZGRTaWduYXR1cmUgZmFpbGVkOiBcIitnfX07dGhpcy5hZGRTaWduYXR1cmVCeUhlYWRlcktleT1mdW5jdGlvbihmLGMpe3ZhciBlPWI2NHV0b3V0ZjgodGhpcy5zUGF5bG9hZCk7dmFyIGQ9bmV3IEtKVVIuandzLkpXUygpO3ZhciBnPWQuZ2VuZXJhdGVKV1NCeVAxUHJ2S2V5KGYsZSxjKTt0aGlzLmFIZWFkZXIucHVzaChkLnBhcnNlZEpXUy5oZWFkQjY0VSk7dGhpcy5hU2lnbmF0dXJlLnB1c2goZC5wYXJzZWRKV1Muc2lndmFsQjY0VSl9O3RoaXMuYWRkU2lnbmF0dXJlQnlIZWFkZXJQYXlsb2FkS2V5PWZ1bmN0aW9uKGYsZSxjKXt2YXIgZD1uZXcgS0pVUi5qd3MuSldTKCk7dmFyIGc9ZC5nZW5lcmF0ZUpXU0J5UDFQcnZLZXkoZixlLGMpO3RoaXMuYUhlYWRlci5wdXNoKGQucGFyc2VkSldTLmhlYWRCNjRVKTt0aGlzLnNQYXlsb2FkPWQucGFyc2VkSldTLnBheWxvYWRCNjRVO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGQucGFyc2VkSldTLnNpZ3ZhbEI2NFUpfTt0aGlzLnZlcmlmeUFsbD1mdW5jdGlvbihmKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoIT09Zi5sZW5ndGh8fHRoaXMuYVNpZ25hdHVyZS5sZW5ndGghPT1mLmxlbmd0aCl7cmV0dXJuIGZhbHNlfWZvcih2YXIgZT0wO2U8Zi5sZW5ndGg7ZSsrKXt2YXIgZD1mW2VdO2lmKGQubGVuZ3RoIT09Mil7cmV0dXJuIGZhbHNlfXZhciBjPXRoaXMudmVyaWZ5TnRoKGUsZFswXSxkWzFdKTtpZihjPT09ZmFsc2Upe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O3RoaXMudmVyaWZ5TnRoPWZ1bmN0aW9uKGQsaCxlKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoPD1kfHx0aGlzLmFTaWduYXR1cmUubGVuZ3RoPD1kKXtyZXR1cm4gZmFsc2V9dmFyIGY9dGhpcy5hSGVhZGVyW2RdO3ZhciBpPXRoaXMuYVNpZ25hdHVyZVtkXTt2YXIgaj1mK1wiLlwiK3RoaXMuc1BheWxvYWQrXCIuXCIraTt2YXIgYz1mYWxzZTt0cnl7Yz1hLnZlcmlmeShqLGgsZSl9Y2F0Y2goZyl7cmV0dXJuIGZhbHNlfXJldHVybiBjfTt0aGlzLnZlcmlmeVdpdGhDZXJ0cz1mdW5jdGlvbihkKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoIT1kLmxlbmd0aCl7dGhyb3dcIm51bSBoZWFkZXJzIGRvZXMgbm90IG1hdGNoIHdpdGggbnVtIGNlcnRzXCJ9aWYodGhpcy5hU2lnbmF0dXJlLmxlbmd0aCE9ZC5sZW5ndGgpe3Rocm93XCJudW0gc2lnbmF0dXJlcyBkb2VzIG5vdCBtYXRjaCB3aXRoIG51bSBjZXJ0c1wifXZhciBsPXRoaXMuc1BheWxvYWQ7dmFyIGg9XCJcIjtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTt2YXIgZz10aGlzLmFIZWFkZXJbZV07dmFyIG49dGhpcy5hU2lnbmF0dXJlW2VdO3ZhciBjPWcrXCIuXCIrbCtcIi5cIituO3ZhciBrPW5ldyBLSlVSLmp3cy5KV1MoKTt0cnl7dmFyIG09ay52ZXJpZnlKV1NCeVBlbVg1MDlDZXJ0KGMsZik7aWYobSE9MSl7aCs9KGUrMSkrXCJ0aCBzaWduYXR1cmUgdW5tYXRjaC4gXCJ9fWNhdGNoKGope2grPShlKzEpK1widGggc2lnbmF0dXJlIGZhaWwoXCIraitcIikuIFwifX1pZihoPT1cIlwiKXtyZXR1cm4gMX1lbHNle3Rocm93IGh9fTt0aGlzLnJlYWRKV1NKUz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09PVwic3RyaW5nXCIpe3ZhciBkPWIucmVhZFNhZmVKU09OU3RyaW5nKGUpO2lmKGQ9PW51bGwpe3Rocm93XCJhcmd1bWVudCBpcyBub3Qgc2FmZSBKU09OIG9iamVjdCBzdHJpbmdcIn10aGlzLmFIZWFkZXI9ZC5oZWFkZXJzO3RoaXMuc1BheWxvYWQ9ZC5wYXlsb2FkO3RoaXMuYVNpZ25hdHVyZT1kLnNpZ25hdHVyZXN9ZWxzZXt0cnl7aWYoZS5oZWFkZXJzLmxlbmd0aD4wKXt0aGlzLmFIZWFkZXI9ZS5oZWFkZXJzfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCBoZWFkZXJcIn1pZih0eXBlb2YgZS5wYXlsb2FkPT09XCJzdHJpbmdcIil7dGhpcy5zUGF5bG9hZD1lLnBheWxvYWR9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIHNpZ25hdHVyZXNcIn1pZihlLnNpZ25hdHVyZXMubGVuZ3RoPjApe3RoaXMuc2lnbmF0dXJlcz1lLnNpZ25hdHVyZXN9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIHNpZ25hdHVyZXNcIn19Y2F0Y2goYyl7dGhyb3dcIm1hbGZvcm1lZCBKV1MtSlMgSlNPTiBvYmplY3Q6IFwiK2N9fX07dGhpcy5nZXRKU09OPWZ1bmN0aW9uKCl7cmV0dXJue2hlYWRlcnM6dGhpcy5hSGVhZGVyLHBheWxvYWQ6dGhpcy5zUGF5bG9hZCxzaWduYXR1cmVzOnRoaXMuYVNpZ25hdHVyZX19O3RoaXMuaXNFbXB0eT1mdW5jdGlvbigpe2lmKHRoaXMuYUhlYWRlci5sZW5ndGg9PTApe3JldHVybiAxfXJldHVybiAwfX07XG4vKiEgbm9kZXV0aWwtMS4wLjAgKGMpIDIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gcmVhZEZpbGVVVEY4KGEpe3JldHVybiByZXF1aXJlKFwiZnNcIikucmVhZEZpbGVTeW5jKGEsXCJ1dGY4XCIpfWZ1bmN0aW9uIHJlYWRGaWxlSGV4QnlCaW4oYyl7dmFyIGI9cmVxdWlyZShcImpzcnNhc2lnblwiKTt2YXIgYT1yZXF1aXJlKFwiZnNcIik7cmV0dXJuIGIucnN0cnRvaGV4KGEucmVhZEZpbGVTeW5jKGMsXCJiaW5hcnlcIikpfWZ1bmN0aW9uIHJlYWRGaWxlKGIpe3ZhciBhPXJlcXVpcmUoXCJmc1wiKTtyZXR1cm4gYS5yZWFkRmlsZVN5bmMoYixcImJpbmFyeVwiKX1mdW5jdGlvbiBzYXZlRmlsZShjLGIpe3ZhciBhPXJlcXVpcmUoXCJmc1wiKTthLndyaXRlRmlsZVN5bmMoYyxiLFwiYmluYXJ5XCIpfWZ1bmN0aW9uIHNhdmVGaWxlQmluQnlIZXgoZSxiKXt2YXIgYT1yZXF1aXJlKFwiZnNcIik7dmFyIGM9cmVxdWlyZShcImpzcnNhc2lnblwiKTt2YXIgZD1jLmhleHRvcnN0cihiKTthLndyaXRlRmlsZVN5bmMoZSxkLFwiYmluYXJ5XCIpfTtcbmV4cG9ydHMuU2VjdXJlUmFuZG9tID0gU2VjdXJlUmFuZG9tO1xuZXhwb3J0cy5ybmdfc2VlZF90aW1lID0gcm5nX3NlZWRfdGltZTtcblxuZXhwb3J0cy5CaWdJbnRlZ2VyID0gQmlnSW50ZWdlcjtcbmV4cG9ydHMuUlNBS2V5ID0gUlNBS2V5O1xuZXhwb3J0cy5FQ0RTQSA9IEtKVVIuY3J5cHRvLkVDRFNBO1xuZXhwb3J0cy5EU0EgPSBLSlVSLmNyeXB0by5EU0E7XG5leHBvcnRzLlNpZ25hdHVyZSA9IEtKVVIuY3J5cHRvLlNpZ25hdHVyZTtcbmV4cG9ydHMuTWVzc2FnZURpZ2VzdCA9IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Q7XG5leHBvcnRzLk1hYyA9IEtKVVIuY3J5cHRvLk1hYztcbmV4cG9ydHMuS0VZVVRJTCA9IEtFWVVUSUw7XG5leHBvcnRzLkFTTjFIRVggPSBBU04xSEVYO1xuZXhwb3J0cy5YNTA5ID0gWDUwOTtcbmV4cG9ydHMuQ3J5cHRvSlMgPSBDcnlwdG9KUztcblxuLy8gZXh0L2Jhc2U2NC5qc1xuZXhwb3J0cy5iNjR0b2hleCA9IGI2NHRvaGV4O1xuZXhwb3J0cy5iNjR0b0JBID0gYjY0dG9CQTtcblxuLy8gYmFzZTY0eC5qc1xuZXhwb3J0cy5zdG9CQSA9IHN0b0JBO1xuZXhwb3J0cy5CQXRvcyA9IEJBdG9zO1xuZXhwb3J0cy5CQXRvaGV4ID0gQkF0b2hleDtcbmV4cG9ydHMuc3RvaGV4ID0gc3RvaGV4O1xuZXhwb3J0cy5zdG9iNjQgPSBzdG9iNjQ7XG5leHBvcnRzLnN0b2I2NHUgPSBzdG9iNjR1O1xuZXhwb3J0cy5iNjR1dG9zID0gYjY0dXRvcztcbmV4cG9ydHMuYjY0dG9iNjR1ID0gYjY0dG9iNjR1O1xuZXhwb3J0cy5iNjR1dG9iNjQgPSBiNjR1dG9iNjQ7XG5leHBvcnRzLmhleDJiNjQgPSBoZXgyYjY0O1xuZXhwb3J0cy5oZXh0b2I2NHUgPSBoZXh0b2I2NHU7XG5leHBvcnRzLmI2NHV0b2hleCA9IGI2NHV0b2hleDtcbmV4cG9ydHMuYjY0dG9oZXggPSBiNjR0b2hleDtcbmV4cG9ydHMudXRmOHRvYjY0dSA9IHV0Zjh0b2I2NHU7XG5leHBvcnRzLmI2NHV0b3V0ZjggPSBiNjR1dG91dGY4O1xuZXhwb3J0cy51dGY4dG9iNjQgPSB1dGY4dG9iNjQ7XG5leHBvcnRzLmI2NHRvdXRmOCA9IGI2NHRvdXRmODtcbmV4cG9ydHMudXRmOHRvaGV4ID0gdXRmOHRvaGV4O1xuZXhwb3J0cy5oZXh0b3V0ZjggPSBoZXh0b3V0Zjg7XG5leHBvcnRzLmhleHRvcnN0ciA9IGhleHRvcnN0cjtcbmV4cG9ydHMucnN0cnRvaGV4ID0gcnN0cnRvaGV4O1xuZXhwb3J0cy5uZXdsaW5lX3RvVW5peCA9IG5ld2xpbmVfdG9Vbml4O1xuZXhwb3J0cy5uZXdsaW5lX3RvRG9zID0gbmV3bGluZV90b0RvcztcbmV4cG9ydHMuaW50YXJ5c3RydG9oZXggPSBpbnRhcnlzdHJ0b2hleDtcbmV4cG9ydHMuc3RyZGlmZmlkeCA9IHN0cmRpZmZpZHg7XG5cbmV4cG9ydHMuS0pVUiA9IEtKVVI7XG5leHBvcnRzLmNyeXB0byA9IEtKVVIuY3J5cHRvO1xuZXhwb3J0cy5hc24xID0gS0pVUi5hc24xO1xuZXhwb3J0cy5qd3MgPSBLSlVSLmp3cztcbmV4cG9ydHMubGFuZyA9IEtKVVIubGFuZztcblxuZXhwb3J0cy5yZWFkRmlsZVVURjggPSByZWFkRmlsZVVURjg7XG5leHBvcnRzLnJlYWRGaWxlSGV4QnlCaW4gPSByZWFkRmlsZUhleEJ5QmluO1xuZXhwb3J0cy5yZWFkRmlsZSA9IHJlYWRGaWxlO1xuZXhwb3J0cy5zYXZlRmlsZSA9IHNhdmVGaWxlO1xuZXhwb3J0cy5zYXZlRmlsZUJpbkJ5SGV4ID0gc2F2ZUZpbGVCaW5CeUhleDtcblxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pzcnNhc2lnbi9saWIvanNyc2FzaWduLmpzXG4vLyBtb2R1bGUgaWQgPSAxMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/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+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYnVmZmVyL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBwbGFjZUhvbGRlcnNDb3VudCAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICByZXR1cm4gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIHJldHVybiAoYjY0Lmxlbmd0aCAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0NvdW50KGI2NClcbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgaSwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBwbGFjZUhvbGRlcnMgPSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG5cbiAgYXJyID0gbmV3IEFycigobGVuICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gNCkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Jhc2U2NC1qcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vaWVlZTc1NC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vaXNhcnJheS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XHJcbmltcG9ydCBTaWduaW5TdGF0ZSBmcm9tICcuL1NpZ25pblN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpZ25pblJlcXVlc3Qge1xyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIC8vIG1hbmRhdG9yeVxyXG4gICAgICAgIHVybCwgY2xpZW50X2lkLCByZWRpcmVjdF91cmksIHJlc3BvbnNlX3R5cGUsIHNjb3BlLCBhdXRob3JpdHksXHJcbiAgICAgICAgLy8gb3B0aW9uYWxcclxuICAgICAgICBkYXRhLCBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsIHJlc291cmNlLFxyXG4gICAgICAgIHJlcXVlc3QsIHJlcXVlc3RfdXJpLCBleHRyYVF1ZXJ5UGFyYW1zLFxyXG4gICAgfSkge1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXJsXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNsaWVudF9pZCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBjbGllbnRfaWQgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFyZWRpcmVjdF91cmkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcmVkaXJlY3RfdXJpIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWRpcmVjdF91cmlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcmVzcG9uc2VfdHlwZSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyByZXNwb25zZV90eXBlIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNwb25zZV90eXBlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNjb3BlKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNjb3BlIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY29wZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXV0aG9yaXR5IHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdXRob3JpdHlcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgb2lkYyA9IFNpZ25pblJlcXVlc3QuaXNPaWRjKHJlc3BvbnNlX3R5cGUpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgU2lnbmluU3RhdGUoeyBub25jZTogb2lkYywgZGF0YSwgY2xpZW50X2lkLCBhdXRob3JpdHkgfSk7XHJcblxyXG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiY2xpZW50X2lkXCIsIGNsaWVudF9pZCk7XHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJyZWRpcmVjdF91cmlcIiwgcmVkaXJlY3RfdXJpKTtcclxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlc3BvbnNlX3R5cGVcIiwgcmVzcG9uc2VfdHlwZSk7XHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzY29wZVwiLCBzY29wZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcclxuICAgICAgICBpZiAob2lkYykge1xyXG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcIm5vbmNlXCIsIHRoaXMuc3RhdGUubm9uY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG9wdGlvbmFsID0geyBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsIHJlc291cmNlLCByZXF1ZXN0LCByZXF1ZXN0X3VyaSB9O1xyXG4gICAgICAgIGZvcihsZXQga2V5IGluIG9wdGlvbmFsKXtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbmFsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIGtleSwgb3B0aW9uYWxba2V5XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvcihsZXQga2V5IGluIGV4dHJhUXVlcnlQYXJhbXMpe1xyXG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBrZXksIGV4dHJhUXVlcnlQYXJhbXNba2V5XSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc09pZGMocmVzcG9uc2VfdHlwZSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSByZXNwb25zZV90eXBlLnNwbGl0KC9cXHMrL2cpLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtID09PSBcImlkX3Rva2VuXCI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICEhKHJlc3VsdFswXSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBpc09BdXRoKHJlc3BvbnNlX3R5cGUpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbSA9PT0gXCJ0b2tlblwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiAhIShyZXN1bHRbMF0pO1xyXG4gICAgfVxyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1NpZ25pblJlcXVlc3QuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcmxVdGlsaXR5IHtcclxuICAgIHN0YXRpYyBhZGRRdWVyeVBhcmFtKHVybCwgbmFtZSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodXJsLmluZGV4T2YoJz8nKSA8IDApIHtcclxuICAgICAgICAgICAgdXJsICs9IFwiP1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVybFt1cmwubGVuZ3RoIC0gMV0gIT09IFwiP1wiKSB7XHJcbiAgICAgICAgICAgIHVybCArPSBcIiZcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XHJcbiAgICAgICAgdXJsICs9IFwiPVwiO1xyXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBwYXJzZVVybEZyYWdtZW50KHZhbHVlLCBkZWxpbWl0ZXIgPSBcIiNcIiwgZ2xvYmFsID0gR2xvYmFsKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXJsVXRpbGl0eS5wYXJzZVVybEZyYWdtZW50XCIpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyl7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZ2xvYmFsLmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaWR4ID0gdmFsdWUubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcclxuICAgICAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHIoaWR4ICsgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcGFyYW1zID0ge30sXHJcbiAgICAgICAgICAgIHJlZ2V4ID0gLyhbXiY9XSspPShbXiZdKikvZyxcclxuICAgICAgICAgICAgbTtcclxuXHJcbiAgICAgICAgdmFyIGNvdW50ZXIgPSAwO1xyXG4gICAgICAgIHdoaWxlIChtID0gcmVnZXguZXhlYyh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChtWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQobVsyXSk7XHJcbiAgICAgICAgICAgIGlmIChjb3VudGVyKysgPiA1MCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwicmVzcG9uc2UgZXhjZWVkZWQgZXhwZWN0ZWQgbnVtYmVyIG9mIHBhcmFtZXRlcnNcIiwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogXCJSZXNwb25zZSBleGNlZWRlZCBleHBlY3RlZCBudW1iZXIgb2YgcGFyYW1ldGVyc1wiXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBwcm9wIGluIHBhcmFtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXJsVXRpbGl0eS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgU3RhdGUgZnJvbSAnLi9TdGF0ZSc7XHJcbmltcG9ydCByYW5kb20gZnJvbSAnLi9yYW5kb20nO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbmluU3RhdGUgZXh0ZW5kcyBTdGF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7bm9uY2UsIGF1dGhvcml0eSwgY2xpZW50X2lkfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIoYXJndW1lbnRzWzBdKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAobm9uY2UgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm9uY2UgPSByYW5kb20oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobm9uY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm9uY2UgPSBub25jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fYXV0aG9yaXR5ID0gYXV0aG9yaXR5O1xyXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm9uY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vbmNlO1xyXG4gICAgfVxyXG4gICAgZ2V0IGF1dGhvcml0eSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yaXR5O1xyXG4gICAgfVxyXG4gICAgZ2V0IGNsaWVudF9pZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2lkO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU2lnbmluU3RhdGUudG9TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZCxcclxuICAgICAgICAgICAgbm9uY2U6IHRoaXMubm9uY2UsXHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogdGhpcy5hdXRob3JpdHksXHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRfaWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlNpZ25pblN0YXRlLmZyb21TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzdG9yYWdlU3RyaW5nKTtcclxuICAgICAgICByZXR1cm4gbmV3IFNpZ25pblN0YXRlKGRhdGEpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TaWduaW5TdGF0ZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgcmFuZG9tIGZyb20gJy4vcmFuZG9tJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKHtpZCwgZGF0YSwgY3JlYXRlZH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuX2lkID0gaWQgfHwgcmFuZG9tKCk7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgY3JlYXRlZCA9PT0gJ251bWJlcicgJiYgY3JlYXRlZCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRlZCA9IGNyZWF0ZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVkID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gICAgfVxyXG4gICAgZ2V0IGRhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9XHJcbiAgICBnZXQgY3JlYXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlZDtcclxuICAgIH1cclxuXHJcbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU3RhdGUudG9TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN0YXRlLmZyb21TdG9yYWdlU3RyaW5nXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgU3RhdGUoSlNPTi5wYXJzZShzdG9yYWdlU3RyaW5nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNsZWFyU3RhbGVTdGF0ZShzdG9yYWdlLCBhZ2UpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5jbGVhclN0YWxlU3RhdGVcIik7XHJcblxyXG4gICAgICAgIHZhciBjdXRvZmYgPSBEYXRlLm5vdygpIC8gMTAwMCAtIGFnZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0b3JhZ2UuZ2V0QWxsS2V5cygpLnRoZW4oa2V5cyA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBrZXlzXCIsIGtleXMpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcCA9IHN0b3JhZ2UuZ2V0KGtleSkudGhlbihpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3ZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhpdGVtKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBpdGVtIGZyb20ga2V5OiBcIiwga2V5LCBzdGF0ZS5jcmVhdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuY3JlYXRlZCA8PSBjdXRvZmYpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBwYXJzaW5nIHN0YXRlIGZvciBrZXlcIiwga2V5LCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwibm8gaXRlbSBpbiBzdG9yYWdlIGZvciBrZXk6IFwiLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJyZW1vdmVkIGl0ZW0gZm9yIGtleTogXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIndhaXRpbmcgb24gcHJvbWlzZSBjb3VudDpcIiwgcHJvbWlzZXMubGVuZ3RoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU3RhdGUuanMiLCIvLyBOT1RJQ0U6IHRoZSBjb2RlIGluIHRoaXMgZmlsZSBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBNaWNyb3NvZnRcclxuLy8gb3JpZ2luYWwgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmVBRC9henVyZS1hY3RpdmVkaXJlY3RvcnktbGlicmFyeS1mb3ItanMvYmxvYi9tYXN0ZXIvbGliL2FkYWwuanMjTDEwMjlcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEFkYWxKUyB2MS4wLjhcclxuLy8gQHByZXNlcnZlIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IE9wZW4gVGVjaG5vbG9naWVzLCBJbmMuXHJcbi8vIEFsbCBSaWdodHMgUmVzZXJ2ZWRcclxuLy8gQXBhY2hlIExpY2Vuc2UgMi4wXHJcbi8vXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbi8vXHJcbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4vL1xyXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZG9tKCkge1xyXG4gICAgdmFyIGd1aWRIb2xkZXIgPSAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnO1xyXG4gICAgdmFyIGhleCA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcclxuICAgIHZhciByID0gMDtcclxuICAgIHZhciBndWlkUmVzcG9uc2UgPSBcIlwiO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBndWlkSG9sZGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGd1aWRIb2xkZXJbaV0gIT09ICctJyAmJiBndWlkSG9sZGVyW2ldICE9PSAnNCcpIHtcclxuICAgICAgICAgICAgLy8gZWFjaCB4IGFuZCB5IG5lZWRzIHRvIGJlIHJhbmRvbVxyXG4gICAgICAgICAgICByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChndWlkSG9sZGVyW2ldID09PSAneCcpIHtcclxuICAgICAgICAgICAgZ3VpZFJlc3BvbnNlICs9IGhleFtyXTtcclxuICAgICAgICB9IGVsc2UgaWYgKGd1aWRIb2xkZXJbaV0gPT09ICd5Jykge1xyXG4gICAgICAgICAgICAvLyBjbG9jay1zZXEtYW5kLXJlc2VydmVkIGZpcnN0IGhleCBpcyBmaWx0ZXJlZCBhbmQgcmVtYWluaW5nIGhleCB2YWx1ZXMgYXJlIHJhbmRvbVxyXG4gICAgICAgICAgICByICY9IDB4MzsgLy8gYml0IGFuZCB3aXRoIDAwMTEgdG8gc2V0IHBvcyAyIHRvIHplcm8gPzA/P1xyXG4gICAgICAgICAgICByIHw9IDB4ODsgLy8gc2V0IHBvcyAzIHRvIDEgYXMgMT8/P1xyXG4gICAgICAgICAgICBndWlkUmVzcG9uc2UgKz0gaGV4W3JdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGd1aWRSZXNwb25zZSArPSBndWlkSG9sZGVyW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBndWlkUmVzcG9uc2U7XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmFuZG9tLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcclxuXHJcbmNvbnN0IE9pZGNTY29wZSA9IFwib3BlbmlkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWduaW5SZXNwb25zZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih1cmwpIHtcclxuXHJcbiAgICAgICAgdmFyIHZhbHVlcyA9IFVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudCh1cmwsIFwiI1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5lcnJvciA9IHZhbHVlcy5lcnJvcjtcclxuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gdmFsdWVzLmVycm9yX2Rlc2NyaXB0aW9uO1xyXG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gdmFsdWVzLmVycm9yX3VyaTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnN0YXRlID0gdmFsdWVzLnN0YXRlO1xyXG4gICAgICAgIHRoaXMuaWRfdG9rZW4gPSB2YWx1ZXMuaWRfdG9rZW47XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gdmFsdWVzLnNlc3Npb25fc3RhdGU7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NfdG9rZW4gPSB2YWx1ZXMuYWNjZXNzX3Rva2VuO1xyXG4gICAgICAgIHRoaXMudG9rZW5fdHlwZSA9IHZhbHVlcy50b2tlbl90eXBlO1xyXG4gICAgICAgIHRoaXMuc2NvcGUgPSB2YWx1ZXMuc2NvcGU7XHJcbiAgICAgICAgdGhpcy5wcm9maWxlID0gdW5kZWZpbmVkOyAvLyB3aWxsIGJlIHNldCBmcm9tIFJlc3BvbnNlVmFsaWRhdG9yXHJcblxyXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gcGFyc2VJbnQodmFsdWVzLmV4cGlyZXNfaW4pO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXhwaXJlc19pbiA9PT0gJ251bWJlcicgJiYgZXhwaXJlc19pbiA+IDApIHtcclxuICAgICAgICAgICAgbGV0IG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICAgICAgdGhpcy5leHBpcmVzX2F0ID0gbm93ICsgZXhwaXJlc19pbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV4cGlyZXNfaW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXhwaXJlc19hdCkge1xyXG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHBpcmVzX2F0IC0gbm93O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBleHBpcmVkKCkge1xyXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gdGhpcy5leHBpcmVzX2luO1xyXG4gICAgICAgIGlmIChleHBpcmVzX2luICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV4cGlyZXNfaW4gPD0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2NvcGVzKCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zY29wZSB8fCBcIlwiKS5zcGxpdChcIiBcIik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBpc09wZW5JZENvbm5lY3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVzLmluZGV4T2YoT2lkY1Njb3BlKSA+PSAwIHx8ICEhdGhpcy5pZF90b2tlbjtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lnbmluUmVzcG9uc2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcclxuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbm91dFJlcXVlc3Qge1xyXG4gICAgY29uc3RydWN0b3Ioe3VybCwgaWRfdG9rZW5faGludCwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLCBkYXRhfSkge1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWQgdG8gU2lnbm91dFJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZF90b2tlbl9oaW50KSB7XHJcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiaWRfdG9rZW5faGludFwiLCBpZF90b2tlbl9oaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSkge1xyXG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaVwiLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgU3RhdGUoeyBkYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInN0YXRlXCIsIHRoaXMuc3RhdGUuaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TaWdub3V0UmVxdWVzdC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWdub3V0UmVzcG9uc2Uge1xyXG4gICAgY29uc3RydWN0b3IodXJsKSB7XHJcblxyXG4gICAgICAgIHZhciB2YWx1ZXMgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBcIj9cIik7XHJcblxyXG4gICAgICAgIHRoaXMuZXJyb3IgPSB2YWx1ZXMuZXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IHZhbHVlcy5lcnJvcl9kZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB2YWx1ZXMuc3RhdGU7XHJcbiAgICB9XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lnbm91dFJlc3BvbnNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbk1lbW9yeVdlYlN0b3JhZ2V7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0SXRlbShrZXkpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJbk1lbW9yeVdlYlN0b3JhZ2UuZ2V0SXRlbVwiLCBrZXkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhW2tleV07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSl7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSW5NZW1vcnlXZWJTdG9yYWdlLnNldEl0ZW1cIiwga2V5KTtcclxuICAgICAgICB0aGlzLl9kYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgIH0gICBcclxuICAgIFxyXG4gICAgcmVtb3ZlSXRlbShrZXkpe1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkluTWVtb3J5V2ViU3RvcmFnZS5yZW1vdmVJdGVtXCIsIGtleSk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX2RhdGFba2V5XTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5fZGF0YSkubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBrZXkoaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5fZGF0YSlbaW5kZXhdO1xyXG4gICAgfVxyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0luTWVtb3J5V2ViU3RvcmFnZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5pbXBvcnQgT2lkY0NsaWVudCBmcm9tICcuL09pZGNDbGllbnQnO1xyXG5pbXBvcnQgVXNlck1hbmFnZXJTZXR0aW5ncyBmcm9tICcuL1VzZXJNYW5hZ2VyU2V0dGluZ3MnO1xyXG5pbXBvcnQgVXNlciBmcm9tICcuL1VzZXInO1xyXG5pbXBvcnQgVXNlck1hbmFnZXJFdmVudHMgZnJvbSAnLi9Vc2VyTWFuYWdlckV2ZW50cyc7XHJcbmltcG9ydCBTaWxlbnRSZW5ld1NlcnZpY2UgZnJvbSAnLi9TaWxlbnRSZW5ld1NlcnZpY2UnO1xyXG5pbXBvcnQgU2Vzc2lvbk1vbml0b3IgZnJvbSAnLi9TZXNzaW9uTW9uaXRvcic7XHJcbmltcG9ydCBUb2tlblJldm9jYXRpb25DbGllbnQgZnJvbSAnLi9Ub2tlblJldm9jYXRpb25DbGllbnQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlck1hbmFnZXIgZXh0ZW5kcyBPaWRjQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzID0ge30sXHJcbiAgICAgICAgU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciA9IFNpbGVudFJlbmV3U2VydmljZSxcclxuICAgICAgICBTZXNzaW9uTW9uaXRvckN0b3IgPSBTZXNzaW9uTW9uaXRvcixcclxuICAgICAgICBUb2tlblJldm9jYXRpb25DbGllbnRDdG9yID0gVG9rZW5SZXZvY2F0aW9uQ2xpZW50XHJcbiAgICApIHtcclxuXHJcbiAgICAgICAgaWYgKCEoc2V0dGluZ3MgaW5zdGFuY2VvZiBVc2VyTWFuYWdlclNldHRpbmdzKSkge1xyXG4gICAgICAgICAgICBzZXR0aW5ncyA9IG5ldyBVc2VyTWFuYWdlclNldHRpbmdzKHNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIoc2V0dGluZ3MpO1xyXG5cclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgVXNlck1hbmFnZXJFdmVudHMoc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3U2VydmljZSA9IG5ldyBTaWxlbnRSZW5ld1NlcnZpY2VDdG9yKHRoaXMpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIG9yZGVyIGlzIGltcG9ydGFudCBmb3IgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOyB0aGVzZSBzZXJ2aWNlcyBkZXBlbmQgdXBvbiB0aGUgZXZlbnRzLlxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9tYXRpY1NpbGVudFJlbmV3KSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImF1dG9tYXRpY1NpbGVudFJlbmV3IGlzIGNvbmZpZ3VyZWQsIHNldHRpbmcgdXAgc2lsZW50IHJlbmV3XCIpO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2lsZW50UmVuZXcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLm1vbml0b3JTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm1vbml0b3JTZXNzaW9uIGlzIGNvbmZpZ3VyZWQsIHNldHRpbmcgdXAgc2Vzc2lvbiBtb25pdG9yXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uTW9uaXRvciA9IG5ldyBTZXNzaW9uTW9uaXRvckN0b3IodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90b2tlblJldm9jYXRpb25DbGllbnQgPSBuZXcgVG9rZW5SZXZvY2F0aW9uQ2xpZW50Q3Rvcih0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF9yZWRpcmVjdE5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5yZWRpcmVjdE5hdmlnYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBfcG9wdXBOYXZpZ2F0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MucG9wdXBOYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgX2lmcmFtZU5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5pZnJhbWVOYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgX3VzZXJTdG9yZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy51c2VyU3RvcmU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV2ZW50cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXIoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuZ2V0VXNlclwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciBsb2FkZWRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmxvYWQodXNlciwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIG5vdCBmb3VuZCBpbiBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVVc2VyKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnJlbW92ZVVzZXJcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcihudWxsKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIHJlbW92ZWQgZnJvbSBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMudW5sb2FkKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbmluUmVkaXJlY3QoYXJncykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblJlZGlyZWN0XCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5TdGFydChhcmdzLCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvcikudGhlbigoKT0+e1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblJlZGlyZWN0IHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWduaW5SZWRpcmVjdENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblJlZGlyZWN0Q2FsbGJhY2tcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkVuZCh1cmwgfHwgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IudXJsKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5SZWRpcmVjdENhbGxiYWNrIHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluUmVkaXJlY3RDYWxsYmFjayBzdWNjZXNzZnVsXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc2lnbmluUG9wdXAoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbmluUG9wdXBcIik7XHJcblxyXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnBvcHVwX3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnJlZGlyZWN0X3VyaTtcclxuICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XHJcbiAgICAgICAgYXJncy5kaXNwbGF5ID0gXCJwb3B1cFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX3BvcHVwTmF2aWdhdG9yLCB7XHJcbiAgICAgICAgICAgIHN0YXJ0VXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHBvcHVwV2luZG93RmVhdHVyZXM6IGFyZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93RmVhdHVyZXMsXHJcbiAgICAgICAgICAgIHBvcHVwV2luZG93VGFyZ2V0OiBhcmdzLnBvcHVwV2luZG93VGFyZ2V0IHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dUYXJnZXRcclxuICAgICAgICB9KS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5Qb3B1cCBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblBvcHVwIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2lnbmluUG9wdXBDYWxsYmFjayh1cmwpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cENhbGxiYWNrXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5DYWxsYmFjayh1cmwsIHRoaXMuX3BvcHVwTmF2aWdhdG9yKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5Qb3B1cENhbGxiYWNrIHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluUG9wdXBDYWxsYmFjayBzdWNjZXNzZnVsXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaWduaW5TaWxlbnQoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5zaWxlbnRfcmVkaXJlY3RfdXJpO1xyXG4gICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcmdzLnJlZGlyZWN0X3VyaSA9IHVybDtcclxuICAgICAgICBhcmdzLnByb21wdCA9IFwibm9uZVwiO1xyXG5cclxuICAgICAgICBsZXQgc2V0SWRUb2tlbjtcclxuICAgICAgICBpZiAoYXJncy5pZF90b2tlbl9oaW50IHx8ICF0aGlzLnNldHRpbmdzLmluY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldykge1xyXG4gICAgICAgICAgICBzZXRJZFRva2VuID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRJZFRva2VuID0gdGhpcy5fbG9hZFVzZXIoKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgYXJncy5pZF90b2tlbl9oaW50ID0gdXNlciAmJiB1c2VyLmlkX3Rva2VuO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZXRJZFRva2VuLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRVcmw6IHVybCxcclxuICAgICAgICAgICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0OiBhcmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0IHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50UmVxdWVzdFRpbWVvdXRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbih1c2VyID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLnN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluU2lsZW50IHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluU2lsZW50IHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2lnbmluU2lsZW50Q2FsbGJhY2sodXJsKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50Q2FsbGJhY2tcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkNhbGxiYWNrKHVybCwgdGhpcy5faWZyYW1lTmF2aWdhdG9yKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5TaWxlbnRDYWxsYmFjayBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblNpbGVudENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXJ5U2Vzc2lvblN0YXR1cyhhcmdzID0ge30pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5xdWVyeVNlc3Npb25TdGF0dXNcIik7XHJcblxyXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnNpbGVudF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgaWYgKCF1cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2lsZW50X3JlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc2lsZW50X3JlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFyZ3MucmVkaXJlY3RfdXJpID0gdXJsO1xyXG4gICAgICAgIGFyZ3MucHJvbXB0ID0gXCJub25lXCI7XHJcbiAgICAgICAgYXJncy5yZXNwb25zZV90eXBlID0gXCJpZF90b2tlblwiO1xyXG4gICAgICAgIGFyZ3Muc2NvcGUgPSBcIm9wZW5pZFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluU3RhcnQoYXJncywgdGhpcy5faWZyYW1lTmF2aWdhdG9yLCB7XHJcbiAgICAgICAgICAgIHN0YXJ0VXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0OiBhcmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0IHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50UmVxdWVzdFRpbWVvdXRcclxuICAgICAgICB9KS50aGVuKG5hdlJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25pblJlc3BvbnNlKG5hdlJlc3BvbnNlLnVybCkudGhlbihzaWduaW5SZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJnb3Qgc2lnbmluIHJlc3BvbnNlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaWduaW5SZXNwb25zZS5zZXNzaW9uX3N0YXRlICYmIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViICYmIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJxdWVyeVNlc3Npb25TdGF0dXMgc3VjY2VzcyBmb3Igc3ViOiBcIiwgIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX3N0YXRlOiBzaWduaW5SZXNwb25zZS5zZXNzaW9uX3N0YXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWI6IHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWQ6IHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc2lkXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwicXVlcnlTZXNzaW9uU3RhdHVzIHN1Y2Nlc3NmdWwsIHVzZXIgbm90IGF1dGhlbnRpY2F0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9zaWduaW4oYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIl9zaWduaW5cIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zKS50aGVuKG5hdlJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkVuZChuYXZSZXNwb25zZS51cmwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25pblN0YXJ0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluU3RhcnRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IucHJlcGFyZShuYXZpZ2F0b3JQYXJhbXMpLnRoZW4oaGFuZGxlID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbmluUmVxdWVzdChhcmdzKS50aGVuKHNpZ25pblJlcXVlc3QgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25pbiByZXF1ZXN0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy51cmwgPSBzaWduaW5SZXF1ZXN0LnVybDtcclxuICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy5pZCA9IHNpZ25pblJlcXVlc3Quc3RhdGUuaWQ7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUubmF2aWdhdGUobmF2aWdhdG9yUGFyYW1zKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuY2xvc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJFcnJvciBhZnRlciBwcmVwYXJpbmcgbmF2aWdhdG9yLCBjbG9zaW5nIG5hdmlnYXRvciB3aW5kb3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25pbkVuZCh1cmwpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluRW5kXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2lnbmluUmVzcG9uc2UodXJsKS50aGVuKHNpZ25pblJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25pbiByZXNwb25zZVwiKTtcclxuXHJcbiAgICAgICAgICAgIGxldCB1c2VyID0gbmV3IFVzZXIoc2lnbmluUmVzcG9uc2UpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVVc2VyKHVzZXIpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBzdG9yZWRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmxvYWQodXNlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25pbkNhbGxiYWNrKHVybCwgbmF2aWdhdG9yKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiX3NpZ25pbkNhbGxiYWNrXCIpO1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2FsbGJhY2sodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBzaWdub3V0UmVkaXJlY3QoYXJncyA9IHt9KSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbm91dFJlZGlyZWN0XCIpO1xyXG4gICAgICAgIGxldCBwb3N0TG9nb3V0UmVkaXJlY3RVcmkgPSBhcmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcclxuICAgICAgICBpZiAocG9zdExvZ291dFJlZGlyZWN0VXJpKXtcclxuICAgICAgICAgICAgYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0TG9nb3V0UmVkaXJlY3RVcmk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IpLnRoZW4oKCk9PntcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJzaWdub3V0UmVkaXJlY3Qgc3VjY2Vzc2Z1bFwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHNpZ25vdXRSZWRpcmVjdENhbGxiYWNrKHVybCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25vdXRSZWRpcmVjdENhbGxiYWNrXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0RW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpLnRoZW4ocmVzcG9uc2U9PntcclxuICAgICAgICAgICAgTG9nLmluZm8oXCJzaWdub3V0UmVkaXJlY3RDYWxsYmFjayBzdWNjZXNzZnVsXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbm91dFBvcHVwKGFyZ3MgPSB7fSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwXCIpO1xyXG5cclxuICAgICAgICBsZXQgdXJsID0gYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSB1cmw7XHJcbiAgICAgICAgYXJncy5kaXNwbGF5ID0gXCJwb3B1cFwiO1xyXG4gICAgICAgIGlmIChhcmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSl7XHJcbiAgICAgICAgICAgIC8vIHdlJ3JlIHB1dHRpbmcgYSBkdW1teSBlbnRyeSBpbiBoZXJlIGJlY2F1c2Ugd2UgXHJcbiAgICAgICAgICAgIC8vIG5lZWQgYSB1bmlxdWUgaWQgZnJvbSB0aGUgc3RhdGUgZm9yIG5vdGlmaWNhdGlvblxyXG4gICAgICAgICAgICAvLyB0byB0aGUgcGFyZW50IHdpbmRvdywgd2hpY2ggaXMgbmVjZXNzYXJ5IGlmIHdlXHJcbiAgICAgICAgICAgIC8vIHBsYW4gdG8gcmV0dXJuIGJhY2sgdG8gdGhlIGNsaWVudCBhZnRlciBzaWdub3V0XHJcbiAgICAgICAgICAgIC8vIGFuZCBzbyB3ZSBjYW4gY2xvc2UgdGhlIHBvcHVwIGFmdGVyIHNpZ25vdXRcclxuICAgICAgICAgICAgYXJncy5zdGF0ZSA9IGFyZ3Muc3RhdGUgfHwge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dChhcmdzLCB0aGlzLl9wb3B1cE5hdmlnYXRvciwge1xyXG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd0ZlYXR1cmVzOiBhcmdzLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cFdpbmRvd0ZlYXR1cmVzLFxyXG4gICAgICAgICAgICBwb3B1cFdpbmRvd1RhcmdldDogYXJncy5wb3B1cFdpbmRvd1RhcmdldCB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93VGFyZ2V0XHJcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbm91dFBvcHVwIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzaWdub3V0UG9wdXBDYWxsYmFjayh1cmwsIGtlZXBPcGVuKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihrZWVwT3BlbikgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZih1cmwpID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgdXJsID0gbnVsbDtcclxuICAgICAgICAgICAga2VlcE9wZW4gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWdub3V0UG9wdXBDYWxsYmFja1wiKTtcclxuICAgICAgICBsZXQgZGVsaW1pdGVyID0gJz8nO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cE5hdmlnYXRvci5jYWxsYmFjayh1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25vdXRQb3B1cENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3NpZ25vdXQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIl9zaWdub3V0XCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMpLnRoZW4obmF2UmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dEVuZChuYXZSZXNwb25zZS51cmwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NpZ25vdXRTdGFydChhcmdzID0ge30sIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbm91dFN0YXJ0XCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnByZXBhcmUobmF2aWdhdG9yUGFyYW1zKS50aGVuKGhhbmRsZSA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBuYXZpZ2F0b3Igd2luZG93IGhhbmRsZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkVXNlcigpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJsb2FkZWQgY3VycmVudCB1c2VyIGZyb20gc3RvcmFnZVwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgcmV2b2tlUHJvbWlzZSA9IHRoaXMuX3NldHRpbmdzLnJldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0ID8gdGhpcy5fcmV2b2tlSW50ZXJuYWwodXNlcikgOiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXZva2VQcm9taXNlLnRoZW4oKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWRfdG9rZW4gPSBhcmdzLmlkX3Rva2VuX2hpbnQgfHwgdXNlciAmJiB1c2VyLmlkX3Rva2VuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZF90b2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXR0aW5nIGlkX3Rva2VuIGludG8gc2lnbm91dCByZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmlkX3Rva2VuX2hpbnQgPSBpZF90b2tlbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVVzZXIoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciByZW1vdmVkLCBjcmVhdGluZyBzaWdub3V0IHJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWdub3V0UmVxdWVzdChhcmdzKS50aGVuKHNpZ25vdXRSZXF1ZXN0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBzaWdub3V0IHJlcXVlc3RcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yUGFyYW1zLnVybCA9IHNpZ25vdXRSZXF1ZXN0LnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWdub3V0UmVxdWVzdC5zdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy5pZCA9IHNpZ25vdXRSZXF1ZXN0LnN0YXRlLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS5uYXZpZ2F0ZShuYXZpZ2F0b3JQYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5jbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkVycm9yIGFmdGVyIHByZXBhcmluZyBuYXZpZ2F0b3IsIGNsb3NpbmcgbmF2aWdhdG9yIHdpbmRvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfc2lnbm91dEVuZCh1cmwpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbm91dEVuZFwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25vdXRSZXNwb25zZSh1cmwpLnRoZW4oc2lnbm91dFJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25vdXQgcmVzcG9uc2VcIik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc2lnbm91dFJlc3BvbnNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldm9rZUFjY2Vzc1Rva2VuKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnJldm9rZUFjY2Vzc1Rva2VuXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFVzZXIoKS50aGVuKHVzZXIgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlSW50ZXJuYWwodXNlciwgdHJ1ZSkudGhlbihzdWNjZXNzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicmVtb3ZpbmcgdG9rZW4gcHJvcGVydGllcyBmcm9tIHVzZXIgYW5kIHJlLXN0b3JpbmdcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIuYWNjZXNzX3Rva2VuID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyLmV4cGlyZXNfYXQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIudG9rZW5fdHlwZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcih1c2VyKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBzdG9yZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKCgpPT57XHJcbiAgICAgICAgICAgIExvZy5pbmZvKFwiYWNjZXNzIHRva2VuIHJldm9rZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9yZXZva2VJbnRlcm5hbCh1c2VyLCByZXF1aXJlZCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcImNoZWNraW5nIGlmIHRva2VuIHJldm9jYXRpb24gaXMgbmVjZXNzYXJ5XCIpO1xyXG5cclxuICAgICAgICB2YXIgYWNjZXNzX3Rva2VuID0gdXNlciAmJiB1c2VyLmFjY2Vzc190b2tlbjtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIEpXVCB2cy4gcmVmZXJlbmNlIHRva2VuXHJcbiAgICAgICAgaWYgKCFhY2Nlc3NfdG9rZW4gfHwgYWNjZXNzX3Rva2VuLmluZGV4T2YoJy4nKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm5vIG5lZWQgdG8gcmV2b2tlIGR1ZSB0byBubyB1c2VyLCB0b2tlbiwgb3IgSldUIGZvcm1hdFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZShhY2Nlc3NfdG9rZW4sIHJlcXVpcmVkKS50aGVuKCgpID0+IHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0U2lsZW50UmVuZXcoKSB7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdTZXJ2aWNlLnN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcFNpbGVudFJlbmV3KCkge1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3U2VydmljZS5zdG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF91c2VyU3RvcmVLZXkoKSB7XHJcbiAgICAgICAgcmV0dXJuIGB1c2VyOiR7dGhpcy5zZXR0aW5ncy5hdXRob3JpdHl9OiR7dGhpcy5zZXR0aW5ncy5jbGllbnRfaWR9YDtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZFVzZXIoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiX2xvYWRVc2VyXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLmdldCh0aGlzLl91c2VyU3RvcmVLZXkpLnRoZW4oc3RvcmFnZVN0cmluZyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdG9yYWdlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ1c2VyIHN0b3JhZ2VTdHJpbmcgbG9hZGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFVzZXIuZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm5vIHVzZXIgc3RvcmFnZVN0cmluZ1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcmVVc2VyKHVzZXIpIHtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJzdG9yZVVzZXIgc3RvcmluZyB1c2VyXCIpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHN0b3JhZ2VTdHJpbmcgPSB1c2VyLnRvU3RvcmFnZVN0cmluZygpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLnNldCh0aGlzLl91c2VyU3RvcmVLZXksIHN0b3JhZ2VTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwic3RvcmVVc2VyIHJlbW92aW5nIHVzZXIgc3RvcmFnZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZS5yZW1vdmUodGhpcy5fdXNlclN0b3JlS2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1VzZXJNYW5hZ2VyLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBPaWRjQ2xpZW50U2V0dGluZ3MgZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MnO1xyXG5pbXBvcnQgUmVkaXJlY3ROYXZpZ2F0b3IgZnJvbSAnLi9SZWRpcmVjdE5hdmlnYXRvcic7XHJcbmltcG9ydCBQb3B1cE5hdmlnYXRvciBmcm9tICcuL1BvcHVwTmF2aWdhdG9yJztcclxuaW1wb3J0IElGcmFtZU5hdmlnYXRvciBmcm9tICcuL0lGcmFtZU5hdmlnYXRvcic7XHJcbmltcG9ydCBXZWJTdG9yYWdlU3RhdGVTdG9yZSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcblxyXG5jb25zdCBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSA2MDtcclxuY29uc3QgRGVmYXVsdENoZWNrU2Vzc2lvbkludGVydmFsID0gMjAwMDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJNYW5hZ2VyU2V0dGluZ3MgZXh0ZW5kcyBPaWRjQ2xpZW50U2V0dGluZ3Mge1xyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIHBvcHVwX3JlZGlyZWN0X3VyaSxcclxuICAgICAgICBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlcyxcclxuICAgICAgICBwb3B1cFdpbmRvd1RhcmdldCxcclxuICAgICAgICBzaWxlbnRfcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0LFxyXG4gICAgICAgIGF1dG9tYXRpY1NpbGVudFJlbmV3ID0gZmFsc2UsXHJcbiAgICAgICAgaW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3ID0gdHJ1ZSxcclxuICAgICAgICBtb25pdG9yU2Vzc2lvbiA9IHRydWUsXHJcbiAgICAgICAgY2hlY2tTZXNzaW9uSW50ZXJ2YWwgPSBEZWZhdWx0Q2hlY2tTZXNzaW9uSW50ZXJ2YWwsXHJcbiAgICAgICAgcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQgPSBmYWxzZSxcclxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSxcclxuICAgICAgICByZWRpcmVjdE5hdmlnYXRvciA9IG5ldyBSZWRpcmVjdE5hdmlnYXRvcigpLFxyXG4gICAgICAgIHBvcHVwTmF2aWdhdG9yID0gbmV3IFBvcHVwTmF2aWdhdG9yKCksXHJcbiAgICAgICAgaWZyYW1lTmF2aWdhdG9yID0gbmV3IElGcmFtZU5hdmlnYXRvcigpLFxyXG4gICAgICAgIHVzZXJTdG9yZSA9IG5ldyBXZWJTdG9yYWdlU3RhdGVTdG9yZSh7IHN0b3JlOiBHbG9iYWwuc2Vzc2lvblN0b3JhZ2UgfSlcclxuICAgIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcHVwX3JlZGlyZWN0X3VyaSA9IHBvcHVwX3JlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBXaW5kb3dGZWF0dXJlcyA9IHBvcHVwV2luZG93RmVhdHVyZXM7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBXaW5kb3dUYXJnZXQgPSBwb3B1cFdpbmRvd1RhcmdldDtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9zaWxlbnRfcmVkaXJlY3RfdXJpID0gc2lsZW50X3JlZGlyZWN0X3VyaTtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZXF1ZXN0VGltZW91dCA9IHNpbGVudFJlcXVlc3RUaW1lb3V0O1xyXG4gICAgICAgIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3ID0gISFhdXRvbWF0aWNTaWxlbnRSZW5ldztcclxuICAgICAgICB0aGlzLl9pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcgPSBpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXc7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcclxuXHJcbiAgICAgICAgdGhpcy5fbW9uaXRvclNlc3Npb24gPSBtb25pdG9yU2Vzc2lvbjtcclxuICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbCA9IGNoZWNrU2Vzc2lvbkludGVydmFsO1xyXG4gICAgICAgIHRoaXMuX3Jldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0ID0gcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yID0gcmVkaXJlY3ROYXZpZ2F0b3I7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBOYXZpZ2F0b3IgPSBwb3B1cE5hdmlnYXRvcjtcclxuICAgICAgICB0aGlzLl9pZnJhbWVOYXZpZ2F0b3IgPSBpZnJhbWVOYXZpZ2F0b3I7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fdXNlclN0b3JlID0gdXNlclN0b3JlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwb3B1cF9yZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwX3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuICAgIGdldCBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuICAgIGdldCBwb3B1cFdpbmRvd0ZlYXR1cmVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cFdpbmRvd0ZlYXR1cmVzO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBvcHVwV2luZG93VGFyZ2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cFdpbmRvd1RhcmdldDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lsZW50X3JlZGlyZWN0X3VyaSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lsZW50X3JlZGlyZWN0X3VyaTtcclxuICAgIH1cclxuICAgICBnZXQgc2lsZW50UmVxdWVzdFRpbWVvdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpbGVudFJlcXVlc3RUaW1lb3V0O1xyXG4gICAgfVxyXG4gICAgZ2V0IGF1dG9tYXRpY1NpbGVudFJlbmV3KCkge1xyXG4gICAgICAgIHJldHVybiAhISh0aGlzLnNpbGVudF9yZWRpcmVjdF91cmkgJiYgdGhpcy5fYXV0b21hdGljU2lsZW50UmVuZXcpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGluY2x1ZGVJZFRva2VuSW5TaWxlbnRSZW5ldygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3O1xyXG4gICAgfVxyXG4gICAgZ2V0IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9uaXRvclNlc3Npb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbml0b3JTZXNzaW9uO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNoZWNrU2Vzc2lvbkludGVydmFsKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbDtcclxuICAgIH1cclxuICAgIGdldCByZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlZGlyZWN0TmF2aWdhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvcjtcclxuICAgIH1cclxuICAgIGdldCBwb3B1cE5hdmlnYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBOYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBnZXQgaWZyYW1lTmF2aWdhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pZnJhbWVOYXZpZ2F0b3I7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCB1c2VyU3RvcmUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXNlck1hbmFnZXJTZXR0aW5ncy5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3ROYXZpZ2F0b3Ige1xyXG4gICAgXHJcbiAgICBwcmVwYXJlKCkge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVkaXJlY3ROYXZpZ2F0b3IubmF2aWdhdGVcIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB1cmwoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVkaXJlY3ROYXZpZ2F0b3IudXJsXCIpO1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUmVkaXJlY3ROYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFBvcHVwV2luZG93IGZyb20gJy4vUG9wdXBXaW5kb3cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9wdXBOYXZpZ2F0b3Ige1xyXG4gICAgXHJcbiAgICBwcmVwYXJlKHBhcmFtcykge1xyXG4gICAgICAgIGxldCBwb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9wdXApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjYWxsYmFjayh1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cE5hdmlnYXRvci5jYWxsYmFja1wiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgUG9wdXBXaW5kb3cubm90aWZ5T3BlbmVyKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUG9wdXBOYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcclxuXHJcbmNvbnN0IENoZWNrRm9yUG9wdXBDbG9zZWRJbnRlcnZhbCA9IDUwMDtcclxuY29uc3QgRGVmYXVsdFBvcHVwRmVhdHVyZXMgPSAnbG9jYXRpb249bm8sdG9vbGJhcj1ubyx3aWR0aD01MDAsaGVpZ2h0PTUwMCxsZWZ0PTEwMCx0b3A9MTAwOyc7XHJcbi8vY29uc3QgRGVmYXVsdFBvcHVwRmVhdHVyZXMgPSAnbG9jYXRpb249bm8sdG9vbGJhcj1ubyx3aWR0aD01MDAsaGVpZ2h0PTUwMCxsZWZ0PTEwMCx0b3A9MTAwO3Jlc2l6YWJsZT15ZXMnO1xyXG5cclxuY29uc3QgRGVmYXVsdFBvcHVwVGFyZ2V0ID0gXCJfYmxhbmtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcHVwV2luZG93IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5jdG9yXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0ID0gcGFyYW1zLnBvcHVwV2luZG93VGFyZ2V0IHx8IERlZmF1bHRQb3B1cFRhcmdldDtcclxuICAgICAgICBsZXQgZmVhdHVyZXMgPSBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCBEZWZhdWx0UG9wdXBGZWF0dXJlcztcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wdXAgPSB3aW5kb3cub3BlbignJywgdGFyZ2V0LCBmZWF0dXJlcyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInBvcHVwIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZC5iaW5kKHRoaXMpLCBDaGVja0ZvclBvcHVwQ2xvc2VkSW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJvbWlzZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5uYXZpZ2F0ZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9wb3B1cCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2V0dGluZyBVUkwgaW4gcG9wdXBcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9pZCA9IHBhcmFtcy5pZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lkKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3dbXCJwb3B1cENhbGxiYWNrX1wiICsgcGFyYW1zLmlkXSA9IHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLndpbmRvdy5sb2NhdGlvbiA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9zdWNjZXNzKGRhdGEpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBwb3B1cCB3aW5kb3dcIik7XHJcbiAgICAgICAgdGhpcy5fcmVzb2x2ZShkYXRhKTtcclxuICAgIH1cclxuICAgIF9lcnJvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG5cclxuICAgICAgICBMb2cuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5fcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NsZWFudXAoa2VlcE9wZW4pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5fY2xlYW51cFwiKTtcclxuXHJcbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyKTtcclxuICAgICAgICB0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIgPSBudWxsO1xyXG5cclxuICAgICAgICBkZWxldGUgd2luZG93W1wicG9wdXBDYWxsYmFja19cIiArIHRoaXMuX2lkXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmICFrZWVwT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgX2NoZWNrRm9yUG9wdXBDbG9zZWQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuX2NoZWNrRm9yUG9wdXBDbG9zZWRcIik7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXAgfHwgdGhpcy5fcG9wdXAuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXAgd2luZG93IGNsb3NlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2NhbGxiYWNrKHVybCwga2VlcE9wZW4pIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJQb3B1cFdpbmRvdy5fY2FsbGJhY2tcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoa2VlcE9wZW4pO1xyXG5cclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3MoeyB1cmw6IHVybCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiSW52YWxpZCByZXNwb25zZSBmcm9tIHBvcHVwXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbm90aWZ5T3BlbmVyKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcikge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lclwiKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5vcGVuZXIpIHtcclxuICAgICAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICBpZiAodXJsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBkZWxpbWl0ZXIpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gXCJwb3B1cENhbGxiYWNrX1wiICsgZGF0YS5zdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSB3aW5kb3cub3BlbmVyW25hbWVdOyBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicGFzc2luZyB1cmwgbWVzc2FnZSB0byBvcGVuZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVybCwga2VlcE9wZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJubyBtYXRjaGluZyBjYWxsYmFjayBmb3VuZCBvbiBvcGVuZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJubyBzdGF0ZSBmb3VuZCBpbiByZXNwb25zZSB1cmxcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1BvcHVwV2luZG93LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBJRnJhbWVXaW5kb3cgZnJvbSAnLi9JRnJhbWVXaW5kb3cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSUZyYW1lTmF2aWdhdG9yIHtcclxuXHJcbiAgICBwcmVwYXJlKHBhcmFtcykge1xyXG4gICAgICAgIGxldCBmcmFtZSA9IG5ldyBJRnJhbWVXaW5kb3cocGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZyYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBjYWxsYmFjayh1cmwpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVOYXZpZ2F0b3IuY2FsbGJhY2tcIik7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIElGcmFtZVdpbmRvdy5ub3RpZnlQYXJlbnQodXJsKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9JRnJhbWVOYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmNvbnN0IERlZmF1bHRUaW1lb3V0ID0gMTAwMDA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJRnJhbWVXaW5kb3cge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdy5jdG9yXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCA9IHRoaXMuX21lc3NhZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9mcmFtZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG5cclxuICAgICAgICAvLyBzaG90Z3VuIGFwcHJvYWNoXHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLndpZHRoID0gMDtcclxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5oZWlnaHQgPSAwO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2ZyYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cubmF2aWdhdGVcIik7XHJcblxyXG4gICAgICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRpbWVvdXQgPSBwYXJhbXMuc2lsZW50UmVxdWVzdFRpbWVvdXQgfHwgRGVmYXVsdFRpbWVvdXQ7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlVzaW5nIHRpbWVvdXQgb2Y6XCIsIHRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX3RpbWVvdXQuYmluZCh0aGlzKSwgdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLnNyYyA9IHBhcmFtcy51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX3N1Y2Nlc3MoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuXHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU3VjY2Vzc2Z1bCByZXNwb25zZSBmcm9tIGZyYW1lIHdpbmRvd1wiKTtcclxuICAgICAgICB0aGlzLl9yZXNvbHZlKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgX2Vycm9yKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLl9yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NsZWFudXAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIklGcmFtZVdpbmRvdy5fY2xlYW51cFwiKTtcclxuXHJcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcclxuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5fZnJhbWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3RpbWVvdXQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Ll90aW1lb3V0XCIpO1xyXG4gICAgICAgIHRoaXMuX2Vycm9yKFwiRnJhbWUgd2luZG93IHRpbWVkIG91dFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBfbWVzc2FnZShlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Ll9tZXNzYWdlXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGltZXIgJiZcclxuICAgICAgICAgICAgZS5vcmlnaW4gPT09IHRoaXMuX29yaWdpbiAmJlxyXG4gICAgICAgICAgICBlLnNvdXJjZSA9PT0gdGhpcy5fZnJhbWUuY29udGVudFdpbmRvd1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBsZXQgdXJsID0gZS5kYXRhO1xyXG4gICAgICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiB1cmwgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihcIkludmFsaWQgcmVzcG9uc2UgZnJvbSBmcmFtZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgX29yaWdpbigpIHtcclxuICAgICAgICByZXR1cm4gbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBub3RpZnlQYXJlbnQodXJsKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Lm5vdGlmeVBhcmVudFwiKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5wYXJlbnQgJiYgd2luZG93ICE9PSB3aW5kb3cucGFyZW50KSB7XHJcbiAgICAgICAgICAgIHVybCA9IHVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicG9zdGluZyB1cmwgbWVzc2FnZSB0byBwYXJlbnRcIik7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHVybCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvSUZyYW1lV2luZG93LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKHtpZF90b2tlbiwgc2Vzc2lvbl9zdGF0ZSwgYWNjZXNzX3Rva2VuLCB0b2tlbl90eXBlLCBzY29wZSwgcHJvZmlsZSwgZXhwaXJlc19hdCwgc3RhdGV9KSB7XHJcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IGlkX3Rva2VuO1xyXG4gICAgICAgIHRoaXMuc2Vzc2lvbl9zdGF0ZSA9IHNlc3Npb25fc3RhdGU7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NfdG9rZW4gPSBhY2Nlc3NfdG9rZW47XHJcbiAgICAgICAgdGhpcy50b2tlbl90eXBlID0gdG9rZW5fdHlwZTtcclxuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XHJcbiAgICAgICAgdGhpcy5wcm9maWxlID0gcHJvZmlsZTtcclxuICAgICAgICB0aGlzLmV4cGlyZXNfYXQgPSBleHBpcmVzX2F0O1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZXhwaXJlc19pbigpIHtcclxuICAgICAgICBpZiAodGhpcy5leHBpcmVzX2F0KSB7XHJcbiAgICAgICAgICAgIGxldCBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGlyZXNfYXQgLSBub3c7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGV4cGlyZWQoKSB7XHJcbiAgICAgICAgbGV0IGV4cGlyZXNfaW4gPSB0aGlzLmV4cGlyZXNfaW47XHJcbiAgICAgICAgaWYgKGV4cGlyZXNfaW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZXhwaXJlc19pbiA8PSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzY29wZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3BlIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlci50b1N0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgaWRfdG9rZW46IHRoaXMuaWRfdG9rZW4sXHJcbiAgICAgICAgICAgIHNlc3Npb25fc3RhdGU6IHRoaXMuc2Vzc2lvbl9zdGF0ZSxcclxuICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiB0aGlzLmFjY2Vzc190b2tlbixcclxuICAgICAgICAgICAgdG9rZW5fdHlwZTogdGhpcy50b2tlbl90eXBlLFxyXG4gICAgICAgICAgICBzY29wZTogdGhpcy5zY29wZSxcclxuICAgICAgICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxyXG4gICAgICAgICAgICBleHBpcmVzX2F0OiB0aGlzLmV4cGlyZXNfYXRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXIuZnJvbVN0b3JhZ2VTdHJpbmdcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKEpTT04ucGFyc2Uoc3RvcmFnZVN0cmluZykpO1xyXG4gICAgfVxyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1VzZXIuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEFjY2Vzc1Rva2VuRXZlbnRzIGZyb20gJy4vQWNjZXNzVG9rZW5FdmVudHMnO1xyXG5pbXBvcnQgRXZlbnQgZnJvbSAnLi9FdmVudCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyTWFuYWdlckV2ZW50cyBleHRlbmRzIEFjY2Vzc1Rva2VuRXZlbnRzIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xyXG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcclxuICAgICAgICB0aGlzLl91c2VyTG9hZGVkID0gbmV3IEV2ZW50KFwiVXNlciBsb2FkZWRcIik7XHJcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkID0gbmV3IEV2ZW50KFwiVXNlciB1bmxvYWRlZFwiKTtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yID0gbmV3IEV2ZW50KFwiU2lsZW50IHJlbmV3IGVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTaWduZWRPdXQgPSBuZXcgRXZlbnQoXCJVc2VyIHNpZ25lZCBvdXRcIik7XHJcbiAgICAgICAgdGhpcy5fdXNlclNlc3Npb25DaGFuZ2VkID0gbmV3IEV2ZW50KFwiVXNlciBzZXNzaW9uIGNoYW5nZWRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZCh1c2VyLCByYWlzZUV2ZW50PXRydWUpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlckV2ZW50cy5sb2FkXCIpO1xyXG4gICAgICAgIHN1cGVyLmxvYWQodXNlcik7XHJcbiAgICAgICAgaWYgKHJhaXNlRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlckxvYWRlZC5yYWlzZSh1c2VyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB1bmxvYWQoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMudW5sb2FkXCIpO1xyXG4gICAgICAgIHN1cGVyLnVubG9hZCgpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yYWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFVzZXJMb2FkZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLmFkZEhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlVXNlckxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2FkZWQucmVtb3ZlSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGFkZFVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVVzZXJVbmxvYWRlZChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRTaWxlbnRSZW5ld0Vycm9yKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVNpbGVudFJlbmV3RXJyb3IoY2IpIHtcclxuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG4gICAgX3JhaXNlU2lsZW50UmVuZXdFcnJvcihlKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMuX3JhaXNlU2lsZW50UmVuZXdFcnJvclwiLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3RXJyb3IucmFpc2UoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkVXNlclNpZ25lZE91dChjYikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJTaWduZWRPdXQuYWRkSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVVc2VyU2lnbmVkT3V0KGNiKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIF9yYWlzZVVzZXJTaWduZWRPdXQoZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXRcIik7XHJcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5yYWlzZShlKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQuYWRkSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQucmVtb3ZlSGFuZGxlcihjYik7XHJcbiAgICB9XHJcbiAgICBfcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWQoZSkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLl9yYWlzZVVzZXJTZXNzaW9uQ2hhbmdlZFwiKTtcclxuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQucmFpc2UoZSk7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1VzZXJNYW5hZ2VyRXZlbnRzLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBUaW1lciBmcm9tICcuL1RpbWVyJztcclxuXHJcbmNvbnN0IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IDYwOyAvLyBzZWNvbmRzXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2Nlc3NUb2tlbkV2ZW50cyB7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioe1xyXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lLFxyXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmluZ1wiKSxcclxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyZWRUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmVkXCIpXHJcbiAgICB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xyXG5cclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nID0gYWNjZXNzVG9rZW5FeHBpcmluZ1RpbWVyO1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZCA9IGFjY2Vzc1Rva2VuRXhwaXJlZFRpbWVyO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWQoY29udGFpbmVyKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQWNjZXNzVG9rZW5FdmVudHMubG9hZFwiKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9jYW5jZWxUaW1lcnMoKTtcclxuXHJcbiAgICAgICAgLy8gb25seSByZWdpc3RlciBldmVudHMgaWYgdGhlcmUncyBhbiBhY2Nlc3MgdG9rZW4gd2hlcmUgd2UgY2FyZSBhYm91dCBleHBpcmF0aW9uXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lci5hY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgICAgbGV0IGR1cmF0aW9uID0gY29udGFpbmVyLmV4cGlyZXNfaW47XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImFjY2VzcyB0b2tlbiBwcmVzZW50LCByZW1haW5pbmcgZHVyYXRpb246XCIsIGR1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZXhwaXJpbmcgaWYgd2Ugc3RpbGwgaGF2ZSB0aW1lXHJcbiAgICAgICAgICAgICAgICBsZXQgZXhwaXJpbmcgPSBkdXJhdGlvbiAtIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV4cGlyaW5nIDw9IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGV4cGlyaW5nID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlZ2lzdGVyaW5nIGV4cGlyaW5nIHRpbWVyIGluOlwiLCBleHBpcmluZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmluaXQoZXhwaXJpbmcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhbHdheXMgcmVnaXN0ZXIgZXhwaXJlZC4gaWYgaXQncyBuZWdhdGl2ZSwgaXQgd2lsbCBzdGlsbCBmaXJlXHJcbiAgICAgICAgICAgIGxldCBleHBpcmVkID0gZHVyYXRpb24gKyAxO1xyXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJyZWdpc3RlcmluZyBleHBpcmVkIHRpbWVyIGluOlwiLCBleHBpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkLmluaXQoZXhwaXJlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVubG9hZCgpIHtcclxuICAgICAgICBMb2cuZGVidWcoXCJBY2Nlc3NUb2tlbkV2ZW50cy51bmxvYWRcIik7XHJcbiAgICAgICAgdGhpcy5fY2FuY2VsVGltZXJzKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9jYW5jZWxUaW1lcnMoKXtcclxuICAgICAgICBMb2cuZGVidWcoXCJjYW5jZWxpbmcgZXhpc3RpbmcgYWNjZXNzIHRva2VuIHRpbWVyc1wiKTtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmNhbmNlbCgpO1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5jYW5jZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBY2Nlc3NUb2tlbkV4cGlyaW5nKGNiKSB7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJpbmcoY2IpIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLnJlbW92ZUhhbmRsZXIoY2IpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5hZGRIYW5kbGVyKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xyXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5yZW1vdmVIYW5kbGVyKGNiKTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvQWNjZXNzVG9rZW5FdmVudHMuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XHJcbmltcG9ydCBFdmVudCBmcm9tICcuL0V2ZW50JztcclxuXHJcbmNvbnN0IFRpbWVyRHVyYXRpb24gPSA1OyAvLyBzZWNvbmRzXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lciBleHRlbmRzIEV2ZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB0aW1lciA9IEdsb2JhbC50aW1lcikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgICAgIHRoaXMuX3RpbWVyID0gdGltZXI7XHJcbiAgICAgICAgdGhpcy5fbm93RnVuYyA9ICgpID0+IERhdGUubm93KCkgLyAxMDAwO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBub3coKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuX25vd0Z1bmMoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChkdXJhdGlvbikge1xyXG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XHJcblxyXG4gICAgICAgIGlmIChkdXJhdGlvbiA8PSAwKSB7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZHVyYXRpb24gPSBwYXJzZUludChkdXJhdGlvbik7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlRpbWVyLmluaXQgdGltZXIgXCIgKyB0aGlzLl9uYW1lICsgXCIgZm9yIGR1cmF0aW9uOlwiLCBkdXJhdGlvbik7XHJcbiAgICAgICAgdGhpcy5fZXhwaXJhdGlvbiA9IHRoaXMubm93ICsgZHVyYXRpb247XHJcblxyXG4gICAgICAgIC8vIHdlJ3JlIHVzaW5nIGEgZmFpcmx5IHNob3J0IHRpbWVyIGFuZCB0aGVuIGNoZWNraW5nIHRoZSBleHBpcmF0aW9uIGluIHRoZSBcclxuICAgICAgICAvLyBjYWxsYmFjayB0byBoYW5kbGUgc2NlbmFyaW9zIHdoZXJlIHRoZSBicm93c2VyIGRldmljZSBzbGVlcHMsIGFuZCB0aGVuIFxyXG4gICAgICAgIC8vIHRoZSB0aW1lcnMgZW5kIHVwIGdldHRpbmcgZGVsYXllZC5cclxuICAgICAgICB2YXIgdGltZXJEdXJhdGlvbiA9IFRpbWVyRHVyYXRpb247XHJcbiAgICAgICAgaWYgKGR1cmF0aW9uIDwgdGltZXJEdXJhdGlvbikge1xyXG4gICAgICAgICAgICB0aW1lckR1cmF0aW9uID0gZHVyYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gdGhpcy5fdGltZXIuc2V0SW50ZXJ2YWwodGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSwgdGltZXJEdXJhdGlvbiAqIDEwMDApO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbmNlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGltZXJIYW5kbGUpIHtcclxuICAgICAgICAgICAgTG9nLmRlYnVnKFwiVGltZXIuY2FuY2VsOiBcIiwgdGhpcy5fbmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyLmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXJIYW5kbGUpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lckhhbmRsZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9jYWxsYmFjaygpIHtcclxuICAgICAgICB2YXIgZGlmZiA9IHRoaXMuX2V4cGlyYXRpb24gLSB0aGlzLm5vdztcclxuICAgICAgICBMb2cuZGVidWcoXCJUaW1lci5fY2FsbGJhY2s7IFwiICsgdGhpcy5fbmFtZSArIFwiIHRpbWVyIGV4cGlyZXMgaW46XCIsIGRpZmYpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZXhwaXJhdGlvbiA8PSB0aGlzLm5vdykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICBzdXBlci5yYWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVGltZXIuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XHJcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSGFuZGxlcihjYikge1xyXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVIYW5kbGVyKGNiKSB7XHJcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2NhbGxiYWNrcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSBjYik7XHJcbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmFpc2UoLi4ucGFyYW1zKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiUmFpc2luZyBldmVudDogXCIgKyB0aGlzLl9uYW1lKTtcclxuICAgICAgICBmb3IgKHZhciBjYiBvZiB0aGlzLl9jYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgY2IoLi4ucGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0V2ZW50LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWxlbnRSZW5ld1NlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHVzZXJNYW5hZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIgPSB1c2VyTWFuYWdlcjtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdGhpcy5fdG9rZW5FeHBpcmluZy5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuYWRkQWNjZXNzVG9rZW5FeHBpcmluZyh0aGlzLl9jYWxsYmFjayk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgdHJpZ2dlciBsb2FkaW5nIG9mIHRoZSB1c2VyIHNvIHRoZSBleHBpcmluZyBldmVudHMgY2FuIGJlIGluaXRpYWxpemVkXHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmdldFVzZXIoKS50aGVuKHVzZXI9PntcclxuICAgICAgICAgICAgICAgIC8vIGRlbGliZXJhdGUgbm9wXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVycj0+e1xyXG4gICAgICAgICAgICAgICAgLy8gY2F0Y2ggdG8gc3VwcHJlc3MgZXJyb3JzIHNpbmNlIHdlJ3JlIGluIGEgY3RvclxyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiRXJyb3IgZnJvbSBnZXRVc2VyOlwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMucmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmluZyh0aGlzLl9jYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFjaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3Rva2VuRXhwaXJpbmcoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU2lsZW50UmVuZXdTZXJ2aWNlIGF1dG9tYXRpY2FsbHkgcmVuZXdpbmcgYWNjZXNzIHRva2VuXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLnNpZ25pblNpbGVudCgpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNpbGVudCB0b2tlbiByZW5ld2FsIHN1Y2Nlc3NmdWxcIik7XHJcbiAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiRXJyb3IgZnJvbSBzaWduaW5TaWxlbnQ6XCIsIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVNpbGVudFJlbmV3RXJyb3IoZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lsZW50UmVuZXdTZXJ2aWNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBDaGVja1Nlc3Npb25JRnJhbWUgZnJvbSAnLi9DaGVja1Nlc3Npb25JRnJhbWUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Vzc2lvbk1vbml0b3Ige1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHVzZXJNYW5hZ2VyLCBDaGVja1Nlc3Npb25JRnJhbWVDdG9yID0gQ2hlY2tTZXNzaW9uSUZyYW1lKSB7XHJcbiAgICAgICAgaWYgKCF1c2VyTWFuYWdlcikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB1c2VyIG1hbmFnZXIgcGFzc2VkIHRvIFNlc3Npb25Nb25pdG9yXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VyTWFuYWdlclwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyID0gdXNlck1hbmFnZXI7XHJcbiAgICAgICAgdGhpcy5fQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciA9IENoZWNrU2Vzc2lvbklGcmFtZUN0b3I7XHJcblxyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5hZGRVc2VyTG9hZGVkKHRoaXMuX3N0YXJ0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5hZGRVc2VyVW5sb2FkZWQodGhpcy5fc3RvcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZ2V0VXNlcigpLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydCh1c2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGN0b3JcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiU2Vzc2lvbk1vbml0b3IgY3RvcjsgZXJyb3IgZnJvbSBnZXRVc2VyOlwiLCBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF9zZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIuc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgICBnZXQgX21ldGFkYXRhU2VydmljZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIubWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9jbGllbnRfaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcclxuICAgIH1cclxuICAgIGdldCBfY2hlY2tTZXNzaW9uSW50ZXJ2YWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNoZWNrU2Vzc2lvbkludGVydmFsO1xyXG4gICAgfVxyXG5cclxuICAgIF9zdGFydCh1c2VyKSB7XHJcbiAgICAgICAgbGV0IHNlc3Npb25fc3RhdGUgPSB1c2VyLnNlc3Npb25fc3RhdGU7XHJcblxyXG4gICAgICAgIGlmIChzZXNzaW9uX3N0YXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1YiA9IHVzZXIucHJvZmlsZS5zdWI7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpZCA9IHVzZXIucHJvZmlsZS5zaWQ7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9zdGFydDsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbl9zdGF0ZSwgXCIsIHN1YjpcIiwgdGhpcy5fc3ViKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lKCkudGhlbih1cmwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSW5pdGlhbGl6aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2xpZW50X2lkID0gdGhpcy5fY2xpZW50X2lkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW50ZXJ2YWwgPSB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZSA9IG5ldyB0aGlzLl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yKHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyksIGNsaWVudF9pZCwgdXJsLCBpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZS5sb2FkKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJObyBjaGVjayBzZXNzaW9uIGlmcmFtZSBmb3VuZCBpbiB0aGUgbWV0YWRhdGFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCB0byBzdXBwcmVzcyBlcnJvcnMgc2luY2Ugd2UncmUgaW4gbm9uLXByb21pc2UgY2FsbGJhY2tcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIGdldENoZWNrU2Vzc2lvbklmcmFtZTpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3N0b3AoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX3N0b3BcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3N1YiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc2lkID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2Vzc2lvbklGcmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfY2FsbGJhY2soKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX2NhbGxiYWNrXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5xdWVyeVNlc3Npb25TdGF0dXMoKS50aGVuKHNlc3Npb24gPT4ge1xyXG4gICAgICAgICAgICB2YXIgcmFpc2VVc2VyU2lnbmVkT3V0RXZlbnQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLnN1YiA9PT0gdGhpcy5fc3ViKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFpc2VVc2VyU2lnbmVkT3V0RXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbi5zZXNzaW9uX3N0YXRlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uc2lkID09PSB0aGlzLl9zaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2FtZSBzdWIgc3RpbGwgbG9nZ2VkIGluIGF0IE9QLCByZXN0YXJ0aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lOyBzZXNzaW9uX3N0YXRlOlwiLCBzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2FtZSBzdWIgc3RpbGwgbG9nZ2VkIGluIGF0IE9QLCBzZXNzaW9uIHN0YXRlIGhhcyBjaGFuZ2VkLCByZXN0YXJ0aW5nIGNoZWNrIHNlc3Npb24gaWZyYW1lOyBzZXNzaW9uX3N0YXRlOlwiLCBzZXNzaW9uLnNlc3Npb25fc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuX3JhaXNlVXNlclNlc3Npb25DaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiRGlmZmVyZW50IHN1YmplY3Qgc2lnbmVkIGludG8gT1A6XCIsIHNlc3Npb24uc3ViKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlN1YmplY3Qgbm8gbG9uZ2VyIHNpZ25lZCBpbnRvIE9QXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmFpc2VVc2VyU2lnbmVkT3V0RXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9jYWxsYmFjazsgcmFpc2luZyBzaWduZWQgb3V0IGV2ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkVycm9yIGNhbGxpbmcgcXVlcnlDdXJyZW50U2lnbmluU2Vzc2lvbjsgcmFpc2luZyBzaWduZWQgb3V0IGV2ZW50XCIsIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2Vzc2lvbk1vbml0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuXHJcbmNvbnN0IERlZmF1bHRJbnRlcnZhbCA9IDIwMDA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGVja1Nlc3Npb25JRnJhbWUge1xyXG4gICAgY29uc3RydWN0b3IoY2FsbGJhY2ssIGNsaWVudF9pZCwgdXJsLCBpbnRlcnZhbCkge1xyXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gY2xpZW50X2lkO1xyXG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcclxuICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IGludGVydmFsIHx8IERlZmF1bHRJbnRlcnZhbDtcclxuXHJcbiAgICAgICAgdmFyIGlkeCA9IHVybC5pbmRleE9mKFwiL1wiLCB1cmwuaW5kZXhPZihcIi8vXCIpICsgMik7XHJcbiAgICAgICAgdGhpcy5fZnJhbWVfb3JpZ2luID0gdXJsLnN1YnN0cigwLCBpZHgpO1xyXG5cclxuICAgICAgICB0aGlzLl9mcmFtZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG5cclxuICAgICAgICAvLyBzaG90Z3VuIGFwcHJvYWNoXHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLndpZHRoID0gMDtcclxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5oZWlnaHQgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl9mcmFtZS5zcmMgPSB1cmw7XHJcbiAgICB9XHJcbiAgICBsb2FkKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9mcmFtZS5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2ZyYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQgPSB0aGlzLl9tZXNzYWdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX21lc3NhZ2UoZSkge1xyXG4gICAgICAgIGlmIChlLm9yaWdpbiA9PT0gdGhpcy5fZnJhbWVfb3JpZ2luICYmXHJcbiAgICAgICAgICAgIGUuc291cmNlID09PSB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmRhdGEgPT09IFwiZXJyb3JcIikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiZXJyb3IgbWVzc2FnZSBmcm9tIGNoZWNrIHNlc3Npb24gb3AgaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZS5kYXRhID09PSBcImNoYW5nZWRcIikge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiY2hhbmdlZCBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoZS5kYXRhICsgXCIgbWVzc2FnZSBmcm9tIGNoZWNrIHNlc3Npb24gb3AgaWZyYW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhcnQoc2Vzc2lvbl9zdGF0ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zZXNzaW9uX3N0YXRlICE9PSBzZXNzaW9uX3N0YXRlKSB7XHJcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkNoZWNrU2Vzc2lvbklGcmFtZS5zdGFydFwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbl9zdGF0ZSA9IHNlc3Npb25fc3RhdGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHRoaXMuX2NsaWVudF9pZCArIFwiIFwiICsgdGhpcy5fc2Vzc2lvbl9zdGF0ZSwgdGhpcy5fZnJhbWVfb3JpZ2luKTtcclxuICAgICAgICAgICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkNoZWNrU2Vzc2lvbklGcmFtZS5zdG9wXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zZXNzaW9uX3N0YXRlID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX3RpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvQ2hlY2tTZXNzaW9uSUZyYW1lLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xyXG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcclxuXHJcbmNvbnN0IEFjY2Vzc1Rva2VuVHlwZUhpbnQgPSBcImFjY2Vzc190b2tlblwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5SZXZvY2F0aW9uQ2xpZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBYTUxIdHRwUmVxdWVzdEN0b3IgPSBHbG9iYWwuWE1MSHR0cFJlcXVlc3QsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzZXR0aW5ncyBwcm92aWRlZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5fWE1MSHR0cFJlcXVlc3RDdG9yID0gWE1MSHR0cFJlcXVlc3RDdG9yO1xyXG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXZva2UoYWNjZXNzVG9rZW4sIHJlcXVpcmVkKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhY2Nlc3NUb2tlbiBwcm92aWRlZFwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYWNjZXNzVG9rZW4gcHJvdmlkZWQuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRSZXZvY2F0aW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdXJsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJSZXZvY2F0aW9uIG5vdCBzdXBwb3J0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmV2b2NhdGlvbiBub3Qgc3VwcG9ydGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIG5vdCByZXF1aXJlZCwgc28gZG9uJ3QgZXJyb3IgYW5kIGp1c3QgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnRfc2VjcmV0ID0gdGhpcy5fc2V0dGluZ3MuY2xpZW50X3NlY3JldDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jldm9rZSh1cmwsIGNsaWVudF9pZCwgY2xpZW50X3NlY3JldCwgYWNjZXNzVG9rZW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9yZXZva2UodXJsLCBjbGllbnRfaWQsIGNsaWVudF9zZWNyZXQsIGFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQ2FsbGluZyByZXZvY2F0aW9uIGVuZHBvaW50XCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgdmFyIHhociA9IG5ldyB0aGlzLl9YTUxIdHRwUmVxdWVzdEN0b3IoKTtcclxuICAgICAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIHVybCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSFRUUCByZXNwb25zZSByZWNlaXZlZCwgc3RhdHVzXCIsIHhoci5zdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHhoci5zdGF0dXNUZXh0ICsgXCIgKFwiICsgeGhyLnN0YXR1cyArIFwiKVwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB2YXIgYm9keSA9IFwiY2xpZW50X2lkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNsaWVudF9pZCk7IFxyXG4gICAgICAgICAgICBpZiAoY2xpZW50X3NlY3JldCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSArPSBcIiZjbGllbnRfc2VjcmV0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNsaWVudF9zZWNyZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJvZHkgKz0gXCImdG9rZW5fdHlwZV9oaW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KEFjY2Vzc1Rva2VuVHlwZUhpbnQpO1xyXG4gICAgICAgICAgICBib2R5ICs9IFwiJnRva2VuPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGFjY2Vzc1Rva2VuKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xyXG4gICAgICAgICAgICB4aHIuc2VuZChib2R5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVG9rZW5SZXZvY2F0aW9uQ2xpZW50LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5cclxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XHJcbmltcG9ydCBDb3Jkb3ZhUG9wdXBXaW5kb3cgZnJvbSAnLi9Db3Jkb3ZhUG9wdXBXaW5kb3cnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZG92YVBvcHVwTmF2aWdhdG9yIHtcclxuICAgIFxyXG4gICAgcHJlcGFyZShwYXJhbXMpIHtcclxuICAgICAgICBsZXQgcG9wdXAgPSBuZXcgQ29yZG92YVBvcHVwV2luZG93KHBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb3B1cCk7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvcmRvdmFQb3B1cE5hdmlnYXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuXHJcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xyXG5cclxuY29uc3QgRGVmYXVsdFBvcHVwRmVhdHVyZXMgPSAnbG9jYXRpb249bm8sdG9vbGJhcj1ubyx6b29tPW5vJztcclxuY29uc3QgRGVmYXVsdFBvcHVwVGFyZ2V0ID0gXCJfYmxhbmtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvcmRvdmFQb3B1cFdpbmRvdyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93LmN0b3JcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmVhdHVyZXMgPSBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCBEZWZhdWx0UG9wdXBGZWF0dXJlcztcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHBhcmFtcy5wb3B1cFdpbmRvd1RhcmdldCB8fCBEZWZhdWx0UG9wdXBUYXJnZXQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5yZWRpcmVjdF91cmkgPSBwYXJhbXMuc3RhcnRVcmw7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwicmVkaXJlY3RfdXJpOiBcIiArIHRoaXMucmVkaXJlY3RfdXJpKTtcclxuICAgIH1cclxuXHJcbiAgICBfaXNJbkFwcEJyb3dzZXJJbnN0YWxsZWQoY29yZG92YU1ldGFkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3NlclwiLCBcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3Nlci5pbmFwcGJyb3dzZXJcIiwgXCJvcmcuYXBhY2hlLmNvcmRvdmEuaW5hcHBicm93c2VyXCJdLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvcmRvdmFNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShuYW1lKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBcclxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xyXG4gICAgICAgIExvZy5kZWJ1ZyhcIkNvcmRvdmFQb3B1cFdpbmRvdy5uYXZpZ2F0ZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29yZG92YSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKFwiY29yZG92YSBpcyB1bmRlZmluZWRcIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdmFyIGNvcmRvdmFNZXRhZGF0YSA9IHdpbmRvdy5jb3Jkb3ZhLnJlcXVpcmUoXCJjb3Jkb3ZhL3BsdWdpbl9saXN0XCIpLm1ldGFkYXRhO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNJbkFwcEJyb3dzZXJJbnN0YWxsZWQoY29yZG92YU1ldGFkYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcihcIkluQXBwQnJvd3NlciBwbHVnaW4gbm90IGZvdW5kXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBjb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKHBhcmFtcy51cmwsIHRoaXMudGFyZ2V0LCB0aGlzLmZlYXR1cmVzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XHJcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJwb3B1cCBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXhpdENhbGxiYWNrRXZlbnQgPSB0aGlzLl9leGl0Q2FsbGJhY2suYmluZCh0aGlzKTsgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50ID0gdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2suYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihcImV4aXRcIiwgdGhpcy5fZXhpdENhbGxiYWNrRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2Fkc3RhcnRcIiwgdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJFcnJvciBvcGVuaW5nIHBvcHVwIHdpbmRvd1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcm9taXNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkU3RhcnRDYWxsYmFjayhldmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC51cmwuaW5kZXhPZih0aGlzLnJlZGlyZWN0X3VyaSkgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fc3VjY2Vzcyh7IHVybDogZXZlbnQudXJsIH0pO1xyXG4gICAgICAgIH0gICAgXHJcbiAgICB9XHJcbiAgICBfZXhpdENhbGxiYWNrKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9lcnJvcihtZXNzYWdlKTsgICAgXHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9zdWNjZXNzKGRhdGEpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBjb3Jkb3ZhIHBvcHVwIHdpbmRvd1wiKTtcclxuICAgICAgICB0aGlzLl9yZXNvbHZlKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgX2Vycm9yKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcblxyXG4gICAgICAgIExvZy5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLl9yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NsZWFudXAoKSB7XHJcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93Ll9jbGVhbnVwXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcG9wdXApe1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZHN0YXJ0XCIsIHRoaXMuX2xvYWRTdGFydENhbGxiYWNrRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9wdXAuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcblxyXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcclxuaW1wb3J0IENvcmRvdmFQb3B1cFdpbmRvdyBmcm9tICcuL0NvcmRvdmFQb3B1cFdpbmRvdyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yIHtcclxuICAgIFxyXG4gICAgcHJlcGFyZShwYXJhbXMpIHtcclxuICAgICAgICBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyA9ICdoaWRkZW49eWVzJztcclxuICAgICAgICBsZXQgcG9wdXAgPSBuZXcgQ29yZG92YVBvcHVwV2luZG93KHBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb3B1cCk7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAzYmE3M2UwNzJmYjg5NWQ4MGNjZCIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvTG9nLmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50U2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9HbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Jlc3BvbnNlVmFsaWRhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9NZXRhZGF0YVNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pzb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VySW5mb1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Vycm9yUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pvc2VVdGlsLmpzIiwid2VicGFjazovLy8uL34vanNyc2FzaWduL2xpYi9qc3JzYXNpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VybFV0aWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblN0YXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9TdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmFuZG9tLmpzIiwid2VicGFjazovLy8uL3NyYy9TaWduaW5SZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbm91dFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25vdXRSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSW5NZW1vcnlXZWJTdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VyTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlck1hbmFnZXJTZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvUmVkaXJlY3ROYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1BvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Qb3B1cFdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSUZyYW1lTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9JRnJhbWVXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXJNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVGltZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0V2ZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9TaWxlbnRSZW5ld1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Nlc3Npb25Nb25pdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9DaGVja1Nlc3Npb25JRnJhbWUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Rva2VuUmV2b2NhdGlvbkNsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiXSwibmFtZXMiOlsiTG9nIiwicmVxdWlyZSIsIk9pZGNDbGllbnQiLCJPaWRjQ2xpZW50U2V0dGluZ3MiLCJXZWJTdG9yYWdlU3RhdGVTdG9yZSIsIkluTWVtb3J5V2ViU3RvcmFnZSIsIlVzZXJNYW5hZ2VyIiwiQWNjZXNzVG9rZW5FdmVudHMiLCJNZXRhZGF0YVNlcnZpY2UiLCJDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3IiLCJDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yIiwiQ2hlY2tTZXNzaW9uSUZyYW1lIiwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50IiwiU2Vzc2lvbk1vbml0b3IiLCJHbG9iYWwiLCJVc2VyIiwibm9wTG9nZ2VyIiwiZGVidWciLCJpbmZvIiwid2FybiIsImVycm9yIiwiTk9ORSIsIkVSUk9SIiwiV0FSTiIsIklORk8iLCJERUJVRyIsImxvZ2dlciIsImxldmVsIiwicmVzZXQiLCJhcmdzIiwiYXBwbHkiLCJBcnJheSIsImZyb20iLCJ2YWx1ZSIsIkVycm9yIiwic2V0dGluZ3MiLCJfc2V0dGluZ3MiLCJjcmVhdGVTaWduaW5SZXF1ZXN0IiwicmVzcG9uc2VfdHlwZSIsInNjb3BlIiwicmVkaXJlY3RfdXJpIiwiZGF0YSIsInN0YXRlIiwicHJvbXB0IiwiZGlzcGxheSIsIm1heF9hZ2UiLCJ1aV9sb2NhbGVzIiwiaWRfdG9rZW5faGludCIsImxvZ2luX2hpbnQiLCJhY3JfdmFsdWVzIiwicmVzb3VyY2UiLCJyZXF1ZXN0IiwicmVxdWVzdF91cmkiLCJleHRyYVF1ZXJ5UGFyYW1zIiwic3RhdGVTdG9yZSIsImNsaWVudF9pZCIsImF1dGhvcml0eSIsIl9tZXRhZGF0YVNlcnZpY2UiLCJnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQiLCJ0aGVuIiwidXJsIiwic2lnbmluUmVxdWVzdCIsInNpZ25pblN0YXRlIiwiX3N0YXRlU3RvcmUiLCJzZXQiLCJpZCIsInRvU3RvcmFnZVN0cmluZyIsInByb2Nlc3NTaWduaW5SZXNwb25zZSIsInJlc3BvbnNlIiwiUHJvbWlzZSIsInJlamVjdCIsInJlbW92ZSIsInN0b3JlZFN0YXRlU3RyaW5nIiwiZnJvbVN0b3JhZ2VTdHJpbmciLCJfdmFsaWRhdG9yIiwidmFsaWRhdGVTaWduaW5SZXNwb25zZSIsImNyZWF0ZVNpZ25vdXRSZXF1ZXN0IiwicG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiZ2V0RW5kU2Vzc2lvbkVuZHBvaW50Iiwic2lnbm91dFN0YXRlIiwicHJvY2Vzc1NpZ25vdXRSZXNwb25zZSIsInJlc29sdmUiLCJzdGF0ZUtleSIsInZhbGlkYXRlU2lnbm91dFJlc3BvbnNlIiwiY2xlYXJTdGFsZVN0YXRlIiwic3RhbGVTdGF0ZUFnZSIsInZhbGlkYXRvciIsIm1ldGFkYXRhU2VydmljZSIsIk9pZGNNZXRhZGF0YVVybFBhdGgiLCJEZWZhdWx0UmVzcG9uc2VUeXBlIiwiRGVmYXVsdFNjb3BlIiwiRGVmYXVsdFN0YWxlU3RhdGVBZ2UiLCJEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzIiwibWV0YWRhdGFVcmwiLCJtZXRhZGF0YSIsInNpZ25pbmdLZXlzIiwiY2xpZW50X3NlY3JldCIsImZpbHRlclByb3RvY29sQ2xhaW1zIiwibG9hZFVzZXJJbmZvIiwiY2xvY2tTa2V3IiwiUmVzcG9uc2VWYWxpZGF0b3JDdG9yIiwiTWV0YWRhdGFTZXJ2aWNlQ3RvciIsIl9hdXRob3JpdHkiLCJfbWV0YWRhdGFVcmwiLCJfbWV0YWRhdGEiLCJfc2lnbmluZ0tleXMiLCJfY2xpZW50X2lkIiwiX2NsaWVudF9zZWNyZXQiLCJfcmVzcG9uc2VfdHlwZSIsIl9zY29wZSIsIl9yZWRpcmVjdF91cmkiLCJfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX3Byb21wdCIsIl9kaXNwbGF5IiwiX21heF9hZ2UiLCJfdWlfbG9jYWxlcyIsIl9hY3JfdmFsdWVzIiwiX3Jlc291cmNlIiwiX2ZpbHRlclByb3RvY29sQ2xhaW1zIiwiX2xvYWRVc2VySW5mbyIsIl9zdGFsZVN0YXRlQWdlIiwiX2Nsb2NrU2tldyIsIl9leHRyYVF1ZXJ5UGFyYW1zIiwiaW5kZXhPZiIsImxlbmd0aCIsInByZWZpeCIsInN0b3JlIiwibG9jYWxTdG9yYWdlIiwiX3N0b3JlIiwiX3ByZWZpeCIsImtleSIsInNldEl0ZW0iLCJnZXQiLCJpdGVtIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJnZXRBbGxLZXlzIiwia2V5cyIsImluZGV4IiwicHVzaCIsInN1YnN0ciIsInRpbWVyIiwic2V0SW50ZXJ2YWwiLCJjYiIsImR1cmF0aW9uIiwiY2xlYXJJbnRlcnZhbCIsImhhbmRsZSIsInRlc3RpbmciLCJfdGVzdGluZyIsInNldFhNTEh0dHBSZXF1ZXN0IiwibmV3UmVxdWVzdCIsImxvY2F0aW9uIiwic2Vzc2lvblN0b3JhZ2UiLCJYTUxIdHRwUmVxdWVzdCIsIlByb3RvY29sQ2xhaW1zIiwiUmVzcG9uc2VWYWxpZGF0b3IiLCJVc2VySW5mb1NlcnZpY2VDdG9yIiwiam9zZVV0aWwiLCJfdXNlckluZm9TZXJ2aWNlIiwiX2pvc2VVdGlsIiwiX3Byb2Nlc3NTaWduaW5QYXJhbXMiLCJfdmFsaWRhdGVUb2tlbnMiLCJfcHJvY2Vzc0NsYWltcyIsIm5vbmNlIiwiaWRfdG9rZW4iLCJpc09wZW5JZENvbm5lY3QiLCJwcm9maWxlIiwiYWNjZXNzX3Rva2VuIiwiZ2V0Q2xhaW1zIiwiY2xhaW1zIiwic3ViIiwiX21lcmdlQ2xhaW1zIiwiY2xhaW1zMSIsImNsYWltczIiLCJyZXN1bHQiLCJPYmplY3QiLCJhc3NpZ24iLCJuYW1lIiwidmFsdWVzIiwiaXNBcnJheSIsImkiLCJmb3JFYWNoIiwidHlwZSIsIl92YWxpZGF0ZUlkVG9rZW5BbmRBY2Nlc3NUb2tlbiIsIl92YWxpZGF0ZUlkVG9rZW4iLCJfdmFsaWRhdGVBY2Nlc3NUb2tlbiIsImp3dCIsInBhcnNlSnd0IiwiaGVhZGVyIiwicGF5bG9hZCIsImtpZCIsImdldElzc3VlciIsImdldFNpZ25pbmdLZXlzIiwiX2ZpbHRlckJ5QWxnIiwiYWxnIiwiZmlsdGVyIiwiYXVkaWVuY2UiLCJjbG9ja1NrZXdJblNlY29uZHMiLCJ2YWxpZGF0ZUp3dCIsImlzc3VlciIsImt0eSIsInN0YXJ0c1dpdGgiLCJhdF9oYXNoIiwiaGFzaEFsZyIsImhhc2hCaXRzIiwicGFyc2VJbnQiLCJzaGEiLCJoYXNoIiwiaGFzaFN0cmluZyIsImxlZnQiLCJsZWZ0X2I2NHUiLCJoZXhUb0Jhc2U2NFVybCIsIkpzb25TZXJ2aWNlQ3RvciIsIl9qc29uU2VydmljZSIsImdldE1ldGFkYXRhIiwiZ2V0SnNvbiIsIl9nZXRNZXRhZGF0YVByb3BlcnR5IiwiZ2V0VXNlckluZm9FbmRwb2ludCIsImdldFRva2VuRW5kcG9pbnQiLCJnZXRDaGVja1Nlc3Npb25JZnJhbWUiLCJnZXRSZXZvY2F0aW9uRW5kcG9pbnQiLCJvcHRpb25hbCIsInVuZGVmaW5lZCIsImp3a3NfdXJpIiwia2V5U2V0IiwiSnNvblNlcnZpY2UiLCJYTUxIdHRwUmVxdWVzdEN0b3IiLCJfWE1MSHR0cFJlcXVlc3QiLCJ0b2tlbiIsInJlcSIsIm9wZW4iLCJvbmxvYWQiLCJzdGF0dXMiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJlIiwibWVzc2FnZSIsInN0YXR1c1RleHQiLCJvbmVycm9yIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJVc2VySW5mb1NlcnZpY2UiLCJFcnJvclJlc3BvbnNlIiwiZXJyb3JfZGVzY3JpcHRpb24iLCJlcnJvcl91cmkiLCJBbGxvd2VkU2lnbmluZ0FsZ3MiLCJKb3NlVXRpbCIsIkpXUyIsImhlYWRlck9iaiIsInBheWxvYWRPYmoiLCJub3ciLCJuIiwiZ2V0S2V5IiwieDVjIiwiZ2V0UHVibGljS2V5RnJvbUNlcnRQRU0iLCJjcnYiLCJ4IiwieSIsIl92YWxpZGF0ZUp3dCIsIkRhdGUiLCJpc3MiLCJhdWQiLCJ2YWxpZEF1ZGllbmNlIiwibG93ZXJOb3ciLCJ1cHBlck5vdyIsImlhdCIsIm5iZiIsImV4cCIsInZlcmlmeSIsIlV0aWwiLCJTaWduaW5SZXF1ZXN0Iiwib2lkYyIsImlzT2lkYyIsImFkZFF1ZXJ5UGFyYW0iLCJzcGxpdCIsImlzT0F1dGgiLCJVcmxVdGlsaXR5IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicGFyc2VVcmxGcmFnbWVudCIsImRlbGltaXRlciIsImdsb2JhbCIsImhyZWYiLCJpZHgiLCJsYXN0SW5kZXhPZiIsInBhcmFtcyIsInJlZ2V4IiwibSIsImNvdW50ZXIiLCJleGVjIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwicHJvcCIsIlNpZ25pblN0YXRlIiwiYXJndW1lbnRzIiwiX25vbmNlIiwic3RyaW5naWZ5IiwiY3JlYXRlZCIsInN0b3JhZ2VTdHJpbmciLCJTdGF0ZSIsIl9pZCIsIl9kYXRhIiwiX2NyZWF0ZWQiLCJzdG9yYWdlIiwiYWdlIiwiY3V0b2ZmIiwicHJvbWlzZXMiLCJwIiwiYWxsIiwicmFuZG9tIiwiZ3VpZEhvbGRlciIsImhleCIsInIiLCJndWlkUmVzcG9uc2UiLCJNYXRoIiwiT2lkY1Njb3BlIiwiU2lnbmluUmVzcG9uc2UiLCJzZXNzaW9uX3N0YXRlIiwidG9rZW5fdHlwZSIsImV4cGlyZXNfaW4iLCJleHBpcmVzX2F0Iiwic2NvcGVzIiwiU2lnbm91dFJlcXVlc3QiLCJTaWdub3V0UmVzcG9uc2UiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciIsIlNlc3Npb25Nb25pdG9yQ3RvciIsIlRva2VuUmV2b2NhdGlvbkNsaWVudEN0b3IiLCJfZXZlbnRzIiwiX3NpbGVudFJlbmV3U2VydmljZSIsImF1dG9tYXRpY1NpbGVudFJlbmV3Iiwic3RhcnRTaWxlbnRSZW5ldyIsIm1vbml0b3JTZXNzaW9uIiwiX3Nlc3Npb25Nb25pdG9yIiwiX3Rva2VuUmV2b2NhdGlvbkNsaWVudCIsImdldFVzZXIiLCJfbG9hZFVzZXIiLCJ1c2VyIiwibG9hZCIsInJlbW92ZVVzZXIiLCJzdG9yZVVzZXIiLCJ1bmxvYWQiLCJzaWduaW5SZWRpcmVjdCIsIl9zaWduaW5TdGFydCIsIl9yZWRpcmVjdE5hdmlnYXRvciIsInNpZ25pblJlZGlyZWN0Q2FsbGJhY2siLCJfc2lnbmluRW5kIiwic2lnbmluUG9wdXAiLCJwb3B1cF9yZWRpcmVjdF91cmkiLCJfc2lnbmluIiwiX3BvcHVwTmF2aWdhdG9yIiwic3RhcnRVcmwiLCJwb3B1cFdpbmRvd0ZlYXR1cmVzIiwicG9wdXBXaW5kb3dUYXJnZXQiLCJzaWduaW5Qb3B1cENhbGxiYWNrIiwiX3NpZ25pbkNhbGxiYWNrIiwic2lnbmluU2lsZW50Iiwic2lsZW50X3JlZGlyZWN0X3VyaSIsInNldElkVG9rZW4iLCJpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXciLCJfaWZyYW1lTmF2aWdhdG9yIiwic2lsZW50UmVxdWVzdFRpbWVvdXQiLCJzaWduaW5TaWxlbnRDYWxsYmFjayIsInF1ZXJ5U2Vzc2lvblN0YXR1cyIsIm5hdlJlc3BvbnNlIiwic2lnbmluUmVzcG9uc2UiLCJzaWQiLCJuYXZpZ2F0b3IiLCJuYXZpZ2F0b3JQYXJhbXMiLCJwcmVwYXJlIiwibmF2aWdhdGUiLCJjYXRjaCIsImNsb3NlIiwiZXJyIiwiY2FsbGJhY2siLCJzaWdub3V0UmVkaXJlY3QiLCJwb3N0TG9nb3V0UmVkaXJlY3RVcmkiLCJfc2lnbm91dFN0YXJ0Iiwic2lnbm91dFJlZGlyZWN0Q2FsbGJhY2siLCJfc2lnbm91dEVuZCIsInNpZ25vdXRQb3B1cCIsInBvcHVwX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSIsIl9zaWdub3V0Iiwic2lnbm91dFBvcHVwQ2FsbGJhY2siLCJrZWVwT3BlbiIsInJldm9rZVByb21pc2UiLCJyZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCIsIl9yZXZva2VJbnRlcm5hbCIsInNpZ25vdXRSZXF1ZXN0Iiwic2lnbm91dFJlc3BvbnNlIiwicmV2b2tlQWNjZXNzVG9rZW4iLCJzdWNjZXNzIiwicmVxdWlyZWQiLCJyZXZva2UiLCJzdGFydCIsInN0b3BTaWxlbnRSZW5ldyIsInN0b3AiLCJfdXNlclN0b3JlIiwiX3VzZXJTdG9yZUtleSIsInJlZGlyZWN0TmF2aWdhdG9yIiwicG9wdXBOYXZpZ2F0b3IiLCJpZnJhbWVOYXZpZ2F0b3IiLCJ1c2VyU3RvcmUiLCJEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUiLCJEZWZhdWx0Q2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJVc2VyTWFuYWdlclNldHRpbmdzIiwiY2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSIsIl9wb3B1cF9yZWRpcmVjdF91cmkiLCJfcG9wdXBfcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIiwiX3BvcHVwV2luZG93RmVhdHVyZXMiLCJfcG9wdXBXaW5kb3dUYXJnZXQiLCJfc2lsZW50X3JlZGlyZWN0X3VyaSIsIl9zaWxlbnRSZXF1ZXN0VGltZW91dCIsIl9hdXRvbWF0aWNTaWxlbnRSZW5ldyIsIl9pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXciLCJfYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUiLCJfbW9uaXRvclNlc3Npb24iLCJfY2hlY2tTZXNzaW9uSW50ZXJ2YWwiLCJfcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQiLCJSZWRpcmVjdE5hdmlnYXRvciIsIndpbmRvdyIsIlBvcHVwTmF2aWdhdG9yIiwicG9wdXAiLCJub3RpZnlPcGVuZXIiLCJDaGVja0ZvclBvcHVwQ2xvc2VkSW50ZXJ2YWwiLCJEZWZhdWx0UG9wdXBGZWF0dXJlcyIsIkRlZmF1bHRQb3B1cFRhcmdldCIsIlBvcHVwV2luZG93IiwiX3Byb21pc2UiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJ0YXJnZXQiLCJmZWF0dXJlcyIsIl9wb3B1cCIsIl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIiLCJfY2hlY2tGb3JQb3B1cENsb3NlZCIsImJpbmQiLCJfZXJyb3IiLCJfY2FsbGJhY2siLCJmb2N1cyIsInByb21pc2UiLCJfc3VjY2VzcyIsIl9jbGVhbnVwIiwiY2xvc2VkIiwib3BlbmVyIiwiSUZyYW1lTmF2aWdhdG9yIiwiZnJhbWUiLCJub3RpZnlQYXJlbnQiLCJEZWZhdWx0VGltZW91dCIsIklGcmFtZVdpbmRvdyIsIl9ib3VuZE1lc3NhZ2VFdmVudCIsIl9tZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9mcmFtZSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwidmlzaWJpbGl0eSIsInBvc2l0aW9uIiwid2lkdGgiLCJoZWlnaHQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJ0aW1lb3V0IiwiX3RpbWVyIiwic2V0VGltZW91dCIsIl90aW1lb3V0Iiwic3JjIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNsZWFyVGltZW91dCIsInJlbW92ZUNoaWxkIiwib3JpZ2luIiwiX29yaWdpbiIsInNvdXJjZSIsImNvbnRlbnRXaW5kb3ciLCJwYXJlbnQiLCJwb3N0TWVzc2FnZSIsInByb3RvY29sIiwiaG9zdCIsIlVzZXJNYW5hZ2VyRXZlbnRzIiwiX3VzZXJMb2FkZWQiLCJfdXNlclVubG9hZGVkIiwiX3NpbGVudFJlbmV3RXJyb3IiLCJfdXNlclNpZ25lZE91dCIsIl91c2VyU2Vzc2lvbkNoYW5nZWQiLCJyYWlzZUV2ZW50IiwicmFpc2UiLCJhZGRVc2VyTG9hZGVkIiwiYWRkSGFuZGxlciIsInJlbW92ZVVzZXJMb2FkZWQiLCJyZW1vdmVIYW5kbGVyIiwiYWRkVXNlclVubG9hZGVkIiwicmVtb3ZlVXNlclVubG9hZGVkIiwiYWRkU2lsZW50UmVuZXdFcnJvciIsInJlbW92ZVNpbGVudFJlbmV3RXJyb3IiLCJfcmFpc2VTaWxlbnRSZW5ld0Vycm9yIiwiYWRkVXNlclNpZ25lZE91dCIsInJlbW92ZVVzZXJTaWduZWRPdXQiLCJfcmFpc2VVc2VyU2lnbmVkT3V0IiwiYWRkVXNlclNlc3Npb25DaGFuZ2VkIiwicmVtb3ZlVXNlclNlc3Npb25DaGFuZ2VkIiwiX3JhaXNlVXNlclNlc3Npb25DaGFuZ2VkIiwiYWNjZXNzVG9rZW5FeHBpcmluZ1RpbWVyIiwiYWNjZXNzVG9rZW5FeHBpcmVkVGltZXIiLCJfYWNjZXNzVG9rZW5FeHBpcmluZyIsIl9hY2Nlc3NUb2tlbkV4cGlyZWQiLCJjb250YWluZXIiLCJfY2FuY2VsVGltZXJzIiwiZXhwaXJpbmciLCJpbml0IiwiZXhwaXJlZCIsImNhbmNlbCIsImFkZEFjY2Vzc1Rva2VuRXhwaXJpbmciLCJyZW1vdmVBY2Nlc3NUb2tlbkV4cGlyaW5nIiwiYWRkQWNjZXNzVG9rZW5FeHBpcmVkIiwicmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmVkIiwiVGltZXJEdXJhdGlvbiIsIlRpbWVyIiwiX25vd0Z1bmMiLCJfbmFtZSIsIl9leHBpcmF0aW9uIiwidGltZXJEdXJhdGlvbiIsIl90aW1lckhhbmRsZSIsImRpZmYiLCJFdmVudCIsIl9jYWxsYmFja3MiLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJTaWxlbnRSZW5ld1NlcnZpY2UiLCJ1c2VyTWFuYWdlciIsIl91c2VyTWFuYWdlciIsIl90b2tlbkV4cGlyaW5nIiwiZXZlbnRzIiwiQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciIsIl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yIiwiX3N0YXJ0IiwiX3N0b3AiLCJfc3ViIiwiX3NpZCIsIl9jaGVja1Nlc3Npb25JRnJhbWUiLCJpbnRlcnZhbCIsInJhaXNlVXNlclNpZ25lZE91dEV2ZW50Iiwic2Vzc2lvbiIsIkRlZmF1bHRJbnRlcnZhbCIsIl91cmwiLCJfaW50ZXJ2YWwiLCJfZnJhbWVfb3JpZ2luIiwiX3Nlc3Npb25fc3RhdGUiLCJBY2Nlc3NUb2tlblR5cGVIaW50IiwiX1hNTEh0dHBSZXF1ZXN0Q3RvciIsImFjY2Vzc1Rva2VuIiwiX3Jldm9rZSIsInhociIsIkNvcmRvdmFQb3B1cFdpbmRvdyIsIl9pc0luQXBwQnJvd3Nlckluc3RhbGxlZCIsImNvcmRvdmFNZXRhZGF0YSIsInNvbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImNvcmRvdmEiLCJJbkFwcEJyb3dzZXIiLCJfZXhpdENhbGxiYWNrRXZlbnQiLCJfZXhpdENhbGxiYWNrIiwiX2xvYWRTdGFydENhbGxiYWNrRXZlbnQiLCJfbG9hZFN0YXJ0Q2FsbGJhY2siLCJldmVudCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7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RDRZLE0sbUJBQU94TSxPLEVBQVM7QUFDWixjQUFLNk0sUUFBTDs7QUFFQSx1QkFBSXRhLEtBQUosQ0FBVXlOLE9BQVY7QUFDQSxjQUFLaU0sT0FBTCxDQUFhLElBQUk1WSxLQUFKLENBQVUyTSxPQUFWLENBQWI7QUFDSCxNOztrQ0FFRHNJLEssb0JBQVE7QUFDSixjQUFLdUUsUUFBTDtBQUNILE07O2tDQUVEQSxRLHVCQUFXO0FBQ1AsdUJBQUl6YSxLQUFKLENBQVUsNkJBQVY7O0FBRUEsYUFBSSxLQUFLZ2EsTUFBVCxFQUFnQjtBQUNaLGtCQUFLQSxNQUFMLENBQVltQyxtQkFBWixDQUFnQyxNQUFoQyxFQUF3QyxLQUFLNEYsa0JBQTdDLEVBQWlFLEtBQWpFO0FBQ0Esa0JBQUsvSCxNQUFMLENBQVltQyxtQkFBWixDQUFnQyxXQUFoQyxFQUE2QyxLQUFLOEYsdUJBQWxELEVBQTJFLEtBQTNFO0FBQ0Esa0JBQUtqSSxNQUFMLENBQVk5RCxLQUFaO0FBQ0g7QUFDRCxjQUFLOEQsTUFBTCxHQUFjLElBQWQ7QUFDSCxNOzs7OzZCQXZDYTtBQUNWLG9CQUFPLEtBQUtMLFFBQVo7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1REw7Ozs7QUFDQTs7Ozs7OzJKQUpBO0FBQ0E7O0tBS2FsYSxzQixXQUFBQSxzQjs7Ozs7c0NBRVRzVyxPLG9CQUFRbkYsTSxFQUFRO0FBQ1pBLGdCQUFPa0UsbUJBQVAsR0FBNkIsWUFBN0I7QUFDQSxhQUFJdUUsUUFBUSxpQ0FBdUJ6SSxNQUF2QixDQUFaO0FBQ0EsZ0JBQU94TixRQUFRWSxPQUFSLENBQWdCcVYsS0FBaEIsQ0FBUDtBQUNILE0iLCJmaWxlIjoib2lkYy1jbGllbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2Uge1xuXHRcdHZhciBhID0gZmFjdG9yeSgpO1xuXHRcdGZvcih2YXIgaSBpbiBhKSAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnID8gZXhwb3J0cyA6IHJvb3QpW2ldID0gYVtpXTtcblx0fVxufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDNiYTczZTA3MmZiODk1ZDgwY2NkIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuZXhwb3J0IGNvbnN0IExvZyA9IHJlcXVpcmUoJy4vc3JjL0xvZycpLkxvZztcbmV4cG9ydCBjb25zdCBPaWRjQ2xpZW50ID0gcmVxdWlyZSgnLi9zcmMvT2lkY0NsaWVudCcpLk9pZGNDbGllbnQ7XG5leHBvcnQgY29uc3QgT2lkY0NsaWVudFNldHRpbmdzID0gcmVxdWlyZSgnLi9zcmMvT2lkY0NsaWVudFNldHRpbmdzJykuT2lkY0NsaWVudFNldHRpbmdzO1xuZXhwb3J0IGNvbnN0IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlID0gcmVxdWlyZSgnLi9zcmMvV2ViU3RvcmFnZVN0YXRlU3RvcmUnKS5XZWJTdG9yYWdlU3RhdGVTdG9yZTtcbmV4cG9ydCBjb25zdCBJbk1lbW9yeVdlYlN0b3JhZ2UgPSByZXF1aXJlKCcuL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UnKS5Jbk1lbW9yeVdlYlN0b3JhZ2U7XG5leHBvcnQgY29uc3QgVXNlck1hbmFnZXIgPSByZXF1aXJlKCcuL3NyYy9Vc2VyTWFuYWdlcicpLlVzZXJNYW5hZ2VyO1xuZXhwb3J0IGNvbnN0IEFjY2Vzc1Rva2VuRXZlbnRzID0gcmVxdWlyZSgnLi9zcmMvQWNjZXNzVG9rZW5FdmVudHMnKS5BY2Nlc3NUb2tlbkV2ZW50cztcbmV4cG9ydCBjb25zdCBNZXRhZGF0YVNlcnZpY2UgPSByZXF1aXJlKCcuL3NyYy9NZXRhZGF0YVNlcnZpY2UnKS5NZXRhZGF0YVNlcnZpY2U7XG5leHBvcnQgY29uc3QgQ29yZG92YVBvcHVwTmF2aWdhdG9yID0gcmVxdWlyZSgnLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yJykuQ29yZG92YVBvcHVwTmF2aWdhdG9yO1xuZXhwb3J0IGNvbnN0IENvcmRvdmFJRnJhbWVOYXZpZ2F0b3IgPSByZXF1aXJlKCcuL3NyYy9Db3Jkb3ZhSUZyYW1lTmF2aWdhdG9yJykuQ29yZG92YUlGcmFtZU5hdmlnYXRvcjtcbmV4cG9ydCBjb25zdCBDaGVja1Nlc3Npb25JRnJhbWUgPSByZXF1aXJlKCcuL3NyYy9DaGVja1Nlc3Npb25JRnJhbWUnKS5DaGVja1Nlc3Npb25JRnJhbWU7XG5leHBvcnQgY29uc3QgVG9rZW5SZXZvY2F0aW9uQ2xpZW50ID0gcmVxdWlyZSgnLi9zcmMvVG9rZW5SZXZvY2F0aW9uQ2xpZW50JykuVG9rZW5SZXZvY2F0aW9uQ2xpZW50O1xuZXhwb3J0IGNvbnN0IFNlc3Npb25Nb25pdG9yID0gcmVxdWlyZSgnLi9zcmMvU2Vzc2lvbk1vbml0b3InKS5TZXNzaW9uTW9uaXRvcjtcbmV4cG9ydCBjb25zdCBHbG9iYWwgPSByZXF1aXJlKCcuL3NyYy9HbG9iYWwnKS5HbG9iYWw7XG5leHBvcnQgY29uc3QgVXNlciA9IHJlcXVpcmUoJy4vc3JjL1VzZXInKS5Vc2VyO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgTG9nLFxuICAgIE9pZGNDbGllbnQsXG4gICAgT2lkY0NsaWVudFNldHRpbmdzLFxuICAgIFdlYlN0b3JhZ2VTdGF0ZVN0b3JlLFxuICAgIEluTWVtb3J5V2ViU3RvcmFnZSxcbiAgICBVc2VyTWFuYWdlcixcbiAgICBBY2Nlc3NUb2tlbkV2ZW50cyxcbiAgICBNZXRhZGF0YVNlcnZpY2UsXG4gICAgQ29yZG92YVBvcHVwTmF2aWdhdG9yLFxuICAgIENvcmRvdmFJRnJhbWVOYXZpZ2F0b3IsXG4gICAgQ2hlY2tTZXNzaW9uSUZyYW1lLFxuICAgIFRva2VuUmV2b2NhdGlvbkNsaWVudCxcbiAgICBTZXNzaW9uTW9uaXRvcixcbiAgICBHbG9iYWwsXG4gICAgVXNlclxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2luZGV4LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxubGV0IG5vcExvZ2dlciA9IHtcbiAgICBkZWJ1Zygpe30sXG4gICAgaW5mbygpe30sXG4gICAgd2Fybigpe30sXG4gICAgZXJyb3IoKXt9XG59O1xuXG5jb25zdCBOT05FID0gMDtcbmNvbnN0IEVSUk9SID0gMTtcbmNvbnN0IFdBUk4gPSAyO1xuY29uc3QgSU5GTyA9IDM7XG5jb25zdCBERUJVRyA9IDQ7XG5cbmxldCBsb2dnZXI7XG5sZXQgbGV2ZWw7XG5cbmV4cG9ydCBjbGFzcyBMb2cge1xuICAgIHN0YXRpYyBnZXQgTk9ORSgpIHtyZXR1cm4gTk9ORX07XG4gICAgc3RhdGljIGdldCBFUlJPUigpIHtyZXR1cm4gRVJST1J9O1xuICAgIHN0YXRpYyBnZXQgV0FSTigpIHtyZXR1cm4gV0FSTn07XG4gICAgc3RhdGljIGdldCBJTkZPKCkge3JldHVybiBJTkZPfTtcbiAgICBzdGF0aWMgZ2V0IERFQlVHKCkge3JldHVybiBERUJVR307XG4gICAgXG4gICAgc3RhdGljIHJlc2V0KCl7XG4gICAgICAgIGxldmVsID0gSU5GTztcbiAgICAgICAgbG9nZ2VyID0gbm9wTG9nZ2VyO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0IGxldmVsKCl7XG4gICAgICAgIHJldHVybiBsZXZlbDtcbiAgICB9XG4gICAgc3RhdGljIHNldCBsZXZlbCh2YWx1ZSl7XG4gICAgICAgIGlmIChOT05FIDw9IHZhbHVlICYmIHZhbHVlIDw9IERFQlVHKXtcbiAgICAgICAgICAgIGxldmVsID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0IGxvZ2dlcigpe1xuICAgICAgICByZXR1cm4gbG9nZ2VyO1xuICAgIH1cbiAgICBzdGF0aWMgc2V0IGxvZ2dlcih2YWx1ZSl7XG4gICAgICAgIGlmICghdmFsdWUuZGVidWcgJiYgdmFsdWUuaW5mbykge1xuICAgICAgICAgICAgLy8ganVzdCB0byBzdGF5IGJhY2t3YXJkcyBjb21wYXQuIGNhbiByZW1vdmUgaW4gMi4wXG4gICAgICAgICAgICB2YWx1ZS5kZWJ1ZyA9IHZhbHVlLmluZm87XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUuZGVidWcgJiYgdmFsdWUuaW5mbyAmJiB2YWx1ZS53YXJuICYmIHZhbHVlLmVycm9yKXtcbiAgICAgICAgICAgIGxvZ2dlciA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsb2dnZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGRlYnVnKC4uLmFyZ3Mpe1xuICAgICAgICBpZiAobGV2ZWwgPj0gREVCVUcpe1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGluZm8oLi4uYXJncyl7XG4gICAgICAgIGlmIChsZXZlbCA+PSBJTkZPKXtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHdhcm4oLi4uYXJncyl7XG4gICAgICAgIGlmIChsZXZlbCA+PSBXQVJOKXtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGVycm9yKC4uLmFyZ3Mpe1xuICAgICAgICBpZiAobGV2ZWwgPj0gRVJST1Ipe1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yLmFwcGx5KGxvZ2dlciwgQXJyYXkuZnJvbShhcmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkxvZy5yZXNldCgpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0xvZy5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IE9pZGNDbGllbnRTZXR0aW5ncyBmcm9tICcuL09pZGNDbGllbnRTZXR0aW5ncyc7XG5pbXBvcnQgRXJyb3JSZXNwb25zZSBmcm9tICcuL0Vycm9yUmVzcG9uc2UnO1xuaW1wb3J0IFNpZ25pblJlcXVlc3QgZnJvbSAnLi9TaWduaW5SZXF1ZXN0JztcbmltcG9ydCBTaWduaW5SZXNwb25zZSBmcm9tICcuL1NpZ25pblJlc3BvbnNlJztcbmltcG9ydCBTaWdub3V0UmVxdWVzdCBmcm9tICcuL1NpZ25vdXRSZXF1ZXN0JztcbmltcG9ydCBTaWdub3V0UmVzcG9uc2UgZnJvbSAnLi9TaWdub3V0UmVzcG9uc2UnO1xuaW1wb3J0IFNpZ25pblN0YXRlIGZyb20gJy4vU2lnbmluU3RhdGUnO1xuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xuXG5leHBvcnQgY2xhc3MgT2lkY0NsaWVudCB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MgPSB7fSkge1xuICAgICAgICBpZiAoc2V0dGluZ3MgaW5zdGFuY2VvZiBPaWRjQ2xpZW50U2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IG5ldyBPaWRjQ2xpZW50U2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IF9zdGF0ZVN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5zdGF0ZVN0b3JlO1xuICAgIH1cbiAgICBnZXQgX3ZhbGlkYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudmFsaWRhdG9yO1xuICAgIH1cbiAgICBnZXQgX21ldGFkYXRhU2VydmljZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWV0YWRhdGFTZXJ2aWNlO1xuICAgIH1cblxuICAgIGdldCBzZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICAgIH1cbiAgICBnZXQgbWV0YWRhdGFTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlO1xuICAgIH1cblxuICAgIGNyZWF0ZVNpZ25pblJlcXVlc3Qoe1xuICAgICAgICByZXNwb25zZV90eXBlLCBzY29wZSwgcmVkaXJlY3RfdXJpLFxuICAgICAgICAvLyBkYXRhIHdhcyBtZWFudCB0byBiZSB0aGUgcGxhY2UgYSBjYWxsZXIgY291bGQgaW5kaWNhdGUgdGhlIGRhdGEgdG9cbiAgICAgICAgLy8gaGF2ZSByb3VuZCB0cmlwcGVkLCBidXQgcGVvcGxlIHdlcmUgZ2V0dGluZyBjb25mdXNlZCwgc28gaSBhZGRlZCBzdGF0ZSAoc2luY2UgdGhhdCBtYXRjaGVzIHRoZSBzcGVjKVxuICAgICAgICAvLyBhbmQgc28gbm93IGlmIGRhdGEgaXMgbm90IHBhc3NlZCwgYnV0IHN0YXRlIGlzIHRoZW4gc3RhdGUgd2lsbCBiZSB1c2VkXG4gICAgICAgIGRhdGEsIHN0YXRlLCBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsXG4gICAgICAgIHJlc291cmNlLCByZXF1ZXN0LCByZXF1ZXN0X3VyaSwgZXh0cmFRdWVyeVBhcmFtcyB9ID0ge30sXG4gICAgICAgIHN0YXRlU3RvcmVcbiAgICApIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jcmVhdGVTaWduaW5SZXF1ZXN0XCIpO1xuXG4gICAgICAgIGxldCBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XG4gICAgICAgIHJlc3BvbnNlX3R5cGUgPSByZXNwb25zZV90eXBlIHx8IHRoaXMuX3NldHRpbmdzLnJlc3BvbnNlX3R5cGU7XG4gICAgICAgIHNjb3BlID0gc2NvcGUgfHwgdGhpcy5fc2V0dGluZ3Muc2NvcGU7XG4gICAgICAgIHJlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5yZWRpcmVjdF91cmk7XG5cbiAgICAgICAgLy8gaWRfdG9rZW5faGludCwgbG9naW5faGludCBhcmVuJ3QgYWxsb3dlZCBvbiBfc2V0dGluZ3NcbiAgICAgICAgcHJvbXB0ID0gcHJvbXB0IHx8IHRoaXMuX3NldHRpbmdzLnByb21wdDtcbiAgICAgICAgZGlzcGxheSA9IGRpc3BsYXkgfHwgdGhpcy5fc2V0dGluZ3MuZGlzcGxheTtcbiAgICAgICAgbWF4X2FnZSA9IG1heF9hZ2UgfHwgdGhpcy5fc2V0dGluZ3MubWF4X2FnZTtcbiAgICAgICAgdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXMgfHwgdGhpcy5fc2V0dGluZ3MudWlfbG9jYWxlcztcbiAgICAgICAgYWNyX3ZhbHVlcyA9IGFjcl92YWx1ZXMgfHwgdGhpcy5fc2V0dGluZ3MuYWNyX3ZhbHVlcztcbiAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZSB8fCB0aGlzLl9zZXR0aW5ncy5yZXNvdXJjZTtcbiAgICAgICAgZXh0cmFRdWVyeVBhcmFtcyA9IGV4dHJhUXVlcnlQYXJhbXMgfHwgdGhpcy5fc2V0dGluZ3MuZXh0cmFRdWVyeVBhcmFtcztcblxuICAgICAgICBsZXQgYXV0aG9yaXR5ID0gdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5O1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0QXV0aG9yaXphdGlvbkVuZHBvaW50KCkudGhlbih1cmwgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiUmVjZWl2ZWQgYXV0aG9yaXphdGlvbiBlbmRwb2ludFwiLCB1cmwpO1xuXG4gICAgICAgICAgICBsZXQgc2lnbmluUmVxdWVzdCA9IG5ldyBTaWduaW5SZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VyaSxcbiAgICAgICAgICAgICAgICByZXNwb25zZV90eXBlLFxuICAgICAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgfHwgc3RhdGUsXG4gICAgICAgICAgICAgICAgYXV0aG9yaXR5LFxuICAgICAgICAgICAgICAgIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlcyxcbiAgICAgICAgICAgICAgICByZXNvdXJjZSwgcmVxdWVzdCwgcmVxdWVzdF91cmksIGV4dHJhUXVlcnlQYXJhbXMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIHNpZ25pblN0YXRlID0gc2lnbmluUmVxdWVzdC5zdGF0ZTtcbiAgICAgICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XG5cbiAgICAgICAgICAgIHJldHVybiBzdGF0ZVN0b3JlLnNldChzaWduaW5TdGF0ZS5pZCwgc2lnbmluU3RhdGUudG9TdG9yYWdlU3RyaW5nKCkpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzaWduaW5SZXF1ZXN0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb2Nlc3NTaWduaW5SZXNwb25zZSh1cmwsIHN0YXRlU3RvcmUpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5wcm9jZXNzU2lnbmluUmVzcG9uc2VcIik7XG5cbiAgICAgICAgdmFyIHJlc3BvbnNlID0gbmV3IFNpZ25pblJlc3BvbnNlKHVybCk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5zdGF0ZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcblxuICAgICAgICByZXR1cm4gc3RhdGVTdG9yZS5yZW1vdmUocmVzcG9uc2Uuc3RhdGUpLnRoZW4oc3RvcmVkU3RhdGVTdHJpbmcgPT4ge1xuICAgICAgICAgICAgaWYgKCFzdG9yZWRTdGF0ZVN0cmluZykge1xuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHN0YXRlID0gU2lnbmluU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmVkU3RhdGVTdHJpbmcpO1xuXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZWNlaXZlZCBzdGF0ZSBmcm9tIHN0b3JhZ2U7IHZhbGlkYXRpbmcgcmVzcG9uc2VcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yLnZhbGlkYXRlU2lnbmluUmVzcG9uc2Uoc3RhdGUsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY3JlYXRlU2lnbm91dFJlcXVlc3Qoe2lkX3Rva2VuX2hpbnQsIGRhdGEsIHN0YXRlLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cml9ID0ge30sXG4gICAgICAgIHN0YXRlU3RvcmVcbiAgICApIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jcmVhdGVTaWdub3V0UmVxdWVzdFwiKTtcblxuICAgICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5fc2V0dGluZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0RW5kU2Vzc2lvbkVuZHBvaW50KCkudGhlbih1cmwgPT4ge1xuICAgICAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBlbmQgc2Vzc2lvbiBlbmRwb2ludCB1cmwgcmV0dXJuZWRcIik7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gZW5kIHNlc3Npb24gZW5kcG9pbnRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIGVuZCBzZXNzaW9uIGVuZHBvaW50XCIsIHVybCk7XG5cbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFNpZ25vdXRSZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgaWRfdG9rZW5faGludCxcbiAgICAgICAgICAgICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSB8fCBzdGF0ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciBzaWdub3V0U3RhdGUgPSByZXF1ZXN0LnN0YXRlO1xuICAgICAgICAgICAgaWYgKHNpZ25vdXRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNpZ25vdXQgcmVxdWVzdCBoYXMgc3RhdGUgdG8gcGVyc2lzdFwiKTtcblxuICAgICAgICAgICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XG4gICAgICAgICAgICAgICAgc3RhdGVTdG9yZS5zZXQoc2lnbm91dFN0YXRlLmlkLCBzaWdub3V0U3RhdGUudG9TdG9yYWdlU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc1NpZ25vdXRSZXNwb25zZSh1cmwsIHN0YXRlU3RvcmUpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5wcm9jZXNzU2lnbm91dFJlc3BvbnNlXCIpO1xuXG4gICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBTaWdub3V0UmVzcG9uc2UodXJsKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5zdGF0ZSkge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIik7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgICAgIExvZy53YXJuKFwiUmVzcG9uc2Ugd2FzIGVycm9yXCIsIHJlc3BvbnNlLmVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhdGVLZXkgPSByZXNwb25zZS5zdGF0ZTtcblxuICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZVN0b3JlLnJlbW92ZShzdGF0ZUtleSkudGhlbihzdG9yZWRTdGF0ZVN0cmluZyA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0b3JlZFN0YXRlU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhzdG9yZWRTdGF0ZVN0cmluZyk7XG5cbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIHN0YXRlIGZyb20gc3RvcmFnZTsgdmFsaWRhdGluZyByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGVTaWdub3V0UmVzcG9uc2Uoc3RhdGUsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xlYXJTdGFsZVN0YXRlKHN0YXRlU3RvcmUpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiT2lkY0NsaWVudC5jbGVhclN0YWxlU3RhdGVcIik7XG5cbiAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcblxuICAgICAgICByZXR1cm4gU3RhdGUuY2xlYXJTdGFsZVN0YXRlKHN0YXRlU3RvcmUsIHRoaXMuc2V0dGluZ3Muc3RhbGVTdGF0ZUFnZSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL09pZGNDbGllbnQuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBXZWJTdG9yYWdlU3RhdGVTdG9yZSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJztcbmltcG9ydCBSZXNwb25zZVZhbGlkYXRvciBmcm9tICcuL1Jlc3BvbnNlVmFsaWRhdG9yJztcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xuXG5jb25zdCBPaWRjTWV0YWRhdGFVcmxQYXRoID0gJy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uJztcblxuY29uc3QgRGVmYXVsdFJlc3BvbnNlVHlwZSA9IFwiaWRfdG9rZW5cIjtcbmNvbnN0IERlZmF1bHRTY29wZSA9IFwib3BlbmlkXCI7XG5jb25zdCBEZWZhdWx0U3RhbGVTdGF0ZUFnZSA9IDYwICogNTsgLy8gc2Vjb25kc1xuY29uc3QgRGVmYXVsdENsb2NrU2tld0luU2Vjb25kcyA9IDYwICogNTtcblxuZXhwb3J0IGNsYXNzIE9pZGNDbGllbnRTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICAvLyBtZXRhZGF0YSByZWxhdGVkXG4gICAgICAgIGF1dGhvcml0eSwgbWV0YWRhdGFVcmwsIG1ldGFkYXRhLCBzaWduaW5nS2V5cyxcbiAgICAgICAgLy8gY2xpZW50IHJlbGF0ZWRcbiAgICAgICAgY2xpZW50X2lkLCBjbGllbnRfc2VjcmV0LCByZXNwb25zZV90eXBlID0gRGVmYXVsdFJlc3BvbnNlVHlwZSwgc2NvcGUgPSBEZWZhdWx0U2NvcGUsXG4gICAgICAgIHJlZGlyZWN0X3VyaSwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLFxuICAgICAgICAvLyBvcHRpb25hbCBwcm90b2NvbFxuICAgICAgICBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGFjcl92YWx1ZXMsIHJlc291cmNlLFxuICAgICAgICAvLyBiZWhhdmlvciBmbGFnc1xuICAgICAgICBmaWx0ZXJQcm90b2NvbENsYWltcyA9IHRydWUsIGxvYWRVc2VySW5mbyA9IHRydWUsXG4gICAgICAgIHN0YWxlU3RhdGVBZ2UgPSBEZWZhdWx0U3RhbGVTdGF0ZUFnZSwgY2xvY2tTa2V3ID0gRGVmYXVsdENsb2NrU2tld0luU2Vjb25kcyxcbiAgICAgICAgLy8gb3RoZXIgYmVoYXZpb3JcbiAgICAgICAgc3RhdGVTdG9yZSA9IG5ldyBXZWJTdG9yYWdlU3RhdGVTdG9yZSgpLFxuICAgICAgICBSZXNwb25zZVZhbGlkYXRvckN0b3IgPSBSZXNwb25zZVZhbGlkYXRvcixcbiAgICAgICAgTWV0YWRhdGFTZXJ2aWNlQ3RvciA9IE1ldGFkYXRhU2VydmljZSxcbiAgICAgICAgLy8gZXh0cmEgcXVlcnkgcGFyYW1zXG4gICAgICAgIGV4dHJhUXVlcnlQYXJhbXMgPSB7fVxuICAgIH0gPSB7fSkge1xuXG4gICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IGF1dGhvcml0eTtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSBtZXRhZGF0YVVybDtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICAgICAgdGhpcy5fc2lnbmluZ0tleXMgPSBzaWduaW5nS2V5cztcblxuICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSBjbGllbnRfaWQ7XG4gICAgICAgIHRoaXMuX2NsaWVudF9zZWNyZXQgPSBjbGllbnRfc2VjcmV0O1xuICAgICAgICB0aGlzLl9yZXNwb25zZV90eXBlID0gcmVzcG9uc2VfdHlwZTtcbiAgICAgICAgdGhpcy5fc2NvcGUgPSBzY29wZTtcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RfdXJpID0gcmVkaXJlY3RfdXJpO1xuICAgICAgICB0aGlzLl9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XG5cbiAgICAgICAgdGhpcy5fcHJvbXB0ID0gcHJvbXB0O1xuICAgICAgICB0aGlzLl9kaXNwbGF5ID0gZGlzcGxheTtcbiAgICAgICAgdGhpcy5fbWF4X2FnZSA9IG1heF9hZ2U7XG4gICAgICAgIHRoaXMuX3VpX2xvY2FsZXMgPSB1aV9sb2NhbGVzO1xuICAgICAgICB0aGlzLl9hY3JfdmFsdWVzID0gYWNyX3ZhbHVlcztcbiAgICAgICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcblxuICAgICAgICB0aGlzLl9maWx0ZXJQcm90b2NvbENsYWltcyA9ICEhZmlsdGVyUHJvdG9jb2xDbGFpbXM7XG4gICAgICAgIHRoaXMuX2xvYWRVc2VySW5mbyA9ICEhbG9hZFVzZXJJbmZvO1xuICAgICAgICB0aGlzLl9zdGFsZVN0YXRlQWdlID0gc3RhbGVTdGF0ZUFnZTtcbiAgICAgICAgdGhpcy5fY2xvY2tTa2V3ID0gY2xvY2tTa2V3O1xuXG4gICAgICAgIHRoaXMuX3N0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlO1xuICAgICAgICB0aGlzLl92YWxpZGF0b3IgPSBuZXcgUmVzcG9uc2VWYWxpZGF0b3JDdG9yKHRoaXMpO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzKTtcblxuICAgICAgICB0aGlzLl9leHRyYVF1ZXJ5UGFyYW1zID0gdHlwZW9mIGV4dHJhUXVlcnlQYXJhbXMgPT09ICdvYmplY3QnID8gZXh0cmFRdWVyeVBhcmFtcyA6IHt9O1xuICAgIH1cblxuICAgIC8vIGNsaWVudCBjb25maWdcbiAgICBnZXQgY2xpZW50X2lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2lkO1xuICAgIH1cbiAgICBzZXQgY2xpZW50X2lkKHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2xpZW50X2lkKSB7XG4gICAgICAgICAgICAvLyBvbmUtdGltZSBzZXQgb25seVxuICAgICAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJjbGllbnRfaWQgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZCBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjbGllbnRfc2VjcmV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X3NlY3JldDtcbiAgICB9XG4gICAgZ2V0IHJlc3BvbnNlX3R5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNwb25zZV90eXBlO1xuICAgIH1cbiAgICBnZXQgc2NvcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY29wZTtcbiAgICB9XG4gICAgZ2V0IHJlZGlyZWN0X3VyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0X3VyaTtcbiAgICB9XG4gICAgZ2V0IHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcbiAgICB9XG5cblxuICAgIC8vIG9wdGlvbmFsIHByb3RvY29sIHBhcmFtc1xuICAgIGdldCBwcm9tcHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9tcHQ7XG4gICAgfVxuICAgIGdldCBkaXNwbGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGxheTtcbiAgICB9XG4gICAgZ2V0IG1heF9hZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhfYWdlO1xuICAgIH1cbiAgICBnZXQgdWlfbG9jYWxlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VpX2xvY2FsZXM7XG4gICAgfVxuICAgIGdldCBhY3JfdmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWNyX3ZhbHVlcztcbiAgICB9XG4gICAgZ2V0IHJlc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2U7XG4gICAgfVxuXG5cbiAgICAvLyBtZXRhZGF0YVxuICAgIGdldCBhdXRob3JpdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRob3JpdHk7XG4gICAgfVxuICAgIHNldCBhdXRob3JpdHkodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldCBvbmx5XG4gICAgICAgICAgICB0aGlzLl9hdXRob3JpdHkgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImF1dGhvcml0eSBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXR5IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG1ldGFkYXRhVXJsKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21ldGFkYXRhVXJsKSB7XG4gICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCA9IHRoaXMuYXV0aG9yaXR5O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmwgJiYgdGhpcy5fbWV0YWRhdGFVcmwuaW5kZXhPZihPaWRjTWV0YWRhdGFVcmxQYXRoKSA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmxbdGhpcy5fbWV0YWRhdGFVcmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSAnLyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsICs9IE9pZGNNZXRhZGF0YVVybFBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFVcmw7XG4gICAgfVxuXG4gICAgLy8gc2V0dGFibGUvY2FjaGFibGUgbWV0YWRhdGEgdmFsdWVzXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGE7XG4gICAgfVxuICAgIHNldCBtZXRhZGF0YSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBzaWduaW5nS2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbmdLZXlzO1xuICAgIH1cbiAgICBzZXQgc2lnbmluZ0tleXModmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2lnbmluZ0tleXMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBmbGFnc1xuICAgIGdldCBmaWx0ZXJQcm90b2NvbENsYWltcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlclByb3RvY29sQ2xhaW1zO1xuICAgIH1cbiAgICBnZXQgbG9hZFVzZXJJbmZvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFVzZXJJbmZvO1xuICAgIH1cbiAgICBnZXQgc3RhbGVTdGF0ZUFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWxlU3RhdGVBZ2U7XG4gICAgfVxuICAgIGdldCBjbG9ja1NrZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9ja1NrZXc7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXRlU3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZVN0b3JlO1xuICAgIH1cbiAgICBnZXQgdmFsaWRhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yO1xuICAgIH1cbiAgICBnZXQgbWV0YWRhdGFTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlO1xuICAgIH1cblxuICAgIC8vIGV4dHJhIHF1ZXJ5IHBhcmFtc1xuICAgIGdldCBleHRyYVF1ZXJ5UGFyYW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXh0cmFRdWVyeVBhcmFtcztcbiAgICB9XG4gICAgc2V0IGV4dHJhUXVlcnlQYXJhbXModmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpe1xuICAgICAgICAgICAgdGhpcy5fZXh0cmFRdWVyeVBhcmFtcyA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXh0cmFRdWVyeVBhcmFtcyA9IHt9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL09pZGNDbGllbnRTZXR0aW5ncy5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTdG9yYWdlU3RhdGVTdG9yZSB7XG4gICAgY29uc3RydWN0b3Ioe3ByZWZpeCA9IFwib2lkYy5cIiwgc3RvcmUgPSBHbG9iYWwubG9jYWxTdG9yYWdlfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgICAgIHRoaXMuX3ByZWZpeCA9IHByZWZpeDtcbiAgICB9XG5cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJXZWJTdG9yYWdlU3RhdGVTdG9yZS5zZXRcIiwga2V5KTtcblxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XG5cbiAgICAgICAgdGhpcy5fc3RvcmUuc2V0SXRlbShrZXksIHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZ2V0KGtleSkge1xuICAgICAgICBMb2cuZGVidWcoXCJXZWJTdG9yYWdlU3RhdGVTdG9yZS5nZXRcIiwga2V5KTtcblxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XG5cbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLl9zdG9yZS5nZXRJdGVtKGtleSk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpdGVtKTtcbiAgICB9XG5cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLnJlbW92ZVwiLCBrZXkpO1xuXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcblxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX3N0b3JlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgdGhpcy5fc3RvcmUucmVtb3ZlSXRlbShrZXkpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaXRlbSk7XG4gICAgfVxuXG4gICAgZ2V0QWxsS2V5cygpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuZ2V0QWxsS2V5c1wiKTtcblxuICAgICAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9zdG9yZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSB0aGlzLl9zdG9yZS5rZXkoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5fcHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkuc3Vic3RyKHRoaXMuX3ByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoa2V5cyk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuY29uc3QgdGltZXIgPSB7XG4gICAgc2V0SW50ZXJ2YWw6IGZ1bmN0aW9uIChjYiwgZHVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHNldEludGVydmFsKGNiLCBkdXJhdGlvbik7XG4gICAgfSxcbiAgICBjbGVhckludGVydmFsOiBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gICAgICAgIHJldHVybiBjbGVhckludGVydmFsKGhhbmRsZSk7XG4gICAgfVxufTtcblxubGV0IHRlc3RpbmcgPSBmYWxzZTtcbmxldCByZXF1ZXN0ID0gbnVsbDtcblxuZXhwb3J0IGNsYXNzIEdsb2JhbCB7XG5cbiAgICBzdGF0aWMgX3Rlc3RpbmcoKSB7XG4gICAgICAgIHRlc3RpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgbG9jYXRpb24oKSB7XG4gICAgICAgIGlmICghdGVzdGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBsb2NhbFN0b3JhZ2UoKSB7XG4gICAgICAgIGlmICghdGVzdGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgc2Vzc2lvblN0b3JhZ2UoKSB7XG4gICAgICAgIGlmICghdGVzdGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHNldFhNTEh0dHBSZXF1ZXN0KG5ld1JlcXVlc3QpIHtcbiAgICAgICAgcmVxdWVzdCA9IG5ld1JlcXVlc3Q7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBYTUxIdHRwUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdCB8fCBYTUxIdHRwUmVxdWVzdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgdGltZXIoKSB7XG4gICAgICAgIGlmICghdGVzdGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9HbG9iYWwuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xuaW1wb3J0IFVzZXJJbmZvU2VydmljZSBmcm9tICcuL1VzZXJJbmZvU2VydmljZSc7XG5pbXBvcnQgRXJyb3JSZXNwb25zZSBmcm9tICcuL0Vycm9yUmVzcG9uc2UnO1xuaW1wb3J0IEpvc2VVdGlsIGZyb20gJy4vSm9zZVV0aWwnO1xuXG5jb25zdCBQcm90b2NvbENsYWltcyA9IFtcIm5vbmNlXCIsIFwiYXRfaGFzaFwiLCBcImlhdFwiLCBcIm5iZlwiLCBcImV4cFwiLCBcImF1ZFwiLCBcImlzc1wiLCBcImNfaGFzaFwiXTtcblxuZXhwb3J0IGNsYXNzIFJlc3BvbnNlVmFsaWRhdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlLCBVc2VySW5mb1NlcnZpY2VDdG9yID0gVXNlckluZm9TZXJ2aWNlLCBqb3NlVXRpbCA9IEpvc2VVdGlsKSB7XG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBSZXNwb25zZVZhbGlkYXRvclwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl91c2VySW5mb1NlcnZpY2UgPSBuZXcgVXNlckluZm9TZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX2pvc2VVdGlsID0gam9zZVV0aWw7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVTaWduaW5SZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IudmFsaWRhdGVTaWduaW5SZXNwb25zZVwiKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1NpZ25pblBhcmFtcyhzdGF0ZSwgcmVzcG9uc2UpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwic3RhdGUgcHJvY2Vzc2VkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlVG9rZW5zKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidG9rZW5zIHZhbGlkYXRlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc0NsYWltcyhyZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImNsYWltcyBwcm9jZXNzZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZVNpZ25vdXRSZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IudmFsaWRhdGVTaWdub3V0UmVzcG9uc2VcIik7XG5cbiAgICAgICAgaWYgKHN0YXRlLmlkICE9PSByZXNwb25zZS5zdGF0ZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgc3RhdGUgbWF0Y2hlcywgdGFrZSB0aGUgc3RvcmVkIGRhdGFcbiAgICAgICAgLy8gYW5kIHNldCBpdCBpbnRvIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBnZXQgdGhlaXIgc3RhdGVcbiAgICAgICAgLy8gdGhpcyBpcyBpbXBvcnRhbnQgZm9yIGJvdGggc3VjY2VzcyAmIGVycm9yIG91dGNvbWVzXG4gICAgICAgIExvZy5kZWJ1ZyhcInN0YXRlIHZhbGlkYXRlZFwiKTtcbiAgICAgICAgcmVzcG9uc2Uuc3RhdGUgPSBzdGF0ZS5kYXRhO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgTG9nLndhcm4oXCJSZXNwb25zZSB3YXMgZXJyb3JcIiwgcmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBfcHJvY2Vzc1NpZ25pblBhcmFtcyhzdGF0ZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3Byb2Nlc3NTaWduaW5QYXJhbXNcIik7XG5cbiAgICAgICAgaWYgKHN0YXRlLmlkICE9PSByZXNwb25zZS5zdGF0ZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIikpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIXN0YXRlLmNsaWVudF9pZCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gY2xpZW50X2lkIG9uIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGNsaWVudF9pZCBvbiBzdGF0ZVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICghc3RhdGUuYXV0aG9yaXR5KSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhdXRob3JpdHkgb24gc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gYXV0aG9yaXR5IG9uIHN0YXRlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlIGF1dGhvcml0eSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgc2lnbmluIHN0YXRlXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5KSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkgPSBzdGF0ZS5hdXRob3JpdHk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZW5zdXJlIHdlJ3JlIHVzaW5nIHRoZSBjb3JyZWN0IGF1dGhvcml0eSBpZiB0aGUgYXV0aG9yaXR5IGlzIG5vdCBsb2FkZWQgZnJvbSBzaWduaW4gc3RhdGVcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5ICYmIHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSAhPT0gc3RhdGUuYXV0aG9yaXR5KSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJhdXRob3JpdHkgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJhdXRob3JpdHkgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcyBhbGxvd3MgdGhlIGNsaWVudF9pZCB0byBiZSBsb2FkZWQgZnJvbSB0aGUgc2lnbmluIHN0YXRlXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQgPSBzdGF0ZS5jbGllbnRfaWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZW5zdXJlIHdlJ3JlIHVzaW5nIHRoZSBjb3JyZWN0IGNsaWVudF9pZCBpZiB0aGUgY2xpZW50X2lkIGlzIG5vdCBsb2FkZWQgZnJvbSBzaWduaW4gc3RhdGVcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkICYmIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCAhPT0gc3RhdGUuY2xpZW50X2lkKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJjbGllbnRfaWQgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJjbGllbnRfaWQgbWlzbWF0Y2ggb24gc2V0dGluZ3MgdnMuIHNpZ25pbiBzdGF0ZVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIHN0YXRlIG1hdGNoZXMsIHRha2UgdGhlIHN0b3JlZCBkYXRhXG4gICAgICAgIC8vIGFuZCBzZXQgaXQgaW50byB0aGUgcmVzcG9uc2Ugc28gY2FsbGVycyBjYW4gZ2V0IHRoZWlyIHN0YXRlXG4gICAgICAgIC8vIHRoaXMgaXMgaW1wb3J0YW50IGZvciBib3RoIHN1Y2Nlc3MgJiBlcnJvciBvdXRjb21lc1xuICAgICAgICBMb2cuZGVidWcoXCJzdGF0ZSB2YWxpZGF0ZWRcIik7XG4gICAgICAgIHJlc3BvbnNlLnN0YXRlID0gc3RhdGUuZGF0YTtcblxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgIExvZy53YXJuKFwiUmVzcG9uc2Ugd2FzIGVycm9yXCIsIHJlc3BvbnNlLmVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLm5vbmNlICYmICFyZXNwb25zZS5pZF90b2tlbikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiRXhwZWN0aW5nIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3RhdGUubm9uY2UgJiYgcmVzcG9uc2UuaWRfdG9rZW4pIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vdCBleHBlY3RpbmcgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5leHBlY3RlZCBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBfcHJvY2Vzc0NsYWltcyhyZXNwb25zZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NsYWltc1wiKTtcblxuICAgICAgICBpZiAocmVzcG9uc2UuaXNPcGVuSWRDb25uZWN0KSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJyZXNwb25zZSBpcyBPSURDLCBwcm9jZXNzaW5nIGNsYWltc1wiKTtcblxuICAgICAgICAgICAgcmVzcG9uc2UucHJvZmlsZSA9IHRoaXMuX2ZpbHRlclByb3RvY29sQ2xhaW1zKHJlc3BvbnNlLnByb2ZpbGUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubG9hZFVzZXJJbmZvICYmIHJlc3BvbnNlLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImxvYWRpbmcgdXNlciBpbmZvXCIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJJbmZvU2VydmljZS5nZXRDbGFpbXMocmVzcG9uc2UuYWNjZXNzX3Rva2VuKS50aGVuKGNsYWltcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInVzZXIgaW5mbyBjbGFpbXMgcmVjZWl2ZWQgZnJvbSB1c2VyIGluZm8gZW5kcG9pbnRcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYWltcy5zdWIgIT09IHJlc3BvbnNlLnByb2ZpbGUuc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJzdWIgZnJvbSB1c2VyIGluZm8gZW5kcG9pbnQgZG9lcyBub3QgbWF0Y2ggc3ViIGluIGFjY2Vzc190b2tlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzdWIgZnJvbSB1c2VyIGluZm8gZW5kcG9pbnQgZG9lcyBub3QgbWF0Y2ggc3ViIGluIGFjY2Vzc190b2tlblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gdGhpcy5fbWVyZ2VDbGFpbXMocmVzcG9uc2UucHJvZmlsZSwgY2xhaW1zKTtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBpbmZvIGNsYWltcyByZWNlaXZlZCwgdXBkYXRlZCBwcm9maWxlOlwiLCByZXNwb25zZS5wcm9maWxlKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJub3QgbG9hZGluZyB1c2VyIGluZm9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJyZXNwb25zZSBpcyBub3QgT0lEQywgbm90IHByb2Nlc3NpbmcgY2xhaW1zXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgfVxuXG4gICAgX21lcmdlQ2xhaW1zKGNsYWltczEsIGNsYWltczIpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGNsYWltczEpO1xuXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gY2xhaW1zMikge1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGNsYWltczJbbmFtZV07XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFtuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRbbmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbbmFtZV0uaW5kZXhPZih2YWx1ZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0ucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0W25hbWVdICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBbcmVzdWx0W25hbWVdLCB2YWx1ZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBfZmlsdGVyUHJvdG9jb2xDbGFpbXMoY2xhaW1zKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9maWx0ZXJQcm90b2NvbENsYWltcywgaW5jb21pbmcgY2xhaW1zOlwiLCBjbGFpbXMpO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBjbGFpbXMpO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMpIHtcbiAgICAgICAgICAgIFByb3RvY29sQ2xhaW1zLmZvckVhY2godHlwZSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFt0eXBlXTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBMb2cuZGVidWcoXCJwcm90b2NvbCBjbGFpbXMgZmlsdGVyZWRcIiwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInByb3RvY29sIGNsYWltcyBub3QgZmlsdGVyZWRcIilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlVG9rZW5zKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVUb2tlbnNcIik7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmlkX3Rva2VuKSB7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJWYWxpZGF0aW5nIGlkX3Rva2VuIGFuZCBhY2Nlc3NfdG9rZW5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuKHN0YXRlLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlZhbGlkYXRpbmcgaWRfdG9rZW5cIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICBMb2cuZGVidWcoXCJObyBpZF90b2tlbiB0byB2YWxpZGF0ZVwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW5cIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlSWRUb2tlbihzdGF0ZSwgcmVzcG9uc2UpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuXCIpO1xuXG4gICAgICAgIGlmICghc3RhdGUubm9uY2UpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIG5vbmNlIG9uIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIG5vbmNlIG9uIHN0YXRlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGp3dCA9IHRoaXMuX2pvc2VVdGlsLnBhcnNlSnd0KHJlc3BvbnNlLmlkX3Rva2VuKTtcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIgfHwgIWp3dC5wYXlsb2FkKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgaWRfdG9rZW5cIiwgand0KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgaWRfdG9rZW5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLm5vbmNlICE9PSBqd3QucGF5bG9hZC5ub25jZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiSW52YWxpZCBub25jZSBpbiBpZF90b2tlblwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIG5vbmNlIGluIGlkX3Rva2VuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBraWQgPSBqd3QuaGVhZGVyLmtpZDtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldElzc3VlcigpLnRoZW4oaXNzdWVyID0+IHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIGlzc3VlclwiKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRTaWduaW5nS2V5cygpLnRoZW4oa2V5cyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpZ25pbmcga2V5cyBmcm9tIG1ldGFkYXRhXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc2lnbmluZyBrZXlzIGZyb20gbWV0YWRhdGFcIikpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJlY2VpdmVkIHNpZ25pbmcga2V5c1wiKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgICAgIGlmICgha2lkKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMgPSB0aGlzLl9maWx0ZXJCeUFsZyhrZXlzLCBqd3QuaGVhZGVyLmFsZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8ga2lkIGZvdW5kIGluIGlkX3Rva2VuIGFuZCBtb3JlIHRoYW4gb25lIGtleSBmb3VuZCBpbiBtZXRhZGF0YVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBraWQgZm91bmQgaW4gaWRfdG9rZW4gYW5kIG1vcmUgdGhhbiBvbmUga2V5IGZvdW5kIGluIG1ldGFkYXRhXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBraWQgaXMgbWFuZGF0b3J5IG9ubHkgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUga2V5cyBpbiB0aGUgcmVmZXJlbmNlZCBKV0sgU2V0IGRvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cDovL29wZW5pZC5uZXQvc3BlY3Mvb3BlbmlkLWNvbm5lY3QtY29yZS0xXzAuaHRtbCNTaWduaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5raWQgPT09IGtpZDtcbiAgICAgICAgICAgICAgICAgICAgfSlbMF07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8ga2V5IG1hdGNoaW5nIGtpZCBvciBhbGcgZm91bmQgaW4gc2lnbmluZyBrZXlzXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8ga2V5IG1hdGNoaW5nIGtpZCBvciBhbGcgZm91bmQgaW4gc2lnbmluZyBrZXlzXCIpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYXVkaWVuY2UgPSBzdGF0ZS5jbGllbnRfaWQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGNsb2NrU2tld0luU2Vjb25kcyA9IHRoaXMuX3NldHRpbmdzLmNsb2NrU2tldztcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJWYWxpZGFpbmcgSldUOyB1c2luZyBjbG9jayBza2V3IChpbiBzZWNvbmRzKSBvZjogXCIsIGNsb2NrU2tld0luU2Vjb25kcyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fam9zZVV0aWwudmFsaWRhdGVKd3QocmVzcG9uc2UuaWRfdG9rZW4sIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3SW5TZWNvbmRzKS50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkpXVCB2YWxpZGF0aW9uIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWp3dC5wYXlsb2FkLnN1Yikge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc3ViIHByZXNlbnQgaW4gaWRfdG9rZW5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc3ViIHByZXNlbnQgaW4gaWRfdG9rZW5cIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucHJvZmlsZSA9IGp3dC5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9maWx0ZXJCeUFsZyhrZXlzLCBhbGcpe1xuICAgICAgICBMb2cuZGVidWcoXCJSZXNwb25zZVZhbGlkYXRvci5fZmlsdGVyQnlBbGdcIiwgYWxnKTtcblxuICAgICAgICB2YXIga3R5ID0gbnVsbDtcbiAgICAgICAgaWYgKGFsZy5zdGFydHNXaXRoKFwiUlNcIikpIHtcbiAgICAgICAgICAgIGt0eSA9IFwiUlNBXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxnLnN0YXJ0c1dpdGgoXCJQU1wiKSkge1xuICAgICAgICAgICAga3R5ID0gXCJQU1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFsZy5zdGFydHNXaXRoKFwiRVNcIikpIHtcbiAgICAgICAgICAgIGt0eSA9IFwiRUNcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImFsZyBub3Qgc3VwcG9ydGVkOiBcIiwgYWxnKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgTG9nLmRlYnVnKFwiTG9va2luZyBmb3Iga2V5cyB0aGF0IG1hdGNoIGt0eTogXCIsIGt0eSk7XG5cbiAgICAgICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ga2V5Lmt0eSA9PT0ga3R5O1xuICAgICAgICB9KTtcblxuICAgICAgICBMb2cuZGVidWcoXCJOdW1iZXIgb2Yga2V5cyB0aGF0IG1hdGNoIGt0eTogXCIsIGt0eSwga2V5cy5sZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuXCIpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UucHJvZmlsZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcHJvZmlsZSBsb2FkZWQgZnJvbSBpZF90b2tlblwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwcm9maWxlIGxvYWRlZCBmcm9tIGlkX3Rva2VuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhdF9oYXNoIGluIGlkX3Rva2VuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF0X2hhc2ggaW4gaWRfdG9rZW5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5pZF90b2tlbikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gaWRfdG9rZW5cIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gaWRfdG9rZW5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGp3dCA9IHRoaXMuX2pvc2VVdGlsLnBhcnNlSnd0KHJlc3BvbnNlLmlkX3Rva2VuKTtcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFzaEFsZyA9IGp3dC5oZWFkZXIuYWxnO1xuICAgICAgICBpZiAoIWhhc2hBbGcgfHwgaGFzaEFsZy5sZW5ndGggIT09IDUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGFsZzpcIiwgaGFzaEFsZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoYXNoQml0cyA9IGhhc2hBbGcuc3Vic3RyKDIsIDMpO1xuICAgICAgICBpZiAoIWhhc2hCaXRzKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6XCIsIGhhc2hBbGcsIGhhc2hCaXRzKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFzaEJpdHMgPSBwYXJzZUludChoYXNoQml0cyk7XG4gICAgICAgIGlmIChoYXNoQml0cyAhPT0gMjU2ICYmIGhhc2hCaXRzICE9PSAzODQgJiYgaGFzaEJpdHMgIT09IDUxMikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOlwiLCBoYXNoQWxnLCBoYXNoQml0cyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaGEgPSBcInNoYVwiICsgaGFzaEJpdHM7XG4gICAgICAgIHZhciBoYXNoID0gdGhpcy5fam9zZVV0aWwuaGFzaFN0cmluZyhyZXNwb25zZS5hY2Nlc3NfdG9rZW4sIHNoYSk7XG4gICAgICAgIGlmICghaGFzaCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiYWNjZXNzX3Rva2VuIGhhc2ggZmFpbGVkOlwiLCBzaGEpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsZWZ0ID0gaGFzaC5zdWJzdHIoMCwgaGFzaC5sZW5ndGggLyAyKTtcbiAgICAgICAgdmFyIGxlZnRfYjY0dSA9IHRoaXMuX2pvc2VVdGlsLmhleFRvQmFzZTY0VXJsKGxlZnQpO1xuICAgICAgICBpZiAobGVmdF9iNjR1ICE9PSByZXNwb25zZS5wcm9maWxlLmF0X2hhc2gpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIsIGxlZnRfYjY0dSwgcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUmVzcG9uc2VWYWxpZGF0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBKc29uU2VydmljZSBmcm9tICcuL0pzb25TZXJ2aWNlJztcblxuY29uc3QgT2lkY01ldGFkYXRhVXJsUGF0aCA9ICcud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBNZXRhZGF0YVNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBKc29uU2VydmljZUN0b3IgPSBKc29uU2VydmljZSkge1xuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBzZXR0aW5ncyBwYXNzZWQgdG8gTWV0YWRhdGFTZXJ2aWNlXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0dGluZ3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLl9qc29uU2VydmljZSA9IG5ldyBKc29uU2VydmljZUN0b3IoKTtcbiAgICB9XG5cbiAgICBnZXQgbWV0YWRhdGFVcmwoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWV0YWRhdGFVcmwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YVVybCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gdGhpcy5fc2V0dGluZ3MubWV0YWRhdGFVcmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCA9IHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybCAmJiB0aGlzLl9tZXRhZGF0YVVybC5pbmRleE9mKE9pZGNNZXRhZGF0YVVybFBhdGgpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmxbdGhpcy5fbWV0YWRhdGFVcmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gJy8nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsICs9IE9pZGNNZXRhZGF0YVVybFBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhVXJsO1xuICAgIH1cblxuICAgIGdldE1ldGFkYXRhKCkge1xuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0TWV0YWRhdGFcIik7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJSZXR1cm5pbmcgbWV0YWRhdGEgZnJvbSBzZXR0aW5nc1wiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fc2V0dGluZ3MubWV0YWRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhVXJsKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhdXRob3JpdHkgb3IgbWV0YWRhdGFVcmwgY29uZmlndXJlZCBvbiBzZXR0aW5nc1wiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBhdXRob3JpdHkgb3IgbWV0YWRhdGFVcmwgY29uZmlndXJlZCBvbiBzZXR0aW5nc1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBMb2cuZGVidWcoXCJnZXR0aW5nIG1ldGFkYXRhIGZyb21cIiwgdGhpcy5tZXRhZGF0YVVybCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2pzb25TZXJ2aWNlLmdldEpzb24odGhpcy5tZXRhZGF0YVVybClcbiAgICAgICAgICAgIC50aGVuKG1ldGFkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJqc29uIHJlY2VpdmVkXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0SXNzdWVyKCkge1xuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0SXNzdWVyXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImlzc3VlclwiKTtcbiAgICB9XG5cbiAgICBnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRBdXRob3JpemF0aW9uRW5kcG9pbnRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiYXV0aG9yaXphdGlvbl9lbmRwb2ludFwiKTtcbiAgICB9XG5cbiAgICBnZXRVc2VySW5mb0VuZHBvaW50KCkge1xuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0VXNlckluZm9FbmRwb2ludFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJ1c2VyaW5mb19lbmRwb2ludFwiKTtcbiAgICB9XG5cbiAgICBnZXRUb2tlbkVuZHBvaW50KCkge1xuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0VG9rZW5FbmRwb2ludFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJ0b2tlbl9lbmRwb2ludFwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICBnZXRDaGVja1Nlc3Npb25JZnJhbWUoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRDaGVja1Nlc3Npb25JZnJhbWVcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiY2hlY2tfc2Vzc2lvbl9pZnJhbWVcIiwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0RW5kU2Vzc2lvbkVuZHBvaW50KCkge1xuICAgICAgICBMb2cuZGVidWcoXCJNZXRhZGF0YVNlcnZpY2UuZ2V0RW5kU2Vzc2lvbkVuZHBvaW50XCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImVuZF9zZXNzaW9uX2VuZHBvaW50XCIsIHRydWUpO1xuICAgIH1cblxuICAgIGdldFJldm9jYXRpb25FbmRwb2ludCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFJldm9jYXRpb25FbmRwb2ludFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJyZXZvY2F0aW9uX2VuZHBvaW50XCIsIHRydWUpO1xuICAgIH1cblxuICAgIF9nZXRNZXRhZGF0YVByb3BlcnR5KG5hbWUsIG9wdGlvbmFsPWZhbHNlKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5fZ2V0TWV0YWRhdGFQcm9wZXJ0eVwiLCBuYW1lKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXRhZGF0YSgpLnRoZW4obWV0YWRhdGEgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwibWV0YWRhdGEgcmVjaWV2ZWRcIik7XG5cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJNZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIG9wdGlvbmFsIHByb3BlcnR5IFwiICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJNZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIHByb3BlcnR5IFwiICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVydHkgXCIgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVtuYW1lXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0U2lnbmluZ0tleXMoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIk1ldGFkYXRhU2VydmljZS5nZXRTaWduaW5nS2V5c1wiKTtcblxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXMpIHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlJldHVybmluZyBzaWduaW5nS2V5cyBmcm9tIHNldHRpbmdzXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImp3a3NfdXJpXCIpLnRoZW4oandrc191cmkgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiandrc191cmkgcmVjZWl2ZWRcIiwgandrc191cmkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbihqd2tzX3VyaSkudGhlbihrZXlTZXQgPT4ge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImtleSBzZXQgcmVjZWl2ZWRcIiwga2V5U2V0KTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5U2V0LmtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTWlzc2luZyBrZXlzIG9uIGtleXNldFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBrZXlzIG9uIGtleXNldFwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cyA9IGtleVNldC5rZXlzO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvTWV0YWRhdGFTZXJ2aWNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuZXhwb3J0IGNsYXNzIEpzb25TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihYTUxIdHRwUmVxdWVzdEN0b3IgPSBHbG9iYWwuWE1MSHR0cFJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5fWE1MSHR0cFJlcXVlc3QgPSBYTUxIdHRwUmVxdWVzdEN0b3I7XG4gICAgfVxuXG4gICAgZ2V0SnNvbih1cmwsIHRva2VuKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkpzb25TZXJ2aWNlLmdldEpzb25cIiwgdXJsKTtcblxuICAgICAgICBpZiAoIXVybCl7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB1cmwgcGFzc2VkXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXJsXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgICAgICAgdmFyIHJlcSA9IG5ldyB0aGlzLl9YTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHVybCk7XG5cbiAgICAgICAgICAgIHJlcS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJIVFRQIHJlc3BvbnNlIHJlY2VpdmVkLCBzdGF0dXNcIiwgcmVxLnN0YXR1cyk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVxLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UocmVxLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBwYXJzaW5nIEpTT04gcmVzcG9uc2VcIiwgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHJlcS5zdGF0dXNUZXh0ICsgXCIgKFwiICsgcmVxLnN0YXR1cyArIFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJuZXR3b3JrIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihcIk5ldHdvcmsgRXJyb3JcIikpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidG9rZW4gcGFzc2VkLCBzZXR0aW5nIEF1dGhvcml6YXRpb24gaGVhZGVyXCIpO1xuICAgICAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIiArIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVxLnNlbmQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0pzb25TZXJ2aWNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IEpzb25TZXJ2aWNlIGZyb20gJy4vSnNvblNlcnZpY2UnO1xuaW1wb3J0IE1ldGFkYXRhU2VydmljZSBmcm9tICcuL01ldGFkYXRhU2VydmljZSc7XG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuZXhwb3J0IGNsYXNzIFVzZXJJbmZvU2VydmljZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIEpzb25TZXJ2aWNlQ3RvciA9IEpzb25TZXJ2aWNlLCBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlKSB7XG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBVc2VySW5mb1NlcnZpY2VcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXR0aW5nc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX2pzb25TZXJ2aWNlID0gbmV3IEpzb25TZXJ2aWNlQ3RvcigpO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgZ2V0Q2xhaW1zKHRva2VuKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJJbmZvU2VydmljZS5nZXRDbGFpbXNcIik7XG5cbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdG9rZW4gcGFzc2VkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkEgdG9rZW4gaXMgcmVxdWlyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRVc2VySW5mb0VuZHBvaW50KCkudGhlbih1cmwgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwicmVjZWl2ZWQgdXNlcmluZm8gdXJsXCIsIHVybCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKHVybCwgdG9rZW4pLnRoZW4oY2xhaW1zID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJjbGFpbXMgcmVjZWl2ZWRcIiwgY2xhaW1zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9Vc2VySW5mb1NlcnZpY2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuZXhwb3J0IGNsYXNzIEVycm9yUmVzcG9uc2UgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3Ioe2Vycm9yLCBlcnJvcl9kZXNjcmlwdGlvbiwgZXJyb3JfdXJpLCBzdGF0ZX09e31cbiAgICApIHtcbiAgICAgICAgIGlmICghZXJyb3Ipe1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gZXJyb3IgcGFzc2VkIHRvIEVycm9yUmVzcG9uc2VcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlcnJvclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyKGVycm9yX2Rlc2NyaXB0aW9uIHx8IGVycm9yKTtcblxuICAgICAgICB0aGlzLm5hbWUgPSBcIkVycm9yUmVzcG9uc2VcIjtcblxuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICAgIHRoaXMuZXJyb3JfZGVzY3JpcHRpb24gPSBlcnJvcl9kZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5lcnJvcl91cmkgPSBlcnJvcl91cmk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9FcnJvclJlc3BvbnNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IHsgandzLCBLRVlVVElMIGFzIEtleVV0aWwsIFg1MDksIGNyeXB0bywgaGV4dG9iNjR1IH0gZnJvbSAnanNyc2FzaWduJztcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBBbGxvd2VkU2lnbmluZ0FsZ3MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJywgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJywgJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ107XG5cbmV4cG9ydCBjbGFzcyBKb3NlVXRpbCB7XG5cbiAgICBzdGF0aWMgcGFyc2VKd3Qoand0KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLnBhcnNlSnd0XCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHRva2VuID0gandzLkpXUy5wYXJzZShqd3QpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoZWFkZXI6IHRva2VuLmhlYWRlck9iaixcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB0b2tlbi5wYXlsb2FkT2JqXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB2YWxpZGF0ZUp3dChqd3QsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3LCBub3cpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiSm9zZVV0aWwudmFsaWRhdGVKd3RcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChrZXkua3R5ID09PSBcIlJTQVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5lICYmIGtleS5uKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleS54NWMgJiYga2V5Lng1Yy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gS2V5VXRpbC5nZXRLZXkoWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTShrZXkueDVjWzBdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJSU0Ega2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJSU0Ega2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkua3R5ID09PSBcIkVDXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmNydiAmJiBrZXkueCAmJiBrZXkueSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBLZXlVdGlsLmdldEtleShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiRUMga2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFQyBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGtleSB0eXBlXCIsIGtleSAmJiBrZXkua3R5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQga2V5IHR5cGU6IFwiICsga2V5ICYmIGtleS5rdHkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIEpvc2VVdGlsLl92YWxpZGF0ZUp3dChqd3QsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3LCBub3cpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoZSAmJiBlLm1lc3NhZ2UgfHwgZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJKV1QgdmFsaWRhdGlvbiBmYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgX3ZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdykge1xuICAgICAgICBMb2cuZGVidWcoXCJKb3NlVXRpbC5fdmFsaWRhdGVKd3RcIik7XG5cbiAgICAgICAgaWYgKCFjbG9ja1NrZXcpIHtcbiAgICAgICAgICAgIGNsb2NrU2tldyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5vdykge1xuICAgICAgICAgICAgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBheWxvYWQgPSBKb3NlVXRpbC5wYXJzZUp3dChqd3QpLnBheWxvYWQ7XG5cbiAgICAgICAgaWYgKCFwYXlsb2FkLmlzcykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiaXNzdWVyIHdhcyBub3QgcHJvdmlkZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiaXNzdWVyIHdhcyBub3QgcHJvdmlkZWRcIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXlsb2FkLmlzcyAhPT0gaXNzdWVyKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIGlzc3VlciBpbiB0b2tlblwiLCBwYXlsb2FkLmlzcyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBpc3N1ZXIgaW4gdG9rZW46IFwiICsgcGF5bG9hZC5pc3MpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF5bG9hZC5hdWQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImF1ZCB3YXMgbm90IHByb3ZpZGVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImF1ZCB3YXMgbm90IHByb3ZpZGVkXCIpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsaWRBdWRpZW5jZSA9IHBheWxvYWQuYXVkID09PSBhdWRpZW5jZSB8fCAoQXJyYXkuaXNBcnJheShwYXlsb2FkLmF1ZCkgJiYgcGF5bG9hZC5hdWQuaW5kZXhPZihhdWRpZW5jZSkgPj0gMCk7IFxuICAgICAgICBpZiAoIXZhbGlkQXVkaWVuY2UpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkludmFsaWQgYXVkaWVuY2UgaW4gdG9rZW5cIiwgcGF5bG9hZC5hdWQpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgYXVkaWVuY2UgaW4gdG9rZW46IFwiICsgcGF5bG9hZC5hdWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb3dlck5vdyA9IG5vdyArIGNsb2NrU2tldztcbiAgICAgICAgdmFyIHVwcGVyTm93ID0gbm93IC0gY2xvY2tTa2V3O1xuXG4gICAgICAgIGlmICghcGF5bG9hZC5pYXQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImlhdCB3YXMgbm90IHByb3ZpZGVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImlhdCB3YXMgbm90IHByb3ZpZGVkXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG93ZXJOb3cgPCBwYXlsb2FkLmlhdCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiaWF0IGlzIGluIHRoZSBmdXR1cmVcIiwgcGF5bG9hZC5pYXQpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImlhdCBpcyBpbiB0aGUgZnV0dXJlOiBcIiArIHBheWxvYWQuaWF0KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF5bG9hZC5uYmYgJiYgbG93ZXJOb3cgPCBwYXlsb2FkLm5iZikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwibmJmIGlzIGluIHRoZSBmdXR1cmVcIiwgcGF5bG9hZC5uYmYpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5iZiBpcyBpbiB0aGUgZnV0dXJlOiBcIiArIHBheWxvYWQubmJmKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBheWxvYWQuZXhwKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJleHAgd2FzIG5vdCBwcm92aWRlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJleHAgd2FzIG5vdCBwcm92aWRlZFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQuZXhwIDwgdXBwZXJOb3cpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImV4cCBpcyBpbiB0aGUgcGFzdFwiLCBwYXlsb2FkLmV4cCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiZXhwIGlzIGluIHRoZSBwYXN0OlwiICsgcGF5bG9hZC5leHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWp3cy5KV1MudmVyaWZ5KGp3dCwga2V5LCBBbGxvd2VkU2lnbmluZ0FsZ3MpKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwic2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoZSAmJiBlLm1lc3NhZ2UgfHwgZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwic2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaGFzaFN0cmluZyh2YWx1ZSwgYWxnKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLmhhc2hTdHJpbmdcIiwgdmFsdWUsIGFsZyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gY3J5cHRvLlV0aWwuaGFzaFN0cmluZyh2YWx1ZSwgYWxnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGhleFRvQmFzZTY0VXJsKHZhbHVlKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkpvc2VVdGlsLmhleFRvQmFzZTY0VXJsXCIsIHZhbHVlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBoZXh0b2I2NHUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvSm9zZVV0aWwuanMiLCJcbnZhciBuYXZpZ2F0b3IgPSB7fTtcbm5hdmlnYXRvci51c2VyQWdlbnQgPSBmYWxzZTtcblxudmFyIHdpbmRvdyA9IHt9O1xuLypcbiAqIGpzcnNhc2lnbiA1LjEuMCAoMjAxNi0wOS0wOCkgKGMpIDIwMTAtMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5cbi8qXG55YWhvby1taW4uanNcbkNvcHlyaWdodCAoYykgMjAxMSwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvZGUgbGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlOlxuaHR0cDovL2RldmVsb3Blci55YWhvby5jb20veXVpL2xpY2Vuc2UuaHRtbFxudmVyc2lvbjogMi45LjBcbiovXG5pZih0eXBlb2YgWUFIT089PVwidW5kZWZpbmVkXCJ8fCFZQUhPTyl7dmFyIFlBSE9PPXt9O31ZQUhPTy5uYW1lc3BhY2U9ZnVuY3Rpb24oKXt2YXIgYj1hcmd1bWVudHMsZz1udWxsLGUsYyxmO2ZvcihlPTA7ZTxiLmxlbmd0aDtlPWUrMSl7Zj0oXCJcIitiW2VdKS5zcGxpdChcIi5cIik7Zz1ZQUhPTztmb3IoYz0oZlswXT09XCJZQUhPT1wiKT8xOjA7YzxmLmxlbmd0aDtjPWMrMSl7Z1tmW2NdXT1nW2ZbY11dfHx7fTtnPWdbZltjXV07fX1yZXR1cm4gZzt9O1lBSE9PLmxvZz1mdW5jdGlvbihkLGEsYyl7dmFyIGI9WUFIT08ud2lkZ2V0LkxvZ2dlcjtpZihiJiZiLmxvZyl7cmV0dXJuIGIubG9nKGQsYSxjKTt9ZWxzZXtyZXR1cm4gZmFsc2U7fX07WUFIT08ucmVnaXN0ZXI9ZnVuY3Rpb24oYSxmLGUpe3ZhciBrPVlBSE9PLmVudi5tb2R1bGVzLGMsaixoLGcsZDtpZigha1thXSl7a1thXT17dmVyc2lvbnM6W10sYnVpbGRzOltdfTt9Yz1rW2FdO2o9ZS52ZXJzaW9uO2g9ZS5idWlsZDtnPVlBSE9PLmVudi5saXN0ZW5lcnM7Yy5uYW1lPWE7Yy52ZXJzaW9uPWo7Yy5idWlsZD1oO2MudmVyc2lvbnMucHVzaChqKTtjLmJ1aWxkcy5wdXNoKGgpO2MubWFpbkNsYXNzPWY7Zm9yKGQ9MDtkPGcubGVuZ3RoO2Q9ZCsxKXtnW2RdKGMpO31pZihmKXtmLlZFUlNJT049ajtmLkJVSUxEPWg7fWVsc2V7WUFIT08ubG9nKFwibWFpbkNsYXNzIGlzIHVuZGVmaW5lZCBmb3IgbW9kdWxlIFwiK2EsXCJ3YXJuXCIpO319O1lBSE9PLmVudj1ZQUhPTy5lbnZ8fHttb2R1bGVzOltdLGxpc3RlbmVyczpbXX07WUFIT08uZW52LmdldFZlcnNpb249ZnVuY3Rpb24oYSl7cmV0dXJuIFlBSE9PLmVudi5tb2R1bGVzW2FdfHxudWxsO307WUFIT08uZW52LnBhcnNlVUE9ZnVuY3Rpb24oZCl7dmFyIGU9ZnVuY3Rpb24oaSl7dmFyIGo9MDtyZXR1cm4gcGFyc2VGbG9hdChpLnJlcGxhY2UoL1xcLi9nLGZ1bmN0aW9uKCl7cmV0dXJuKGorKz09MSk/XCJcIjpcIi5cIjt9KSk7fSxoPW5hdmlnYXRvcixnPXtpZTowLG9wZXJhOjAsZ2Vja286MCx3ZWJraXQ6MCxjaHJvbWU6MCxtb2JpbGU6bnVsbCxhaXI6MCxpcGFkOjAsaXBob25lOjAsaXBvZDowLGlvczpudWxsLGFuZHJvaWQ6MCx3ZWJvczowLGNhamE6aCYmaC5jYWphVmVyc2lvbixzZWN1cmU6ZmFsc2Usb3M6bnVsbH0sYz1kfHwobmF2aWdhdG9yJiZuYXZpZ2F0b3IudXNlckFnZW50KSxmPXdpbmRvdyYmd2luZG93LmxvY2F0aW9uLGI9ZiYmZi5ocmVmLGE7Zy5zZWN1cmU9YiYmKGIudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiaHR0cHNcIik9PT0wKTtpZihjKXtpZigoL3dpbmRvd3N8d2luMzIvaSkudGVzdChjKSl7Zy5vcz1cIndpbmRvd3NcIjt9ZWxzZXtpZigoL21hY2ludG9zaC9pKS50ZXN0KGMpKXtnLm9zPVwibWFjaW50b3NoXCI7fWVsc2V7aWYoKC9yaGluby9pKS50ZXN0KGMpKXtnLm9zPVwicmhpbm9cIjt9fX1pZigoL0tIVE1MLykudGVzdChjKSl7Zy53ZWJraXQ9MTt9YT1jLm1hdGNoKC9BcHBsZVdlYktpdFxcLyhbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2cud2Via2l0PWUoYVsxXSk7aWYoLyBNb2JpbGVcXC8vLnRlc3QoYykpe2cubW9iaWxlPVwiQXBwbGVcIjthPWMubWF0Y2goL09TIChbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2E9ZShhWzFdLnJlcGxhY2UoXCJfXCIsXCIuXCIpKTt9Zy5pb3M9YTtnLmlwYWQ9Zy5pcG9kPWcuaXBob25lPTA7YT1jLm1hdGNoKC9pUGFkfGlQb2R8aVBob25lLyk7aWYoYSYmYVswXSl7Z1thWzBdLnRvTG93ZXJDYXNlKCldPWcuaW9zO319ZWxzZXthPWMubWF0Y2goL05va2lhTlteXFwvXSp8QW5kcm9pZCBcXGRcXC5cXGR8d2ViT1NcXC9cXGRcXC5cXGQvKTtpZihhKXtnLm1vYmlsZT1hWzBdO31pZigvd2ViT1MvLnRlc3QoYykpe2cubW9iaWxlPVwiV2ViT1NcIjthPWMubWF0Y2goL3dlYk9TXFwvKFteXFxzXSopOy8pO2lmKGEmJmFbMV0pe2cud2Vib3M9ZShhWzFdKTt9fWlmKC8gQW5kcm9pZC8udGVzdChjKSl7Zy5tb2JpbGU9XCJBbmRyb2lkXCI7YT1jLm1hdGNoKC9BbmRyb2lkIChbXlxcc10qKTsvKTtpZihhJiZhWzFdKXtnLmFuZHJvaWQ9ZShhWzFdKTt9fX1hPWMubWF0Y2goL0Nocm9tZVxcLyhbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2cuY2hyb21lPWUoYVsxXSk7fWVsc2V7YT1jLm1hdGNoKC9BZG9iZUFJUlxcLyhbXlxcc10qKS8pO2lmKGEpe2cuYWlyPWFbMF07fX19aWYoIWcud2Via2l0KXthPWMubWF0Y2goL09wZXJhW1xcc1xcL10oW15cXHNdKikvKTtpZihhJiZhWzFdKXtnLm9wZXJhPWUoYVsxXSk7YT1jLm1hdGNoKC9WZXJzaW9uXFwvKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy5vcGVyYT1lKGFbMV0pO31hPWMubWF0Y2goL09wZXJhIE1pbmlbXjtdKi8pO2lmKGEpe2cubW9iaWxlPWFbMF07fX1lbHNle2E9Yy5tYXRjaCgvTVNJRVxccyhbXjtdKikvKTtpZihhJiZhWzFdKXtnLmllPWUoYVsxXSk7fWVsc2V7YT1jLm1hdGNoKC9HZWNrb1xcLyhbXlxcc10qKS8pO2lmKGEpe2cuZ2Vja289MTthPWMubWF0Y2goL3J2OihbXlxcc1xcKV0qKS8pO2lmKGEmJmFbMV0pe2cuZ2Vja289ZShhWzFdKTt9fX19fX1yZXR1cm4gZzt9O1lBSE9PLmVudi51YT1ZQUhPTy5lbnYucGFyc2VVQSgpOyhmdW5jdGlvbigpe1lBSE9PLm5hbWVzcGFjZShcInV0aWxcIixcIndpZGdldFwiLFwiZXhhbXBsZVwiKTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIFlBSE9PX2NvbmZpZyl7dmFyIGI9WUFIT09fY29uZmlnLmxpc3RlbmVyLGE9WUFIT08uZW52Lmxpc3RlbmVycyxkPXRydWUsYztpZihiKXtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXtpZihhW2NdPT1iKXtkPWZhbHNlO2JyZWFrO319aWYoZCl7YS5wdXNoKGIpO319fX0pKCk7WUFIT08ubGFuZz1ZQUhPTy5sYW5nfHx7fTsoZnVuY3Rpb24oKXt2YXIgZj1ZQUhPTy5sYW5nLGE9T2JqZWN0LnByb3RvdHlwZSxjPVwiW29iamVjdCBBcnJheV1cIixoPVwiW29iamVjdCBGdW5jdGlvbl1cIixpPVwiW29iamVjdCBPYmplY3RdXCIsYj1bXSxnPXtcIiZcIjpcIiZhbXA7XCIsXCI8XCI6XCImbHQ7XCIsXCI+XCI6XCImZ3Q7XCIsJ1wiJzpcIiZxdW90O1wiLFwiJ1wiOlwiJiN4Mjc7XCIsXCIvXCI6XCImI3gyRjtcIixcImBcIjpcIiYjeDYwO1wifSxkPVtcInRvU3RyaW5nXCIsXCJ2YWx1ZU9mXCJdLGU9e2lzQXJyYXk6ZnVuY3Rpb24oail7cmV0dXJuIGEudG9TdHJpbmcuYXBwbHkoaik9PT1jO30saXNCb29sZWFuOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwiYm9vbGVhblwiO30saXNGdW5jdGlvbjpmdW5jdGlvbihqKXtyZXR1cm4odHlwZW9mIGo9PT1cImZ1bmN0aW9uXCIpfHxhLnRvU3RyaW5nLmFwcGx5KGopPT09aDt9LGlzTnVsbDpmdW5jdGlvbihqKXtyZXR1cm4gaj09PW51bGw7fSxpc051bWJlcjpmdW5jdGlvbihqKXtyZXR1cm4gdHlwZW9mIGo9PT1cIm51bWJlclwiJiZpc0Zpbml0ZShqKTt9LGlzT2JqZWN0OmZ1bmN0aW9uKGope3JldHVybihqJiYodHlwZW9mIGo9PT1cIm9iamVjdFwifHxmLmlzRnVuY3Rpb24oaikpKXx8ZmFsc2U7fSxpc1N0cmluZzpmdW5jdGlvbihqKXtyZXR1cm4gdHlwZW9mIGo9PT1cInN0cmluZ1wiO30saXNVbmRlZmluZWQ6ZnVuY3Rpb24oail7cmV0dXJuIHR5cGVvZiBqPT09XCJ1bmRlZmluZWRcIjt9LF9JRUVudW1GaXg6KFlBSE9PLmVudi51YS5pZSk/ZnVuY3Rpb24obCxrKXt2YXIgaixuLG07Zm9yKGo9MDtqPGQubGVuZ3RoO2o9aisxKXtuPWRbal07bT1rW25dO2lmKGYuaXNGdW5jdGlvbihtKSYmbSE9YVtuXSl7bFtuXT1tO319fTpmdW5jdGlvbigpe30sZXNjYXBlSFRNTDpmdW5jdGlvbihqKXtyZXR1cm4gai5yZXBsYWNlKC9bJjw+XCInXFwvYF0vZyxmdW5jdGlvbihrKXtyZXR1cm4gZ1trXTt9KTt9LGV4dGVuZDpmdW5jdGlvbihtLG4sbCl7aWYoIW58fCFtKXt0aHJvdyBuZXcgRXJyb3IoXCJleHRlbmQgZmFpbGVkLCBwbGVhc2UgY2hlY2sgdGhhdCBcIitcImFsbCBkZXBlbmRlbmNpZXMgYXJlIGluY2x1ZGVkLlwiKTt9dmFyIGs9ZnVuY3Rpb24oKXt9LGo7ay5wcm90b3R5cGU9bi5wcm90b3R5cGU7bS5wcm90b3R5cGU9bmV3IGsoKTttLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tO20uc3VwZXJjbGFzcz1uLnByb3RvdHlwZTtpZihuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj09YS5jb25zdHJ1Y3Rvcil7bi5wcm90b3R5cGUuY29uc3RydWN0b3I9bjt9aWYobCl7Zm9yKGogaW4gbCl7aWYoZi5oYXNPd25Qcm9wZXJ0eShsLGopKXttLnByb3RvdHlwZVtqXT1sW2pdO319Zi5fSUVFbnVtRml4KG0ucHJvdG90eXBlLGwpO319LGF1Z21lbnRPYmplY3Q6ZnVuY3Rpb24obixtKXtpZighbXx8IW4pe3Rocm93IG5ldyBFcnJvcihcIkFic29yYiBmYWlsZWQsIHZlcmlmeSBkZXBlbmRlbmNpZXMuXCIpO312YXIgaj1hcmd1bWVudHMsbCxvLGs9alsyXTtpZihrJiZrIT09dHJ1ZSl7Zm9yKGw9MjtsPGoubGVuZ3RoO2w9bCsxKXtuW2pbbF1dPW1baltsXV07fX1lbHNle2ZvcihvIGluIG0pe2lmKGt8fCEobyBpbiBuKSl7bltvXT1tW29dO319Zi5fSUVFbnVtRml4KG4sbSk7fXJldHVybiBuO30sYXVnbWVudFByb3RvOmZ1bmN0aW9uKG0sbCl7aWYoIWx8fCFtKXt0aHJvdyBuZXcgRXJyb3IoXCJBdWdtZW50IGZhaWxlZCwgdmVyaWZ5IGRlcGVuZGVuY2llcy5cIik7fXZhciBqPVttLnByb3RvdHlwZSxsLnByb3RvdHlwZV0saztmb3Ioaz0yO2s8YXJndW1lbnRzLmxlbmd0aDtrPWsrMSl7ai5wdXNoKGFyZ3VtZW50c1trXSk7fWYuYXVnbWVudE9iamVjdC5hcHBseSh0aGlzLGopO3JldHVybiBtO30sZHVtcDpmdW5jdGlvbihqLHApe3ZhciBsLG4scj1bXSx0PVwiey4uLn1cIixrPVwiZigpey4uLn1cIixxPVwiLCBcIixtPVwiID0+IFwiO2lmKCFmLmlzT2JqZWN0KGopKXtyZXR1cm4gaitcIlwiO31lbHNle2lmKGogaW5zdGFuY2VvZiBEYXRlfHwoXCJub2RlVHlwZVwiIGluIGomJlwidGFnTmFtZVwiIGluIGopKXtyZXR1cm4gajt9ZWxzZXtpZihmLmlzRnVuY3Rpb24oaikpe3JldHVybiBrO319fXA9KGYuaXNOdW1iZXIocCkpP3A6MztpZihmLmlzQXJyYXkoaikpe3IucHVzaChcIltcIik7Zm9yKGw9MCxuPWoubGVuZ3RoO2w8bjtsPWwrMSl7aWYoZi5pc09iamVjdChqW2xdKSl7ci5wdXNoKChwPjApP2YuZHVtcChqW2xdLHAtMSk6dCk7fWVsc2V7ci5wdXNoKGpbbF0pO31yLnB1c2gocSk7fWlmKHIubGVuZ3RoPjEpe3IucG9wKCk7fXIucHVzaChcIl1cIik7fWVsc2V7ci5wdXNoKFwie1wiKTtmb3IobCBpbiBqKXtpZihmLmhhc093blByb3BlcnR5KGosbCkpe3IucHVzaChsK20pO2lmKGYuaXNPYmplY3QoaltsXSkpe3IucHVzaCgocD4wKT9mLmR1bXAoaltsXSxwLTEpOnQpO31lbHNle3IucHVzaChqW2xdKTt9ci5wdXNoKHEpO319aWYoci5sZW5ndGg+MSl7ci5wb3AoKTt9ci5wdXNoKFwifVwiKTt9cmV0dXJuIHIuam9pbihcIlwiKTt9LHN1YnN0aXR1dGU6ZnVuY3Rpb24oeCx5LEUsbCl7dmFyIEQsQyxCLEcsdCx1LEY9W10scCx6PXgubGVuZ3RoLEE9XCJkdW1wXCIscj1cIiBcIixxPVwie1wiLG09XCJ9XCIsbix3O2Zvcig7Oyl7RD14Lmxhc3RJbmRleE9mKHEseik7aWYoRDwwKXticmVhazt9Qz14LmluZGV4T2YobSxEKTtpZihEKzE+Qyl7YnJlYWs7fXA9eC5zdWJzdHJpbmcoRCsxLEMpO0c9cDt1PW51bGw7Qj1HLmluZGV4T2Yocik7aWYoQj4tMSl7dT1HLnN1YnN0cmluZyhCKzEpO0c9Ry5zdWJzdHJpbmcoMCxCKTt9dD15W0ddO2lmKEUpe3Q9RShHLHQsdSk7fWlmKGYuaXNPYmplY3QodCkpe2lmKGYuaXNBcnJheSh0KSl7dD1mLmR1bXAodCxwYXJzZUludCh1LDEwKSk7fWVsc2V7dT11fHxcIlwiO249dS5pbmRleE9mKEEpO2lmKG4+LTEpe3U9dS5zdWJzdHJpbmcoNCk7fXc9dC50b1N0cmluZygpO2lmKHc9PT1pfHxuPi0xKXt0PWYuZHVtcCh0LHBhcnNlSW50KHUsMTApKTt9ZWxzZXt0PXc7fX19ZWxzZXtpZighZi5pc1N0cmluZyh0KSYmIWYuaXNOdW1iZXIodCkpe3Q9XCJ+LVwiK0YubGVuZ3RoK1wiLX5cIjtGW0YubGVuZ3RoXT1wO319eD14LnN1YnN0cmluZygwLEQpK3QreC5zdWJzdHJpbmcoQysxKTtpZihsPT09ZmFsc2Upe3o9RC0xO319Zm9yKEQ9Ri5sZW5ndGgtMTtEPj0wO0Q9RC0xKXt4PXgucmVwbGFjZShuZXcgUmVnRXhwKFwifi1cIitEK1wiLX5cIiksXCJ7XCIrRltEXStcIn1cIixcImdcIik7fXJldHVybiB4O30sdHJpbTpmdW5jdGlvbihqKXt0cnl7cmV0dXJuIGoucmVwbGFjZSgvXlxccyt8XFxzKyQvZyxcIlwiKTt9Y2F0Y2goayl7cmV0dXJuIGo7XG59fSxtZXJnZTpmdW5jdGlvbigpe3ZhciBuPXt9LGs9YXJndW1lbnRzLGo9ay5sZW5ndGgsbTtmb3IobT0wO208ajttPW0rMSl7Zi5hdWdtZW50T2JqZWN0KG4sa1ttXSx0cnVlKTt9cmV0dXJuIG47fSxsYXRlcjpmdW5jdGlvbih0LGssdSxuLHApe3Q9dHx8MDtrPWt8fHt9O3ZhciBsPXUscz1uLHEsajtpZihmLmlzU3RyaW5nKHUpKXtsPWtbdV07fWlmKCFsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwibWV0aG9kIHVuZGVmaW5lZFwiKTt9aWYoIWYuaXNVbmRlZmluZWQobikmJiFmLmlzQXJyYXkocykpe3M9W25dO31xPWZ1bmN0aW9uKCl7bC5hcHBseShrLHN8fGIpO307aj0ocCk/c2V0SW50ZXJ2YWwocSx0KTpzZXRUaW1lb3V0KHEsdCk7cmV0dXJue2ludGVydmFsOnAsY2FuY2VsOmZ1bmN0aW9uKCl7aWYodGhpcy5pbnRlcnZhbCl7Y2xlYXJJbnRlcnZhbChqKTt9ZWxzZXtjbGVhclRpbWVvdXQoaik7fX19O30saXNWYWx1ZTpmdW5jdGlvbihqKXtyZXR1cm4oZi5pc09iamVjdChqKXx8Zi5pc1N0cmluZyhqKXx8Zi5pc051bWJlcihqKXx8Zi5pc0Jvb2xlYW4oaikpO319O2YuaGFzT3duUHJvcGVydHk9KGEuaGFzT3duUHJvcGVydHkpP2Z1bmN0aW9uKGosayl7cmV0dXJuIGomJmouaGFzT3duUHJvcGVydHkmJmouaGFzT3duUHJvcGVydHkoayk7fTpmdW5jdGlvbihqLGspe3JldHVybiAhZi5pc1VuZGVmaW5lZChqW2tdKSYmai5jb25zdHJ1Y3Rvci5wcm90b3R5cGVba10hPT1qW2tdO307ZS5hdWdtZW50T2JqZWN0KGYsZSx0cnVlKTtZQUhPTy51dGlsLkxhbmc9ZjtmLmF1Z21lbnQ9Zi5hdWdtZW50UHJvdG87WUFIT08uYXVnbWVudD1mLmF1Z21lbnRQcm90bztZQUhPTy5leHRlbmQ9Zi5leHRlbmQ7fSkoKTtZQUhPTy5yZWdpc3RlcihcInlhaG9vXCIsWUFIT08se3ZlcnNpb246XCIyLjkuMFwiLGJ1aWxkOlwiMjgwMFwifSk7XG5cbi8qISBDcnlwdG9KUyB2My4xLjIgY29yZS1maXguanNcbiAqIGNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuICogKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4gKiBUSElTIElTIEZJWCBvZiAnY29yZS5qcycgdG8gZml4IEhtYWMgaXNzdWUuXG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy9pc3N1ZXMvZGV0YWlsP2lkPTg0XG4gKiBodHRwczovL2NyeXB0by1qcy5nb29nbGVjb2RlLmNvbS9zdm4taGlzdG9yeS9yNjY3L2JyYW5jaGVzLzMueC9zcmMvY29yZS5qc1xuICovXG52YXIgQ3J5cHRvSlM9Q3J5cHRvSlN8fChmdW5jdGlvbihlLGcpe3ZhciBhPXt9O3ZhciBiPWEubGliPXt9O3ZhciBqPWIuQmFzZT0oZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7fXJldHVybntleHRlbmQ6ZnVuY3Rpb24ocCl7bi5wcm90b3R5cGU9dGhpczt2YXIgbz1uZXcgbigpO2lmKHApe28ubWl4SW4ocCl9aWYoIW8uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKXtvLmluaXQ9ZnVuY3Rpb24oKXtvLiRzdXBlci5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19by5pbml0LnByb3RvdHlwZT1vO28uJHN1cGVyPXRoaXM7cmV0dXJuIG99LGNyZWF0ZTpmdW5jdGlvbigpe3ZhciBvPXRoaXMuZXh0ZW5kKCk7by5pbml0LmFwcGx5KG8sYXJndW1lbnRzKTtyZXR1cm4gb30saW5pdDpmdW5jdGlvbigpe30sbWl4SW46ZnVuY3Rpb24ocCl7Zm9yKHZhciBvIGluIHApe2lmKHAuaGFzT3duUHJvcGVydHkobykpe3RoaXNbb109cFtvXX19aWYocC5oYXNPd25Qcm9wZXJ0eShcInRvU3RyaW5nXCIpKXt0aGlzLnRvU3RyaW5nPXAudG9TdHJpbmd9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKX19fSgpKTt2YXIgbD1iLldvcmRBcnJheT1qLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihvLG4pe289dGhpcy53b3Jkcz1vfHxbXTtpZihuIT1nKXt0aGlzLnNpZ0J5dGVzPW59ZWxzZXt0aGlzLnNpZ0J5dGVzPW8ubGVuZ3RoKjR9fSx0b1N0cmluZzpmdW5jdGlvbihuKXtyZXR1cm4obnx8aCkuc3RyaW5naWZ5KHRoaXMpfSxjb25jYXQ6ZnVuY3Rpb24odCl7dmFyIHE9dGhpcy53b3Jkczt2YXIgcD10LndvcmRzO3ZhciBuPXRoaXMuc2lnQnl0ZXM7dmFyIHM9dC5zaWdCeXRlczt0aGlzLmNsYW1wKCk7aWYobiU0KXtmb3IodmFyIHI9MDtyPHM7cisrKXt2YXIgbz0ocFtyPj4+Ml0+Pj4oMjQtKHIlNCkqOCkpJjI1NTtxWyhuK3IpPj4+Ml18PW88PCgyNC0oKG4rciklNCkqOCl9fWVsc2V7Zm9yKHZhciByPTA7cjxzO3IrPTQpe3FbKG4rcik+Pj4yXT1wW3I+Pj4yXX19dGhpcy5zaWdCeXRlcys9cztyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLndvcmRzO3ZhciBuPXRoaXMuc2lnQnl0ZXM7b1tuPj4+Ml0mPTQyOTQ5NjcyOTU8PCgzMi0obiU0KSo4KTtvLmxlbmd0aD1lLmNlaWwobi80KX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgbj1qLmNsb25lLmNhbGwodGhpcyk7bi53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApO3JldHVybiBufSxyYW5kb206ZnVuY3Rpb24ocCl7dmFyIG89W107Zm9yKHZhciBuPTA7bjxwO24rPTQpe28ucHVzaCgoZS5yYW5kb20oKSo0Mjk0OTY3Mjk2KXwwKX1yZXR1cm4gbmV3IGwuaW5pdChvLHApfX0pO3ZhciBtPWEuZW5jPXt9O3ZhciBoPW0uSGV4PXtzdHJpbmdpZnk6ZnVuY3Rpb24ocCl7dmFyIHI9cC53b3Jkczt2YXIgbz1wLnNpZ0J5dGVzO3ZhciBxPVtdO2Zvcih2YXIgbj0wO248bztuKyspe3ZhciBzPShyW24+Pj4yXT4+PigyNC0obiU0KSo4KSkmMjU1O3EucHVzaCgocz4+PjQpLnRvU3RyaW5nKDE2KSk7cS5wdXNoKChzJjE1KS50b1N0cmluZygxNikpfXJldHVybiBxLmpvaW4oXCJcIil9LHBhcnNlOmZ1bmN0aW9uKHApe3ZhciBuPXAubGVuZ3RoO3ZhciBxPVtdO2Zvcih2YXIgbz0wO288bjtvKz0yKXtxW28+Pj4zXXw9cGFyc2VJbnQocC5zdWJzdHIobywyKSwxNik8PCgyNC0obyU4KSo0KX1yZXR1cm4gbmV3IGwuaW5pdChxLG4vMil9fTt2YXIgZD1tLkxhdGluMT17c3RyaW5naWZ5OmZ1bmN0aW9uKHEpe3ZhciByPXEud29yZHM7dmFyIHA9cS5zaWdCeXRlczt2YXIgbj1bXTtmb3IodmFyIG89MDtvPHA7bysrKXt2YXIgcz0ocltvPj4+Ml0+Pj4oMjQtKG8lNCkqOCkpJjI1NTtuLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShzKSl9cmV0dXJuIG4uam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24ocCl7dmFyIG49cC5sZW5ndGg7dmFyIHE9W107Zm9yKHZhciBvPTA7bzxuO28rKyl7cVtvPj4+Ml18PShwLmNoYXJDb2RlQXQobykmMjU1KTw8KDI0LShvJTQpKjgpfXJldHVybiBuZXcgbC5pbml0KHEsbil9fTt2YXIgYz1tLlV0Zjg9e3N0cmluZ2lmeTpmdW5jdGlvbihuKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZC5zdHJpbmdpZnkobikpKX1jYXRjaChvKXt0aHJvdyBuZXcgRXJyb3IoXCJNYWxmb3JtZWQgVVRGLTggZGF0YVwiKX19LHBhcnNlOmZ1bmN0aW9uKG4pe3JldHVybiBkLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChuKSkpfX07dmFyIGk9Yi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtPWouZXh0ZW5kKHtyZXNldDpmdW5jdGlvbigpe3RoaXMuX2RhdGE9bmV3IGwuaW5pdCgpO3RoaXMuX25EYXRhQnl0ZXM9MH0sX2FwcGVuZDpmdW5jdGlvbihuKXtpZih0eXBlb2Ygbj09XCJzdHJpbmdcIil7bj1jLnBhcnNlKG4pfXRoaXMuX2RhdGEuY29uY2F0KG4pO3RoaXMuX25EYXRhQnl0ZXMrPW4uc2lnQnl0ZXN9LF9wcm9jZXNzOmZ1bmN0aW9uKHcpe3ZhciBxPXRoaXMuX2RhdGE7dmFyIHg9cS53b3Jkczt2YXIgbj1xLnNpZ0J5dGVzO3ZhciB0PXRoaXMuYmxvY2tTaXplO3ZhciB2PXQqNDt2YXIgdT1uL3Y7aWYodyl7dT1lLmNlaWwodSl9ZWxzZXt1PWUubWF4KCh1fDApLXRoaXMuX21pbkJ1ZmZlclNpemUsMCl9dmFyIHM9dSp0O3ZhciByPWUubWluKHMqNCxuKTtpZihzKXtmb3IodmFyIHA9MDtwPHM7cCs9dCl7dGhpcy5fZG9Qcm9jZXNzQmxvY2soeCxwKX12YXIgbz14LnNwbGljZSgwLHMpO3Euc2lnQnl0ZXMtPXJ9cmV0dXJuIG5ldyBsLmluaXQobyxyKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgbj1qLmNsb25lLmNhbGwodGhpcyk7bi5fZGF0YT10aGlzLl9kYXRhLmNsb25lKCk7cmV0dXJuIG59LF9taW5CdWZmZXJTaXplOjB9KTt2YXIgZj1iLkhhc2hlcj1pLmV4dGVuZCh7Y2ZnOmouZXh0ZW5kKCksaW5pdDpmdW5jdGlvbihuKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQobik7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe2kucmVzZXQuY2FsbCh0aGlzKTt0aGlzLl9kb1Jlc2V0KCl9LHVwZGF0ZTpmdW5jdGlvbihuKXt0aGlzLl9hcHBlbmQobik7dGhpcy5fcHJvY2VzcygpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbihuKXtpZihuKXt0aGlzLl9hcHBlbmQobil9dmFyIG89dGhpcy5fZG9GaW5hbGl6ZSgpO3JldHVybiBvfSxibG9ja1NpemU6NTEyLzMyLF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHAsbyl7cmV0dXJuIG5ldyBuLmluaXQobykuZmluYWxpemUocCl9fSxfY3JlYXRlSG1hY0hlbHBlcjpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24ocCxvKXtyZXR1cm4gbmV3IGsuSE1BQy5pbml0KG4sbykuZmluYWxpemUocCl9fX0pO3ZhciBrPWEuYWxnbz17fTtyZXR1cm4gYX0oTWF0aCkpO1xuLypcbkNyeXB0b0pTIHYzLjEuMiB4NjQtY29yZS1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKGcpe3ZhciBhPUNyeXB0b0pTLGY9YS5saWIsZT1mLkJhc2UsaD1mLldvcmRBcnJheSxhPWEueDY0PXt9O2EuV29yZD1lLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihiLGMpe3RoaXMuaGlnaD1iO3RoaXMubG93PWN9fSk7YS5Xb3JkQXJyYXk9ZS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYixjKXtiPXRoaXMud29yZHM9Ynx8W107dGhpcy5zaWdCeXRlcz1jIT1nP2M6OCpiLmxlbmd0aH0sdG9YMzI6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy53b3JkcyxjPWIubGVuZ3RoLGE9W10sZD0wO2Q8YztkKyspe3ZhciBlPWJbZF07YS5wdXNoKGUuaGlnaCk7YS5wdXNoKGUubG93KX1yZXR1cm4gaC5jcmVhdGUoYSx0aGlzLnNpZ0J5dGVzKX0sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZS5jbG9uZS5jYWxsKHRoaXMpLGM9Yi53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApLGE9Yy5sZW5ndGgsZD0wO2Q8YTtkKyspY1tkXT1jW2RdLmNsb25lKCk7cmV0dXJuIGJ9fSl9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIGNpcGhlci1jb3JlLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbkNyeXB0b0pTLmxpYi5DaXBoZXJ8fGZ1bmN0aW9uKHUpe3ZhciBnPUNyeXB0b0pTLGY9Zy5saWIsaz1mLkJhc2UsbD1mLldvcmRBcnJheSxxPWYuQnVmZmVyZWRCbG9ja0FsZ29yaXRobSxyPWcuZW5jLkJhc2U2NCx2PWcuYWxnby5FdnBLREYsbj1mLkNpcGhlcj1xLmV4dGVuZCh7Y2ZnOmsuZXh0ZW5kKCksY3JlYXRlRW5jcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0VOQ19YRk9STV9NT0RFLGEsYil9LGNyZWF0ZURlY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9ERUNfWEZPUk1fTU9ERSxhLGIpfSxpbml0OmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQoYyk7dGhpcy5feGZvcm1Nb2RlPWE7dGhpcy5fa2V5PWI7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3EucmVzZXQuY2FsbCh0aGlzKTt0aGlzLl9kb1Jlc2V0KCl9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dGhpcy5fYXBwZW5kKGEpO1xucmV0dXJuIHRoaXMuX3Byb2Nlc3MoKX0sZmluYWxpemU6ZnVuY3Rpb24oYSl7YSYmdGhpcy5fYXBwZW5kKGEpO3JldHVybiB0aGlzLl9kb0ZpbmFsaXplKCl9LGtleVNpemU6NCxpdlNpemU6NCxfRU5DX1hGT1JNX01PREU6MSxfREVDX1hGT1JNX01PREU6MixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKGEpe3JldHVybntlbmNyeXB0OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4oXCJzdHJpbmdcIj09dHlwZW9mIGM/czpqKS5lbmNyeXB0KGEsYixjLGQpfSxkZWNyeXB0OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4oXCJzdHJpbmdcIj09dHlwZW9mIGM/czpqKS5kZWNyeXB0KGEsYixjLGQpfX19fSk7Zi5TdHJlYW1DaXBoZXI9bi5leHRlbmQoe19kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2Nlc3MoITApfSxibG9ja1NpemU6MX0pO3ZhciBtPWcubW9kZT17fSx0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9pdjtkP3RoaXMuX2l2PXU6ZD10aGlzLl9wcmV2QmxvY2s7Zm9yKHZhciBlPVxuMDtlPGM7ZSsrKWFbYitlXV49ZFtlXX0saD0oZi5CbG9ja0NpcGhlck1vZGU9ay5leHRlbmQoe2NyZWF0ZUVuY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkVuY3J5cHRvci5jcmVhdGUoYSxiKX0sY3JlYXRlRGVjcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuRGVjcnlwdG9yLmNyZWF0ZShhLGIpfSxpbml0OmZ1bmN0aW9uKGEsYil7dGhpcy5fY2lwaGVyPWE7dGhpcy5faXY9Yn19KSkuZXh0ZW5kKCk7aC5FbmNyeXB0b3I9aC5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2NpcGhlcixkPWMuYmxvY2tTaXplO3QuY2FsbCh0aGlzLGEsYixkKTtjLmVuY3J5cHRCbG9jayhhLGIpO3RoaXMuX3ByZXZCbG9jaz1hLnNsaWNlKGIsYitkKX19KTtoLkRlY3J5cHRvcj1oLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2lwaGVyLGQ9Yy5ibG9ja1NpemUsZT1hLnNsaWNlKGIsYitkKTtjLmRlY3J5cHRCbG9jayhhLFxuYik7dC5jYWxsKHRoaXMsYSxiLGQpO3RoaXMuX3ByZXZCbG9jaz1lfX0pO209bS5DQkM9aDtoPShnLnBhZD17fSkuUGtjczc9e3BhZDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz00KmIsYz1jLWEuc2lnQnl0ZXMlYyxkPWM8PDI0fGM8PDE2fGM8PDh8YyxlPVtdLGY9MDtmPGM7Zis9NCllLnB1c2goZCk7Yz1sLmNyZWF0ZShlLGMpO2EuY29uY2F0KGMpfSx1bnBhZDpmdW5jdGlvbihhKXthLnNpZ0J5dGVzLT1hLndvcmRzW2Euc2lnQnl0ZXMtMT4+PjJdJjI1NX19O2YuQmxvY2tDaXBoZXI9bi5leHRlbmQoe2NmZzpuLmNmZy5leHRlbmQoe21vZGU6bSxwYWRkaW5nOmh9KSxyZXNldDpmdW5jdGlvbigpe24ucmVzZXQuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmNmZyxiPWEuaXYsYT1hLm1vZGU7aWYodGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERSl2YXIgYz1hLmNyZWF0ZUVuY3J5cHRvcjtlbHNlIGM9YS5jcmVhdGVEZWNyeXB0b3IsdGhpcy5fbWluQnVmZmVyU2l6ZT0xO1xudGhpcy5fbW9kZT1jLmNhbGwoYSx0aGlzLGImJmIud29yZHMpfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxiKXt0aGlzLl9tb2RlLnByb2Nlc3NCbG9jayhhLGIpfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2ZnLnBhZGRpbmc7aWYodGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERSl7YS5wYWQodGhpcy5fZGF0YSx0aGlzLmJsb2NrU2l6ZSk7dmFyIGI9dGhpcy5fcHJvY2VzcyghMCl9ZWxzZSBiPXRoaXMuX3Byb2Nlc3MoITApLGEudW5wYWQoYik7cmV0dXJuIGJ9LGJsb2NrU2l6ZTo0fSk7dmFyIHA9Zi5DaXBoZXJQYXJhbXM9ay5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSl7dGhpcy5taXhJbihhKX0sdG9TdHJpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyl9fSksbT0oZy5mb3JtYXQ9e30pLk9wZW5TU0w9e3N0cmluZ2lmeTpmdW5jdGlvbihhKXt2YXIgYj1hLmNpcGhlcnRleHQ7YT1hLnNhbHQ7XG5yZXR1cm4oYT9sLmNyZWF0ZShbMTM5ODg5MzY4NCwxNzAxMDc2ODMxXSkuY29uY2F0KGEpLmNvbmNhdChiKTpiKS50b1N0cmluZyhyKX0scGFyc2U6ZnVuY3Rpb24oYSl7YT1yLnBhcnNlKGEpO3ZhciBiPWEud29yZHM7aWYoMTM5ODg5MzY4ND09YlswXSYmMTcwMTA3NjgzMT09YlsxXSl7dmFyIGM9bC5jcmVhdGUoYi5zbGljZSgyLDQpKTtiLnNwbGljZSgwLDQpO2Euc2lnQnl0ZXMtPTE2fXJldHVybiBwLmNyZWF0ZSh7Y2lwaGVydGV4dDphLHNhbHQ6Y30pfX0saj1mLlNlcmlhbGl6YWJsZUNpcGhlcj1rLmV4dGVuZCh7Y2ZnOmsuZXh0ZW5kKHtmb3JtYXQ6bX0pLGVuY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7dmFyIGU9YS5jcmVhdGVFbmNyeXB0b3IoYyxkKTtiPWUuZmluYWxpemUoYik7ZT1lLmNmZztyZXR1cm4gcC5jcmVhdGUoe2NpcGhlcnRleHQ6YixrZXk6YyxpdjplLml2LGFsZ29yaXRobTphLG1vZGU6ZS5tb2RlLHBhZGRpbmc6ZS5wYWRkaW5nLFxuYmxvY2tTaXplOmEuYmxvY2tTaXplLGZvcm1hdHRlcjpkLmZvcm1hdH0pfSxkZWNyeXB0OmZ1bmN0aW9uKGEsYixjLGQpe2Q9dGhpcy5jZmcuZXh0ZW5kKGQpO2I9dGhpcy5fcGFyc2UoYixkLmZvcm1hdCk7cmV0dXJuIGEuY3JlYXRlRGVjcnlwdG9yKGMsZCkuZmluYWxpemUoYi5jaXBoZXJ0ZXh0KX0sX3BhcnNlOmZ1bmN0aW9uKGEsYil7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGE/Yi5wYXJzZShhLHRoaXMpOmF9fSksZz0oZy5rZGY9e30pLk9wZW5TU0w9e2V4ZWN1dGU6ZnVuY3Rpb24oYSxiLGMsZCl7ZHx8KGQ9bC5yYW5kb20oOCkpO2E9di5jcmVhdGUoe2tleVNpemU6YitjfSkuY29tcHV0ZShhLGQpO2M9bC5jcmVhdGUoYS53b3Jkcy5zbGljZShiKSw0KmMpO2Euc2lnQnl0ZXM9NCpiO3JldHVybiBwLmNyZWF0ZSh7a2V5OmEsaXY6YyxzYWx0OmR9KX19LHM9Zi5QYXNzd29yZEJhc2VkQ2lwaGVyPWouZXh0ZW5kKHtjZmc6ai5jZmcuZXh0ZW5kKHtrZGY6Z30pLGVuY3J5cHQ6ZnVuY3Rpb24oYSxcbmIsYyxkKXtkPXRoaXMuY2ZnLmV4dGVuZChkKTtjPWQua2RmLmV4ZWN1dGUoYyxhLmtleVNpemUsYS5pdlNpemUpO2QuaXY9Yy5pdjthPWouZW5jcnlwdC5jYWxsKHRoaXMsYSxiLGMua2V5LGQpO2EubWl4SW4oYyk7cmV0dXJuIGF9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7Yj10aGlzLl9wYXJzZShiLGQuZm9ybWF0KTtjPWQua2RmLmV4ZWN1dGUoYyxhLmtleVNpemUsYS5pdlNpemUsYi5zYWx0KTtkLml2PWMuaXY7cmV0dXJuIGouZGVjcnlwdC5jYWxsKHRoaXMsYSxiLGMua2V5LGQpfX0pfSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIGFlcy5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmb3IodmFyIHE9Q3J5cHRvSlMseD1xLmxpYi5CbG9ja0NpcGhlcixyPXEuYWxnbyxqPVtdLHk9W10sej1bXSxBPVtdLEI9W10sQz1bXSxzPVtdLHU9W10sdj1bXSx3PVtdLGc9W10saz0wOzI1Nj5rO2srKylnW2tdPTEyOD5rP2s8PDE6azw8MV4yODM7Zm9yKHZhciBuPTAsbD0wLGs9MDsyNTY+aztrKyspe3ZhciBmPWxebDw8MV5sPDwyXmw8PDNebDw8NCxmPWY+Pj44XmYmMjU1Xjk5O2pbbl09Zjt5W2ZdPW47dmFyIHQ9Z1tuXSxEPWdbdF0sRT1nW0RdLGI9MjU3KmdbZl1eMTY4NDMwMDgqZjt6W25dPWI8PDI0fGI+Pj44O0Fbbl09Yjw8MTZ8Yj4+PjE2O0Jbbl09Yjw8OHxiPj4+MjQ7Q1tuXT1iO2I9MTY4NDMwMDkqRV42NTUzNypEXjI1Nyp0XjE2ODQzMDA4Km47c1tmXT1iPDwyNHxiPj4+ODt1W2ZdPWI8PDE2fGI+Pj4xNjt2W2ZdPWI8PDh8Yj4+PjI0O3dbZl09YjtuPyhuPXReZ1tnW2dbRV50XV1dLGxePWdbZ1tsXV0pOm49bD0xfXZhciBGPVswLDEsMiw0LDgsXG4xNiwzMiw2NCwxMjgsMjcsNTRdLHI9ci5BRVM9eC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBjPXRoaXMuX2tleSxlPWMud29yZHMsYT1jLnNpZ0J5dGVzLzQsYz00KigodGhpcy5fblJvdW5kcz1hKzYpKzEpLGI9dGhpcy5fa2V5U2NoZWR1bGU9W10saD0wO2g8YztoKyspaWYoaDxhKWJbaF09ZVtoXTtlbHNle3ZhciBkPWJbaC0xXTtoJWE/NjxhJiY0PT1oJWEmJihkPWpbZD4+PjI0XTw8MjR8altkPj4+MTYmMjU1XTw8MTZ8altkPj4+OCYyNTVdPDw4fGpbZCYyNTVdKTooZD1kPDw4fGQ+Pj4yNCxkPWpbZD4+PjI0XTw8MjR8altkPj4+MTYmMjU1XTw8MTZ8altkPj4+OCYyNTVdPDw4fGpbZCYyNTVdLGRePUZbaC9hfDBdPDwyNCk7YltoXT1iW2gtYV1eZH1lPXRoaXMuX2ludktleVNjaGVkdWxlPVtdO2ZvcihhPTA7YTxjO2ErKyloPWMtYSxkPWElND9iW2hdOmJbaC00XSxlW2FdPTQ+YXx8ND49aD9kOnNbaltkPj4+MjRdXV51W2pbZD4+PjE2JjI1NV1dXnZbaltkPj4+XG44JjI1NV1dXndbaltkJjI1NV1dfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oYyxlKXt0aGlzLl9kb0NyeXB0QmxvY2soYyxlLHRoaXMuX2tleVNjaGVkdWxlLHosQSxCLEMsail9LGRlY3J5cHRCbG9jazpmdW5jdGlvbihjLGUpe3ZhciBhPWNbZSsxXTtjW2UrMV09Y1tlKzNdO2NbZSszXT1hO3RoaXMuX2RvQ3J5cHRCbG9jayhjLGUsdGhpcy5faW52S2V5U2NoZWR1bGUscyx1LHYsdyx5KTthPWNbZSsxXTtjW2UrMV09Y1tlKzNdO2NbZSszXT1hfSxfZG9DcnlwdEJsb2NrOmZ1bmN0aW9uKGMsZSxhLGIsaCxkLGosbSl7Zm9yKHZhciBuPXRoaXMuX25Sb3VuZHMsZj1jW2VdXmFbMF0sZz1jW2UrMV1eYVsxXSxrPWNbZSsyXV5hWzJdLHA9Y1tlKzNdXmFbM10sbD00LHQ9MTt0PG47dCsrKXZhciBxPWJbZj4+PjI0XV5oW2c+Pj4xNiYyNTVdXmRbaz4+PjgmMjU1XV5qW3AmMjU1XV5hW2wrK10scj1iW2c+Pj4yNF1eaFtrPj4+MTYmMjU1XV5kW3A+Pj44JjI1NV1ealtmJjI1NV1eYVtsKytdLHM9XG5iW2s+Pj4yNF1eaFtwPj4+MTYmMjU1XV5kW2Y+Pj44JjI1NV1ealtnJjI1NV1eYVtsKytdLHA9YltwPj4+MjRdXmhbZj4+PjE2JjI1NV1eZFtnPj4+OCYyNTVdXmpbayYyNTVdXmFbbCsrXSxmPXEsZz1yLGs9cztxPShtW2Y+Pj4yNF08PDI0fG1bZz4+PjE2JjI1NV08PDE2fG1baz4+PjgmMjU1XTw8OHxtW3AmMjU1XSleYVtsKytdO3I9KG1bZz4+PjI0XTw8MjR8bVtrPj4+MTYmMjU1XTw8MTZ8bVtwPj4+OCYyNTVdPDw4fG1bZiYyNTVdKV5hW2wrK107cz0obVtrPj4+MjRdPDwyNHxtW3A+Pj4xNiYyNTVdPDwxNnxtW2Y+Pj44JjI1NV08PDh8bVtnJjI1NV0pXmFbbCsrXTtwPShtW3A+Pj4yNF08PDI0fG1bZj4+PjE2JjI1NV08PDE2fG1bZz4+PjgmMjU1XTw8OHxtW2smMjU1XSleYVtsKytdO2NbZV09cTtjW2UrMV09cjtjW2UrMl09cztjW2UrM109cH0sa2V5U2l6ZTo4fSk7cS5BRVM9eC5fY3JlYXRlSGVscGVyKHIpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiB0cmlwbGVkZXMtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe2Z1bmN0aW9uIGooYixjKXt2YXIgYT0odGhpcy5fbEJsb2NrPj4+Yl50aGlzLl9yQmxvY2spJmM7dGhpcy5fckJsb2NrXj1hO3RoaXMuX2xCbG9ja149YTw8Yn1mdW5jdGlvbiBsKGIsYyl7dmFyIGE9KHRoaXMuX3JCbG9jaz4+PmJedGhpcy5fbEJsb2NrKSZjO3RoaXMuX2xCbG9ja149YTt0aGlzLl9yQmxvY2tePWE8PGJ9dmFyIGg9Q3J5cHRvSlMsZT1oLmxpYixuPWUuV29yZEFycmF5LGU9ZS5CbG9ja0NpcGhlcixnPWguYWxnbyxxPVs1Nyw0OSw0MSwzMywyNSwxNyw5LDEsNTgsNTAsNDIsMzQsMjYsMTgsMTAsMiw1OSw1MSw0MywzNSwyNywxOSwxMSwzLDYwLDUyLDQ0LDM2LDYzLDU1LDQ3LDM5LDMxLDIzLDE1LDcsNjIsNTQsNDYsMzgsMzAsMjIsMTQsNiw2MSw1Myw0NSwzNywyOSwyMSwxMyw1LDI4LDIwLDEyLDRdLHA9WzE0LDE3LDExLDI0LDEsNSwzLDI4LDE1LDYsMjEsMTAsMjMsMTksMTIsNCwyNiw4LDE2LDcsMjcsMjAsMTMsMiw0MSw1MiwzMSwzNyw0NyxcbjU1LDMwLDQwLDUxLDQ1LDMzLDQ4LDQ0LDQ5LDM5LDU2LDM0LDUzLDQ2LDQyLDUwLDM2LDI5LDMyXSxyPVsxLDIsNCw2LDgsMTAsMTIsMTQsMTUsMTcsMTksMjEsMjMsMjUsMjcsMjhdLHM9W3tcIjBcIjo4NDIxODg4LDI2ODQzNTQ1NjozMjc2OCw1MzY4NzA5MTI6ODQyMTM3OCw4MDUzMDYzNjg6MiwxMDczNzQxODI0OjUxMiwxMzQyMTc3MjgwOjg0MjE4OTAsMTYxMDYxMjczNjo4Mzg5MTIyLDE4NzkwNDgxOTI6ODM4ODYwOCwyMTQ3NDgzNjQ4OjUxNCwyNDE1OTE5MTA0OjgzODkxMjAsMjY4NDM1NDU2MDozMzI4MCwyOTUyNzkwMDE2Ojg0MjEzNzYsMzIyMTIyNTQ3MjozMjc3MCwzNDg5NjYwOTI4OjgzODg2MTAsMzc1ODA5NjM4NDowLDQwMjY1MzE4NDA6MzMyODIsMTM0MjE3NzI4OjAsNDAyNjUzMTg0Ojg0MjE4OTAsNjcxMDg4NjQwOjMzMjgyLDkzOTUyNDA5NjozMjc2OCwxMjA3OTU5NTUyOjg0MjE4ODgsMTQ3NjM5NTAwODo1MTIsMTc0NDgzMDQ2NDo4NDIxMzc4LDIwMTMyNjU5MjA6MixcbjIyODE3MDEzNzY6ODM4OTEyMCwyNTUwMTM2ODMyOjMzMjgwLDI4MTg1NzIyODg6ODQyMTM3NiwzMDg3MDA3NzQ0OjgzODkxMjIsMzM1NTQ0MzIwMDo4Mzg4NjEwLDM2MjM4Nzg2NTY6MzI3NzAsMzg5MjMxNDExMjo1MTQsNDE2MDc0OTU2ODo4Mzg4NjA4LDE6MzI3NjgsMjY4NDM1NDU3OjIsNTM2ODcwOTEzOjg0MjE4ODgsODA1MzA2MzY5OjgzODg2MDgsMTA3Mzc0MTgyNTo4NDIxMzc4LDEzNDIxNzcyODE6MzMyODAsMTYxMDYxMjczNzo1MTIsMTg3OTA0ODE5Mzo4Mzg5MTIyLDIxNDc0ODM2NDk6ODQyMTg5MCwyNDE1OTE5MTA1Ojg0MjEzNzYsMjY4NDM1NDU2MTo4Mzg4NjEwLDI5NTI3OTAwMTc6MzMyODIsMzIyMTIyNTQ3Mzo1MTQsMzQ4OTY2MDkyOTo4Mzg5MTIwLDM3NTgwOTYzODU6MzI3NzAsNDAyNjUzMTg0MTowLDEzNDIxNzcyOTo4NDIxODkwLDQwMjY1MzE4NTo4NDIxMzc2LDY3MTA4ODY0MTo4Mzg4NjA4LDkzOTUyNDA5Nzo1MTIsMTIwNzk1OTU1MzozMjc2OCwxNDc2Mzk1MDA5OjgzODg2MTAsXG4xNzQ0ODMwNDY1OjIsMjAxMzI2NTkyMTozMzI4MiwyMjgxNzAxMzc3OjMyNzcwLDI1NTAxMzY4MzM6ODM4OTEyMiwyODE4NTcyMjg5OjUxNCwzMDg3MDA3NzQ1Ojg0MjE4ODgsMzM1NTQ0MzIwMTo4Mzg5MTIwLDM2MjM4Nzg2NTc6MCwzODkyMzE0MTEzOjMzMjgwLDQxNjA3NDk1Njk6ODQyMTM3OH0se1wiMFwiOjEwNzQyODI1MTIsMTY3NzcyMTY6MTYzODQsMzM1NTQ0MzI6NTI0Mjg4LDUwMzMxNjQ4OjEwNzQyNjYxMjgsNjcxMDg4NjQ6MTA3Mzc0MTg0MCw4Mzg4NjA4MDoxMDc0MjgyNDk2LDEwMDY2MzI5NjoxMDczNzU4MjA4LDExNzQ0MDUxMjoxNiwxMzQyMTc3Mjg6NTQwNjcyLDE1MDk5NDk0NDoxMDczNzU4MjI0LDE2Nzc3MjE2MDoxMDczNzQxODI0LDE4NDU0OTM3Njo1NDA2ODgsMjAxMzI2NTkyOjUyNDMwNCwyMTgxMDM4MDg6MCwyMzQ4ODEwMjQ6MTY0MDAsMjUxNjU4MjQwOjEwNzQyNjYxMTIsODM4ODYwODoxMDczNzU4MjA4LDI1MTY1ODI0OjU0MDY4OCw0MTk0MzA0MDoxNiw1ODcyMDI1NjoxMDczNzU4MjI0LFxuNzU0OTc0NzI6MTA3NDI4MjUxMiw5MjI3NDY4ODoxMDczNzQxODI0LDEwOTA1MTkwNDo1MjQyODgsMTI1ODI5MTIwOjEwNzQyNjYxMjgsMTQyNjA2MzM2OjUyNDMwNCwxNTkzODM1NTI6MCwxNzYxNjA3Njg6MTYzODQsMTkyOTM3OTg0OjEwNzQyNjYxMTIsMjA5NzE1MjAwOjEwNzM3NDE4NDAsMjI2NDkyNDE2OjU0MDY3MiwyNDMyNjk2MzI6MTA3NDI4MjQ5NiwyNjAwNDY4NDg6MTY0MDAsMjY4NDM1NDU2OjAsMjg1MjEyNjcyOjEwNzQyNjYxMjgsMzAxOTg5ODg4OjEwNzM3NTgyMjQsMzE4NzY3MTA0OjEwNzQyODI0OTYsMzM1NTQ0MzIwOjEwNzQyNjYxMTIsMzUyMzIxNTM2OjE2LDM2OTA5ODc1Mjo1NDA2ODgsMzg1ODc1OTY4OjE2Mzg0LDQwMjY1MzE4NDoxNjQwMCw0MTk0MzA0MDA6NTI0Mjg4LDQzNjIwNzYxNjo1MjQzMDQsNDUyOTg0ODMyOjEwNzM3NDE4NDAsNDY5NzYyMDQ4OjU0MDY3Miw0ODY1MzkyNjQ6MTA3Mzc1ODIwOCw1MDMzMTY0ODA6MTA3Mzc0MTgyNCw1MjAwOTM2OTY6MTA3NDI4MjUxMixcbjI3NjgyNDA2NDo1NDA2ODgsMjkzNjAxMjgwOjUyNDI4OCwzMTAzNzg0OTY6MTA3NDI2NjExMiwzMjcxNTU3MTI6MTYzODQsMzQzOTMyOTI4OjEwNzM3NTgyMDgsMzYwNzEwMTQ0OjEwNzQyODI1MTIsMzc3NDg3MzYwOjE2LDM5NDI2NDU3NjoxMDczNzQxODI0LDQxMTA0MTc5MjoxMDc0MjgyNDk2LDQyNzgxOTAwODoxMDczNzQxODQwLDQ0NDU5NjIyNDoxMDczNzU4MjI0LDQ2MTM3MzQ0MDo1MjQzMDQsNDc4MTUwNjU2OjAsNDk0OTI3ODcyOjE2NDAwLDUxMTcwNTA4ODoxMDc0MjY2MTI4LDUyODQ4MjMwNDo1NDA2NzJ9LHtcIjBcIjoyNjAsMTA0ODU3NjowLDIwOTcxNTI6NjcxMDkxMjAsMzE0NTcyODo2NTc5Niw0MTk0MzA0OjY1NTQwLDUyNDI4ODA6NjcxMDg4NjgsNjI5MTQ1Njo2NzE3NDY2MCw3MzQwMDMyOjY3MTc0NDAwLDgzODg2MDg6NjcxMDg4NjQsOTQzNzE4NDo2NzE3NDY1NiwxMDQ4NTc2MDo2NTc5MiwxMTUzNDMzNjo2NzE3NDQwNCwxMjU4MjkxMjo2NzEwOTEyNCwxMzYzMTQ4ODo2NTUzNixcbjE0NjgwMDY0OjQsMTU3Mjg2NDA6MjU2LDUyNDI4ODo2NzE3NDY1NiwxNTcyODY0OjY3MTc0NDA0LDI2MjE0NDA6MCwzNjcwMDE2OjY3MTA5MTIwLDQ3MTg1OTI6NjcxMDg4NjgsNTc2NzE2ODo2NTUzNiw2ODE1NzQ0OjY1NTQwLDc4NjQzMjA6MjYwLDg5MTI4OTY6NCw5OTYxNDcyOjI1NiwxMTAxMDA0ODo2NzE3NDQwMCwxMjA1ODYyNDo2NTc5NiwxMzEwNzIwMDo2NTc5MiwxNDE1NTc3Njo2NzEwOTEyNCwxNTIwNDM1Mjo2NzE3NDY2MCwxNjI1MjkyODo2NzEwODg2NCwxNjc3NzIxNjo2NzE3NDY1NiwxNzgyNTc5Mjo2NTU0MCwxODg3NDM2ODo2NTUzNiwxOTkyMjk0NDo2NzEwOTEyMCwyMDk3MTUyMDoyNTYsMjIwMjAwOTY6NjcxNzQ2NjAsMjMwNjg2NzI6NjcxMDg4NjgsMjQxMTcyNDg6MCwyNTE2NTgyNDo2NzEwOTEyNCwyNjIxNDQwMDo2NzEwODg2NCwyNzI2Mjk3Njo0LDI4MzExNTUyOjY1NzkyLDI5MzYwMTI4OjY3MTc0NDAwLDMwNDA4NzA0OjI2MCwzMTQ1NzI4MDo2NTc5NiwzMjUwNTg1Njo2NzE3NDQwNCxcbjE3MzAxNTA0OjY3MTA4ODY0LDE4MzUwMDgwOjI2MCwxOTM5ODY1Njo2NzE3NDY1NiwyMDQ0NzIzMjowLDIxNDk1ODA4OjY1NTQwLDIyNTQ0Mzg0OjY3MTA5MTIwLDIzNTkyOTYwOjI1NiwyNDY0MTUzNjo2NzE3NDQwNCwyNTY5MDExMjo2NTUzNiwyNjczODY4ODo2NzE3NDY2MCwyNzc4NzI2NDo2NTc5NiwyODgzNTg0MDo2NzEwODg2OCwyOTg4NDQxNjo2NzEwOTEyNCwzMDkzMjk5Mjo2NzE3NDQwMCwzMTk4MTU2ODo0LDMzMDMwMTQ0OjY1NzkyfSx7XCIwXCI6MjE1MTY4MjA0OCw2NTUzNjoyMTQ3NDg3ODA4LDEzMTA3Mjo0MTk4NDY0LDE5NjYwODoyMTUxNjc3OTUyLDI2MjE0NDowLDMyNzY4MDo0MTk4NDAwLDM5MzIxNjoyMTQ3NDgzNzEyLDQ1ODc1Mjo0MTk0MzY4LDUyNDI4ODoyMTQ3NDgzNjQ4LDU4OTgyNDo0MTk0MzA0LDY1NTM2MDo2NCw3MjA4OTY6MjE0NzQ4Nzc0NCw3ODY0MzI6MjE1MTY3ODAxNiw4NTE5Njg6NDE2MCw5MTc1MDQ6NDA5Niw5ODMwNDA6MjE1MTY4MjExMiwzMjc2ODoyMTQ3NDg3ODA4LFxuOTgzMDQ6NjQsMTYzODQwOjIxNTE2NzgwMTYsMjI5Mzc2OjIxNDc0ODc3NDQsMjk0OTEyOjQxOTg0MDAsMzYwNDQ4OjIxNTE2ODIxMTIsNDI1OTg0OjAsNDkxNTIwOjIxNTE2Nzc5NTIsNTU3MDU2OjQwOTYsNjIyNTkyOjIxNTE2ODIwNDgsNjg4MTI4OjQxOTQzMDQsNzUzNjY0OjQxNjAsODE5MjAwOjIxNDc0ODM2NDgsODg0NzM2OjQxOTQzNjgsOTUwMjcyOjQxOTg0NjQsMTAxNTgwODoyMTQ3NDgzNzEyLDEwNDg1NzY6NDE5NDM2OCwxMTE0MTEyOjQxOTg0MDAsMTE3OTY0ODoyMTQ3NDgzNzEyLDEyNDUxODQ6MCwxMzEwNzIwOjQxNjAsMTM3NjI1NjoyMTUxNjc4MDE2LDE0NDE3OTI6MjE1MTY4MjA0OCwxNTA3MzI4OjIxNDc0ODc4MDgsMTU3Mjg2NDoyMTUxNjgyMTEyLDE2Mzg0MDA6MjE0NzQ4MzY0OCwxNzAzOTM2OjIxNTE2Nzc5NTIsMTc2OTQ3Mjo0MTk4NDY0LDE4MzUwMDg6MjE0NzQ4Nzc0NCwxOTAwNTQ0OjQxOTQzMDQsMTk2NjA4MDo2NCwyMDMxNjE2OjQwOTYsMTA4MTM0NDoyMTUxNjc3OTUyLFxuMTE0Njg4MDoyMTUxNjgyMTEyLDEyMTI0MTY6MCwxMjc3OTUyOjQxOTg0MDAsMTM0MzQ4ODo0MTk0MzY4LDE0MDkwMjQ6MjE0NzQ4MzY0OCwxNDc0NTYwOjIxNDc0ODc4MDgsMTU0MDA5Njo2NCwxNjA1NjMyOjIxNDc0ODM3MTIsMTY3MTE2ODo0MDk2LDE3MzY3MDQ6MjE0NzQ4Nzc0NCwxODAyMjQwOjIxNTE2NzgwMTYsMTg2Nzc3Njo0MTYwLDE5MzMzMTI6MjE1MTY4MjA0OCwxOTk4ODQ4OjQxOTQzMDQsMjA2NDM4NDo0MTk4NDY0fSx7XCIwXCI6MTI4LDQwOTY6MTcwMzkzNjAsODE5MjoyNjIxNDQsMTIyODg6NTM2ODcwOTEyLDE2Mzg0OjUzNzEzMzE4NCwyMDQ4MDoxNjc3NzM0NCwyNDU3Njo1NTM2NDgyNTYsMjg2NzI6MjYyMjcyLDMyNzY4OjE2Nzc3MjE2LDM2ODY0OjUzNzEzMzA1Niw0MDk2MDo1MzY4NzEwNDAsNDUwNTY6NTUzOTEwNDAwLDQ5MTUyOjU1MzkxMDI3Miw1MzI0ODowLDU3MzQ0OjE3MDM5NDg4LDYxNDQwOjU1MzY0ODEyOCwyMDQ4OjE3MDM5NDg4LDYxNDQ6NTUzNjQ4MjU2LFxuMTAyNDA6MTI4LDE0MzM2OjE3MDM5MzYwLDE4NDMyOjI2MjE0NCwyMjUyODo1MzcxMzMxODQsMjY2MjQ6NTUzOTEwMjcyLDMwNzIwOjUzNjg3MDkxMiwzNDgxNjo1MzcxMzMwNTYsMzg5MTI6MCw0MzAwODo1NTM5MTA0MDAsNDcxMDQ6MTY3NzczNDQsNTEyMDA6NTM2ODcxMDQwLDU1Mjk2OjU1MzY0ODEyOCw1OTM5MjoxNjc3NzIxNiw2MzQ4ODoyNjIyNzIsNjU1MzY6MjYyMTQ0LDY5NjMyOjEyOCw3MzcyODo1MzY4NzA5MTIsNzc4MjQ6NTUzNjQ4MjU2LDgxOTIwOjE2Nzc3MzQ0LDg2MDE2OjU1MzkxMDI3Miw5MDExMjo1MzcxMzMxODQsOTQyMDg6MTY3NzcyMTYsOTgzMDQ6NTUzOTEwNDAwLDEwMjQwMDo1NTM2NDgxMjgsMTA2NDk2OjE3MDM5MzYwLDExMDU5Mjo1MzcxMzMwNTYsMTE0Njg4OjI2MjI3MiwxMTg3ODQ6NTM2ODcxMDQwLDEyMjg4MDowLDEyNjk3NjoxNzAzOTQ4OCw2NzU4NDo1NTM2NDgyNTYsNzE2ODA6MTY3NzcyMTYsNzU3NzY6MTcwMzkzNjAsNzk4NzI6NTM3MTMzMTg0LFxuODM5Njg6NTM2ODcwOTEyLDg4MDY0OjE3MDM5NDg4LDkyMTYwOjEyOCw5NjI1Njo1NTM5MTAyNzIsMTAwMzUyOjI2MjI3MiwxMDQ0NDg6NTUzOTEwNDAwLDEwODU0NDowLDExMjY0MDo1NTM2NDgxMjgsMTE2NzM2OjE2Nzc3MzQ0LDEyMDgzMjoyNjIxNDQsMTI0OTI4OjUzNzEzMzA1NiwxMjkwMjQ6NTM2ODcxMDQwfSx7XCIwXCI6MjY4NDM1NDY0LDI1Njo4MTkyLDUxMjoyNzA1MzI2MDgsNzY4OjI3MDU0MDgwOCwxMDI0OjI2ODQ0MzY0OCwxMjgwOjIwOTcxNTIsMTUzNjoyMDk3MTYwLDE3OTI6MjY4NDM1NDU2LDIwNDg6MCwyMzA0OjI2ODQ0MzY1NiwyNTYwOjIxMDUzNDQsMjgxNjo4LDMwNzI6MjcwNTMyNjE2LDMzMjg6MjEwNTM1MiwzNTg0OjgyMDAsMzg0MDoyNzA1NDA4MDAsMTI4OjI3MDUzMjYwOCwzODQ6MjcwNTQwODA4LDY0MDo4LDg5NjoyMDk3MTUyLDExNTI6MjEwNTM1MiwxNDA4OjI2ODQzNTQ2NCwxNjY0OjI2ODQ0MzY0OCwxOTIwOjgyMDAsMjE3NjoyMDk3MTYwLDI0MzI6ODE5MixcbjI2ODg6MjY4NDQzNjU2LDI5NDQ6MjcwNTMyNjE2LDMyMDA6MCwzNDU2OjI3MDU0MDgwMCwzNzEyOjIxMDUzNDQsMzk2ODoyNjg0MzU0NTYsNDA5NjoyNjg0NDM2NDgsNDM1MjoyNzA1MzI2MTYsNDYwODoyNzA1NDA4MDgsNDg2NDo4MjAwLDUxMjA6MjA5NzE1Miw1Mzc2OjI2ODQzNTQ1Niw1NjMyOjI2ODQzNTQ2NCw1ODg4OjIxMDUzNDQsNjE0NDoyMTA1MzUyLDY0MDA6MCw2NjU2OjgsNjkxMjoyNzA1MzI2MDgsNzE2ODo4MTkyLDc0MjQ6MjY4NDQzNjU2LDc2ODA6MjcwNTQwODAwLDc5MzY6MjA5NzE2MCw0MjI0OjgsNDQ4MDoyMTA1MzQ0LDQ3MzY6MjA5NzE1Miw0OTkyOjI2ODQzNTQ2NCw1MjQ4OjI2ODQ0MzY0OCw1NTA0OjgyMDAsNTc2MDoyNzA1NDA4MDgsNjAxNjoyNzA1MzI2MDgsNjI3MjoyNzA1NDA4MDAsNjUyODoyNzA1MzI2MTYsNjc4NDo4MTkyLDcwNDA6MjEwNTM1Miw3Mjk2OjIwOTcxNjAsNzU1MjowLDc4MDg6MjY4NDM1NDU2LDgwNjQ6MjY4NDQzNjU2fSx7XCIwXCI6MTA0ODU3NixcbjE2OjMzNTU1NDU3LDMyOjEwMjQsNDg6MTA0OTYwMSw2NDozNDYwNDAzMyw4MDowLDk2OjEsMTEyOjM0NjAzMDA5LDEyODozMzU1NTQ1NiwxNDQ6MTA0ODU3NywxNjA6MzM1NTQ0MzMsMTc2OjM0NjA0MDMyLDE5MjozNDYwMzAwOCwyMDg6MTAyNSwyMjQ6MTA0OTYwMCwyNDA6MzM1NTQ0MzIsODozNDYwMzAwOSwyNDowLDQwOjMzNTU1NDU3LDU2OjM0NjA0MDMyLDcyOjEwNDg1NzYsODg6MzM1NTQ0MzMsMTA0OjMzNTU0NDMyLDEyMDoxMDI1LDEzNjoxMDQ5NjAxLDE1MjozMzU1NTQ1NiwxNjg6MzQ2MDMwMDgsMTg0OjEwNDg1NzcsMjAwOjEwMjQsMjE2OjM0NjA0MDMzLDIzMjoxLDI0ODoxMDQ5NjAwLDI1NjozMzU1NDQzMiwyNzI6MTA0ODU3NiwyODg6MzM1NTU0NTcsMzA0OjM0NjAzMDA5LDMyMDoxMDQ4NTc3LDMzNjozMzU1NTQ1NiwzNTI6MzQ2MDQwMzIsMzY4OjEwNDk2MDEsMzg0OjEwMjUsNDAwOjM0NjA0MDMzLDQxNjoxMDQ5NjAwLDQzMjoxLDQ0ODowLDQ2NDozNDYwMzAwOCw0ODA6MzM1NTQ0MzMsXG40OTY6MTAyNCwyNjQ6MTA0OTYwMCwyODA6MzM1NTU0NTcsMjk2OjM0NjAzMDA5LDMxMjoxLDMyODozMzU1NDQzMiwzNDQ6MTA0ODU3NiwzNjA6MTAyNSwzNzY6MzQ2MDQwMzIsMzkyOjMzNTU0NDMzLDQwODozNDYwMzAwOCw0MjQ6MCw0NDA6MzQ2MDQwMzMsNDU2OjEwNDk2MDEsNDcyOjEwMjQsNDg4OjMzNTU1NDU2LDUwNDoxMDQ4NTc3fSx7XCIwXCI6MTM0MjE5ODA4LDE6MTMxMDcyLDI6MTM0MjE3NzI4LDM6MzIsNDoxMzExMDQsNToxMzQzNTA4ODAsNjoxMzQzNTA4NDgsNzoyMDQ4LDg6MTM0MzQ4ODAwLDk6MTM0MjE5Nzc2LDEwOjEzMzEyMCwxMToxMzQzNDg4MzIsMTI6MjA4MCwxMzowLDE0OjEzNDIxNzc2MCwxNToxMzMxNTIsMjE0NzQ4MzY0ODoyMDQ4LDIxNDc0ODM2NDk6MTM0MzUwODgwLDIxNDc0ODM2NTA6MTM0MjE5ODA4LDIxNDc0ODM2NTE6MTM0MjE3NzI4LDIxNDc0ODM2NTI6MTM0MzQ4ODAwLDIxNDc0ODM2NTM6MTMzMTIwLDIxNDc0ODM2NTQ6MTMzMTUyLDIxNDc0ODM2NTU6MzIsXG4yMTQ3NDgzNjU2OjEzNDIxNzc2MCwyMTQ3NDgzNjU3OjIwODAsMjE0NzQ4MzY1ODoxMzExMDQsMjE0NzQ4MzY1OToxMzQzNTA4NDgsMjE0NzQ4MzY2MDowLDIxNDc0ODM2NjE6MTM0MzQ4ODMyLDIxNDc0ODM2NjI6MTM0MjE5Nzc2LDIxNDc0ODM2NjM6MTMxMDcyLDE2OjEzMzE1MiwxNzoxMzQzNTA4NDgsMTg6MzIsMTk6MjA0OCwyMDoxMzQyMTk3NzYsMjE6MTM0MjE3NzYwLDIyOjEzNDM0ODgzMiwyMzoxMzEwNzIsMjQ6MCwyNToxMzExMDQsMjY6MTM0MzQ4ODAwLDI3OjEzNDIxOTgwOCwyODoxMzQzNTA4ODAsMjk6MTMzMTIwLDMwOjIwODAsMzE6MTM0MjE3NzI4LDIxNDc0ODM2NjQ6MTMxMDcyLDIxNDc0ODM2NjU6MjA0OCwyMTQ3NDgzNjY2OjEzNDM0ODgzMiwyMTQ3NDgzNjY3OjEzMzE1MiwyMTQ3NDgzNjY4OjMyLDIxNDc0ODM2Njk6MTM0MzQ4ODAwLDIxNDc0ODM2NzA6MTM0MjE3NzI4LDIxNDc0ODM2NzE6MTM0MjE5ODA4LDIxNDc0ODM2NzI6MTM0MzUwODgwLDIxNDc0ODM2NzM6MTM0MjE3NzYwLFxuMjE0NzQ4MzY3NDoxMzQyMTk3NzYsMjE0NzQ4MzY3NTowLDIxNDc0ODM2NzY6MTMzMTIwLDIxNDc0ODM2Nzc6MjA4MCwyMTQ3NDgzNjc4OjEzMTEwNCwyMTQ3NDgzNjc5OjEzNDM1MDg0OH1dLHQ9WzQxNjA3NDk1NjksNTI4NDgyMzA0LDMzMDMwMTQ0LDIwNjQzODQsMTI5MDI0LDgwNjQsNTA0LDIxNDc0ODM2NzldLG09Zy5ERVM9ZS5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX2tleS53b3JkcyxjPVtdLGE9MDs1Nj5hO2ErKyl7dmFyIGY9cVthXS0xO2NbYV09YltmPj4+NV0+Pj4zMS1mJTMyJjF9Yj10aGlzLl9zdWJLZXlzPVtdO2ZvcihmPTA7MTY+ZjtmKyspe2Zvcih2YXIgZD1iW2ZdPVtdLGU9cltmXSxhPTA7MjQ+YTthKyspZFthLzZ8MF18PWNbKHBbYV0tMStlKSUyOF08PDMxLWElNixkWzQrKGEvNnwwKV18PWNbMjgrKHBbYSsyNF0tMStlKSUyOF08PDMxLWElNjtkWzBdPWRbMF08PDF8ZFswXT4+PjMxO2ZvcihhPTE7Nz5hO2ErKylkW2FdPj4+PVxuNCooYS0xKSszO2RbN109ZFs3XTw8NXxkWzddPj4+Mjd9Yz10aGlzLl9pbnZTdWJLZXlzPVtdO2ZvcihhPTA7MTY+YTthKyspY1thXT1iWzE1LWFdfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kb0NyeXB0QmxvY2soYixjLHRoaXMuX3N1YktleXMpfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kb0NyeXB0QmxvY2soYixjLHRoaXMuX2ludlN1YktleXMpfSxfZG9DcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyxhKXt0aGlzLl9sQmxvY2s9YltjXTt0aGlzLl9yQmxvY2s9YltjKzFdO2ouY2FsbCh0aGlzLDQsMjUyNjQ1MTM1KTtqLmNhbGwodGhpcywxNiw2NTUzNSk7bC5jYWxsKHRoaXMsMiw4NTg5OTM0NTkpO2wuY2FsbCh0aGlzLDgsMTY3MTE5MzUpO2ouY2FsbCh0aGlzLDEsMTQzMTY1NTc2NSk7Zm9yKHZhciBmPTA7MTY+ZjtmKyspe2Zvcih2YXIgZD1hW2ZdLGU9dGhpcy5fbEJsb2NrLGg9dGhpcy5fckJsb2NrLGc9MCxrPTA7OD5rO2srKylnfD1zW2tdWygoaF5cbmRba10pJnRba10pPj4+MF07dGhpcy5fbEJsb2NrPWg7dGhpcy5fckJsb2NrPWVeZ31hPXRoaXMuX2xCbG9jazt0aGlzLl9sQmxvY2s9dGhpcy5fckJsb2NrO3RoaXMuX3JCbG9jaz1hO2ouY2FsbCh0aGlzLDEsMTQzMTY1NTc2NSk7bC5jYWxsKHRoaXMsOCwxNjcxMTkzNSk7bC5jYWxsKHRoaXMsMiw4NTg5OTM0NTkpO2ouY2FsbCh0aGlzLDE2LDY1NTM1KTtqLmNhbGwodGhpcyw0LDI1MjY0NTEzNSk7YltjXT10aGlzLl9sQmxvY2s7YltjKzFdPXRoaXMuX3JCbG9ja30sa2V5U2l6ZToyLGl2U2l6ZToyLGJsb2NrU2l6ZToyfSk7aC5ERVM9ZS5fY3JlYXRlSGVscGVyKG0pO2c9Zy5UcmlwbGVERVM9ZS5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fa2V5LndvcmRzO3RoaXMuX2RlczE9bS5jcmVhdGVFbmNyeXB0b3Iobi5jcmVhdGUoYi5zbGljZSgwLDIpKSk7dGhpcy5fZGVzMj1tLmNyZWF0ZUVuY3J5cHRvcihuLmNyZWF0ZShiLnNsaWNlKDIsNCkpKTt0aGlzLl9kZXMzPVxubS5jcmVhdGVFbmNyeXB0b3Iobi5jcmVhdGUoYi5zbGljZSg0LDYpKSl9LGVuY3J5cHRCbG9jazpmdW5jdGlvbihiLGMpe3RoaXMuX2RlczEuZW5jcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMi5kZWNyeXB0QmxvY2soYixjKTt0aGlzLl9kZXMzLmVuY3J5cHRCbG9jayhiLGMpfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kZXMzLmRlY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczIuZW5jcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMS5kZWNyeXB0QmxvY2soYixjKX0sa2V5U2l6ZTo2LGl2U2l6ZToyLGJsb2NrU2l6ZToyfSk7aC5UcmlwbGVERVM9ZS5fY3JlYXRlSGVscGVyKGcpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBlbmMtYmFzZTY0LmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe3ZhciBoPUNyeXB0b0pTLGo9aC5saWIuV29yZEFycmF5O2guZW5jLkJhc2U2ND17c3RyaW5naWZ5OmZ1bmN0aW9uKGIpe3ZhciBlPWIud29yZHMsZj1iLnNpZ0J5dGVzLGM9dGhpcy5fbWFwO2IuY2xhbXAoKTtiPVtdO2Zvcih2YXIgYT0wO2E8ZjthKz0zKWZvcih2YXIgZD0oZVthPj4+Ml0+Pj4yNC04KihhJTQpJjI1NSk8PDE2fChlW2ErMT4+PjJdPj4+MjQtOCooKGErMSklNCkmMjU1KTw8OHxlW2ErMj4+PjJdPj4+MjQtOCooKGErMiklNCkmMjU1LGc9MDs0PmcmJmErMC43NSpnPGY7ZysrKWIucHVzaChjLmNoYXJBdChkPj4+NiooMy1nKSY2MykpO2lmKGU9Yy5jaGFyQXQoNjQpKWZvcig7Yi5sZW5ndGglNDspYi5wdXNoKGUpO3JldHVybiBiLmpvaW4oXCJcIil9LHBhcnNlOmZ1bmN0aW9uKGIpe3ZhciBlPWIubGVuZ3RoLGY9dGhpcy5fbWFwLGM9Zi5jaGFyQXQoNjQpO2MmJihjPWIuaW5kZXhPZihjKSwtMSE9YyYmKGU9YykpO2Zvcih2YXIgYz1bXSxhPTAsZD0wO2Q8XG5lO2QrKylpZihkJTQpe3ZhciBnPWYuaW5kZXhPZihiLmNoYXJBdChkLTEpKTw8MiooZCU0KSxoPWYuaW5kZXhPZihiLmNoYXJBdChkKSk+Pj42LTIqKGQlNCk7Y1thPj4+Ml18PShnfGgpPDwyNC04KihhJTQpO2ErK31yZXR1cm4gai5jcmVhdGUoYyxhKX0sX21hcDpcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCJ9fSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBtZDUuanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKEUpe2Z1bmN0aW9uIGgoYSxmLGcsaixwLGgsayl7YT1hKyhmJmd8fmYmaikrcCtrO3JldHVybihhPDxofGE+Pj4zMi1oKStmfWZ1bmN0aW9uIGsoYSxmLGcsaixwLGgsayl7YT1hKyhmJmp8ZyZ+aikrcCtrO3JldHVybihhPDxofGE+Pj4zMi1oKStmfWZ1bmN0aW9uIGwoYSxmLGcsaixoLGssbCl7YT1hKyhmXmdeaikraCtsO3JldHVybihhPDxrfGE+Pj4zMi1rKStmfWZ1bmN0aW9uIG4oYSxmLGcsaixoLGssbCl7YT1hKyhnXihmfH5qKSkraCtsO3JldHVybihhPDxrfGE+Pj4zMi1rKStmfWZvcih2YXIgcj1DcnlwdG9KUyxxPXIubGliLEY9cS5Xb3JkQXJyYXkscz1xLkhhc2hlcixxPXIuYWxnbyxhPVtdLHQ9MDs2ND50O3QrKylhW3RdPTQyOTQ5NjcyOTYqRS5hYnMoRS5zaW4odCsxKSl8MDtxPXEuTUQ1PXMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IEYuaW5pdChbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4XSl9LFxuX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKG0sZil7Zm9yKHZhciBnPTA7MTY+ZztnKyspe3ZhciBqPWYrZyxwPW1bal07bVtqXT0ocDw8OHxwPj4+MjQpJjE2NzExOTM1fChwPDwyNHxwPj4+OCkmNDI3ODI1NTM2MH12YXIgZz10aGlzLl9oYXNoLndvcmRzLGo9bVtmKzBdLHA9bVtmKzFdLHE9bVtmKzJdLHI9bVtmKzNdLHM9bVtmKzRdLHQ9bVtmKzVdLHU9bVtmKzZdLHY9bVtmKzddLHc9bVtmKzhdLHg9bVtmKzldLHk9bVtmKzEwXSx6PW1bZisxMV0sQT1tW2YrMTJdLEI9bVtmKzEzXSxDPW1bZisxNF0sRD1tW2YrMTVdLGI9Z1swXSxjPWdbMV0sZD1nWzJdLGU9Z1szXSxiPWgoYixjLGQsZSxqLDcsYVswXSksZT1oKGUsYixjLGQscCwxMixhWzFdKSxkPWgoZCxlLGIsYyxxLDE3LGFbMl0pLGM9aChjLGQsZSxiLHIsMjIsYVszXSksYj1oKGIsYyxkLGUscyw3LGFbNF0pLGU9aChlLGIsYyxkLHQsMTIsYVs1XSksZD1oKGQsZSxiLGMsdSwxNyxhWzZdKSxjPWgoYyxkLGUsYix2LDIyLGFbN10pLFxuYj1oKGIsYyxkLGUsdyw3LGFbOF0pLGU9aChlLGIsYyxkLHgsMTIsYVs5XSksZD1oKGQsZSxiLGMseSwxNyxhWzEwXSksYz1oKGMsZCxlLGIseiwyMixhWzExXSksYj1oKGIsYyxkLGUsQSw3LGFbMTJdKSxlPWgoZSxiLGMsZCxCLDEyLGFbMTNdKSxkPWgoZCxlLGIsYyxDLDE3LGFbMTRdKSxjPWgoYyxkLGUsYixELDIyLGFbMTVdKSxiPWsoYixjLGQsZSxwLDUsYVsxNl0pLGU9ayhlLGIsYyxkLHUsOSxhWzE3XSksZD1rKGQsZSxiLGMseiwxNCxhWzE4XSksYz1rKGMsZCxlLGIsaiwyMCxhWzE5XSksYj1rKGIsYyxkLGUsdCw1LGFbMjBdKSxlPWsoZSxiLGMsZCx5LDksYVsyMV0pLGQ9ayhkLGUsYixjLEQsMTQsYVsyMl0pLGM9ayhjLGQsZSxiLHMsMjAsYVsyM10pLGI9ayhiLGMsZCxlLHgsNSxhWzI0XSksZT1rKGUsYixjLGQsQyw5LGFbMjVdKSxkPWsoZCxlLGIsYyxyLDE0LGFbMjZdKSxjPWsoYyxkLGUsYix3LDIwLGFbMjddKSxiPWsoYixjLGQsZSxCLDUsYVsyOF0pLGU9ayhlLGIsXG5jLGQscSw5LGFbMjldKSxkPWsoZCxlLGIsYyx2LDE0LGFbMzBdKSxjPWsoYyxkLGUsYixBLDIwLGFbMzFdKSxiPWwoYixjLGQsZSx0LDQsYVszMl0pLGU9bChlLGIsYyxkLHcsMTEsYVszM10pLGQ9bChkLGUsYixjLHosMTYsYVszNF0pLGM9bChjLGQsZSxiLEMsMjMsYVszNV0pLGI9bChiLGMsZCxlLHAsNCxhWzM2XSksZT1sKGUsYixjLGQscywxMSxhWzM3XSksZD1sKGQsZSxiLGMsdiwxNixhWzM4XSksYz1sKGMsZCxlLGIseSwyMyxhWzM5XSksYj1sKGIsYyxkLGUsQiw0LGFbNDBdKSxlPWwoZSxiLGMsZCxqLDExLGFbNDFdKSxkPWwoZCxlLGIsYyxyLDE2LGFbNDJdKSxjPWwoYyxkLGUsYix1LDIzLGFbNDNdKSxiPWwoYixjLGQsZSx4LDQsYVs0NF0pLGU9bChlLGIsYyxkLEEsMTEsYVs0NV0pLGQ9bChkLGUsYixjLEQsMTYsYVs0Nl0pLGM9bChjLGQsZSxiLHEsMjMsYVs0N10pLGI9bihiLGMsZCxlLGosNixhWzQ4XSksZT1uKGUsYixjLGQsdiwxMCxhWzQ5XSksZD1uKGQsZSxiLGMsXG5DLDE1LGFbNTBdKSxjPW4oYyxkLGUsYix0LDIxLGFbNTFdKSxiPW4oYixjLGQsZSxBLDYsYVs1Ml0pLGU9bihlLGIsYyxkLHIsMTAsYVs1M10pLGQ9bihkLGUsYixjLHksMTUsYVs1NF0pLGM9bihjLGQsZSxiLHAsMjEsYVs1NV0pLGI9bihiLGMsZCxlLHcsNixhWzU2XSksZT1uKGUsYixjLGQsRCwxMCxhWzU3XSksZD1uKGQsZSxiLGMsdSwxNSxhWzU4XSksYz1uKGMsZCxlLGIsQiwyMSxhWzU5XSksYj1uKGIsYyxkLGUscyw2LGFbNjBdKSxlPW4oZSxiLGMsZCx6LDEwLGFbNjFdKSxkPW4oZCxlLGIsYyxxLDE1LGFbNjJdKSxjPW4oYyxkLGUsYix4LDIxLGFbNjNdKTtnWzBdPWdbMF0rYnwwO2dbMV09Z1sxXStjfDA7Z1syXT1nWzJdK2R8MDtnWzNdPWdbM10rZXwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2RhdGEsZj1hLndvcmRzLGc9OCp0aGlzLl9uRGF0YUJ5dGVzLGo9OCphLnNpZ0J5dGVzO2Zbaj4+PjVdfD0xMjg8PDI0LWolMzI7dmFyIGg9RS5mbG9vcihnL1xuNDI5NDk2NzI5Nik7Zlsoais2ND4+Pjk8PDQpKzE1XT0oaDw8OHxoPj4+MjQpJjE2NzExOTM1fChoPDwyNHxoPj4+OCkmNDI3ODI1NTM2MDtmWyhqKzY0Pj4+OTw8NCkrMTRdPShnPDw4fGc+Pj4yNCkmMTY3MTE5MzV8KGc8PDI0fGc+Pj44KSY0Mjc4MjU1MzYwO2Euc2lnQnl0ZXM9NCooZi5sZW5ndGgrMSk7dGhpcy5fcHJvY2VzcygpO2E9dGhpcy5faGFzaDtmPWEud29yZHM7Zm9yKGc9MDs0Pmc7ZysrKWo9ZltnXSxmW2ddPShqPDw4fGo+Pj4yNCkmMTY3MTE5MzV8KGo8PDI0fGo+Pj44KSY0Mjc4MjU1MzYwO3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPXMuY2xvbmUuY2FsbCh0aGlzKTthLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gYX19KTtyLk1ENT1zLl9jcmVhdGVIZWxwZXIocSk7ci5IbWFjTUQ1PXMuX2NyZWF0ZUhtYWNIZWxwZXIocSl9KShNYXRoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGExLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgaz1DcnlwdG9KUyxiPWsubGliLG09Yi5Xb3JkQXJyYXksbD1iLkhhc2hlcixkPVtdLGI9ay5hbGdvLlNIQTE9bC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgbS5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24obixwKXtmb3IodmFyIGE9dGhpcy5faGFzaC53b3JkcyxlPWFbMF0sZj1hWzFdLGg9YVsyXSxqPWFbM10sYj1hWzRdLGM9MDs4MD5jO2MrKyl7aWYoMTY+YylkW2NdPW5bcCtjXXwwO2Vsc2V7dmFyIGc9ZFtjLTNdXmRbYy04XV5kW2MtMTRdXmRbYy0xNl07ZFtjXT1nPDwxfGc+Pj4zMX1nPShlPDw1fGU+Pj4yNykrYitkW2NdO2c9MjA+Yz9nKygoZiZofH5mJmopKzE1MTg1MDAyNDkpOjQwPmM/ZysoKGZeaF5qKSsxODU5Nzc1MzkzKTo2MD5jP2crKChmJmh8ZiZqfGgmaiktMTg5NDAwNzU4OCk6ZysoKGZeaF5cbmopLTg5OTQ5NzUxNCk7Yj1qO2o9aDtoPWY8PDMwfGY+Pj4yO2Y9ZTtlPWd9YVswXT1hWzBdK2V8MDthWzFdPWFbMV0rZnwwO2FbMl09YVsyXStofDA7YVszXT1hWzNdK2p8MDthWzRdPWFbNF0rYnwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2RhdGEsZD1iLndvcmRzLGE9OCp0aGlzLl9uRGF0YUJ5dGVzLGU9OCpiLnNpZ0J5dGVzO2RbZT4+PjVdfD0xMjg8PDI0LWUlMzI7ZFsoZSs2ND4+Pjk8PDQpKzE0XT1NYXRoLmZsb29yKGEvNDI5NDk2NzI5Nik7ZFsoZSs2ND4+Pjk8PDQpKzE1XT1hO2Iuc2lnQnl0ZXM9NCpkLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9bC5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2suU0hBMT1sLl9jcmVhdGVIZWxwZXIoYik7ay5IbWFjU0hBMT1sLl9jcmVhdGVIbWFjSGVscGVyKGIpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGEyNTYtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbihrKXtmb3IodmFyIGc9Q3J5cHRvSlMsaD1nLmxpYix2PWguV29yZEFycmF5LGo9aC5IYXNoZXIsaD1nLmFsZ28scz1bXSx0PVtdLHU9ZnVuY3Rpb24ocSl7cmV0dXJuIDQyOTQ5NjcyOTYqKHEtKHF8MCkpfDB9LGw9MixiPTA7NjQ+Yjspe3ZhciBkO2E6e2Q9bDtmb3IodmFyIHc9ay5zcXJ0KGQpLHI9MjtyPD13O3IrKylpZighKGQlcikpe2Q9ITE7YnJlYWsgYX1kPSEwfWQmJig4PmImJihzW2JdPXUoay5wb3cobCwwLjUpKSksdFtiXT11KGsucG93KGwsMS8zKSksYisrKTtsKyt9dmFyIG49W10saD1oLlNIQTI1Nj1qLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyB2LmluaXQocy5zbGljZSgwKSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihxLGgpe2Zvcih2YXIgYT10aGlzLl9oYXNoLndvcmRzLGM9YVswXSxkPWFbMV0sYj1hWzJdLGs9YVszXSxmPWFbNF0sZz1hWzVdLGo9YVs2XSxsPWFbN10sZT0wOzY0PmU7ZSsrKXtpZigxNj5lKW5bZV09XG5xW2grZV18MDtlbHNle3ZhciBtPW5bZS0xNV0scD1uW2UtMl07bltlXT0oKG08PDI1fG0+Pj43KV4obTw8MTR8bT4+PjE4KV5tPj4+MykrbltlLTddKygocDw8MTV8cD4+PjE3KV4ocDw8MTN8cD4+PjE5KV5wPj4+MTApK25bZS0xNl19bT1sKygoZjw8MjZ8Zj4+PjYpXihmPDwyMXxmPj4+MTEpXihmPDw3fGY+Pj4yNSkpKyhmJmdefmYmaikrdFtlXStuW2VdO3A9KChjPDwzMHxjPj4+MileKGM8PDE5fGM+Pj4xMyleKGM8PDEwfGM+Pj4yMikpKyhjJmReYyZiXmQmYik7bD1qO2o9ZztnPWY7Zj1rK218MDtrPWI7Yj1kO2Q9YztjPW0rcHwwfWFbMF09YVswXStjfDA7YVsxXT1hWzFdK2R8MDthWzJdPWFbMl0rYnwwO2FbM109YVszXStrfDA7YVs0XT1hWzRdK2Z8MDthWzVdPWFbNV0rZ3wwO2FbNl09YVs2XStqfDA7YVs3XT1hWzddK2x8MH0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLl9kYXRhLGI9ZC53b3JkcyxhPTgqdGhpcy5fbkRhdGFCeXRlcyxjPTgqZC5zaWdCeXRlcztcbmJbYz4+PjVdfD0xMjg8PDI0LWMlMzI7YlsoYys2ND4+Pjk8PDQpKzE0XT1rLmZsb29yKGEvNDI5NDk2NzI5Nik7YlsoYys2ND4+Pjk8PDQpKzE1XT1hO2Quc2lnQnl0ZXM9NCpiLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9ai5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2cuU0hBMjU2PWouX2NyZWF0ZUhlbHBlcihoKTtnLkhtYWNTSEEyNTY9ai5fY3JlYXRlSG1hY0hlbHBlcihoKX0pKE1hdGgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTIyNC1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGI9Q3J5cHRvSlMsZD1iLmxpYi5Xb3JkQXJyYXksYT1iLmFsZ28sYz1hLlNIQTI1NixhPWEuU0hBMjI0PWMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGQuaW5pdChbMzIzODM3MTAzMiw5MTQxNTA2NjMsODEyNzAyOTk5LDQxNDQ5MTI2OTcsNDI5MDc3NTg1NywxNzUwNjAzMDI1LDE2OTQwNzY4MzksMzIwNDA3NTQyOF0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWMuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT00O3JldHVybiBhfX0pO2IuU0hBMjI0PWMuX2NyZWF0ZUhlbHBlcihhKTtiLkhtYWNTSEEyMjQ9Yy5fY3JlYXRlSG1hY0hlbHBlcihhKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhNTEyLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7cmV0dXJuIGQuY3JlYXRlLmFwcGx5KGQsYXJndW1lbnRzKX1mb3IodmFyIG49Q3J5cHRvSlMscj1uLmxpYi5IYXNoZXIsZT1uLng2NCxkPWUuV29yZCxUPWUuV29yZEFycmF5LGU9bi5hbGdvLGVhPVthKDExMTYzNTI0MDgsMzYwOTc2NzQ1OCksYSgxODk5NDQ3NDQxLDYwMjg5MTcyNSksYSgzMDQ5MzIzNDcxLDM5NjQ0ODQzOTkpLGEoMzkyMTAwOTU3MywyMTczMjk1NTQ4KSxhKDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxhKDE1MDg5NzA5OTMsMzA1MzgzNDI2NSksYSgyNDUzNjM1NzQ4LDI5Mzc2NzE1NzkpLGEoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxhKDM2MjQzODEwODAsMjczNDg4MzM5NCksYSgzMTA1OTg0MDEsMTE2NDk5NjU0MiksYSg2MDcyMjUyNzgsMTMyMzYxMDc2NCksYSgxNDI2ODgxOTg3LDM1OTAzMDQ5OTQpLGEoMTkyNTA3ODM4OCw0MDY4MTgyMzgzKSxhKDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxhKDI2MTQ4ODgxMDMsNjMzODAzMzE3KSxcbmEoMzI0ODIyMjU4MCwzNDc5Nzc0ODY4KSxhKDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCksYSg0MDIyMjI0Nzc0LDk0NDcxMTEzOSksYSgyNjQzNDcwNzgsMjM0MTI2Mjc3MyksYSg2MDQ4MDc2MjgsMjAwNzgwMDkzMyksYSg3NzAyNTU5ODMsMTQ5NTk5MDkwMSksYSgxMjQ5MTUwMTIyLDE4NTY0MzEyMzUpLGEoMTU1NTA4MTY5MiwzMTc1MjE4MTMyKSxhKDE5OTYwNjQ5ODYsMjE5ODk1MDgzNyksYSgyNTU0MjIwODgyLDM5OTk3MTkzMzkpLGEoMjgyMTgzNDM0OSw3NjY3ODQwMTYpLGEoMjk1Mjk5NjgwOCwyNTY2NTk0ODc5KSxhKDMyMTAzMTM2NzEsMzIwMzMzNzk1NiksYSgzMzM2NTcxODkxLDEwMzQ0NTcwMjYpLGEoMzU4NDUyODcxMSwyNDY2OTQ4OTAxKSxhKDExMzkyNjk5MywzNzU4MzI2MzgzKSxhKDMzODI0MTg5NSwxNjg3MTc5MzYpLGEoNjY2MzA3MjA1LDExODgxNzk5NjQpLGEoNzczNTI5OTEyLDE1NDYwNDU3MzQpLGEoMTI5NDc1NzM3MiwxNTIyODA1NDg1KSxhKDEzOTYxODIyOTEsXG4yNjQzODMzODIzKSxhKDE2OTUxODM3MDAsMjM0MzUyNzM5MCksYSgxOTg2NjYxMDUxLDEwMTQ0Nzc0ODApLGEoMjE3NzAyNjM1MCwxMjA2NzU5MTQyKSxhKDI0NTY5NTYwMzcsMzQ0MDc3NjI3KSxhKDI3MzA0ODU5MjEsMTI5MDg2MzQ2MCksYSgyODIwMzAyNDExLDMxNTg0NTQyNzMpLGEoMzI1OTczMDgwMCwzNTA1OTUyNjU3KSxhKDMzNDU3NjQ3NzEsMTA2MjE3MDA4KSxhKDM1MTYwNjU4MTcsMzYwNjAwODM0NCksYSgzNjAwMzUyODA0LDE0MzI3MjU3NzYpLGEoNDA5NDU3MTkwOSwxNDY3MDMxNTk0KSxhKDI3NTQyMzM0NCw4NTExNjk3MjApLGEoNDMwMjI3NzM0LDMxMDA4MjM3NTIpLGEoNTA2OTQ4NjE2LDEzNjMyNTgxOTUpLGEoNjU5MDYwNTU2LDM3NTA2ODU1OTMpLGEoODgzOTk3ODc3LDM3ODUwNTAyODApLGEoOTU4MTM5NTcxLDMzMTgzMDc0MjcpLGEoMTMyMjgyMjIxOCwzODEyNzIzNDAzKSxhKDE1MzcwMDIwNjMsMjAwMzAzNDk5NSksYSgxNzQ3ODczNzc5LDM2MDIwMzY4OTkpLFxuYSgxOTU1NTYyMjIyLDE1NzU5OTAwMTIpLGEoMjAyNDEwNDgxNSwxMTI1NTkyOTI4KSxhKDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksYSgyMzYxODUyNDI0LDQ0Mjc3NjA0NCksYSgyNDI4NDM2NDc0LDU5MzY5ODM0NCksYSgyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLGEoMzIwNDAzMTQ3OSwyOTk5MzUxNTczKSxhKDMzMjkzMjUyOTgsMzgxNTkyMDQyNyksYSgzMzkxNTY5NjE0LDM5MjgzODM5MDApLGEoMzUxNTI2NzI3MSw1NjYyODA3MTEpLGEoMzk0MDE4NzYwNiwzNDU0MDY5NTM0KSxhKDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksYSgxMTY0MTg0NzQsMTkxNDEzODU1NCksYSgxNzQyOTI0MjEsMjczMTA1NTI3MCksYSgyODkzODAzNTYsMzIwMzk5MzAwNiksYSg0NjAzOTMyNjksMzIwNjIwMzE1KSxhKDY4NTQ3MTczMyw1ODc0OTY4MzYpLGEoODUyMTQyOTcxLDEwODY3OTI4NTEpLGEoMTAxNzAzNjI5OCwzNjU1NDMxMDApLGEoMTEyNjAwMDU4MCwyNjE4Mjk3Njc2KSxhKDEyODgwMzM0NzAsXG4zNDA5ODU1MTU4KSxhKDE1MDE1MDU5NDgsNDIzNDUwOTg2NiksYSgxNjA3MTY3OTE1LDk4NzE2NzQ2OCksYSgxODE2NDAyMzE2LDEyNDYxODk1OTEpXSx2PVtdLHc9MDs4MD53O3crKyl2W3ddPWEoKTtlPWUuU0hBNTEyPXIuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IFQuaW5pdChbbmV3IGQuaW5pdCgxNzc5MDMzNzAzLDQwODkyMzU3MjApLG5ldyBkLmluaXQoMzE0NDEzNDI3NywyMjI3ODczNTk1KSxuZXcgZC5pbml0KDEwMTM5MDQyNDIsNDI3MTE3NTcyMyksbmV3IGQuaW5pdCgyNzczNDgwNzYyLDE1OTU3NTAxMjkpLG5ldyBkLmluaXQoMTM1OTg5MzExOSwyOTE3NTY1MTM3KSxuZXcgZC5pbml0KDI2MDA4MjI5MjQsNzI1NTExMTk5KSxuZXcgZC5pbml0KDUyODczNDYzNSw0MjE1Mzg5NTQ3KSxuZXcgZC5pbml0KDE1NDE0NTkyMjUsMzI3MDMzMjA5KV0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxkKXtmb3IodmFyIGY9dGhpcy5faGFzaC53b3JkcyxcbkY9ZlswXSxlPWZbMV0sbj1mWzJdLHI9ZlszXSxHPWZbNF0sSD1mWzVdLEk9Zls2XSxmPWZbN10sdz1GLmhpZ2gsSj1GLmxvdyxYPWUuaGlnaCxLPWUubG93LFk9bi5oaWdoLEw9bi5sb3csWj1yLmhpZ2gsTT1yLmxvdywkPUcuaGlnaCxOPUcubG93LGFhPUguaGlnaCxPPUgubG93LGJhPUkuaGlnaCxQPUkubG93LGNhPWYuaGlnaCxRPWYubG93LGs9dyxnPUosej1YLHg9SyxBPVkseT1MLFU9WixCPU0sbD0kLGg9TixSPWFhLEM9TyxTPWJhLEQ9UCxWPWNhLEU9USxtPTA7ODA+bTttKyspe3ZhciBzPXZbbV07aWYoMTY+bSl2YXIgaj1zLmhpZ2g9YVtkKzIqbV18MCxiPXMubG93PWFbZCsyKm0rMV18MDtlbHNle3ZhciBqPXZbbS0xNV0sYj1qLmhpZ2gscD1qLmxvdyxqPShiPj4+MXxwPDwzMSleKGI+Pj44fHA8PDI0KV5iPj4+NyxwPShwPj4+MXxiPDwzMSleKHA+Pj44fGI8PDI0KV4ocD4+Pjd8Yjw8MjUpLHU9dlttLTJdLGI9dS5oaWdoLGM9dS5sb3csdT0oYj4+PjE5fGM8PDEzKV4oYjw8XG4zfGM+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/MTpcbjApLGM9Yyt0LHE9cStXKyhjPj4+MDx0Pj4+MD8xOjApLGM9YytkYSxxPXErZmErKGM+Pj4wPGRhPj4+MD8xOjApLGM9YytiLHE9cStqKyhjPj4+MDxiPj4+MD8xOjApLGI9dStULHM9cCtzKyhiPj4+MDx1Pj4+MD8xOjApLFY9UyxFPUQsUz1SLEQ9QyxSPWwsQz1oLGg9QitjfDAsbD1VK3ErKGg+Pj4wPEI+Pj4wPzE6MCl8MCxVPUEsQj15LEE9eix5PXgsej1rLHg9ZyxnPWMrYnwwLGs9cStzKyhnPj4+MDxjPj4+MD8xOjApfDB9Sj1GLmxvdz1KK2c7Ri5oaWdoPXcraysoSj4+PjA8Zz4+PjA/MTowKTtLPWUubG93PUsreDtlLmhpZ2g9WCt6KyhLPj4+MDx4Pj4+MD8xOjApO0w9bi5sb3c9TCt5O24uaGlnaD1ZK0ErKEw+Pj4wPHk+Pj4wPzE6MCk7TT1yLmxvdz1NK0I7ci5oaWdoPVorVSsoTT4+PjA8Qj4+PjA/MTowKTtOPUcubG93PU4raDtHLmhpZ2g9JCtsKyhOPj4+MDxoPj4+MD8xOjApO089SC5sb3c9TytDO0guaGlnaD1hYStSKyhPPj4+MDxDPj4+MD8xOjApO1A9SS5sb3c9UCtEO1xuSS5oaWdoPWJhK1MrKFA+Pj4wPEQ+Pj4wPzE6MCk7UT1mLmxvdz1RK0U7Zi5oaWdoPWNhK1YrKFE+Pj4wPEU+Pj4wPzE6MCl9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fZGF0YSxkPWEud29yZHMsZj04KnRoaXMuX25EYXRhQnl0ZXMsZT04KmEuc2lnQnl0ZXM7ZFtlPj4+NV18PTEyODw8MjQtZSUzMjtkWyhlKzEyOD4+PjEwPDw1KSszMF09TWF0aC5mbG9vcihmLzQyOTQ5NjcyOTYpO2RbKGUrMTI4Pj4+MTA8PDUpKzMxXT1mO2Euc2lnQnl0ZXM9NCpkLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2gudG9YMzIoKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYT1yLmNsb25lLmNhbGwodGhpcyk7YS5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGF9LGJsb2NrU2l6ZTozMn0pO24uU0hBNTEyPXIuX2NyZWF0ZUhlbHBlcihlKTtuLkhtYWNTSEE1MTI9ci5fY3JlYXRlSG1hY0hlbHBlcihlKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhMzg0LW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxhPWMueDY0LGI9YS5Xb3JkLGU9YS5Xb3JkQXJyYXksYT1jLmFsZ28sZD1hLlNIQTUxMixhPWEuU0hBMzg0PWQuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGUuaW5pdChbbmV3IGIuaW5pdCgzNDE4MDcwMzY1LDMyMzgzNzEwMzIpLG5ldyBiLmluaXQoMTY1NDI3MDI1MCw5MTQxNTA2NjMpLG5ldyBiLmluaXQoMjQzODUyOTM3MCw4MTI3MDI5OTkpLG5ldyBiLmluaXQoMzU1NDYyMzYwLDQxNDQ5MTI2OTcpLG5ldyBiLmluaXQoMTczMTQwNTQxNSw0MjkwNzc1ODU3KSxuZXcgYi5pbml0KDIzOTQxODAyMzEsMTc1MDYwMzAyNSksbmV3IGIuaW5pdCgzNjc1MDA4NTI1LDE2OTQwNzY4MzkpLG5ldyBiLmluaXQoMTIwMzA2MjgxMywzMjA0MDc1NDI4KV0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWQuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT0xNjtyZXR1cm4gYX19KTtjLlNIQTM4ND1cbmQuX2NyZWF0ZUhlbHBlcihhKTtjLkhtYWNTSEEzODQ9ZC5fY3JlYXRlSG1hY0hlbHBlcihhKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgcmlwZW1kMTYwLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4vKlxuXG4oYykgMjAxMiBieSBDZWRyaWMgTWVzbmlsLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbihmdW5jdGlvbigpe3ZhciBxPUNyeXB0b0pTLGQ9cS5saWIsbj1kLldvcmRBcnJheSxwPWQuSGFzaGVyLGQ9cS5hbGdvLHg9bi5jcmVhdGUoWzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10pLHk9bi5jcmVhdGUoWzUsMTQsNywwLDksMiwxMSw0LDEzLDYsMTUsOCwxLDEwLDMsMTIsNiwxMSwzLDcsMCwxMyw1LDEwLDE0LDE1LDgsMTIsNCw5LDEsMiwxNSw1LDEsMyw3LDE0LDYsOSwxMSw4LDEyLDIsMTAsMCw0LDEzLDgsNiw0LDEsMywxMSwxNSwwLDUsMTIsMiwxMyw5LDcsMTAsMTQsMTIsMTUsMTAsNCwxLDUsOCw3LDYsMiwxMywxNCwwLDMsOSwxMV0pLHo9bi5jcmVhdGUoWzExLDE0LDE1LDEyLFxuNSw4LDcsOSwxMSwxMywxNCwxNSw2LDcsOSw4LDcsNiw4LDEzLDExLDksNywxNSw3LDEyLDE1LDksMTEsNywxMywxMiwxMSwxMyw2LDcsMTQsOSwxMywxNSwxNCw4LDEzLDYsNSwxMiw3LDUsMTEsMTIsMTQsMTUsMTQsMTUsOSw4LDksMTQsNSw2LDgsNiw1LDEyLDksMTUsNSwxMSw2LDgsMTMsMTIsNSwxMiwxMywxNCwxMSw4LDUsNl0pLEE9bi5jcmVhdGUoWzgsOSw5LDExLDEzLDE1LDE1LDUsNyw3LDgsMTEsMTQsMTQsMTIsNiw5LDEzLDE1LDcsMTIsOCw5LDExLDcsNywxMiw3LDYsMTUsMTMsMTEsOSw3LDE1LDExLDgsNiw2LDE0LDEyLDEzLDUsMTQsMTMsMTMsNyw1LDE1LDUsOCwxMSwxNCwxNCw2LDE0LDYsOSwxMiw5LDEyLDUsMTUsOCw4LDUsMTIsOSwxMiw1LDE0LDYsOCwxMyw2LDUsMTUsMTMsMTEsMTFdKSxCPW4uY3JlYXRlKFswLDE1MTg1MDAyNDksMTg1OTc3NTM5MywyNDAwOTU5NzA4LDI4NDA4NTM4MzhdKSxDPW4uY3JlYXRlKFsxMzUyODI5OTI2LDE1NDg2MDM2ODQsMTgzNjA3MjY5MSxcbjIwNTM5OTQyMTcsMF0pLGQ9ZC5SSVBFTUQxNjA9cC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uLmNyZWF0ZShbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGUsdil7Zm9yKHZhciBiPTA7MTY+YjtiKyspe3ZhciBjPXYrYixmPWVbY107ZVtjXT0oZjw8OHxmPj4+MjQpJjE2NzExOTM1fChmPDwyNHxmPj4+OCkmNDI3ODI1NTM2MH12YXIgYz10aGlzLl9oYXNoLndvcmRzLGY9Qi53b3JkcyxkPUMud29yZHMsbj14LndvcmRzLHE9eS53b3JkcyxwPXoud29yZHMsdz1BLndvcmRzLHQsZyxoLGoscix1LGssbCxtLHM7dT10PWNbMF07az1nPWNbMV07bD1oPWNbMl07bT1qPWNbM107cz1yPWNbNF07Zm9yKHZhciBhLGI9MDs4MD5iO2IrPTEpYT10K2VbdituW2JdXXwwLGE9MTY+Yj9hKygoZ15oXmopK2ZbMF0pOjMyPmI/YSsoKGcmaHx+ZyZqKStmWzFdKTo0OD5iP1xuYSsoKChnfH5oKV5qKStmWzJdKTo2ND5iP2ErKChnJmp8aCZ+aikrZlszXSk6YSsoKGdeKGh8fmopKStmWzRdKSxhfD0wLGE9YTw8cFtiXXxhPj4+MzItcFtiXSxhPWErcnwwLHQ9cixyPWosaj1oPDwxMHxoPj4+MjIsaD1nLGc9YSxhPXUrZVt2K3FbYl1dfDAsYT0xNj5iP2ErKChrXihsfH5tKSkrZFswXSk6MzI+Yj9hKygoayZtfGwmfm0pK2RbMV0pOjQ4PmI/YSsoKChrfH5sKV5tKStkWzJdKTo2ND5iP2ErKChrJmx8fmsmbSkrZFszXSk6YSsoKGtebF5tKStkWzRdKSxhfD0wLGE9YTw8d1tiXXxhPj4+MzItd1tiXSxhPWErc3wwLHU9cyxzPW0sbT1sPDwxMHxsPj4+MjIsbD1rLGs9YTthPWNbMV0raCttfDA7Y1sxXT1jWzJdK2orc3wwO2NbMl09Y1szXStyK3V8MDtjWzNdPWNbNF0rdCtrfDA7Y1s0XT1jWzBdK2crbHwwO2NbMF09YX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9kYXRhLGQ9ZS53b3JkcyxiPTgqdGhpcy5fbkRhdGFCeXRlcyxjPTgqZS5zaWdCeXRlcztcbmRbYz4+PjVdfD0xMjg8PDI0LWMlMzI7ZFsoYys2ND4+Pjk8PDQpKzE0XT0oYjw8OHxiPj4+MjQpJjE2NzExOTM1fChiPDwyNHxiPj4+OCkmNDI3ODI1NTM2MDtlLnNpZ0J5dGVzPTQqKGQubGVuZ3RoKzEpO3RoaXMuX3Byb2Nlc3MoKTtlPXRoaXMuX2hhc2g7ZD1lLndvcmRzO2ZvcihiPTA7NT5iO2IrKyljPWRbYl0sZFtiXT0oYzw8OHxjPj4+MjQpJjE2NzExOTM1fChjPDwyNHxjPj4+OCkmNDI3ODI1NTM2MDtyZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgZD1wLmNsb25lLmNhbGwodGhpcyk7ZC5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGR9fSk7cS5SSVBFTUQxNjA9cC5fY3JlYXRlSGVscGVyKGQpO3EuSG1hY1JJUEVNRDE2MD1wLl9jcmVhdGVIbWFjSGVscGVyKGQpfSkoTWF0aCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgaG1hYy5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxrPWMuZW5jLlV0Zjg7Yy5hbGdvLkhNQUM9Yy5saWIuQmFzZS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSxiKXthPXRoaXMuX2hhc2hlcj1uZXcgYS5pbml0O1wic3RyaW5nXCI9PXR5cGVvZiBiJiYoYj1rLnBhcnNlKGIpKTt2YXIgYz1hLmJsb2NrU2l6ZSxlPTQqYztiLnNpZ0J5dGVzPmUmJihiPWEuZmluYWxpemUoYikpO2IuY2xhbXAoKTtmb3IodmFyIGY9dGhpcy5fb0tleT1iLmNsb25lKCksZz10aGlzLl9pS2V5PWIuY2xvbmUoKSxoPWYud29yZHMsaj1nLndvcmRzLGQ9MDtkPGM7ZCsrKWhbZF1ePTE1NDk1NTY4MjgsaltkXV49OTA5NTIyNDg2O2Yuc2lnQnl0ZXM9Zy5zaWdCeXRlcz1lO3RoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9oYXNoZXI7YS5yZXNldCgpO2EudXBkYXRlKHRoaXMuX2lLZXkpfSx1cGRhdGU6ZnVuY3Rpb24oYSl7dGhpcy5faGFzaGVyLnVwZGF0ZShhKTtyZXR1cm4gdGhpc30sZmluYWxpemU6ZnVuY3Rpb24oYSl7dmFyIGI9XG50aGlzLl9oYXNoZXI7YT1iLmZpbmFsaXplKGEpO2IucmVzZXQoKTtyZXR1cm4gYi5maW5hbGl6ZSh0aGlzLl9vS2V5LmNsb25lKCkuY29uY2F0KGEpKX19KX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgcGJrZGYyLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYj1DcnlwdG9KUyxhPWIubGliLGQ9YS5CYXNlLG09YS5Xb3JkQXJyYXksYT1iLmFsZ28scT1hLkhNQUMsbD1hLlBCS0RGMj1kLmV4dGVuZCh7Y2ZnOmQuZXh0ZW5kKHtrZXlTaXplOjQsaGFzaGVyOmEuU0hBMSxpdGVyYXRpb25zOjF9KSxpbml0OmZ1bmN0aW9uKGEpe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChhKX0sY29tcHV0ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz10aGlzLmNmZyxmPXEuY3JlYXRlKGMuaGFzaGVyLGEpLGc9bS5jcmVhdGUoKSxkPW0uY3JlYXRlKFsxXSksbD1nLndvcmRzLHI9ZC53b3JkcyxuPWMua2V5U2l6ZSxjPWMuaXRlcmF0aW9ucztsLmxlbmd0aDxuOyl7dmFyIGg9Zi51cGRhdGUoYikuZmluYWxpemUoZCk7Zi5yZXNldCgpO2Zvcih2YXIgaj1oLndvcmRzLHM9ai5sZW5ndGgsaz1oLHA9MTtwPGM7cCsrKXtrPWYuZmluYWxpemUoayk7Zi5yZXNldCgpO2Zvcih2YXIgdD1rLndvcmRzLGU9MDtlPHM7ZSsrKWpbZV1ePXRbZV19Zy5jb25jYXQoaCk7XG5yWzBdKyt9Zy5zaWdCeXRlcz00Km47cmV0dXJuIGd9fSk7Yi5QQktERjI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBsLmNyZWF0ZShjKS5jb21wdXRlKGEsYil9fSkoKTtcblxuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbnZhciBiNjRtYXA9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7dmFyIGI2NHBhZD1cIj1cIjtmdW5jdGlvbiBoZXgyYjY0KGQpe3ZhciBiO3ZhciBlO3ZhciBhPVwiXCI7Zm9yKGI9MDtiKzM8PWQubGVuZ3RoO2IrPTMpe2U9cGFyc2VJbnQoZC5zdWJzdHJpbmcoYixiKzMpLDE2KTthKz1iNjRtYXAuY2hhckF0KGU+PjYpK2I2NG1hcC5jaGFyQXQoZSY2Myl9aWYoYisxPT1kLmxlbmd0aCl7ZT1wYXJzZUludChkLnN1YnN0cmluZyhiLGIrMSksMTYpO2ErPWI2NG1hcC5jaGFyQXQoZTw8Mil9ZWxzZXtpZihiKzI9PWQubGVuZ3RoKXtlPXBhcnNlSW50KGQuc3Vic3RyaW5nKGIsYisyKSwxNik7YSs9YjY0bWFwLmNoYXJBdChlPj4yKStiNjRtYXAuY2hhckF0KChlJjMpPDw0KX19aWYoYjY0cGFkKXt3aGlsZSgoYS5sZW5ndGgmMyk+MCl7YSs9YjY0cGFkfX1yZXR1cm4gYX1mdW5jdGlvbiBiNjR0b2hleChmKXt2YXIgZD1cIlwiO3ZhciBlO3ZhciBiPTA7dmFyIGM7dmFyIGE7Zm9yKGU9MDtlPGYubGVuZ3RoOysrZSl7aWYoZi5jaGFyQXQoZSk9PWI2NHBhZCl7YnJlYWt9YT1iNjRtYXAuaW5kZXhPZihmLmNoYXJBdChlKSk7aWYoYTwwKXtjb250aW51ZX1pZihiPT0wKXtkKz1pbnQyY2hhcihhPj4yKTtjPWEmMztiPTF9ZWxzZXtpZihiPT0xKXtkKz1pbnQyY2hhcigoYzw8Mil8KGE+PjQpKTtjPWEmMTU7Yj0yfWVsc2V7aWYoYj09Mil7ZCs9aW50MmNoYXIoYyk7ZCs9aW50MmNoYXIoYT4+Mik7Yz1hJjM7Yj0zfWVsc2V7ZCs9aW50MmNoYXIoKGM8PDIpfChhPj40KSk7ZCs9aW50MmNoYXIoYSYxNSk7Yj0wfX19fWlmKGI9PTEpe2QrPWludDJjaGFyKGM8PDIpfXJldHVybiBkfWZ1bmN0aW9uIGI2NHRvQkEoZSl7dmFyIGQ9YjY0dG9oZXgoZSk7dmFyIGM7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKGM9MDsyKmM8ZC5sZW5ndGg7KytjKXtiW2NdPXBhcnNlSW50KGQuc3Vic3RyaW5nKDIqYywyKmMrMiksMTYpfXJldHVybiBifTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG52YXIgZGJpdHM7dmFyIGNhbmFyeT0yNDQ4Mzc4MTQwOTQ1OTA7dmFyIGpfbG09KChjYW5hcnkmMTY3NzcyMTUpPT0xNTcxNTA3MCk7ZnVuY3Rpb24gQmlnSW50ZWdlcihlLGQsZil7aWYoZSE9bnVsbCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpe3RoaXMuZnJvbU51bWJlcihlLGQsZil9ZWxzZXtpZihkPT1udWxsJiZcInN0cmluZ1wiIT10eXBlb2YgZSl7dGhpcy5mcm9tU3RyaW5nKGUsMjU2KX1lbHNle3RoaXMuZnJvbVN0cmluZyhlLGQpfX19fWZ1bmN0aW9uIG5iaSgpe3JldHVybiBuZXcgQmlnSW50ZWdlcihudWxsKX1mdW5jdGlvbiBhbTEoZixhLGIsZSxoLGcpe3doaWxlKC0tZz49MCl7dmFyIGQ9YSp0aGlzW2YrK10rYltlXStoO2g9TWF0aC5mbG9vcihkLzY3MTA4ODY0KTtiW2UrK109ZCY2NzEwODg2M31yZXR1cm4gaH1mdW5jdGlvbiBhbTIoZixxLHIsZSxvLGEpe3ZhciBrPXEmMzI3NjcscD1xPj4xNTt3aGlsZSgtLWE+PTApe3ZhciBkPXRoaXNbZl0mMzI3Njc7dmFyIGc9dGhpc1tmKytdPj4xNTt2YXIgYj1wKmQrZyprO2Q9aypkKygoYiYzMjc2Nyk8PDE1KStyW2VdKyhvJjEwNzM3NDE4MjMpO289KGQ+Pj4zMCkrKGI+Pj4xNSkrcCpnKyhvPj4+MzApO3JbZSsrXT1kJjEwNzM3NDE4MjN9cmV0dXJuIG99ZnVuY3Rpb24gYW0zKGYscSxyLGUsbyxhKXt2YXIgaz1xJjE2MzgzLHA9cT4+MTQ7d2hpbGUoLS1hPj0wKXt2YXIgZD10aGlzW2ZdJjE2MzgzO3ZhciBnPXRoaXNbZisrXT4+MTQ7dmFyIGI9cCpkK2cqaztkPWsqZCsoKGImMTYzODMpPDwxNCkrcltlXStvO289KGQ+PjI4KSsoYj4+MTQpK3AqZztyW2UrK109ZCYyNjg0MzU0NTV9cmV0dXJuIG99aWYoal9sbSYmKG5hdmlnYXRvci5hcHBOYW1lPT1cIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlclwiKSl7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0yO2RiaXRzPTMwfWVsc2V7aWYoal9sbSYmKG5hdmlnYXRvci5hcHBOYW1lIT1cIk5ldHNjYXBlXCIpKXtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbT1hbTE7ZGJpdHM9MjZ9ZWxzZXtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbT1hbTM7ZGJpdHM9Mjh9fUJpZ0ludGVnZXIucHJvdG90eXBlLkRCPWRiaXRzO0JpZ0ludGVnZXIucHJvdG90eXBlLkRNPSgoMTw8ZGJpdHMpLTEpO0JpZ0ludGVnZXIucHJvdG90eXBlLkRWPSgxPDxkYml0cyk7dmFyIEJJX0ZQPTUyO0JpZ0ludGVnZXIucHJvdG90eXBlLkZWPU1hdGgucG93KDIsQklfRlApO0JpZ0ludGVnZXIucHJvdG90eXBlLkYxPUJJX0ZQLWRiaXRzO0JpZ0ludGVnZXIucHJvdG90eXBlLkYyPTIqZGJpdHMtQklfRlA7dmFyIEJJX1JNPVwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7dmFyIEJJX1JDPW5ldyBBcnJheSgpO3ZhciBycix2djtycj1cIjBcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0wO3Z2PD05OysrdnYpe0JJX1JDW3JyKytdPXZ2fXJyPVwiYVwiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpe0JJX1JDW3JyKytdPXZ2fXJyPVwiQVwiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpe0JJX1JDW3JyKytdPXZ2fWZ1bmN0aW9uIGludDJjaGFyKGEpe3JldHVybiBCSV9STS5jaGFyQXQoYSl9ZnVuY3Rpb24gaW50QXQoYixhKXt2YXIgZD1CSV9SQ1tiLmNoYXJDb2RlQXQoYSldO3JldHVybihkPT1udWxsKT8tMTpkfWZ1bmN0aW9uIGJucENvcHlUbyhiKXtmb3IodmFyIGE9dGhpcy50LTE7YT49MDstLWEpe2JbYV09dGhpc1thXX1iLnQ9dGhpcy50O2Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wRnJvbUludChhKXt0aGlzLnQ9MTt0aGlzLnM9KGE8MCk/LTE6MDtpZihhPjApe3RoaXNbMF09YX1lbHNle2lmKGE8LTEpe3RoaXNbMF09YSt0aGlzLkRWfWVsc2V7dGhpcy50PTB9fX1mdW5jdGlvbiBuYnYoYSl7dmFyIGI9bmJpKCk7Yi5mcm9tSW50KGEpO3JldHVybiBifWZ1bmN0aW9uIGJucEZyb21TdHJpbmcoaCxjKXt2YXIgZTtpZihjPT0xNil7ZT00fWVsc2V7aWYoYz09OCl7ZT0zfWVsc2V7aWYoYz09MjU2KXtlPTh9ZWxzZXtpZihjPT0yKXtlPTF9ZWxzZXtpZihjPT0zMil7ZT01fWVsc2V7aWYoYz09NCl7ZT0yfWVsc2V7dGhpcy5mcm9tUmFkaXgoaCxjKTtyZXR1cm59fX19fX10aGlzLnQ9MDt0aGlzLnM9MDt2YXIgZz1oLmxlbmd0aCxkPWZhbHNlLGY9MDt3aGlsZSgtLWc+PTApe3ZhciBhPShlPT04KT9oW2ddJjI1NTppbnRBdChoLGcpO2lmKGE8MCl7aWYoaC5jaGFyQXQoZyk9PVwiLVwiKXtkPXRydWV9Y29udGludWV9ZD1mYWxzZTtpZihmPT0wKXt0aGlzW3RoaXMudCsrXT1hfWVsc2V7aWYoZitlPnRoaXMuREIpe3RoaXNbdGhpcy50LTFdfD0oYSYoKDE8PCh0aGlzLkRCLWYpKS0xKSk8PGY7dGhpc1t0aGlzLnQrK109KGE+Pih0aGlzLkRCLWYpKX1lbHNle3RoaXNbdGhpcy50LTFdfD1hPDxmfX1mKz1lO2lmKGY+PXRoaXMuREIpe2YtPXRoaXMuREJ9fWlmKGU9PTgmJihoWzBdJjEyOCkhPTApe3RoaXMucz0tMTtpZihmPjApe3RoaXNbdGhpcy50LTFdfD0oKDE8PCh0aGlzLkRCLWYpKS0xKTw8Zn19dGhpcy5jbGFtcCgpO2lmKGQpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpfX1mdW5jdGlvbiBibnBDbGFtcCgpe3ZhciBhPXRoaXMucyZ0aGlzLkRNO3doaWxlKHRoaXMudD4wJiZ0aGlzW3RoaXMudC0xXT09YSl7LS10aGlzLnR9fWZ1bmN0aW9uIGJuVG9TdHJpbmcoYyl7aWYodGhpcy5zPDApe3JldHVyblwiLVwiK3RoaXMubmVnYXRlKCkudG9TdHJpbmcoYyl9dmFyIGU7aWYoYz09MTYpe2U9NH1lbHNle2lmKGM9PTgpe2U9M31lbHNle2lmKGM9PTIpe2U9MX1lbHNle2lmKGM9PTMyKXtlPTV9ZWxzZXtpZihjPT00KXtlPTJ9ZWxzZXtyZXR1cm4gdGhpcy50b1JhZGl4KGMpfX19fX12YXIgZz0oMTw8ZSktMSxsLGE9ZmFsc2UsaD1cIlwiLGY9dGhpcy50O3ZhciBqPXRoaXMuREItKGYqdGhpcy5EQiklZTtpZihmLS0+MCl7aWYoajx0aGlzLkRCJiYobD10aGlzW2ZdPj5qKT4wKXthPXRydWU7aD1pbnQyY2hhcihsKX13aGlsZShmPj0wKXtpZihqPGUpe2w9KHRoaXNbZl0mKCgxPDxqKS0xKSk8PChlLWopO2x8PXRoaXNbLS1mXT4+KGorPXRoaXMuREItZSl9ZWxzZXtsPSh0aGlzW2ZdPj4oai09ZSkpJmc7aWYoajw9MCl7ais9dGhpcy5EQjstLWZ9fWlmKGw+MCl7YT10cnVlfWlmKGEpe2grPWludDJjaGFyKGwpfX19cmV0dXJuIGE/aDpcIjBcIn1mdW5jdGlvbiBibk5lZ2F0ZSgpe3ZhciBhPW5iaSgpO0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuQWJzKCl7cmV0dXJuKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXN9ZnVuY3Rpb24gYm5Db21wYXJlVG8oYil7dmFyIGQ9dGhpcy5zLWIucztpZihkIT0wKXtyZXR1cm4gZH12YXIgYz10aGlzLnQ7ZD1jLWIudDtpZihkIT0wKXtyZXR1cm4odGhpcy5zPDApPy1kOmR9d2hpbGUoLS1jPj0wKXtpZigoZD10aGlzW2NdLWJbY10pIT0wKXtyZXR1cm4gZH19cmV0dXJuIDB9ZnVuY3Rpb24gbmJpdHMoYSl7dmFyIGM9MSxiO2lmKChiPWE+Pj4xNikhPTApe2E9YjtjKz0xNn1pZigoYj1hPj44KSE9MCl7YT1iO2MrPTh9aWYoKGI9YT4+NCkhPTApe2E9YjtjKz00fWlmKChiPWE+PjIpIT0wKXthPWI7Yys9Mn1pZigoYj1hPj4xKSE9MCl7YT1iO2MrPTF9cmV0dXJuIGN9ZnVuY3Rpb24gYm5CaXRMZW5ndGgoKXtpZih0aGlzLnQ8PTApe3JldHVybiAwfXJldHVybiB0aGlzLkRCKih0aGlzLnQtMSkrbmJpdHModGhpc1t0aGlzLnQtMV1eKHRoaXMucyZ0aGlzLkRNKSl9ZnVuY3Rpb24gYm5wRExTaGlmdFRvKGMsYil7dmFyIGE7Zm9yKGE9dGhpcy50LTE7YT49MDstLWEpe2JbYStjXT10aGlzW2FdfWZvcihhPWMtMTthPj0wOy0tYSl7YlthXT0wfWIudD10aGlzLnQrYztiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucERSU2hpZnRUbyhjLGIpe2Zvcih2YXIgYT1jO2E8dGhpcy50OysrYSl7YlthLWNdPXRoaXNbYV19Yi50PU1hdGgubWF4KHRoaXMudC1jLDApO2Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wTFNoaWZ0VG8oaixlKXt2YXIgYj1qJXRoaXMuREI7dmFyIGE9dGhpcy5EQi1iO3ZhciBnPSgxPDxhKS0xO3ZhciBmPU1hdGguZmxvb3Ioai90aGlzLkRCKSxoPSh0aGlzLnM8PGIpJnRoaXMuRE0sZDtmb3IoZD10aGlzLnQtMTtkPj0wOy0tZCl7ZVtkK2YrMV09KHRoaXNbZF0+PmEpfGg7aD0odGhpc1tkXSZnKTw8Yn1mb3IoZD1mLTE7ZD49MDstLWQpe2VbZF09MH1lW2ZdPWg7ZS50PXRoaXMudCtmKzE7ZS5zPXRoaXMucztlLmNsYW1wKCl9ZnVuY3Rpb24gYm5wUlNoaWZ0VG8oZyxkKXtkLnM9dGhpcy5zO3ZhciBlPU1hdGguZmxvb3IoZy90aGlzLkRCKTtpZihlPj10aGlzLnQpe2QudD0wO3JldHVybn12YXIgYj1nJXRoaXMuREI7dmFyIGE9dGhpcy5EQi1iO3ZhciBmPSgxPDxiKS0xO2RbMF09dGhpc1tlXT4+Yjtmb3IodmFyIGM9ZSsxO2M8dGhpcy50OysrYyl7ZFtjLWUtMV18PSh0aGlzW2NdJmYpPDxhO2RbYy1lXT10aGlzW2NdPj5ifWlmKGI+MCl7ZFt0aGlzLnQtZS0xXXw9KHRoaXMucyZmKTw8YX1kLnQ9dGhpcy50LWU7ZC5jbGFtcCgpfWZ1bmN0aW9uIGJucFN1YlRvKGQsZil7dmFyIGU9MCxnPTAsYj1NYXRoLm1pbihkLnQsdGhpcy50KTt3aGlsZShlPGIpe2crPXRoaXNbZV0tZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWlmKGQudDx0aGlzLnQpe2ctPWQuczt3aGlsZShlPHRoaXMudCl7Zys9dGhpc1tlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWcrPXRoaXMuc31lbHNle2crPXRoaXMuczt3aGlsZShlPGQudCl7Zy09ZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWctPWQuc31mLnM9KGc8MCk/LTE6MDtpZihnPC0xKXtmW2UrK109dGhpcy5EVitnfWVsc2V7aWYoZz4wKXtmW2UrK109Z319Zi50PWU7Zi5jbGFtcCgpfWZ1bmN0aW9uIGJucE11bHRpcGx5VG8oYyxlKXt2YXIgYj10aGlzLmFicygpLGY9Yy5hYnMoKTt2YXIgZD1iLnQ7ZS50PWQrZi50O3doaWxlKC0tZD49MCl7ZVtkXT0wfWZvcihkPTA7ZDxmLnQ7KytkKXtlW2QrYi50XT1iLmFtKDAsZltkXSxlLGQsMCxiLnQpfWUucz0wO2UuY2xhbXAoKTtpZih0aGlzLnMhPWMucyl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKGUsZSl9fWZ1bmN0aW9uIGJucFNxdWFyZVRvKGQpe3ZhciBhPXRoaXMuYWJzKCk7dmFyIGI9ZC50PTIqYS50O3doaWxlKC0tYj49MCl7ZFtiXT0wfWZvcihiPTA7YjxhLnQtMTsrK2Ipe3ZhciBlPWEuYW0oYixhW2JdLGQsMipiLDAsMSk7aWYoKGRbYithLnRdKz1hLmFtKGIrMSwyKmFbYl0sZCwyKmIrMSxlLGEudC1iLTEpKT49YS5EVil7ZFtiK2EudF0tPWEuRFY7ZFtiK2EudCsxXT0xfX1pZihkLnQ+MCl7ZFtkLnQtMV0rPWEuYW0oYixhW2JdLGQsMipiLDAsMSl9ZC5zPTA7ZC5jbGFtcCgpfWZ1bmN0aW9uIGJucERpdlJlbVRvKG4saCxnKXt2YXIgdz1uLmFicygpO2lmKHcudDw9MCl7cmV0dXJufXZhciBrPXRoaXMuYWJzKCk7aWYoay50PHcudCl7aWYoaCE9bnVsbCl7aC5mcm9tSW50KDApfWlmKGchPW51bGwpe3RoaXMuY29weVRvKGcpfXJldHVybn1pZihnPT1udWxsKXtnPW5iaSgpfXZhciBkPW5iaSgpLGE9dGhpcy5zLGw9bi5zO3ZhciB2PXRoaXMuREItbmJpdHMod1t3LnQtMV0pO2lmKHY+MCl7dy5sU2hpZnRUbyh2LGQpO2subFNoaWZ0VG8odixnKX1lbHNle3cuY29weVRvKGQpO2suY29weVRvKGcpfXZhciBwPWQudDt2YXIgYj1kW3AtMV07aWYoYj09MCl7cmV0dXJufXZhciBvPWIqKDE8PHRoaXMuRjEpKygocD4xKT9kW3AtMl0+PnRoaXMuRjI6MCk7dmFyIEE9dGhpcy5GVi9vLHo9KDE8PHRoaXMuRjEpL28seD0xPDx0aGlzLkYyO3ZhciB1PWcudCxzPXUtcCxmPShoPT1udWxsKT9uYmkoKTpoO2QuZGxTaGlmdFRvKHMsZik7aWYoZy5jb21wYXJlVG8oZik+PTApe2dbZy50KytdPTE7Zy5zdWJUbyhmLGcpfUJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbyhwLGYpO2Yuc3ViVG8oZCxkKTt3aGlsZShkLnQ8cCl7ZFtkLnQrK109MH13aGlsZSgtLXM+PTApe3ZhciBjPShnWy0tdV09PWIpP3RoaXMuRE06TWF0aC5mbG9vcihnW3VdKkErKGdbdS0xXSt4KSp6KTtpZigoZ1t1XSs9ZC5hbSgwLGMsZyxzLDAscCkpPGMpe2QuZGxTaGlmdFRvKHMsZik7Zy5zdWJUbyhmLGcpO3doaWxlKGdbdV08LS1jKXtnLnN1YlRvKGYsZyl9fX1pZihoIT1udWxsKXtnLmRyU2hpZnRUbyhwLGgpO2lmKGEhPWwpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyhoLGgpfX1nLnQ9cDtnLmNsYW1wKCk7aWYodj4wKXtnLnJTaGlmdFRvKHYsZyl9aWYoYTwwKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8oZyxnKX19ZnVuY3Rpb24gYm5Nb2QoYil7dmFyIGM9bmJpKCk7dGhpcy5hYnMoKS5kaXZSZW1UbyhiLG51bGwsYyk7aWYodGhpcy5zPDAmJmMuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk+MCl7Yi5zdWJUbyhjLGMpfXJldHVybiBjfWZ1bmN0aW9uIENsYXNzaWMoYSl7dGhpcy5tPWF9ZnVuY3Rpb24gY0NvbnZlcnQoYSl7aWYoYS5zPDB8fGEuY29tcGFyZVRvKHRoaXMubSk+PTApe3JldHVybiBhLm1vZCh0aGlzLm0pfWVsc2V7cmV0dXJuIGF9fWZ1bmN0aW9uIGNSZXZlcnQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gY1JlZHVjZShhKXthLmRpdlJlbVRvKHRoaXMubSxudWxsLGEpfWZ1bmN0aW9uIGNNdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYik7dGhpcy5yZWR1Y2UoYil9ZnVuY3Rpb24gY1NxclRvKGEsYil7YS5zcXVhcmVUbyhiKTt0aGlzLnJlZHVjZShiKX1DbGFzc2ljLnByb3RvdHlwZS5jb252ZXJ0PWNDb252ZXJ0O0NsYXNzaWMucHJvdG90eXBlLnJldmVydD1jUmV2ZXJ0O0NsYXNzaWMucHJvdG90eXBlLnJlZHVjZT1jUmVkdWNlO0NsYXNzaWMucHJvdG90eXBlLm11bFRvPWNNdWxUbztDbGFzc2ljLnByb3RvdHlwZS5zcXJUbz1jU3FyVG87ZnVuY3Rpb24gYm5wSW52RGlnaXQoKXtpZih0aGlzLnQ8MSl7cmV0dXJuIDB9dmFyIGE9dGhpc1swXTtpZigoYSYxKT09MCl7cmV0dXJuIDB9dmFyIGI9YSYzO2I9KGIqKDItKGEmMTUpKmIpKSYxNTtiPShiKigyLShhJjI1NSkqYikpJjI1NTtiPShiKigyLSgoKGEmNjU1MzUpKmIpJjY1NTM1KSkpJjY1NTM1O2I9KGIqKDItYSpiJXRoaXMuRFYpKSV0aGlzLkRWO3JldHVybihiPjApP3RoaXMuRFYtYjotYn1mdW5jdGlvbiBNb250Z29tZXJ5KGEpe3RoaXMubT1hO3RoaXMubXA9YS5pbnZEaWdpdCgpO3RoaXMubXBsPXRoaXMubXAmMzI3Njc7dGhpcy5tcGg9dGhpcy5tcD4+MTU7dGhpcy51bT0oMTw8KGEuREItMTUpKS0xO3RoaXMubXQyPTIqYS50fWZ1bmN0aW9uIG1vbnRDb252ZXJ0KGEpe3ZhciBiPW5iaSgpO2EuYWJzKCkuZGxTaGlmdFRvKHRoaXMubS50LGIpO2IuZGl2UmVtVG8odGhpcy5tLG51bGwsYik7aWYoYS5zPDAmJmIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk+MCl7dGhpcy5tLnN1YlRvKGIsYil9cmV0dXJuIGJ9ZnVuY3Rpb24gbW9udFJldmVydChhKXt2YXIgYj1uYmkoKTthLmNvcHlUbyhiKTt0aGlzLnJlZHVjZShiKTtyZXR1cm4gYn1mdW5jdGlvbiBtb250UmVkdWNlKGEpe3doaWxlKGEudDw9dGhpcy5tdDIpe2FbYS50KytdPTB9Zm9yKHZhciBjPTA7Yzx0aGlzLm0udDsrK2Mpe3ZhciBiPWFbY10mMzI3Njc7dmFyIGQ9KGIqdGhpcy5tcGwrKCgoYip0aGlzLm1waCsoYVtjXT4+MTUpKnRoaXMubXBsKSZ0aGlzLnVtKTw8MTUpKSZhLkRNO2I9Yyt0aGlzLm0udDthW2JdKz10aGlzLm0uYW0oMCxkLGEsYywwLHRoaXMubS50KTt3aGlsZShhW2JdPj1hLkRWKXthW2JdLT1hLkRWO2FbKytiXSsrfX1hLmNsYW1wKCk7YS5kclNoaWZ0VG8odGhpcy5tLnQsYSk7aWYoYS5jb21wYXJlVG8odGhpcy5tKT49MCl7YS5zdWJUbyh0aGlzLm0sYSl9fWZ1bmN0aW9uIG1vbnRTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9ZnVuY3Rpb24gbW9udE11bFRvKGEsYyxiKXthLm11bHRpcGx5VG8oYyxiKTt0aGlzLnJlZHVjZShiKX1Nb250Z29tZXJ5LnByb3RvdHlwZS5jb252ZXJ0PW1vbnRDb252ZXJ0O01vbnRnb21lcnkucHJvdG90eXBlLnJldmVydD1tb250UmV2ZXJ0O01vbnRnb21lcnkucHJvdG90eXBlLnJlZHVjZT1tb250UmVkdWNlO01vbnRnb21lcnkucHJvdG90eXBlLm11bFRvPW1vbnRNdWxUbztNb250Z29tZXJ5LnByb3RvdHlwZS5zcXJUbz1tb250U3FyVG87ZnVuY3Rpb24gYm5wSXNFdmVuKCl7cmV0dXJuKCh0aGlzLnQ+MCk/KHRoaXNbMF0mMSk6dGhpcy5zKT09MH1mdW5jdGlvbiBibnBFeHAoaCxqKXtpZihoPjQyOTQ5NjcyOTV8fGg8MSl7cmV0dXJuIEJpZ0ludGVnZXIuT05FfXZhciBmPW5iaSgpLGE9bmJpKCksZD1qLmNvbnZlcnQodGhpcyksYz1uYml0cyhoKS0xO2QuY29weVRvKGYpO3doaWxlKC0tYz49MCl7ai5zcXJUbyhmLGEpO2lmKChoJigxPDxjKSk+MCl7ai5tdWxUbyhhLGQsZil9ZWxzZXt2YXIgYj1mO2Y9YTthPWJ9fXJldHVybiBqLnJldmVydChmKX1mdW5jdGlvbiBibk1vZFBvd0ludChiLGEpe3ZhciBjO2lmKGI8MjU2fHxhLmlzRXZlbigpKXtjPW5ldyBDbGFzc2ljKGEpfWVsc2V7Yz1uZXcgTW9udGdvbWVyeShhKX1yZXR1cm4gdGhpcy5leHAoYixjKX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5jb3B5VG89Ym5wQ29weVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21JbnQ9Ym5wRnJvbUludDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tU3RyaW5nPWJucEZyb21TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUuY2xhbXA9Ym5wQ2xhbXA7QmlnSW50ZWdlci5wcm90b3R5cGUuZGxTaGlmdFRvPWJucERMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5kclNoaWZ0VG89Ym5wRFJTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmxTaGlmdFRvPWJucExTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLnJTaGlmdFRvPWJucFJTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLnN1YlRvPWJucFN1YlRvO0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VG89Ym5wTXVsdGlwbHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmVUbz1ibnBTcXVhcmVUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZSZW1Ubz1ibnBEaXZSZW1UbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnZEaWdpdD1ibnBJbnZEaWdpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc0V2ZW49Ym5wSXNFdmVuO0JpZ0ludGVnZXIucHJvdG90eXBlLmV4cD1ibnBFeHA7QmlnSW50ZWdlci5wcm90b3R5cGUudG9TdHJpbmc9Ym5Ub1N0cmluZztCaWdJbnRlZ2VyLnByb3RvdHlwZS5uZWdhdGU9Ym5OZWdhdGU7QmlnSW50ZWdlci5wcm90b3R5cGUuYWJzPWJuQWJzO0JpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbz1ibkNvbXBhcmVUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRMZW5ndGg9Ym5CaXRMZW5ndGg7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kPWJuTW9kO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvd0ludD1ibk1vZFBvd0ludDtCaWdJbnRlZ2VyLlpFUk89bmJ2KDApO0JpZ0ludGVnZXIuT05FPW5idigxKTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBibkNsb25lKCl7dmFyIGE9bmJpKCk7dGhpcy5jb3B5VG8oYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5JbnRWYWx1ZSgpe2lmKHRoaXMuczwwKXtpZih0aGlzLnQ9PTEpe3JldHVybiB0aGlzWzBdLXRoaXMuRFZ9ZWxzZXtpZih0aGlzLnQ9PTApe3JldHVybiAtMX19fWVsc2V7aWYodGhpcy50PT0xKXtyZXR1cm4gdGhpc1swXX1lbHNle2lmKHRoaXMudD09MCl7cmV0dXJuIDB9fX1yZXR1cm4oKHRoaXNbMV0mKCgxPDwoMzItdGhpcy5EQikpLTEpKTw8dGhpcy5EQil8dGhpc1swXX1mdW5jdGlvbiBibkJ5dGVWYWx1ZSgpe3JldHVybih0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MjQpPj4yNH1mdW5jdGlvbiBiblNob3J0VmFsdWUoKXtyZXR1cm4odGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDE2KT4+MTZ9ZnVuY3Rpb24gYm5wQ2h1bmtTaXplKGEpe3JldHVybiBNYXRoLmZsb29yKE1hdGguTE4yKnRoaXMuREIvTWF0aC5sb2coYSkpfWZ1bmN0aW9uIGJuU2lnTnVtKCl7aWYodGhpcy5zPDApe3JldHVybiAtMX1lbHNle2lmKHRoaXMudDw9MHx8KHRoaXMudD09MSYmdGhpc1swXTw9MCkpe3JldHVybiAwfWVsc2V7cmV0dXJuIDF9fX1mdW5jdGlvbiBibnBUb1JhZGl4KGMpe2lmKGM9PW51bGwpe2M9MTB9aWYodGhpcy5zaWdudW0oKT09MHx8YzwyfHxjPjM2KXtyZXR1cm5cIjBcIn12YXIgZj10aGlzLmNodW5rU2l6ZShjKTt2YXIgZT1NYXRoLnBvdyhjLGYpO3ZhciBpPW5idihlKSxqPW5iaSgpLGg9bmJpKCksZz1cIlwiO3RoaXMuZGl2UmVtVG8oaSxqLGgpO3doaWxlKGouc2lnbnVtKCk+MCl7Zz0oZStoLmludFZhbHVlKCkpLnRvU3RyaW5nKGMpLnN1YnN0cigxKStnO2ouZGl2UmVtVG8oaSxqLGgpfXJldHVybiBoLmludFZhbHVlKCkudG9TdHJpbmcoYykrZ31mdW5jdGlvbiBibnBGcm9tUmFkaXgobSxoKXt0aGlzLmZyb21JbnQoMCk7aWYoaD09bnVsbCl7aD0xMH12YXIgZj10aGlzLmNodW5rU2l6ZShoKTt2YXIgZz1NYXRoLnBvdyhoLGYpLGU9ZmFsc2UsYT0wLGw9MDtmb3IodmFyIGM9MDtjPG0ubGVuZ3RoOysrYyl7dmFyIGs9aW50QXQobSxjKTtpZihrPDApe2lmKG0uY2hhckF0KGMpPT1cIi1cIiYmdGhpcy5zaWdudW0oKT09MCl7ZT10cnVlfWNvbnRpbnVlfWw9aCpsK2s7aWYoKythPj1mKXt0aGlzLmRNdWx0aXBseShnKTt0aGlzLmRBZGRPZmZzZXQobCwwKTthPTA7bD0wfX1pZihhPjApe3RoaXMuZE11bHRpcGx5KE1hdGgucG93KGgsYSkpO3RoaXMuZEFkZE9mZnNldChsLDApfWlmKGUpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpfX1mdW5jdGlvbiBibnBGcm9tTnVtYmVyKGYsZSxoKXtpZihcIm51bWJlclwiPT10eXBlb2YgZSl7aWYoZjwyKXt0aGlzLmZyb21JbnQoMSl9ZWxzZXt0aGlzLmZyb21OdW1iZXIoZixoKTtpZighdGhpcy50ZXN0Qml0KGYtMSkpe3RoaXMuYml0d2lzZVRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChmLTEpLG9wX29yLHRoaXMpfWlmKHRoaXMuaXNFdmVuKCkpe3RoaXMuZEFkZE9mZnNldCgxLDApfXdoaWxlKCF0aGlzLmlzUHJvYmFibGVQcmltZShlKSl7dGhpcy5kQWRkT2Zmc2V0KDIsMCk7aWYodGhpcy5iaXRMZW5ndGgoKT5mKXt0aGlzLnN1YlRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChmLTEpLHRoaXMpfX19fWVsc2V7dmFyIGQ9bmV3IEFycmF5KCksZz1mJjc7ZC5sZW5ndGg9KGY+PjMpKzE7ZS5uZXh0Qnl0ZXMoZCk7aWYoZz4wKXtkWzBdJj0oKDE8PGcpLTEpfWVsc2V7ZFswXT0wfXRoaXMuZnJvbVN0cmluZyhkLDI1Nil9fWZ1bmN0aW9uIGJuVG9CeXRlQXJyYXkoKXt2YXIgYj10aGlzLnQsYz1uZXcgQXJyYXkoKTtjWzBdPXRoaXMuczt2YXIgZT10aGlzLkRCLShiKnRoaXMuREIpJTgsZixhPTA7aWYoYi0tPjApe2lmKGU8dGhpcy5EQiYmKGY9dGhpc1tiXT4+ZSkhPSh0aGlzLnMmdGhpcy5ETSk+PmUpe2NbYSsrXT1mfCh0aGlzLnM8PCh0aGlzLkRCLWUpKX13aGlsZShiPj0wKXtpZihlPDgpe2Y9KHRoaXNbYl0mKCgxPDxlKS0xKSk8PCg4LWUpO2Z8PXRoaXNbLS1iXT4+KGUrPXRoaXMuREItOCl9ZWxzZXtmPSh0aGlzW2JdPj4oZS09OCkpJjI1NTtpZihlPD0wKXtlKz10aGlzLkRCOy0tYn19aWYoKGYmMTI4KSE9MCl7Znw9LTI1Nn1pZihhPT0wJiYodGhpcy5zJjEyOCkhPShmJjEyOCkpeysrYX1pZihhPjB8fGYhPXRoaXMucyl7Y1thKytdPWZ9fX1yZXR1cm4gY31mdW5jdGlvbiBibkVxdWFscyhiKXtyZXR1cm4odGhpcy5jb21wYXJlVG8oYik9PTApfWZ1bmN0aW9uIGJuTWluKGIpe3JldHVybih0aGlzLmNvbXBhcmVUbyhiKTwwKT90aGlzOmJ9ZnVuY3Rpb24gYm5NYXgoYil7cmV0dXJuKHRoaXMuY29tcGFyZVRvKGIpPjApP3RoaXM6Yn1mdW5jdGlvbiBibnBCaXR3aXNlVG8oYyxoLGUpe3ZhciBkLGcsYj1NYXRoLm1pbihjLnQsdGhpcy50KTtmb3IoZD0wO2Q8YjsrK2Qpe2VbZF09aCh0aGlzW2RdLGNbZF0pfWlmKGMudDx0aGlzLnQpe2c9Yy5zJnRoaXMuRE07Zm9yKGQ9YjtkPHRoaXMudDsrK2Qpe2VbZF09aCh0aGlzW2RdLGcpfWUudD10aGlzLnR9ZWxzZXtnPXRoaXMucyZ0aGlzLkRNO2ZvcihkPWI7ZDxjLnQ7KytkKXtlW2RdPWgoZyxjW2RdKX1lLnQ9Yy50fWUucz1oKHRoaXMucyxjLnMpO2UuY2xhbXAoKX1mdW5jdGlvbiBvcF9hbmQoYSxiKXtyZXR1cm4gYSZifWZ1bmN0aW9uIGJuQW5kKGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3BfYW5kLGMpO3JldHVybiBjfWZ1bmN0aW9uIG9wX29yKGEsYil7cmV0dXJuIGF8Yn1mdW5jdGlvbiBibk9yKGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3Bfb3IsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gb3BfeG9yKGEsYil7cmV0dXJuIGFeYn1mdW5jdGlvbiBiblhvcihiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX3hvcixjKTtyZXR1cm4gY31mdW5jdGlvbiBvcF9hbmRub3QoYSxiKXtyZXR1cm4gYSZ+Yn1mdW5jdGlvbiBibkFuZE5vdChiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX2FuZG5vdCxjKTtyZXR1cm4gY31mdW5jdGlvbiBibk5vdCgpe3ZhciBiPW5iaSgpO2Zvcih2YXIgYT0wO2E8dGhpcy50OysrYSl7YlthXT10aGlzLkRNJn50aGlzW2FdfWIudD10aGlzLnQ7Yi5zPX50aGlzLnM7cmV0dXJuIGJ9ZnVuY3Rpb24gYm5TaGlmdExlZnQoYil7dmFyIGE9bmJpKCk7aWYoYjwwKXt0aGlzLnJTaGlmdFRvKC1iLGEpfWVsc2V7dGhpcy5sU2hpZnRUbyhiLGEpfXJldHVybiBhfWZ1bmN0aW9uIGJuU2hpZnRSaWdodChiKXt2YXIgYT1uYmkoKTtpZihiPDApe3RoaXMubFNoaWZ0VG8oLWIsYSl9ZWxzZXt0aGlzLnJTaGlmdFRvKGIsYSl9cmV0dXJuIGF9ZnVuY3Rpb24gbGJpdChhKXtpZihhPT0wKXtyZXR1cm4gLTF9dmFyIGI9MDtpZigoYSY2NTUzNSk9PTApe2E+Pj0xNjtiKz0xNn1pZigoYSYyNTUpPT0wKXthPj49ODtiKz04fWlmKChhJjE1KT09MCl7YT4+PTQ7Yis9NH1pZigoYSYzKT09MCl7YT4+PTI7Yis9Mn1pZigoYSYxKT09MCl7KytifXJldHVybiBifWZ1bmN0aW9uIGJuR2V0TG93ZXN0U2V0Qml0KCl7Zm9yKHZhciBhPTA7YTx0aGlzLnQ7KythKXtpZih0aGlzW2FdIT0wKXtyZXR1cm4gYSp0aGlzLkRCK2xiaXQodGhpc1thXSl9fWlmKHRoaXMuczwwKXtyZXR1cm4gdGhpcy50KnRoaXMuREJ9cmV0dXJuIC0xfWZ1bmN0aW9uIGNiaXQoYSl7dmFyIGI9MDt3aGlsZShhIT0wKXthJj1hLTE7KytifXJldHVybiBifWZ1bmN0aW9uIGJuQml0Q291bnQoKXt2YXIgYz0wLGE9dGhpcy5zJnRoaXMuRE07Zm9yKHZhciBiPTA7Yjx0aGlzLnQ7KytiKXtjKz1jYml0KHRoaXNbYl1eYSl9cmV0dXJuIGN9ZnVuY3Rpb24gYm5UZXN0Qml0KGIpe3ZhciBhPU1hdGguZmxvb3IoYi90aGlzLkRCKTtpZihhPj10aGlzLnQpe3JldHVybih0aGlzLnMhPTApfXJldHVybigodGhpc1thXSYoMTw8KGIldGhpcy5EQikpKSE9MCl9ZnVuY3Rpb24gYm5wQ2hhbmdlQml0KGMsYil7dmFyIGE9QmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGMpO3RoaXMuYml0d2lzZVRvKGEsYixhKTtyZXR1cm4gYX1mdW5jdGlvbiBiblNldEJpdChhKXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQoYSxvcF9vcil9ZnVuY3Rpb24gYm5DbGVhckJpdChhKXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQoYSxvcF9hbmRub3QpfWZ1bmN0aW9uIGJuRmxpcEJpdChhKXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQoYSxvcF94b3IpfWZ1bmN0aW9uIGJucEFkZFRvKGQsZil7dmFyIGU9MCxnPTAsYj1NYXRoLm1pbihkLnQsdGhpcy50KTt3aGlsZShlPGIpe2crPXRoaXNbZV0rZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWlmKGQudDx0aGlzLnQpe2crPWQuczt3aGlsZShlPHRoaXMudCl7Zys9dGhpc1tlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWcrPXRoaXMuc31lbHNle2crPXRoaXMuczt3aGlsZShlPGQudCl7Zys9ZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWcrPWQuc31mLnM9KGc8MCk/LTE6MDtpZihnPjApe2ZbZSsrXT1nfWVsc2V7aWYoZzwtMSl7ZltlKytdPXRoaXMuRFYrZ319Zi50PWU7Zi5jbGFtcCgpfWZ1bmN0aW9uIGJuQWRkKGIpe3ZhciBjPW5iaSgpO3RoaXMuYWRkVG8oYixjKTtyZXR1cm4gY31mdW5jdGlvbiBiblN1YnRyYWN0KGIpe3ZhciBjPW5iaSgpO3RoaXMuc3ViVG8oYixjKTtyZXR1cm4gY31mdW5jdGlvbiBibk11bHRpcGx5KGIpe3ZhciBjPW5iaSgpO3RoaXMubXVsdGlwbHlUbyhiLGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuU3F1YXJlKCl7dmFyIGE9bmJpKCk7dGhpcy5zcXVhcmVUbyhhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkRpdmlkZShiKXt2YXIgYz1uYmkoKTt0aGlzLmRpdlJlbVRvKGIsYyxudWxsKTtyZXR1cm4gY31mdW5jdGlvbiBiblJlbWFpbmRlcihiKXt2YXIgYz1uYmkoKTt0aGlzLmRpdlJlbVRvKGIsbnVsbCxjKTtyZXR1cm4gY31mdW5jdGlvbiBibkRpdmlkZUFuZFJlbWFpbmRlcihiKXt2YXIgZD1uYmkoKSxjPW5iaSgpO3RoaXMuZGl2UmVtVG8oYixkLGMpO3JldHVybiBuZXcgQXJyYXkoZCxjKX1mdW5jdGlvbiBibnBETXVsdGlwbHkoYSl7dGhpc1t0aGlzLnRdPXRoaXMuYW0oMCxhLTEsdGhpcywwLDAsdGhpcy50KTsrK3RoaXMudDt0aGlzLmNsYW1wKCl9ZnVuY3Rpb24gYm5wREFkZE9mZnNldChiLGEpe2lmKGI9PTApe3JldHVybn13aGlsZSh0aGlzLnQ8PWEpe3RoaXNbdGhpcy50KytdPTB9dGhpc1thXSs9Yjt3aGlsZSh0aGlzW2FdPj10aGlzLkRWKXt0aGlzW2FdLT10aGlzLkRWO2lmKCsrYT49dGhpcy50KXt0aGlzW3RoaXMudCsrXT0wfSsrdGhpc1thXX19ZnVuY3Rpb24gTnVsbEV4cCgpe31mdW5jdGlvbiBuTm9wKGEpe3JldHVybiBhfWZ1bmN0aW9uIG5NdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYil9ZnVuY3Rpb24gblNxclRvKGEsYil7YS5zcXVhcmVUbyhiKX1OdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0PW5Ob3A7TnVsbEV4cC5wcm90b3R5cGUucmV2ZXJ0PW5Ob3A7TnVsbEV4cC5wcm90b3R5cGUubXVsVG89bk11bFRvO051bGxFeHAucHJvdG90eXBlLnNxclRvPW5TcXJUbztmdW5jdGlvbiBiblBvdyhhKXtyZXR1cm4gdGhpcy5leHAoYSxuZXcgTnVsbEV4cCgpKX1mdW5jdGlvbiBibnBNdWx0aXBseUxvd2VyVG8oYixmLGUpe3ZhciBkPU1hdGgubWluKHRoaXMudCtiLnQsZik7ZS5zPTA7ZS50PWQ7d2hpbGUoZD4wKXtlWy0tZF09MH12YXIgYztmb3IoYz1lLnQtdGhpcy50O2Q8YzsrK2Qpe2VbZCt0aGlzLnRdPXRoaXMuYW0oMCxiW2RdLGUsZCwwLHRoaXMudCl9Zm9yKGM9TWF0aC5taW4oYi50LGYpO2Q8YzsrK2Qpe3RoaXMuYW0oMCxiW2RdLGUsZCwwLGYtZCl9ZS5jbGFtcCgpfWZ1bmN0aW9uIGJucE11bHRpcGx5VXBwZXJUbyhiLGUsZCl7LS1lO3ZhciBjPWQudD10aGlzLnQrYi50LWU7ZC5zPTA7d2hpbGUoLS1jPj0wKXtkW2NdPTB9Zm9yKGM9TWF0aC5tYXgoZS10aGlzLnQsMCk7YzxiLnQ7KytjKXtkW3RoaXMudCtjLWVdPXRoaXMuYW0oZS1jLGJbY10sZCwwLDAsdGhpcy50K2MtZSl9ZC5jbGFtcCgpO2QuZHJTaGlmdFRvKDEsZCl9ZnVuY3Rpb24gQmFycmV0dChhKXt0aGlzLnIyPW5iaSgpO3RoaXMucTM9bmJpKCk7QmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKDIqYS50LHRoaXMucjIpO3RoaXMubXU9dGhpcy5yMi5kaXZpZGUoYSk7dGhpcy5tPWF9ZnVuY3Rpb24gYmFycmV0dENvbnZlcnQoYSl7aWYoYS5zPDB8fGEudD4yKnRoaXMubS50KXtyZXR1cm4gYS5tb2QodGhpcy5tKX1lbHNle2lmKGEuY29tcGFyZVRvKHRoaXMubSk8MCl7cmV0dXJuIGF9ZWxzZXt2YXIgYj1uYmkoKTthLmNvcHlUbyhiKTt0aGlzLnJlZHVjZShiKTtyZXR1cm4gYn19fWZ1bmN0aW9uIGJhcnJldHRSZXZlcnQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gYmFycmV0dFJlZHVjZShhKXthLmRyU2hpZnRUbyh0aGlzLm0udC0xLHRoaXMucjIpO2lmKGEudD50aGlzLm0udCsxKXthLnQ9dGhpcy5tLnQrMTthLmNsYW1wKCl9dGhpcy5tdS5tdWx0aXBseVVwcGVyVG8odGhpcy5yMix0aGlzLm0udCsxLHRoaXMucTMpO3RoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO3doaWxlKGEuY29tcGFyZVRvKHRoaXMucjIpPDApe2EuZEFkZE9mZnNldCgxLHRoaXMubS50KzEpfWEuc3ViVG8odGhpcy5yMixhKTt3aGlsZShhLmNvbXBhcmVUbyh0aGlzLm0pPj0wKXthLnN1YlRvKHRoaXMubSxhKX19ZnVuY3Rpb24gYmFycmV0dFNxclRvKGEsYil7YS5zcXVhcmVUbyhiKTt0aGlzLnJlZHVjZShiKX1mdW5jdGlvbiBiYXJyZXR0TXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpO3RoaXMucmVkdWNlKGIpfUJhcnJldHQucHJvdG90eXBlLmNvbnZlcnQ9YmFycmV0dENvbnZlcnQ7QmFycmV0dC5wcm90b3R5cGUucmV2ZXJ0PWJhcnJldHRSZXZlcnQ7QmFycmV0dC5wcm90b3R5cGUucmVkdWNlPWJhcnJldHRSZWR1Y2U7QmFycmV0dC5wcm90b3R5cGUubXVsVG89YmFycmV0dE11bFRvO0JhcnJldHQucHJvdG90eXBlLnNxclRvPWJhcnJldHRTcXJUbztmdW5jdGlvbiBibk1vZFBvdyhxLGYpe3ZhciBvPXEuYml0TGVuZ3RoKCksaCxiPW5idigxKSx2O2lmKG88PTApe3JldHVybiBifWVsc2V7aWYobzwxOCl7aD0xfWVsc2V7aWYobzw0OCl7aD0zfWVsc2V7aWYobzwxNDQpe2g9NH1lbHNle2lmKG88NzY4KXtoPTV9ZWxzZXtoPTZ9fX19fWlmKG88OCl7dj1uZXcgQ2xhc3NpYyhmKX1lbHNle2lmKGYuaXNFdmVuKCkpe3Y9bmV3IEJhcnJldHQoZil9ZWxzZXt2PW5ldyBNb250Z29tZXJ5KGYpfX12YXIgcD1uZXcgQXJyYXkoKSxkPTMscz1oLTEsYT0oMTw8aCktMTtwWzFdPXYuY29udmVydCh0aGlzKTtpZihoPjEpe3ZhciBBPW5iaSgpO3Yuc3FyVG8ocFsxXSxBKTt3aGlsZShkPD1hKXtwW2RdPW5iaSgpO3YubXVsVG8oQSxwW2QtMl0scFtkXSk7ZCs9Mn19dmFyIGw9cS50LTEseCx1PXRydWUsYz1uYmkoKSx5O289bmJpdHMocVtsXSktMTt3aGlsZShsPj0wKXtpZihvPj1zKXt4PShxW2xdPj4oby1zKSkmYX1lbHNle3g9KHFbbF0mKCgxPDwobysxKSktMSkpPDwocy1vKTtpZihsPjApe3h8PXFbbC0xXT4+KHRoaXMuREIrby1zKX19ZD1oO3doaWxlKCh4JjEpPT0wKXt4Pj49MTstLWR9aWYoKG8tPWQpPDApe28rPXRoaXMuREI7LS1sfWlmKHUpe3BbeF0uY29weVRvKGIpO3U9ZmFsc2V9ZWxzZXt3aGlsZShkPjEpe3Yuc3FyVG8oYixjKTt2LnNxclRvKGMsYik7ZC09Mn1pZihkPjApe3Yuc3FyVG8oYixjKX1lbHNle3k9YjtiPWM7Yz15fXYubXVsVG8oYyxwW3hdLGIpfXdoaWxlKGw+PTAmJihxW2xdJigxPDxvKSk9PTApe3Yuc3FyVG8oYixjKTt5PWI7Yj1jO2M9eTtpZigtLW88MCl7bz10aGlzLkRCLTE7LS1sfX19cmV0dXJuIHYucmV2ZXJ0KGIpfWZ1bmN0aW9uIGJuR0NEKGMpe3ZhciBiPSh0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzLmNsb25lKCk7dmFyIGg9KGMuczwwKT9jLm5lZ2F0ZSgpOmMuY2xvbmUoKTtpZihiLmNvbXBhcmVUbyhoKTwwKXt2YXIgZT1iO2I9aDtoPWV9dmFyIGQ9Yi5nZXRMb3dlc3RTZXRCaXQoKSxmPWguZ2V0TG93ZXN0U2V0Qml0KCk7aWYoZjwwKXtyZXR1cm4gYn1pZihkPGYpe2Y9ZH1pZihmPjApe2IuclNoaWZ0VG8oZixiKTtoLnJTaGlmdFRvKGYsaCl9d2hpbGUoYi5zaWdudW0oKT4wKXtpZigoZD1iLmdldExvd2VzdFNldEJpdCgpKT4wKXtiLnJTaGlmdFRvKGQsYil9aWYoKGQ9aC5nZXRMb3dlc3RTZXRCaXQoKSk+MCl7aC5yU2hpZnRUbyhkLGgpfWlmKGIuY29tcGFyZVRvKGgpPj0wKXtiLnN1YlRvKGgsYik7Yi5yU2hpZnRUbygxLGIpfWVsc2V7aC5zdWJUbyhiLGgpO2guclNoaWZ0VG8oMSxoKX19aWYoZj4wKXtoLmxTaGlmdFRvKGYsaCl9cmV0dXJuIGh9ZnVuY3Rpb24gYm5wTW9kSW50KGUpe2lmKGU8PTApe3JldHVybiAwfXZhciBjPXRoaXMuRFYlZSxiPSh0aGlzLnM8MCk/ZS0xOjA7aWYodGhpcy50PjApe2lmKGM9PTApe2I9dGhpc1swXSVlfWVsc2V7Zm9yKHZhciBhPXRoaXMudC0xO2E+PTA7LS1hKXtiPShjKmIrdGhpc1thXSklZX19fXJldHVybiBifWZ1bmN0aW9uIGJuTW9kSW52ZXJzZShmKXt2YXIgaj1mLmlzRXZlbigpO2lmKCh0aGlzLmlzRXZlbigpJiZqKXx8Zi5zaWdudW0oKT09MCl7cmV0dXJuIEJpZ0ludGVnZXIuWkVST312YXIgaT1mLmNsb25lKCksaD10aGlzLmNsb25lKCk7dmFyIGc9bmJ2KDEpLGU9bmJ2KDApLGw9bmJ2KDApLGs9bmJ2KDEpO3doaWxlKGkuc2lnbnVtKCkhPTApe3doaWxlKGkuaXNFdmVuKCkpe2kuclNoaWZ0VG8oMSxpKTtpZihqKXtpZighZy5pc0V2ZW4oKXx8IWUuaXNFdmVuKCkpe2cuYWRkVG8odGhpcyxnKTtlLnN1YlRvKGYsZSl9Zy5yU2hpZnRUbygxLGcpfWVsc2V7aWYoIWUuaXNFdmVuKCkpe2Uuc3ViVG8oZixlKX19ZS5yU2hpZnRUbygxLGUpfXdoaWxlKGguaXNFdmVuKCkpe2guclNoaWZ0VG8oMSxoKTtpZihqKXtpZighbC5pc0V2ZW4oKXx8IWsuaXNFdmVuKCkpe2wuYWRkVG8odGhpcyxsKTtrLnN1YlRvKGYsayl9bC5yU2hpZnRUbygxLGwpfWVsc2V7aWYoIWsuaXNFdmVuKCkpe2suc3ViVG8oZixrKX19ay5yU2hpZnRUbygxLGspfWlmKGkuY29tcGFyZVRvKGgpPj0wKXtpLnN1YlRvKGgsaSk7aWYoail7Zy5zdWJUbyhsLGcpfWUuc3ViVG8oayxlKX1lbHNle2guc3ViVG8oaSxoKTtpZihqKXtsLnN1YlRvKGcsbCl9ay5zdWJUbyhlLGspfX1pZihoLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTApe3JldHVybiBCaWdJbnRlZ2VyLlpFUk99aWYoay5jb21wYXJlVG8oZik+PTApe3JldHVybiBrLnN1YnRyYWN0KGYpfWlmKGsuc2lnbnVtKCk8MCl7ay5hZGRUbyhmLGspfWVsc2V7cmV0dXJuIGt9aWYoay5zaWdudW0oKTwwKXtyZXR1cm4gay5hZGQoZil9ZWxzZXtyZXR1cm4ga319dmFyIGxvd3ByaW1lcz1bMiwzLDUsNywxMSwxMywxNywxOSwyMywyOSwzMSwzNyw0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OSwyMTEsMjIzLDIyNywyMjksMjMzLDIzOSwyNDEsMjUxLDI1NywyNjMsMjY5LDI3MSwyNzcsMjgxLDI4MywyOTMsMzA3LDMxMSwzMTMsMzE3LDMzMSwzMzcsMzQ3LDM0OSwzNTMsMzU5LDM2NywzNzMsMzc5LDM4MywzODksMzk3LDQwMSw0MDksNDE5LDQyMSw0MzEsNDMzLDQzOSw0NDMsNDQ5LDQ1Nyw0NjEsNDYzLDQ2Nyw0NzksNDg3LDQ5MSw0OTksNTAzLDUwOSw1MjEsNTIzLDU0MSw1NDcsNTU3LDU2Myw1NjksNTcxLDU3Nyw1ODcsNTkzLDU5OSw2MDEsNjA3LDYxMyw2MTcsNjE5LDYzMSw2NDEsNjQzLDY0Nyw2NTMsNjU5LDY2MSw2NzMsNjc3LDY4Myw2OTEsNzAxLDcwOSw3MTksNzI3LDczMyw3MzksNzQzLDc1MSw3NTcsNzYxLDc2OSw3NzMsNzg3LDc5Nyw4MDksODExLDgyMSw4MjMsODI3LDgyOSw4MzksODUzLDg1Nyw4NTksODYzLDg3Nyw4ODEsODgzLDg4Nyw5MDcsOTExLDkxOSw5MjksOTM3LDk0MSw5NDcsOTUzLDk2Nyw5NzEsOTc3LDk4Myw5OTEsOTk3XTt2YXIgbHBsaW09KDE8PDI2KS9sb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXTtmdW5jdGlvbiBibklzUHJvYmFibGVQcmltZShlKXt2YXIgZCxiPXRoaXMuYWJzKCk7aWYoYi50PT0xJiZiWzBdPD1sb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXSl7Zm9yKGQ9MDtkPGxvd3ByaW1lcy5sZW5ndGg7KytkKXtpZihiWzBdPT1sb3dwcmltZXNbZF0pe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9aWYoYi5pc0V2ZW4oKSl7cmV0dXJuIGZhbHNlfWQ9MTt3aGlsZShkPGxvd3ByaW1lcy5sZW5ndGgpe3ZhciBhPWxvd3ByaW1lc1tkXSxjPWQrMTt3aGlsZShjPGxvd3ByaW1lcy5sZW5ndGgmJmE8bHBsaW0pe2EqPWxvd3ByaW1lc1tjKytdfWE9Yi5tb2RJbnQoYSk7d2hpbGUoZDxjKXtpZihhJWxvd3ByaW1lc1tkKytdPT0wKXtyZXR1cm4gZmFsc2V9fX1yZXR1cm4gYi5taWxsZXJSYWJpbihlKX1mdW5jdGlvbiBibnBNaWxsZXJSYWJpbihmKXt2YXIgZz10aGlzLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgYz1nLmdldExvd2VzdFNldEJpdCgpO2lmKGM8PTApe3JldHVybiBmYWxzZX12YXIgaD1nLnNoaWZ0UmlnaHQoYyk7Zj0oZisxKT4+MTtpZihmPmxvd3ByaW1lcy5sZW5ndGgpe2Y9bG93cHJpbWVzLmxlbmd0aH12YXIgYj1uYmkoKTtmb3IodmFyIGU9MDtlPGY7KytlKXtiLmZyb21JbnQobG93cHJpbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsb3dwcmltZXMubGVuZ3RoKV0pO3ZhciBsPWIubW9kUG93KGgsdGhpcyk7aWYobC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpIT0wJiZsLmNvbXBhcmVUbyhnKSE9MCl7dmFyIGQ9MTt3aGlsZShkKys8YyYmbC5jb21wYXJlVG8oZykhPTApe2w9bC5tb2RQb3dJbnQoMix0aGlzKTtpZihsLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk9PTApe3JldHVybiBmYWxzZX19aWYobC5jb21wYXJlVG8oZykhPTApe3JldHVybiBmYWxzZX19fXJldHVybiB0cnVlfUJpZ0ludGVnZXIucHJvdG90eXBlLmNodW5rU2l6ZT1ibnBDaHVua1NpemU7QmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeD1ibnBUb1JhZGl4O0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeD1ibnBGcm9tUmFkaXg7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbU51bWJlcj1ibnBGcm9tTnVtYmVyO0JpZ0ludGVnZXIucHJvdG90eXBlLmJpdHdpc2VUbz1ibnBCaXR3aXNlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuY2hhbmdlQml0PWJucENoYW5nZUJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGRUbz1ibnBBZGRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5kTXVsdGlwbHk9Ym5wRE11bHRpcGx5O0JpZ0ludGVnZXIucHJvdG90eXBlLmRBZGRPZmZzZXQ9Ym5wREFkZE9mZnNldDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseUxvd2VyVG89Ym5wTXVsdGlwbHlMb3dlclRvO0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VXBwZXJUbz1ibnBNdWx0aXBseVVwcGVyVG87QmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW50PWJucE1vZEludDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5taWxsZXJSYWJpbj1ibnBNaWxsZXJSYWJpbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbG9uZT1ibkNsb25lO0JpZ0ludGVnZXIucHJvdG90eXBlLmludFZhbHVlPWJuSW50VmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuYnl0ZVZhbHVlPWJuQnl0ZVZhbHVlO0JpZ0ludGVnZXIucHJvdG90eXBlLnNob3J0VmFsdWU9Ym5TaG9ydFZhbHVlO0JpZ0ludGVnZXIucHJvdG90eXBlLnNpZ251bT1iblNpZ051bTtCaWdJbnRlZ2VyLnByb3RvdHlwZS50b0J5dGVBcnJheT1iblRvQnl0ZUFycmF5O0JpZ0ludGVnZXIucHJvdG90eXBlLmVxdWFscz1ibkVxdWFscztCaWdJbnRlZ2VyLnByb3RvdHlwZS5taW49Ym5NaW47QmlnSW50ZWdlci5wcm90b3R5cGUubWF4PWJuTWF4O0JpZ0ludGVnZXIucHJvdG90eXBlLmFuZD1ibkFuZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5vcj1ibk9yO0JpZ0ludGVnZXIucHJvdG90eXBlLnhvcj1iblhvcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmROb3Q9Ym5BbmROb3Q7QmlnSW50ZWdlci5wcm90b3R5cGUubm90PWJuTm90O0JpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdD1iblNoaWZ0TGVmdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdFJpZ2h0PWJuU2hpZnRSaWdodDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5nZXRMb3dlc3RTZXRCaXQ9Ym5HZXRMb3dlc3RTZXRCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuYml0Q291bnQ9Ym5CaXRDb3VudDtCaWdJbnRlZ2VyLnByb3RvdHlwZS50ZXN0Qml0PWJuVGVzdEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zZXRCaXQ9Ym5TZXRCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuY2xlYXJCaXQ9Ym5DbGVhckJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mbGlwQml0PWJuRmxpcEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGQ9Ym5BZGQ7QmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3Q9Ym5TdWJ0cmFjdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseT1ibk11bHRpcGx5O0JpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZT1ibkRpdmlkZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5yZW1haW5kZXI9Ym5SZW1haW5kZXI7QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlQW5kUmVtYWluZGVyPWJuRGl2aWRlQW5kUmVtYWluZGVyO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvdz1ibk1vZFBvdztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlPWJuTW9kSW52ZXJzZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3c9Ym5Qb3c7QmlnSW50ZWdlci5wcm90b3R5cGUuZ2NkPWJuR0NEO0JpZ0ludGVnZXIucHJvdG90eXBlLmlzUHJvYmFibGVQcmltZT1ibklzUHJvYmFibGVQcmltZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmU9Ym5TcXVhcmU7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gQXJjZm91cigpe3RoaXMuaT0wO3RoaXMuaj0wO3RoaXMuUz1uZXcgQXJyYXkoKX1mdW5jdGlvbiBBUkM0aW5pdChkKXt2YXIgYyxhLGI7Zm9yKGM9MDtjPDI1NjsrK2Mpe3RoaXMuU1tjXT1jfWE9MDtmb3IoYz0wO2M8MjU2OysrYyl7YT0oYSt0aGlzLlNbY10rZFtjJWQubGVuZ3RoXSkmMjU1O2I9dGhpcy5TW2NdO3RoaXMuU1tjXT10aGlzLlNbYV07dGhpcy5TW2FdPWJ9dGhpcy5pPTA7dGhpcy5qPTB9ZnVuY3Rpb24gQVJDNG5leHQoKXt2YXIgYTt0aGlzLmk9KHRoaXMuaSsxKSYyNTU7dGhpcy5qPSh0aGlzLmordGhpcy5TW3RoaXMuaV0pJjI1NTthPXRoaXMuU1t0aGlzLmldO3RoaXMuU1t0aGlzLmldPXRoaXMuU1t0aGlzLmpdO3RoaXMuU1t0aGlzLmpdPWE7cmV0dXJuIHRoaXMuU1soYSt0aGlzLlNbdGhpcy5pXSkmMjU1XX1BcmNmb3VyLnByb3RvdHlwZS5pbml0PUFSQzRpbml0O0FyY2ZvdXIucHJvdG90eXBlLm5leHQ9QVJDNG5leHQ7ZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpe3JldHVybiBuZXcgQXJjZm91cigpfXZhciBybmdfcHNpemU9MjU2O1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbnZhciBybmdfc3RhdGU7dmFyIHJuZ19wb29sO3ZhciBybmdfcHB0cjtmdW5jdGlvbiBybmdfc2VlZF9pbnQoYSl7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePWEmMjU1O3JuZ19wb29sW3JuZ19wcHRyKytdXj0oYT4+OCkmMjU1O3JuZ19wb29sW3JuZ19wcHRyKytdXj0oYT4+MTYpJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjI0KSYyNTU7aWYocm5nX3BwdHI+PXJuZ19wc2l6ZSl7cm5nX3BwdHItPXJuZ19wc2l6ZX19ZnVuY3Rpb24gcm5nX3NlZWRfdGltZSgpe3JuZ19zZWVkX2ludChuZXcgRGF0ZSgpLmdldFRpbWUoKSl9aWYocm5nX3Bvb2w9PW51bGwpe3JuZ19wb29sPW5ldyBBcnJheSgpO3JuZ19wcHRyPTA7dmFyIHQ7aWYod2luZG93LmNyeXB0byYmd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciB1YT1uZXcgVWludDhBcnJheSgzMik7d2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXModWEpO2Zvcih0PTA7dDwzMjsrK3Qpe3JuZ19wb29sW3JuZ19wcHRyKytdPXVhW3RdfX1pZihuYXZpZ2F0b3IuYXBwTmFtZT09XCJOZXRzY2FwZVwiJiZuYXZpZ2F0b3IuYXBwVmVyc2lvbjxcIjVcIiYmd2luZG93LmNyeXB0byl7dmFyIHo9d2luZG93LmNyeXB0by5yYW5kb20oMzIpO2Zvcih0PTA7dDx6Lmxlbmd0aDsrK3Qpe3JuZ19wb29sW3JuZ19wcHRyKytdPXouY2hhckNvZGVBdCh0KSYyNTV9fXdoaWxlKHJuZ19wcHRyPHJuZ19wc2l6ZSl7dD1NYXRoLmZsb29yKDY1NTM2Kk1hdGgucmFuZG9tKCkpO3JuZ19wb29sW3JuZ19wcHRyKytdPXQ+Pj44O3JuZ19wb29sW3JuZ19wcHRyKytdPXQmMjU1fXJuZ19wcHRyPTA7cm5nX3NlZWRfdGltZSgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZSgpe2lmKHJuZ19zdGF0ZT09bnVsbCl7cm5nX3NlZWRfdGltZSgpO3JuZ19zdGF0ZT1wcm5nX25ld3N0YXRlKCk7cm5nX3N0YXRlLmluaXQocm5nX3Bvb2wpO2ZvcihybmdfcHB0cj0wO3JuZ19wcHRyPHJuZ19wb29sLmxlbmd0aDsrK3JuZ19wcHRyKXtybmdfcG9vbFtybmdfcHB0cl09MH1ybmdfcHB0cj0wfXJldHVybiBybmdfc3RhdGUubmV4dCgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZXMoYil7dmFyIGE7Zm9yKGE9MDthPGIubGVuZ3RoOysrYSl7YlthXT1ybmdfZ2V0X2J5dGUoKX19ZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCl7fVNlY3VyZVJhbmRvbS5wcm90b3R5cGUubmV4dEJ5dGVzPXJuZ19nZXRfYnl0ZXM7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gcGFyc2VCaWdJbnQoYixhKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoYixhKX1mdW5jdGlvbiBsaW5lYnJrKGMsZCl7dmFyIGE9XCJcIjt2YXIgYj0wO3doaWxlKGIrZDxjLmxlbmd0aCl7YSs9Yy5zdWJzdHJpbmcoYixiK2QpK1wiXFxuXCI7Yis9ZH1yZXR1cm4gYStjLnN1YnN0cmluZyhiLGMubGVuZ3RoKX1mdW5jdGlvbiBieXRlMkhleChhKXtpZihhPDE2KXtyZXR1cm5cIjBcIithLnRvU3RyaW5nKDE2KX1lbHNle3JldHVybiBhLnRvU3RyaW5nKDE2KX19ZnVuY3Rpb24gcGtjczFwYWQyKGUsaCl7aWYoaDxlLmxlbmd0aCsxMSl7YWxlcnQoXCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0FcIik7cmV0dXJuIG51bGx9dmFyIGc9bmV3IEFycmF5KCk7dmFyIGQ9ZS5sZW5ndGgtMTt3aGlsZShkPj0wJiZoPjApe3ZhciBmPWUuY2hhckNvZGVBdChkLS0pO2lmKGY8MTI4KXtnWy0taF09Zn1lbHNle2lmKChmPjEyNykmJihmPDIwNDgpKXtnWy0taF09KGYmNjMpfDEyODtnWy0taF09KGY+PjYpfDE5Mn1lbHNle2dbLS1oXT0oZiY2Myl8MTI4O2dbLS1oXT0oKGY+PjYpJjYzKXwxMjg7Z1stLWhdPShmPj4xMil8MjI0fX19Z1stLWhdPTA7dmFyIGI9bmV3IFNlY3VyZVJhbmRvbSgpO3ZhciBhPW5ldyBBcnJheSgpO3doaWxlKGg+Mil7YVswXT0wO3doaWxlKGFbMF09PTApe2IubmV4dEJ5dGVzKGEpfWdbLS1oXT1hWzBdfWdbLS1oXT0yO2dbLS1oXT0wO3JldHVybiBuZXcgQmlnSW50ZWdlcihnKX1mdW5jdGlvbiBvYWVwX21nZjFfYXJyKGMsYSxlKXt2YXIgYj1cIlwiLGQ9MDt3aGlsZShiLmxlbmd0aDxhKXtiKz1lKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGMuY29uY2F0KFsoZCY0Mjc4MTkwMDgwKT4+MjQsKGQmMTY3MTE2ODApPj4xNiwoZCY2NTI4MCk+PjgsZCYyNTVdKSkpO2QrPTF9cmV0dXJuIGJ9dmFyIFNIQTFfU0laRT0yMDtmdW5jdGlvbiBvYWVwX3BhZChsLGEsYyl7aWYobC5sZW5ndGgrMipTSEExX1NJWkUrMj5hKXt0aHJvd1wiTWVzc2FnZSB0b28gbG9uZyBmb3IgUlNBXCJ9dmFyIGg9XCJcIixkO2ZvcihkPTA7ZDxhLWwubGVuZ3RoLTIqU0hBMV9TSVpFLTI7ZCs9MSl7aCs9XCJcXHgwMFwifXZhciBlPXJzdHJfc2hhMShcIlwiKStoK1wiXFx4MDFcIitsO3ZhciBmPW5ldyBBcnJheShTSEExX1NJWkUpO25ldyBTZWN1cmVSYW5kb20oKS5uZXh0Qnl0ZXMoZik7dmFyIGc9b2FlcF9tZ2YxX2FycihmLGUubGVuZ3RoLGN8fHJzdHJfc2hhMSk7dmFyIGs9W107Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrPTEpe2tbZF09ZS5jaGFyQ29kZUF0KGQpXmcuY2hhckNvZGVBdChkKX12YXIgaj1vYWVwX21nZjFfYXJyKGssZi5sZW5ndGgscnN0cl9zaGExKTt2YXIgYj1bMF07Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrPTEpe2JbZCsxXT1mW2RdXmouY2hhckNvZGVBdChkKX1yZXR1cm4gbmV3IEJpZ0ludGVnZXIoYi5jb25jYXQoaykpfWZ1bmN0aW9uIFJTQUtleSgpe3RoaXMubj1udWxsO3RoaXMuZT0wO3RoaXMuZD1udWxsO3RoaXMucD1udWxsO3RoaXMucT1udWxsO3RoaXMuZG1wMT1udWxsO3RoaXMuZG1xMT1udWxsO3RoaXMuY29lZmY9bnVsbH1mdW5jdGlvbiBSU0FTZXRQdWJsaWMoYixhKXt0aGlzLmlzUHVibGljPXRydWU7aWYodHlwZW9mIGIhPT1cInN0cmluZ1wiKXt0aGlzLm49Yjt0aGlzLmU9YX1lbHNle2lmKGIhPW51bGwmJmEhPW51bGwmJmIubGVuZ3RoPjAmJmEubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChiLDE2KTt0aGlzLmU9cGFyc2VJbnQoYSwxNil9ZWxzZXthbGVydChcIkludmFsaWQgUlNBIHB1YmxpYyBrZXlcIil9fX1mdW5jdGlvbiBSU0FEb1B1YmxpYyhhKXtyZXR1cm4gYS5tb2RQb3dJbnQodGhpcy5lLHRoaXMubil9ZnVuY3Rpb24gUlNBRW5jcnlwdChkKXt2YXIgYT1wa2NzMXBhZDIoZCwodGhpcy5uLmJpdExlbmd0aCgpKzcpPj4zKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgZT10aGlzLmRvUHVibGljKGEpO2lmKGU9PW51bGwpe3JldHVybiBudWxsfXZhciBiPWUudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCYxKT09MCl7cmV0dXJuIGJ9ZWxzZXtyZXR1cm5cIjBcIitifX1mdW5jdGlvbiBSU0FFbmNyeXB0T0FFUChlLGQpe3ZhciBhPW9hZXBfcGFkKGUsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+MyxkKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgZj10aGlzLmRvUHVibGljKGEpO2lmKGY9PW51bGwpe3JldHVybiBudWxsfXZhciBiPWYudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCYxKT09MCl7cmV0dXJuIGJ9ZWxzZXtyZXR1cm5cIjBcIitifX1SU0FLZXkucHJvdG90eXBlLmRvUHVibGljPVJTQURvUHVibGljO1JTQUtleS5wcm90b3R5cGUuc2V0UHVibGljPVJTQVNldFB1YmxpYztSU0FLZXkucHJvdG90eXBlLmVuY3J5cHQ9UlNBRW5jcnlwdDtSU0FLZXkucHJvdG90eXBlLmVuY3J5cHRPQUVQPVJTQUVuY3J5cHRPQUVQO1JTQUtleS5wcm90b3R5cGUudHlwZT1cIlJTQVwiO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIHBrY3MxdW5wYWQyKGcsail7dmFyIGE9Zy50b0J5dGVBcnJheSgpO3ZhciBmPTA7d2hpbGUoZjxhLmxlbmd0aCYmYVtmXT09MCl7KytmfWlmKGEubGVuZ3RoLWYhPWotMXx8YVtmXSE9Mil7cmV0dXJuIG51bGx9KytmO3doaWxlKGFbZl0hPTApe2lmKCsrZj49YS5sZW5ndGgpe3JldHVybiBudWxsfX12YXIgZT1cIlwiO3doaWxlKCsrZjxhLmxlbmd0aCl7dmFyIGg9YVtmXSYyNTU7aWYoaDwxMjgpe2UrPVN0cmluZy5mcm9tQ2hhckNvZGUoaCl9ZWxzZXtpZigoaD4xOTEpJiYoaDwyMjQpKXtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgoaCYzMSk8PDYpfChhW2YrMV0mNjMpKTsrK2Z9ZWxzZXtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgoaCYxNSk8PDEyKXwoKGFbZisxXSY2Myk8PDYpfChhW2YrMl0mNjMpKTtmKz0yfX19cmV0dXJuIGV9ZnVuY3Rpb24gb2FlcF9tZ2YxX3N0cihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9ZShjK1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLFsoZCY0Mjc4MTkwMDgwKT4+MjQsKGQmMTY3MTE2ODApPj4xNiwoZCY2NTI4MCk+PjgsZCYyNTVdKSk7ZCs9MX1yZXR1cm4gYn12YXIgU0hBMV9TSVpFPTIwO2Z1bmN0aW9uIG9hZXBfdW5wYWQobCxiLGUpe2w9bC50b0J5dGVBcnJheSgpO3ZhciBmO2ZvcihmPTA7ZjxsLmxlbmd0aDtmKz0xKXtsW2ZdJj0yNTV9d2hpbGUobC5sZW5ndGg8Yil7bC51bnNoaWZ0KDApfWw9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsbCk7aWYobC5sZW5ndGg8MipTSEExX1NJWkUrMil7dGhyb3dcIkNpcGhlciB0b28gc2hvcnRcIn12YXIgYz1sLnN1YnN0cigxLFNIQTFfU0laRSk7dmFyIG89bC5zdWJzdHIoU0hBMV9TSVpFKzEpO3ZhciBtPW9hZXBfbWdmMV9zdHIobyxTSEExX1NJWkUsZXx8cnN0cl9zaGExKTt2YXIgaD1bXSxmO2ZvcihmPTA7ZjxjLmxlbmd0aDtmKz0xKXtoW2ZdPWMuY2hhckNvZGVBdChmKV5tLmNoYXJDb2RlQXQoZil9dmFyIGo9b2FlcF9tZ2YxX3N0cihTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxoKSxsLmxlbmd0aC1TSEExX1NJWkUscnN0cl9zaGExKTt2YXIgZz1bXTtmb3IoZj0wO2Y8by5sZW5ndGg7Zis9MSl7Z1tmXT1vLmNoYXJDb2RlQXQoZileai5jaGFyQ29kZUF0KGYpfWc9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZyk7aWYoZy5zdWJzdHIoMCxTSEExX1NJWkUpIT09cnN0cl9zaGExKFwiXCIpKXt0aHJvd1wiSGFzaCBtaXNtYXRjaFwifWc9Zy5zdWJzdHIoU0hBMV9TSVpFKTt2YXIgYT1nLmluZGV4T2YoXCJcXHgwMVwiKTt2YXIgaz0oYSE9LTEpP2cuc3Vic3RyKDAsYSkubGFzdEluZGV4T2YoXCJcXHgwMFwiKTotMTtpZihrKzEhPWEpe3Rocm93XCJNYWxmb3JtZWQgZGF0YVwifXJldHVybiBnLnN1YnN0cihhKzEpfWZ1bmN0aW9uIFJTQVNldFByaXZhdGUoYyxhLGIpe3RoaXMuaXNQcml2YXRlPXRydWU7aWYodHlwZW9mIGMhPT1cInN0cmluZ1wiKXt0aGlzLm49Yzt0aGlzLmU9YTt0aGlzLmQ9Yn1lbHNle2lmKGMhPW51bGwmJmEhPW51bGwmJmMubGVuZ3RoPjAmJmEubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChjLDE2KTt0aGlzLmU9cGFyc2VJbnQoYSwxNik7dGhpcy5kPXBhcnNlQmlnSW50KGIsMTYpfWVsc2V7YWxlcnQoXCJJbnZhbGlkIFJTQSBwcml2YXRlIGtleVwiKX19fWZ1bmN0aW9uIFJTQVNldFByaXZhdGVFeChnLGQsZSxjLGIsYSxoLGYpe3RoaXMuaXNQcml2YXRlPXRydWU7aWYoZz09bnVsbCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBOID09IG51bGxcIn1pZihkPT1udWxsKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IEUgPT0gbnVsbFwifWlmKGcubGVuZ3RoPT0wKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IE4ubGVuZ3RoID09IDBcIn1pZihkLmxlbmd0aD09MCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBFLmxlbmd0aCA9PSAwXCJ9aWYoZyE9bnVsbCYmZCE9bnVsbCYmZy5sZW5ndGg+MCYmZC5sZW5ndGg+MCl7dGhpcy5uPXBhcnNlQmlnSW50KGcsMTYpO3RoaXMuZT1wYXJzZUludChkLDE2KTt0aGlzLmQ9cGFyc2VCaWdJbnQoZSwxNik7dGhpcy5wPXBhcnNlQmlnSW50KGMsMTYpO3RoaXMucT1wYXJzZUJpZ0ludChiLDE2KTt0aGlzLmRtcDE9cGFyc2VCaWdJbnQoYSwxNik7dGhpcy5kbXExPXBhcnNlQmlnSW50KGgsMTYpO3RoaXMuY29lZmY9cGFyc2VCaWdJbnQoZiwxNil9ZWxzZXthbGVydChcIkludmFsaWQgUlNBIHByaXZhdGUga2V5IGluIFJTQVNldFByaXZhdGVFeFwiKX19ZnVuY3Rpb24gUlNBR2VuZXJhdGUoYixpKXt2YXIgYT1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIGY9Yj4+MTt0aGlzLmU9cGFyc2VJbnQoaSwxNik7dmFyIGM9bmV3IEJpZ0ludGVnZXIoaSwxNik7Zm9yKDs7KXtmb3IoOzspe3RoaXMucD1uZXcgQmlnSW50ZWdlcihiLWYsMSxhKTtpZih0aGlzLnAuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpLmdjZChjKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wJiZ0aGlzLnAuaXNQcm9iYWJsZVByaW1lKDEwKSl7YnJlYWt9fWZvcig7Oyl7dGhpcy5xPW5ldyBCaWdJbnRlZ2VyKGYsMSxhKTtpZih0aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpLmdjZChjKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wJiZ0aGlzLnEuaXNQcm9iYWJsZVByaW1lKDEwKSl7YnJlYWt9fWlmKHRoaXMucC5jb21wYXJlVG8odGhpcy5xKTw9MCl7dmFyIGg9dGhpcy5wO3RoaXMucD10aGlzLnE7dGhpcy5xPWh9dmFyIGc9dGhpcy5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgZD10aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3ZhciBlPWcubXVsdGlwbHkoZCk7aWYoZS5nY2QoYykuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCl7dGhpcy5uPXRoaXMucC5tdWx0aXBseSh0aGlzLnEpO3RoaXMuZD1jLm1vZEludmVyc2UoZSk7dGhpcy5kbXAxPXRoaXMuZC5tb2QoZyk7dGhpcy5kbXExPXRoaXMuZC5tb2QoZCk7dGhpcy5jb2VmZj10aGlzLnEubW9kSW52ZXJzZSh0aGlzLnApO2JyZWFrfX19ZnVuY3Rpb24gUlNBRG9Qcml2YXRlKGEpe2lmKHRoaXMucD09bnVsbHx8dGhpcy5xPT1udWxsKXtyZXR1cm4gYS5tb2RQb3codGhpcy5kLHRoaXMubil9dmFyIGM9YS5tb2QodGhpcy5wKS5tb2RQb3codGhpcy5kbXAxLHRoaXMucCk7dmFyIGI9YS5tb2QodGhpcy5xKS5tb2RQb3codGhpcy5kbXExLHRoaXMucSk7d2hpbGUoYy5jb21wYXJlVG8oYik8MCl7Yz1jLmFkZCh0aGlzLnApfXJldHVybiBjLnN1YnRyYWN0KGIpLm11bHRpcGx5KHRoaXMuY29lZmYpLm1vZCh0aGlzLnApLm11bHRpcGx5KHRoaXMucSkuYWRkKGIpfWZ1bmN0aW9uIFJTQURlY3J5cHQoYil7dmFyIGQ9cGFyc2VCaWdJbnQoYiwxNik7dmFyIGE9dGhpcy5kb1ByaXZhdGUoZCk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9cmV0dXJuIHBrY3MxdW5wYWQyKGEsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+Myl9ZnVuY3Rpb24gUlNBRGVjcnlwdE9BRVAoZCxiKXt2YXIgZT1wYXJzZUJpZ0ludChkLDE2KTt2YXIgYT10aGlzLmRvUHJpdmF0ZShlKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gb2FlcF91bnBhZChhLCh0aGlzLm4uYml0TGVuZ3RoKCkrNyk+PjMsYil9UlNBS2V5LnByb3RvdHlwZS5kb1ByaXZhdGU9UlNBRG9Qcml2YXRlO1JTQUtleS5wcm90b3R5cGUuc2V0UHJpdmF0ZT1SU0FTZXRQcml2YXRlO1JTQUtleS5wcm90b3R5cGUuc2V0UHJpdmF0ZUV4PVJTQVNldFByaXZhdGVFeDtSU0FLZXkucHJvdG90eXBlLmdlbmVyYXRlPVJTQUdlbmVyYXRlO1JTQUtleS5wcm90b3R5cGUuZGVjcnlwdD1SU0FEZWNyeXB0O1JTQUtleS5wcm90b3R5cGUuZGVjcnlwdE9BRVA9UlNBRGVjcnlwdE9BRVA7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gRUNGaWVsZEVsZW1lbnRGcChiLGEpe3RoaXMueD1hO3RoaXMucT1ifWZ1bmN0aW9uIGZlRnBFcXVhbHMoYSl7aWYoYT09dGhpcyl7cmV0dXJuIHRydWV9cmV0dXJuKHRoaXMucS5lcXVhbHMoYS5xKSYmdGhpcy54LmVxdWFscyhhLngpKX1mdW5jdGlvbiBmZUZwVG9CaWdJbnRlZ2VyKCl7cmV0dXJuIHRoaXMueH1mdW5jdGlvbiBmZUZwTmVnYXRlKCl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLngubmVnYXRlKCkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBBZGQoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLnguYWRkKGEudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwU3VidHJhY3QoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLnguc3VidHJhY3QoYS50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBNdWx0aXBseShhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5tdWx0aXBseShhLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcFNxdWFyZSgpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LnNxdWFyZSgpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwRGl2aWRlKGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54Lm11bHRpcGx5KGEudG9CaWdJbnRlZ2VyKCkubW9kSW52ZXJzZSh0aGlzLnEpKS5tb2QodGhpcy5xKSl9RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZXF1YWxzPWZlRnBFcXVhbHM7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUudG9CaWdJbnRlZ2VyPWZlRnBUb0JpZ0ludGVnZXI7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUubmVnYXRlPWZlRnBOZWdhdGU7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuYWRkPWZlRnBBZGQ7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuc3VidHJhY3Q9ZmVGcFN1YnRyYWN0O0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLm11bHRpcGx5PWZlRnBNdWx0aXBseTtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5zcXVhcmU9ZmVGcFNxdWFyZTtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5kaXZpZGU9ZmVGcERpdmlkZTtmdW5jdGlvbiBFQ1BvaW50RnAoYyxhLGQsYil7dGhpcy5jdXJ2ZT1jO3RoaXMueD1hO3RoaXMueT1kO2lmKGI9PW51bGwpe3RoaXMuej1CaWdJbnRlZ2VyLk9ORX1lbHNle3RoaXMuej1ifXRoaXMuemludj1udWxsfWZ1bmN0aW9uIHBvaW50RnBHZXRYKCl7aWYodGhpcy56aW52PT1udWxsKXt0aGlzLnppbnY9dGhpcy56Lm1vZEludmVyc2UodGhpcy5jdXJ2ZS5xKX1yZXR1cm4gdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcih0aGlzLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56aW52KS5tb2QodGhpcy5jdXJ2ZS5xKSl9ZnVuY3Rpb24gcG9pbnRGcEdldFkoKXtpZih0aGlzLnppbnY9PW51bGwpe3RoaXMuemludj10aGlzLnoubW9kSW52ZXJzZSh0aGlzLmN1cnZlLnEpfXJldHVybiB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnppbnYpLm1vZCh0aGlzLmN1cnZlLnEpKX1mdW5jdGlvbiBwb2ludEZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfWlmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gYS5pc0luZmluaXR5KCl9aWYoYS5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKX12YXIgYyxiO2M9YS55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGEueikpLm1vZCh0aGlzLmN1cnZlLnEpO2lmKCFjLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKXtyZXR1cm4gZmFsc2V9Yj1hLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkoYS56KSkubW9kKHRoaXMuY3VydmUucSk7cmV0dXJuIGIuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTyl9ZnVuY3Rpb24gcG9pbnRGcElzSW5maW5pdHkoKXtpZigodGhpcy54PT1udWxsKSYmKHRoaXMueT09bnVsbCkpe3JldHVybiB0cnVlfXJldHVybiB0aGlzLnouZXF1YWxzKEJpZ0ludGVnZXIuWkVSTykmJiF0aGlzLnkudG9CaWdJbnRlZ2VyKCkuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTyl9ZnVuY3Rpb24gcG9pbnRGcE5lZ2F0ZSgpe3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy54LHRoaXMueS5uZWdhdGUoKSx0aGlzLnopfWZ1bmN0aW9uIHBvaW50RnBBZGQobCl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiBsfWlmKGwuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc312YXIgcD1sLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkobC56KSkubW9kKHRoaXMuY3VydmUucSk7dmFyIG89bC54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGwueikpLm1vZCh0aGlzLmN1cnZlLnEpO2lmKEJpZ0ludGVnZXIuWkVSTy5lcXVhbHMobykpe2lmKEJpZ0ludGVnZXIuWkVSTy5lcXVhbHMocCkpe3JldHVybiB0aGlzLnR3aWNlKCl9cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgaj1uZXcgQmlnSW50ZWdlcihcIjNcIik7dmFyIGU9dGhpcy54LnRvQmlnSW50ZWdlcigpO3ZhciBuPXRoaXMueS50b0JpZ0ludGVnZXIoKTt2YXIgYz1sLngudG9CaWdJbnRlZ2VyKCk7dmFyIGs9bC55LnRvQmlnSW50ZWdlcigpO3ZhciBtPW8uc3F1YXJlKCk7dmFyIGk9bS5tdWx0aXBseShvKTt2YXIgZD1lLm11bHRpcGx5KG0pO3ZhciBnPXAuc3F1YXJlKCkubXVsdGlwbHkodGhpcy56KTt2YXIgYT1nLnN1YnRyYWN0KGQuc2hpZnRMZWZ0KDEpKS5tdWx0aXBseShsLnopLnN1YnRyYWN0KGkpLm11bHRpcGx5KG8pLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBoPWQubXVsdGlwbHkoaikubXVsdGlwbHkocCkuc3VidHJhY3Qobi5tdWx0aXBseShpKSkuc3VidHJhY3QoZy5tdWx0aXBseShwKSkubXVsdGlwbHkobC56KS5hZGQocC5tdWx0aXBseShpKSkubW9kKHRoaXMuY3VydmUucSk7dmFyIGY9aS5tdWx0aXBseSh0aGlzLnopLm11bHRpcGx5KGwueikubW9kKHRoaXMuY3VydmUucSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGEpLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoaCksZil9ZnVuY3Rpb24gcG9pbnRGcFR3aWNlKCl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKHRoaXMueS50b0JpZ0ludGVnZXIoKS5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1uZXcgQmlnSW50ZWdlcihcIjNcIik7dmFyIGM9dGhpcy54LnRvQmlnSW50ZWdlcigpO3ZhciBoPXRoaXMueS50b0JpZ0ludGVnZXIoKTt2YXIgZT1oLm11bHRpcGx5KHRoaXMueik7dmFyIGo9ZS5tdWx0aXBseShoKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgaT10aGlzLmN1cnZlLmEudG9CaWdJbnRlZ2VyKCk7dmFyIGs9Yy5zcXVhcmUoKS5tdWx0aXBseShnKTtpZighQmlnSW50ZWdlci5aRVJPLmVxdWFscyhpKSl7az1rLmFkZCh0aGlzLnouc3F1YXJlKCkubXVsdGlwbHkoaSkpfWs9ay5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgYj1rLnNxdWFyZSgpLnN1YnRyYWN0KGMuc2hpZnRMZWZ0KDMpLm11bHRpcGx5KGopKS5zaGlmdExlZnQoMSkubXVsdGlwbHkoZSkubW9kKHRoaXMuY3VydmUucSk7dmFyIGY9ay5tdWx0aXBseShnKS5tdWx0aXBseShjKS5zdWJ0cmFjdChqLnNoaWZ0TGVmdCgxKSkuc2hpZnRMZWZ0KDIpLm11bHRpcGx5KGopLnN1YnRyYWN0KGsuc3F1YXJlKCkubXVsdGlwbHkoaykpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBkPWUuc3F1YXJlKCkubXVsdGlwbHkoZSkuc2hpZnRMZWZ0KDMpLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihiKSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGYpLGQpfWZ1bmN0aW9uIHBvaW50RnBNdWx0aXBseShiKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYoYi5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1iO3ZhciBmPWcubXVsdGlwbHkobmV3IEJpZ0ludGVnZXIoXCIzXCIpKTt2YXIgbD10aGlzLm5lZ2F0ZSgpO3ZhciBkPXRoaXM7dmFyIGM7Zm9yKGM9Zi5iaXRMZW5ndGgoKS0yO2M+MDstLWMpe2Q9ZC50d2ljZSgpO3ZhciBhPWYudGVzdEJpdChjKTt2YXIgaj1nLnRlc3RCaXQoYyk7aWYoYSE9ail7ZD1kLmFkZChhP3RoaXM6bCl9fXJldHVybiBkfWZ1bmN0aW9uIHBvaW50RnBNdWx0aXBseVR3byhjLGEsYil7dmFyIGQ7aWYoYy5iaXRMZW5ndGgoKT5iLmJpdExlbmd0aCgpKXtkPWMuYml0TGVuZ3RoKCktMX1lbHNle2Q9Yi5iaXRMZW5ndGgoKS0xfXZhciBmPXRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKTt2YXIgZT10aGlzLmFkZChhKTt3aGlsZShkPj0wKXtmPWYudHdpY2UoKTtpZihjLnRlc3RCaXQoZCkpe2lmKGIudGVzdEJpdChkKSl7Zj1mLmFkZChlKX1lbHNle2Y9Zi5hZGQodGhpcyl9fWVsc2V7aWYoYi50ZXN0Qml0KGQpKXtmPWYuYWRkKGEpfX0tLWR9cmV0dXJuIGZ9RUNQb2ludEZwLnByb3RvdHlwZS5nZXRYPXBvaW50RnBHZXRYO0VDUG9pbnRGcC5wcm90b3R5cGUuZ2V0WT1wb2ludEZwR2V0WTtFQ1BvaW50RnAucHJvdG90eXBlLmVxdWFscz1wb2ludEZwRXF1YWxzO0VDUG9pbnRGcC5wcm90b3R5cGUuaXNJbmZpbml0eT1wb2ludEZwSXNJbmZpbml0eTtFQ1BvaW50RnAucHJvdG90eXBlLm5lZ2F0ZT1wb2ludEZwTmVnYXRlO0VDUG9pbnRGcC5wcm90b3R5cGUuYWRkPXBvaW50RnBBZGQ7RUNQb2ludEZwLnByb3RvdHlwZS50d2ljZT1wb2ludEZwVHdpY2U7RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseT1wb2ludEZwTXVsdGlwbHk7RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseVR3bz1wb2ludEZwTXVsdGlwbHlUd287ZnVuY3Rpb24gRUNDdXJ2ZUZwKGUsZCxjKXt0aGlzLnE9ZTt0aGlzLmE9dGhpcy5mcm9tQmlnSW50ZWdlcihkKTt0aGlzLmI9dGhpcy5mcm9tQmlnSW50ZWdlcihjKTt0aGlzLmluZmluaXR5PW5ldyBFQ1BvaW50RnAodGhpcyxudWxsLG51bGwpfWZ1bmN0aW9uIGN1cnZlRnBHZXRRKCl7cmV0dXJuIHRoaXMucX1mdW5jdGlvbiBjdXJ2ZUZwR2V0QSgpe3JldHVybiB0aGlzLmF9ZnVuY3Rpb24gY3VydmVGcEdldEIoKXtyZXR1cm4gdGhpcy5ifWZ1bmN0aW9uIGN1cnZlRnBFcXVhbHMoYSl7aWYoYT09dGhpcyl7cmV0dXJuIHRydWV9cmV0dXJuKHRoaXMucS5lcXVhbHMoYS5xKSYmdGhpcy5hLmVxdWFscyhhLmEpJiZ0aGlzLmIuZXF1YWxzKGEuYikpfWZ1bmN0aW9uIGN1cnZlRnBHZXRJbmZpbml0eSgpe3JldHVybiB0aGlzLmluZmluaXR5fWZ1bmN0aW9uIGN1cnZlRnBGcm9tQmlnSW50ZWdlcihhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLGEpfWZ1bmN0aW9uIGN1cnZlRnBEZWNvZGVQb2ludEhleChkKXtzd2l0Y2gocGFyc2VJbnQoZC5zdWJzdHIoMCwyKSwxNikpe2Nhc2UgMDpyZXR1cm4gdGhpcy5pbmZpbml0eTtjYXNlIDI6Y2FzZSAzOnJldHVybiBudWxsO2Nhc2UgNDpjYXNlIDY6Y2FzZSA3OnZhciBhPShkLmxlbmd0aC0yKS8yO3ZhciBjPWQuc3Vic3RyKDIsYSk7dmFyIGI9ZC5zdWJzdHIoYSsyLGEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMsdGhpcy5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcihjLDE2KSksdGhpcy5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcihiLDE2KSkpO2RlZmF1bHQ6cmV0dXJuIG51bGx9fUVDQ3VydmVGcC5wcm90b3R5cGUuZ2V0UT1jdXJ2ZUZwR2V0UTtFQ0N1cnZlRnAucHJvdG90eXBlLmdldEE9Y3VydmVGcEdldEE7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRCPWN1cnZlRnBHZXRCO0VDQ3VydmVGcC5wcm90b3R5cGUuZXF1YWxzPWN1cnZlRnBFcXVhbHM7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRJbmZpbml0eT1jdXJ2ZUZwR2V0SW5maW5pdHk7RUNDdXJ2ZUZwLnByb3RvdHlwZS5mcm9tQmlnSW50ZWdlcj1jdXJ2ZUZwRnJvbUJpZ0ludGVnZXI7RUNDdXJ2ZUZwLnByb3RvdHlwZS5kZWNvZGVQb2ludEhleD1jdXJ2ZUZwRGVjb2RlUG9pbnRIZXg7XG4vKiEgKGMpIFN0ZWZhbiBUaG9tYXMgfCBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbmpzL2JpdGNvaW5qcy1saWJcbiAqL1xuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZ2V0Qnl0ZUxlbmd0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmZsb29yKCh0aGlzLnRvQmlnSW50ZWdlcigpLmJpdExlbmd0aCgpKzcpLzgpfTtFQ1BvaW50RnAucHJvdG90eXBlLmdldEVuY29kZWQ9ZnVuY3Rpb24oYyl7dmFyIGQ9ZnVuY3Rpb24oaCxmKXt2YXIgZz1oLnRvQnl0ZUFycmF5VW5zaWduZWQoKTtpZihmPGcubGVuZ3RoKXtnPWcuc2xpY2UoZy5sZW5ndGgtZil9ZWxzZXt3aGlsZShmPmcubGVuZ3RoKXtnLnVuc2hpZnQoMCl9fXJldHVybiBnfTt2YXIgYT10aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgZT10aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgYj1kKGEsMzIpO2lmKGMpe2lmKGUuaXNFdmVuKCkpe2IudW5zaGlmdCgyKX1lbHNle2IudW5zaGlmdCgzKX19ZWxzZXtiLnVuc2hpZnQoNCk7Yj1iLmNvbmNhdChkKGUsMzIpKX1yZXR1cm4gYn07RUNQb2ludEZwLmRlY29kZUZyb209ZnVuY3Rpb24oZyxjKXt2YXIgZj1jWzBdO3ZhciBlPWMubGVuZ3RoLTE7dmFyIGQ9Yy5zbGljZSgxLDErZS8yKTt2YXIgYj1jLnNsaWNlKDErZS8yLDErZSk7ZC51bnNoaWZ0KDApO2IudW5zaGlmdCgwKTt2YXIgYT1uZXcgQmlnSW50ZWdlcihkKTt2YXIgaD1uZXcgQmlnSW50ZWdlcihiKTtyZXR1cm4gbmV3IEVDUG9pbnRGcChnLGcuZnJvbUJpZ0ludGVnZXIoYSksZy5mcm9tQmlnSW50ZWdlcihoKSl9O0VDUG9pbnRGcC5kZWNvZGVGcm9tSGV4PWZ1bmN0aW9uKGcsYyl7dmFyIGY9Yy5zdWJzdHIoMCwyKTt2YXIgZT1jLmxlbmd0aC0yO3ZhciBkPWMuc3Vic3RyKDIsZS8yKTt2YXIgYj1jLnN1YnN0cigyK2UvMixlLzIpO3ZhciBhPW5ldyBCaWdJbnRlZ2VyKGQsMTYpO3ZhciBoPW5ldyBCaWdJbnRlZ2VyKGIsMTYpO3JldHVybiBuZXcgRUNQb2ludEZwKGcsZy5mcm9tQmlnSW50ZWdlcihhKSxnLmZyb21CaWdJbnRlZ2VyKGgpKX07RUNQb2ludEZwLnByb3RvdHlwZS5hZGQyRD1mdW5jdGlvbihjKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIGN9aWYoYy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKHRoaXMueC5lcXVhbHMoYy54KSl7aWYodGhpcy55LmVxdWFscyhjLnkpKXtyZXR1cm4gdGhpcy50d2ljZSgpfXJldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9Yy54LnN1YnRyYWN0KHRoaXMueCk7dmFyIGU9Yy55LnN1YnRyYWN0KHRoaXMueSk7dmFyIGE9ZS5kaXZpZGUoZyk7dmFyIGQ9YS5zcXVhcmUoKS5zdWJ0cmFjdCh0aGlzLngpLnN1YnRyYWN0KGMueCk7dmFyIGY9YS5tdWx0aXBseSh0aGlzLnguc3VidHJhY3QoZCkpLnN1YnRyYWN0KHRoaXMueSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSxkLGYpfTtFQ1BvaW50RnAucHJvdG90eXBlLnR3aWNlMkQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYodGhpcy55LnRvQmlnSW50ZWdlcigpLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBiPXRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDIpKTt2YXIgZT10aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZigzKSk7dmFyIGE9dGhpcy54LnNxdWFyZSgpLm11bHRpcGx5KGUpLmFkZCh0aGlzLmN1cnZlLmEpLmRpdmlkZSh0aGlzLnkubXVsdGlwbHkoYikpO3ZhciBjPWEuc3F1YXJlKCkuc3VidHJhY3QodGhpcy54Lm11bHRpcGx5KGIpKTt2YXIgZD1hLm11bHRpcGx5KHRoaXMueC5zdWJ0cmFjdChjKSkuc3VidHJhY3QodGhpcy55KTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLGMsZCl9O0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHkyRD1mdW5jdGlvbihiKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYoYi5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1iO3ZhciBmPWcubXVsdGlwbHkobmV3IEJpZ0ludGVnZXIoXCIzXCIpKTt2YXIgbD10aGlzLm5lZ2F0ZSgpO3ZhciBkPXRoaXM7dmFyIGM7Zm9yKGM9Zi5iaXRMZW5ndGgoKS0yO2M+MDstLWMpe2Q9ZC50d2ljZSgpO3ZhciBhPWYudGVzdEJpdChjKTt2YXIgaj1nLnRlc3RCaXQoYyk7aWYoYSE9ail7ZD1kLmFkZDJEKGE/dGhpczpsKX19cmV0dXJuIGR9O0VDUG9pbnRGcC5wcm90b3R5cGUuaXNPbkN1cnZlPWZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGk9dGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGY9dGhpcy5jdXJ2ZS5nZXRBKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGM9dGhpcy5jdXJ2ZS5nZXRCKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGg9dGhpcy5jdXJ2ZS5nZXRRKCk7dmFyIGU9aS5tdWx0aXBseShpKS5tb2QoaCk7dmFyIGc9ZC5tdWx0aXBseShkKS5tdWx0aXBseShkKS5hZGQoZi5tdWx0aXBseShkKSkuYWRkKGMpLm1vZChoKTtyZXR1cm4gZS5lcXVhbHMoZyl9O0VDUG9pbnRGcC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIihcIit0aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKS50b1N0cmluZygpK1wiLFwiK3RoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKCkrXCIpXCJ9O0VDUG9pbnRGcC5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXt2YXIgYz10aGlzLmN1cnZlLmdldFEoKTtpZih0aGlzLmlzSW5maW5pdHkoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgYXQgaW5maW5pdHkuXCIpfXZhciBhPXRoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBiPXRoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO2lmKGEuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKTwwfHxhLmNvbXBhcmVUbyhjLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk+MCl7dGhyb3cgbmV3IEVycm9yKFwieCBjb29yZGluYXRlIG91dCBvZiBib3VuZHNcIil9aWYoYi5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fGIuY29tcGFyZVRvKGMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKT4wKXt0aHJvdyBuZXcgRXJyb3IoXCJ5IGNvb3JkaW5hdGUgb3V0IG9mIGJvdW5kc1wiKX1pZighdGhpcy5pc09uQ3VydmUoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgbm90IG9uIHRoZSBjdXJ2ZS5cIil9aWYodGhpcy5tdWx0aXBseShjKS5pc0luZmluaXR5KCkpe3Rocm93IG5ldyBFcnJvcihcIlBvaW50IGlzIG5vdCBhIHNjYWxhciBtdWx0aXBsZSBvZiBHLlwiKX1yZXR1cm4gdHJ1ZX07XG4vKiEgTWlrZSBTYW11ZWwgKGMpIDIwMDkgfCBjb2RlLmdvb2dsZS5jb20vcC9qc29uLXNhbnMtZXZhbFxuICovXG52YXIganNvblBhcnNlPShmdW5jdGlvbigpe3ZhciBlPVwiKD86LT9cXFxcYig/OjB8WzEtOV1bMC05XSopKD86XFxcXC5bMC05XSspPyg/OltlRV1bKy1dP1swLTldKyk/XFxcXGIpXCI7dmFyIGo9Jyg/OlteXFxcXDAtXFxcXHgwOFxcXFx4MGEtXFxcXHgxZlwiXFxcXFxcXFxdfFxcXFxcXFxcKD86W1wiL1xcXFxcXFxcYmZucnRdfHVbMC05QS1GYS1mXXs0fSkpJzt2YXIgaT0nKD86XCInK2orJypcIiknO3ZhciBkPW5ldyBSZWdFeHAoXCIoPzpmYWxzZXx0cnVlfG51bGx8W1xcXFx7XFxcXH1cXFxcW1xcXFxdXXxcIitlK1wifFwiK2krXCIpXCIsXCJnXCIpO3ZhciBrPW5ldyBSZWdFeHAoXCJcXFxcXFxcXCg/OihbXnVdKXx1KC57NH0pKVwiLFwiZ1wiKTt2YXIgZz17J1wiJzonXCInLFwiL1wiOlwiL1wiLFwiXFxcXFwiOlwiXFxcXFwiLGI6XCJcXGJcIixmOlwiXFxmXCIsbjpcIlxcblwiLHI6XCJcXHJcIix0OlwiXFx0XCJ9O2Z1bmN0aW9uIGgobCxtLG4pe3JldHVybiBtP2dbbV06U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLDE2KSl9dmFyIGM9bmV3IFN0cmluZyhcIlwiKTt2YXIgYT1cIlxcXFxcIjt2YXIgZj17XCJ7XCI6T2JqZWN0LFwiW1wiOkFycmF5fTt2YXIgYj1PYmplY3QuaGFzT3duUHJvcGVydHk7cmV0dXJuIGZ1bmN0aW9uKHUscSl7dmFyIHA9dS5tYXRjaChkKTt2YXIgeDt2YXIgdj1wWzBdO3ZhciBsPWZhbHNlO2lmKFwie1wiPT09dil7eD17fX1lbHNle2lmKFwiW1wiPT09dil7eD1bXX1lbHNle3g9W107bD10cnVlfX12YXIgdDt2YXIgcj1beF07Zm9yKHZhciBvPTEtbCxtPXAubGVuZ3RoO288bTsrK28pe3Y9cFtvXTt2YXIgdztzd2l0Y2godi5jaGFyQ29kZUF0KDApKXtkZWZhdWx0Onc9clswXTt3W3R8fHcubGVuZ3RoXT0rKHYpO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMzQ6dj12LnN1YnN0cmluZygxLHYubGVuZ3RoLTEpO2lmKHYuaW5kZXhPZihhKSE9PS0xKXt2PXYucmVwbGFjZShrLGgpfXc9clswXTtpZighdCl7aWYodyBpbnN0YW5jZW9mIEFycmF5KXt0PXcubGVuZ3RofWVsc2V7dD12fHxjO2JyZWFrfX13W3RdPXY7dD12b2lkIDA7YnJlYWs7Y2FzZSA5MTp3PXJbMF07ci51bnNoaWZ0KHdbdHx8dy5sZW5ndGhdPVtdKTt0PXZvaWQgMDticmVhaztjYXNlIDkzOnIuc2hpZnQoKTticmVhaztjYXNlIDEwMjp3PXJbMF07d1t0fHx3Lmxlbmd0aF09ZmFsc2U7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTA6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPW51bGw7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTY6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPXRydWU7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjM6dz1yWzBdO3IudW5zaGlmdCh3W3R8fHcubGVuZ3RoXT17fSk7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjU6ci5zaGlmdCgpO2JyZWFrfX1pZihsKXtpZihyLmxlbmd0aCE9PTEpe3Rocm93IG5ldyBFcnJvcigpfXg9eFswXX1lbHNle2lmKHIubGVuZ3RoKXt0aHJvdyBuZXcgRXJyb3IoKX19aWYocSl7dmFyIHM9ZnVuY3Rpb24oQyxCKXt2YXIgRD1DW0JdO2lmKEQmJnR5cGVvZiBEPT09XCJvYmplY3RcIil7dmFyIG49bnVsbDtmb3IodmFyIHogaW4gRCl7aWYoYi5jYWxsKEQseikmJkQhPT1DKXt2YXIgeT1zKEQseik7aWYoeSE9PXZvaWQgMCl7RFt6XT15fWVsc2V7aWYoIW4pe249W119bi5wdXNoKHopfX19aWYobil7Zm9yKHZhciBBPW4ubGVuZ3RoOy0tQT49MDspe2RlbGV0ZSBEW25bQV1dfX19cmV0dXJuIHEuY2FsbChDLEIsRCl9O3g9cyh7XCJcIjp4fSxcIlwiKX1yZXR1cm4geH19KSgpO1xuLyohIGFzbjEtMS4wLjEwLmpzIChjKSAyMDEzLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1LSlVSLmFzbjEuQVNOMVV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5pbnRlZ2VyVG9CeXRlSGV4PWZ1bmN0aW9uKGEpe3ZhciBiPWEudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCUyKT09MSl7Yj1cIjBcIitifXJldHVybiBifTt0aGlzLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4PWZ1bmN0aW9uKGope3ZhciBmPWoudG9TdHJpbmcoMTYpO2lmKGYuc3Vic3RyKDAsMSkhPVwiLVwiKXtpZihmLmxlbmd0aCUyPT0xKXtmPVwiMFwiK2Z9ZWxzZXtpZighZi5tYXRjaCgvXlswLTddLykpe2Y9XCIwMFwiK2Z9fX1lbHNle3ZhciBhPWYuc3Vic3RyKDEpO3ZhciBlPWEubGVuZ3RoO2lmKGUlMj09MSl7ZSs9MX1lbHNle2lmKCFmLm1hdGNoKC9eWzAtN10vKSl7ZSs9Mn19dmFyIGc9XCJcIjtmb3IodmFyIGQ9MDtkPGU7ZCsrKXtnKz1cImZcIn12YXIgYz1uZXcgQmlnSW50ZWdlcihnLDE2KTt2YXIgYj1jLnhvcihqKS5hZGQoQmlnSW50ZWdlci5PTkUpO2Y9Yi50b1N0cmluZygxNikucmVwbGFjZSgvXi0vLFwiXCIpfXJldHVybiBmfTt0aGlzLmdldFBFTVN0cmluZ0Zyb21IZXg9ZnVuY3Rpb24oYSxiKXt2YXIgYz1oZXh0b2I2NChhKTt2YXIgZD1jLnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO2Q9ZC5yZXBsYWNlKC9cXHJcXG4kLyxcIlwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gXCIrYitcIi0tLS0tXFxyXFxuXCIrZCtcIlxcclxcbi0tLS0tRU5EIFwiK2IrXCItLS0tLVxcclxcblwifTt0aGlzLm5ld09iamVjdD1mdW5jdGlvbihiKXt2YXIgZz1LSlVSLmFzbjE7dmFyIGs9T2JqZWN0LmtleXMoYik7aWYoay5sZW5ndGghPTEpe3Rocm93XCJrZXkgb2YgcGFyYW0gc2hhbGwgYmUgb25seSBvbmUuXCJ9dmFyIGo9a1swXTtpZihcIjpib29sOmludDpiaXRzdHI6b2N0c3RyOm51bGw6b2lkOmVudW06dXRmOHN0cjpudW1zdHI6cHJuc3RyOnRlbHN0cjppYTVzdHI6dXRjdGltZTpnZW50aW1lOnNlcTpzZXQ6dGFnOlwiLmluZGV4T2YoXCI6XCIraitcIjpcIik9PS0xKXt0aHJvd1widW5kZWZpbmVkIGtleTogXCIran1pZihqPT1cImJvb2xcIil7cmV0dXJuIG5ldyBnLkRFUkJvb2xlYW4oYltqXSl9aWYoaj09XCJpbnRcIil7cmV0dXJuIG5ldyBnLkRFUkludGVnZXIoYltqXSl9aWYoaj09XCJiaXRzdHJcIil7cmV0dXJuIG5ldyBnLkRFUkJpdFN0cmluZyhiW2pdKX1pZihqPT1cIm9jdHN0clwiKXtyZXR1cm4gbmV3IGcuREVST2N0ZXRTdHJpbmcoYltqXSl9aWYoaj09XCJudWxsXCIpe3JldHVybiBuZXcgZy5ERVJOdWxsKGJbal0pfWlmKGo9PVwib2lkXCIpe3JldHVybiBuZXcgZy5ERVJPYmplY3RJZGVudGlmaWVyKGJbal0pfWlmKGo9PVwiZW51bVwiKXtyZXR1cm4gbmV3IGcuREVSRW51bWVyYXRlZChiW2pdKX1pZihqPT1cInV0ZjhzdHJcIil7cmV0dXJuIG5ldyBnLkRFUlVURjhTdHJpbmcoYltqXSl9aWYoaj09XCJudW1zdHJcIil7cmV0dXJuIG5ldyBnLkRFUk51bWVyaWNTdHJpbmcoYltqXSl9aWYoaj09XCJwcm5zdHJcIil7cmV0dXJuIG5ldyBnLkRFUlByaW50YWJsZVN0cmluZyhiW2pdKX1pZihqPT1cInRlbHN0clwiKXtyZXR1cm4gbmV3IGcuREVSVGVsZXRleFN0cmluZyhiW2pdKX1pZihqPT1cImlhNXN0clwiKXtyZXR1cm4gbmV3IGcuREVSSUE1U3RyaW5nKGJbal0pfWlmKGo9PVwidXRjdGltZVwiKXtyZXR1cm4gbmV3IGcuREVSVVRDVGltZShiW2pdKX1pZihqPT1cImdlbnRpbWVcIil7cmV0dXJuIG5ldyBnLkRFUkdlbmVyYWxpemVkVGltZShiW2pdKX1pZihqPT1cInNlcVwiKXt2YXIgbT1iW2pdO3ZhciBoPVtdO2Zvcih2YXIgZT0wO2U8bS5sZW5ndGg7ZSsrKXt2YXIgbD1nLkFTTjFVdGlsLm5ld09iamVjdChtW2VdKTtoLnB1c2gobCl9cmV0dXJuIG5ldyBnLkRFUlNlcXVlbmNlKHthcnJheTpofSl9aWYoaj09XCJzZXRcIil7dmFyIG09YltqXTt2YXIgaD1bXTtmb3IodmFyIGU9MDtlPG0ubGVuZ3RoO2UrKyl7dmFyIGw9Zy5BU04xVXRpbC5uZXdPYmplY3QobVtlXSk7aC5wdXNoKGwpfXJldHVybiBuZXcgZy5ERVJTZXQoe2FycmF5Omh9KX1pZihqPT1cInRhZ1wiKXt2YXIgYz1iW2pdO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjKT09PVwiW29iamVjdCBBcnJheV1cIiYmYy5sZW5ndGg9PTMpe3ZhciBkPWcuQVNOMVV0aWwubmV3T2JqZWN0KGNbMl0pO3JldHVybiBuZXcgZy5ERVJUYWdnZWRPYmplY3Qoe3RhZzpjWzBdLGV4cGxpY2l0OmNbMV0sb2JqOmR9KX1lbHNle3ZhciBmPXt9O2lmKGMuZXhwbGljaXQhPT11bmRlZmluZWQpe2YuZXhwbGljaXQ9Yy5leHBsaWNpdH1pZihjLnRhZyE9PXVuZGVmaW5lZCl7Zi50YWc9Yy50YWd9aWYoYy5vYmo9PT11bmRlZmluZWQpe3Rocm93XCJvYmogc2hhbGwgYmUgc3BlY2lmaWVkIGZvciAndGFnJy5cIn1mLm9iaj1nLkFTTjFVdGlsLm5ld09iamVjdChjLm9iaik7cmV0dXJuIG5ldyBnLkRFUlRhZ2dlZE9iamVjdChmKX19fTt0aGlzLmpzb25Ub0FTTjFIRVg9ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5uZXdPYmplY3QoYik7cmV0dXJuIGEuZ2V0RW5jb2RlZEhleCgpfX07S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50PWZ1bmN0aW9uKGEpe3ZhciBqPVwiXCI7dmFyIGs9cGFyc2VJbnQoYS5zdWJzdHIoMCwyKSwxNik7dmFyIGQ9TWF0aC5mbG9vcihrLzQwKTt2YXIgYz1rJTQwO3ZhciBqPWQrXCIuXCIrYzt2YXIgZT1cIlwiO2Zvcih2YXIgZj0yO2Y8YS5sZW5ndGg7Zis9Mil7dmFyIGc9cGFyc2VJbnQoYS5zdWJzdHIoZiwyKSwxNik7dmFyIGg9KFwiMDAwMDAwMDBcIitnLnRvU3RyaW5nKDIpKS5zbGljZSgtOCk7ZT1lK2guc3Vic3RyKDEsNyk7aWYoaC5zdWJzdHIoMCwxKT09XCIwXCIpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKGUsMik7aj1qK1wiLlwiK2IudG9TdHJpbmcoMTApO2U9XCJcIn19cmV0dXJuIGp9O0tKVVIuYXNuMS5BU04xVXRpbC5vaWRJbnRUb0hleD1mdW5jdGlvbihmKXt2YXIgZT1mdW5jdGlvbihhKXt2YXIgaz1hLnRvU3RyaW5nKDE2KTtpZihrLmxlbmd0aD09MSl7az1cIjBcIitrfXJldHVybiBrfTt2YXIgZD1mdW5jdGlvbihvKXt2YXIgbj1cIlwiO3ZhciBrPW5ldyBCaWdJbnRlZ2VyKG8sMTApO3ZhciBhPWsudG9TdHJpbmcoMik7dmFyIGw9Ny1hLmxlbmd0aCU3O2lmKGw9PTcpe2w9MH12YXIgcT1cIlwiO2Zvcih2YXIgbT0wO208bDttKyspe3ErPVwiMFwifWE9cSthO2Zvcih2YXIgbT0wO208YS5sZW5ndGgtMTttKz03KXt2YXIgcD1hLnN1YnN0cihtLDcpO2lmKG0hPWEubGVuZ3RoLTcpe3A9XCIxXCIrcH1uKz1lKHBhcnNlSW50KHAsMikpfXJldHVybiBufTtpZighZi5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJtYWxmb3JtZWQgb2lkIHN0cmluZzogXCIrZn12YXIgZz1cIlwiO3ZhciBiPWYuc3BsaXQoXCIuXCIpO3ZhciBqPXBhcnNlSW50KGJbMF0pKjQwK3BhcnNlSW50KGJbMV0pO2crPWUoaik7Yi5zcGxpY2UoMCwyKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7Zys9ZChiW2NdKX1yZXR1cm4gZ307S0pVUi5hc24xLkFTTjFPYmplY3Q9ZnVuY3Rpb24oKXt2YXIgYz10cnVlO3ZhciBiPW51bGw7dmFyIGQ9XCIwMFwiO3ZhciBlPVwiMDBcIjt2YXIgYT1cIlwiO3RoaXMuZ2V0TGVuZ3RoSGV4RnJvbVZhbHVlPWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFY9PVwidW5kZWZpbmVkXCJ8fHRoaXMuaFY9PW51bGwpe3Rocm93XCJ0aGlzLmhWIGlzIG51bGwgb3IgdW5kZWZpbmVkLlwifWlmKHRoaXMuaFYubGVuZ3RoJTI9PTEpe3Rocm93XCJ2YWx1ZSBoZXggbXVzdCBiZSBldmVuIGxlbmd0aDogbj1cIithLmxlbmd0aCtcIix2PVwiK3RoaXMuaFZ9dmFyIGk9dGhpcy5oVi5sZW5ndGgvMjt2YXIgaD1pLnRvU3RyaW5nKDE2KTtpZihoLmxlbmd0aCUyPT0xKXtoPVwiMFwiK2h9aWYoaTwxMjgpe3JldHVybiBofWVsc2V7dmFyIGc9aC5sZW5ndGgvMjtpZihnPjE1KXt0aHJvd1wiQVNOLjEgbGVuZ3RoIHRvbyBsb25nIHRvIHJlcHJlc2VudCBieSA4eDogbiA9IFwiK2kudG9TdHJpbmcoMTYpfXZhciBmPTEyOCtnO3JldHVybiBmLnRvU3RyaW5nKDE2KStofX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5oVExWPT1udWxsfHx0aGlzLmlzTW9kaWZpZWQpe3RoaXMuaFY9dGhpcy5nZXRGcmVzaFZhbHVlSGV4KCk7dGhpcy5oTD10aGlzLmdldExlbmd0aEhleEZyb21WYWx1ZSgpO3RoaXMuaFRMVj10aGlzLmhUK3RoaXMuaEwrdGhpcy5oVjt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5nZXRWYWx1ZUhleD1mdW5jdGlvbigpe3RoaXMuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhWfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm5cIlwifX07S0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMuZ2V0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc307dGhpcy5zZXRTdHJpbmc9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPWQ7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX07dGhpcy5zZXRTdHJpbmdIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiKXt0aGlzLnNldFN0cmluZyhjKX1lbHNle2lmKHR5cGVvZiBjLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRTdHJpbmcoYy5zdHIpfWVsc2V7aWYodHlwZW9mIGMuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFN0cmluZ0hleChjLmhleCl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLkRFUkFic3RyYWN0VGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMubG9jYWxEYXRlVG9VVEM9ZnVuY3Rpb24oZil7dXRjPWYuZ2V0VGltZSgpKyhmLmdldFRpbWV6b25lT2Zmc2V0KCkqNjAwMDApO3ZhciBlPW5ldyBEYXRlKHV0Yyk7cmV0dXJuIGV9O3RoaXMuZm9ybWF0RGF0ZT1mdW5jdGlvbihtLG8sZSl7dmFyIGc9dGhpcy56ZXJvUGFkZGluZzt2YXIgbj10aGlzLmxvY2FsRGF0ZVRvVVRDKG0pO3ZhciBwPVN0cmluZyhuLmdldEZ1bGxZZWFyKCkpO2lmKG89PVwidXRjXCIpe3A9cC5zdWJzdHIoMiwyKX12YXIgbD1nKFN0cmluZyhuLmdldE1vbnRoKCkrMSksMik7dmFyIHE9ZyhTdHJpbmcobi5nZXREYXRlKCkpLDIpO3ZhciBoPWcoU3RyaW5nKG4uZ2V0SG91cnMoKSksMik7dmFyIGk9ZyhTdHJpbmcobi5nZXRNaW51dGVzKCkpLDIpO3ZhciBqPWcoU3RyaW5nKG4uZ2V0U2Vjb25kcygpKSwyKTt2YXIgcj1wK2wrcStoK2krajtpZihlPT09dHJ1ZSl7dmFyIGY9bi5nZXRNaWxsaXNlY29uZHMoKTtpZihmIT0wKXt2YXIgaz1nKFN0cmluZyhmKSwzKTtrPWsucmVwbGFjZSgvWzBdKyQvLFwiXCIpO3I9citcIi5cIitrfX1yZXR1cm4gcitcIlpcIn07dGhpcy56ZXJvUGFkZGluZz1mdW5jdGlvbihlLGQpe2lmKGUubGVuZ3RoPj1kKXtyZXR1cm4gZX1yZXR1cm4gbmV3IEFycmF5KGQtZS5sZW5ndGgrMSkuam9pbihcIjBcIikrZX07dGhpcy5nZXRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfTt0aGlzLnNldFN0cmluZz1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9ZDt0aGlzLmhWPXN0b2hleChkKX07dGhpcy5zZXRCeURhdGVWYWx1ZT1mdW5jdGlvbihoLGosZSxkLGYsZyl7dmFyIGk9bmV3IERhdGUoRGF0ZS5VVEMoaCxqLTEsZSxkLGYsZywwKSk7dGhpcy5zZXRCeURhdGUoaSl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZD1mdW5jdGlvbihiKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRCeUFTTjFPYmplY3RBcnJheT1mdW5jdGlvbihjKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmFzbjFBcnJheT1jfTt0aGlzLmFwcGVuZEFTTjFPYmplY3Q9ZnVuY3Rpb24oYyl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5hc24xQXJyYXkucHVzaChjKX07dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFBcnJheT1iLmFycmF5fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCb29sZWFuPWZ1bmN0aW9uKCl7S0pVUi5hc24xLkRFUkJvb2xlYW4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMVwiO3RoaXMuaFRMVj1cIjAxMDFmZlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQm9vbGVhbixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkludGVnZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkludGVnZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMlwiO3RoaXMuc2V0QnlCaWdJbnRlZ2VyPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGIpfTt0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbihjKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihTdHJpbmcoYyksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGIpfTt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGIpe3RoaXMuaFY9Yn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5iaWdpbnQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGEuYmlnaW50KX1lbHNle2lmKHR5cGVvZiBhW1wiaW50XCJdIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5SW50ZWdlcihhW1wiaW50XCJdKX1lbHNle2lmKHR5cGVvZiBhPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5SW50ZWdlcihhKX1lbHNle2lmKHR5cGVvZiBhLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChhLmhleCl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkludGVnZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCaXRTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkJpdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAzXCI7dGhpcy5zZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHM9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1ifTt0aGlzLnNldFVudXNlZEJpdHNBbmRIZXhWYWx1ZT1mdW5jdGlvbihiLGQpe2lmKGI8MHx8NzxiKXt0aHJvd1widW51c2VkIGJpdHMgc2hhbGwgYmUgZnJvbSAwIHRvIDc6IHUgPSBcIitifXZhciBjPVwiMFwiK2I7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1jK2R9O3RoaXMuc2V0QnlCaW5hcnlTdHJpbmc9ZnVuY3Rpb24oZSl7ZT1lLnJlcGxhY2UoLzArJC8sXCJcIik7dmFyIGY9OC1lLmxlbmd0aCU4O2lmKGY9PTgpe2Y9MH1mb3IodmFyIGc9MDtnPD1mO2crKyl7ZSs9XCIwXCJ9dmFyIGo9XCJcIjtmb3IodmFyIGc9MDtnPGUubGVuZ3RoLTE7Zys9OCl7dmFyIGQ9ZS5zdWJzdHIoZyw4KTt2YXIgYz1wYXJzZUludChkLDIpLnRvU3RyaW5nKDE2KTtpZihjLmxlbmd0aD09MSl7Yz1cIjBcIitjfWorPWN9dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1cIjBcIitmK2p9O3RoaXMuc2V0QnlCb29sZWFuQXJyYXk9ZnVuY3Rpb24oZCl7dmFyIGM9XCJcIjtmb3IodmFyIGI9MDtiPGQubGVuZ3RoO2IrKyl7aWYoZFtiXT09dHJ1ZSl7Yys9XCIxXCJ9ZWxzZXtjKz1cIjBcIn19dGhpcy5zZXRCeUJpbmFyeVN0cmluZyhjKX07dGhpcy5uZXdGYWxzZUFycmF5PWZ1bmN0aW9uKGQpe3ZhciBiPW5ldyBBcnJheShkKTtmb3IodmFyIGM9MDtjPGQ7YysrKXtiW2NdPWZhbHNlfXJldHVybiBifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhPT1cInN0cmluZ1wiJiZhLnRvTG93ZXJDYXNlKCkubWF0Y2goL15bMC05YS1mXSskLykpe3RoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzKGEpfWVsc2V7aWYodHlwZW9mIGEuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyhhLmhleCl9ZWxzZXtpZih0eXBlb2YgYS5iaW4hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaW5hcnlTdHJpbmcoYS5iaW4pfWVsc2V7aWYodHlwZW9mIGEuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCb29sZWFuQXJyYXkoYS5hcnJheSl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkJpdFN0cmluZyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJPY3RldFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMDRcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUk51bGw9ZnVuY3Rpb24oKXtLSlVSLmFzbjEuREVSTnVsbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjA1XCI7dGhpcy5oVExWPVwiMDUwMFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVsbCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXI9ZnVuY3Rpb24oYyl7dmFyIGI9ZnVuY3Rpb24oZCl7dmFyIGU9ZC50b1N0cmluZygxNik7aWYoZS5sZW5ndGg9PTEpe2U9XCIwXCIrZX1yZXR1cm4gZX07dmFyIGE9ZnVuY3Rpb24oayl7dmFyIGo9XCJcIjt2YXIgZT1uZXcgQmlnSW50ZWdlcihrLDEwKTt2YXIgZD1lLnRvU3RyaW5nKDIpO3ZhciBmPTctZC5sZW5ndGglNztpZihmPT03KXtmPTB9dmFyIG09XCJcIjtmb3IodmFyIGc9MDtnPGY7ZysrKXttKz1cIjBcIn1kPW0rZDtmb3IodmFyIGc9MDtnPGQubGVuZ3RoLTE7Zys9Nyl7dmFyIGw9ZC5zdWJzdHIoZyw3KTtpZihnIT1kLmxlbmd0aC03KXtsPVwiMVwiK2x9ais9YihwYXJzZUludChsLDIpKX1yZXR1cm4gan07S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwNlwiO3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLnNldFZhbHVlT2lkU3RyaW5nPWZ1bmN0aW9uKGYpe2lmKCFmLm1hdGNoKC9eWzAtOS5dKyQvKSl7dGhyb3dcIm1hbGZvcm1lZCBvaWQgc3RyaW5nOiBcIitmfXZhciBnPVwiXCI7dmFyIGQ9Zi5zcGxpdChcIi5cIik7dmFyIGo9cGFyc2VJbnQoZFswXSkqNDArcGFyc2VJbnQoZFsxXSk7Zys9YihqKTtkLnNwbGljZSgwLDIpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXtnKz1hKGRbZV0pfXRoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1udWxsO3RoaXMuaFY9Z307dGhpcy5zZXRWYWx1ZU5hbWU9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbZV0hPVwidW5kZWZpbmVkXCIpe3ZhciBkPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbZV07dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhkKX1lbHNle3Rocm93XCJERVJPYmplY3RJZGVudGlmaWVyIG9pZE5hbWUgdW5kZWZpbmVkOiBcIitlfX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJzdHJpbmdcIiYmYy5tYXRjaCgvXlswLTJdLlswLTkuXSskLykpe3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoYyl9ZWxzZXtpZihLSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0W2NdIT09dW5kZWZpbmVkKXt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbY10pfWVsc2V7aWYodHlwZW9mIGMub2lkIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKGMub2lkKX1lbHNle2lmKHR5cGVvZiBjLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChjLmhleCl9ZWxzZXtpZih0eXBlb2YgYy5uYW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlTmFtZShjLm5hbWUpfX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkVudW1lcmF0ZWQ9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkVudW1lcmF0ZWQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwYVwiO3RoaXMuc2V0QnlCaWdJbnRlZ2VyPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGIpfTt0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbihjKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihTdHJpbmcoYyksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGIpfTt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGIpe3RoaXMuaFY9Yn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYVtcImludFwiXSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUludGVnZXIoYVtcImludFwiXSl9ZWxzZXtpZih0eXBlb2YgYT09XCJudW1iZXJcIil7dGhpcy5zZXRCeUludGVnZXIoYSl9ZWxzZXtpZih0eXBlb2YgYS5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVIZXgoYS5oZXgpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkVudW1lcmF0ZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJVVEY4U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJVVEY4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIwY1wifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRGOFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxMlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTNcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxNFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJJQTVTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUklBNVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTZcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUklBNVN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJVVENUaW1lPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJVVENUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxN1wiO3RoaXMuc2V0QnlEYXRlPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuZGF0ZT1iO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwidXRjXCIpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmRhdGU9PVwidW5kZWZpbmVkXCImJnR5cGVvZiB0aGlzLnM9PVwidW5kZWZpbmVkXCIpe3RoaXMuZGF0ZT1uZXcgRGF0ZSgpO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwidXRjXCIpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9cmV0dXJuIHRoaXMuaFZ9O2lmKGEhPT11bmRlZmluZWQpe2lmKGEuc3RyIT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZyhhLnN0cil9ZWxzZXtpZih0eXBlb2YgYT09XCJzdHJpbmdcIiYmYS5tYXRjaCgvXlswLTldezEyfVokLykpe3RoaXMuc2V0U3RyaW5nKGEpfWVsc2V7aWYoYS5oZXghPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nSGV4KGEuaGV4KX1lbHNle2lmKGEuZGF0ZSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRCeURhdGUoYS5kYXRlKX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRDVGltZSxLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lKTtLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE4XCI7dGhpcy53aXRoTWlsbGlzPWZhbHNlO3RoaXMuc2V0QnlEYXRlPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuZGF0ZT1iO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwiZ2VuXCIsdGhpcy53aXRoTWlsbGlzKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRhdGU9PT11bmRlZmluZWQmJnRoaXMucz09PXVuZGVmaW5lZCl7dGhpcy5kYXRlPW5ldyBEYXRlKCk7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJnZW5cIix0aGlzLndpdGhNaWxsaXMpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9cmV0dXJuIHRoaXMuaFZ9O2lmKGEhPT11bmRlZmluZWQpe2lmKGEuc3RyIT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZyhhLnN0cil9ZWxzZXtpZih0eXBlb2YgYT09XCJzdHJpbmdcIiYmYS5tYXRjaCgvXlswLTldezE0fVokLykpe3RoaXMuc2V0U3RyaW5nKGEpfWVsc2V7aWYoYS5oZXghPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nSGV4KGEuaGV4KX1lbHNle2lmKGEuZGF0ZSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRCeURhdGUoYS5kYXRlKX19fX1pZihhLm1pbGxpcz09PXRydWUpe3RoaXMud2l0aE1pbGxpcz10cnVlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUsS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSk7S0pVUi5hc24xLkRFUlNlcXVlbmNlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJTZXF1ZW5jZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMzBcIjt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYz1cIlwiO2Zvcih2YXIgYj0wO2I8dGhpcy5hc24xQXJyYXkubGVuZ3RoO2IrKyl7dmFyIGQ9dGhpcy5hc24xQXJyYXlbYl07Yys9ZC5nZXRFbmNvZGVkSGV4KCl9dGhpcy5oVj1jO3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlNlcXVlbmNlLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpO0tKVVIuYXNuMS5ERVJTZXQ9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlNldC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMzFcIjt0aGlzLnNvcnRGbGFnPXRydWU7dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKHZhciBjPTA7Yzx0aGlzLmFzbjFBcnJheS5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmFzbjFBcnJheVtjXTtiLnB1c2goZC5nZXRFbmNvZGVkSGV4KCkpfWlmKHRoaXMuc29ydEZsYWc9PXRydWUpe2Iuc29ydCgpfXRoaXMuaFY9Yi5qb2luKFwiXCIpO3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc29ydGZsYWchPVwidW5kZWZpbmVkXCImJmEuc29ydGZsYWc9PWZhbHNlKXt0aGlzLnNvcnRGbGFnPWZhbHNlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJTZXQsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCk7S0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiYTBcIjt0aGlzLmhWPVwiXCI7dGhpcy5pc0V4cGxpY2l0PXRydWU7dGhpcy5hc24xT2JqZWN0PW51bGw7dGhpcy5zZXRBU04xT2JqZWN0PWZ1bmN0aW9uKGIsYyxkKXt0aGlzLmhUPWM7dGhpcy5pc0V4cGxpY2l0PWI7dGhpcy5hc24xT2JqZWN0PWQ7aWYodGhpcy5pc0V4cGxpY2l0KXt0aGlzLmhWPXRoaXMuYXNuMU9iamVjdC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWV9ZWxzZXt0aGlzLmhWPW51bGw7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaFRMVj10aGlzLmhUTFYucmVwbGFjZSgvXi4uLyxjKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9fTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLnRhZyE9XCJ1bmRlZmluZWRcIil7dGhpcy5oVD1hLnRhZ31pZih0eXBlb2YgYS5leHBsaWNpdCE9XCJ1bmRlZmluZWRcIil7dGhpcy5pc0V4cGxpY2l0PWEuZXhwbGljaXR9aWYodHlwZW9mIGEub2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFPYmplY3Q9YS5vYmo7dGhpcy5zZXRBU04xT2JqZWN0KHRoaXMuaXNFeHBsaWNpdCx0aGlzLmhULHRoaXMuYXNuMU9iamVjdCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7XG4vKiEgYXNuMWhleC0xLjEuNi5qcyAoYykgMjAxMi0yMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBBU04xSEVYPW5ldyBmdW5jdGlvbigpe3RoaXMuZ2V0Qnl0ZUxlbmd0aE9mTF9BdE9iaj1mdW5jdGlvbihiLGMpe2lmKGIuc3Vic3RyaW5nKGMrMixjKzMpIT1cIjhcIil7cmV0dXJuIDF9dmFyIGE9cGFyc2VJbnQoYi5zdWJzdHJpbmcoYyszLGMrNCkpO2lmKGE9PTApe3JldHVybiAtMX1pZigwPGEmJmE8MTApe3JldHVybiBhKzF9cmV0dXJuIC0yfTt0aGlzLmdldEhleE9mTF9BdE9iaj1mdW5jdGlvbihiLGMpe3ZhciBhPXRoaXMuZ2V0Qnl0ZUxlbmd0aE9mTF9BdE9iaihiLGMpO2lmKGE8MSl7cmV0dXJuXCJcIn1yZXR1cm4gYi5zdWJzdHJpbmcoYysyLGMrMithKjIpfTt0aGlzLmdldEludE9mTF9BdE9iaj1mdW5jdGlvbihjLGQpe3ZhciBiPXRoaXMuZ2V0SGV4T2ZMX0F0T2JqKGMsZCk7aWYoYj09XCJcIil7cmV0dXJuIC0xfXZhciBhO2lmKHBhcnNlSW50KGIuc3Vic3RyaW5nKDAsMSkpPDgpe2E9bmV3IEJpZ0ludGVnZXIoYiwxNil9ZWxzZXthPW5ldyBCaWdJbnRlZ2VyKGIuc3Vic3RyaW5nKDIpLDE2KX1yZXR1cm4gYS5pbnRWYWx1ZSgpfTt0aGlzLmdldFN0YXJ0UG9zT2ZWX0F0T2JqPWZ1bmN0aW9uKGIsYyl7dmFyIGE9dGhpcy5nZXRCeXRlTGVuZ3RoT2ZMX0F0T2JqKGIsYyk7aWYoYTwwKXtyZXR1cm4gYX1yZXR1cm4gYysoYSsxKSoyfTt0aGlzLmdldEhleE9mVl9BdE9iaj1mdW5jdGlvbihjLGQpe3ZhciBiPXRoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmooYyxkKTt2YXIgYT10aGlzLmdldEludE9mTF9BdE9iaihjLGQpO3JldHVybiBjLnN1YnN0cmluZyhiLGIrYSoyKX07dGhpcy5nZXRIZXhPZlRMVl9BdE9iaj1mdW5jdGlvbihjLGUpe3ZhciBiPWMuc3Vic3RyKGUsMik7dmFyIGQ9dGhpcy5nZXRIZXhPZkxfQXRPYmooYyxlKTt2YXIgYT10aGlzLmdldEhleE9mVl9BdE9iaihjLGUpO3JldHVybiBiK2QrYX07dGhpcy5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqPWZ1bmN0aW9uKGMsZCl7dmFyIGI9dGhpcy5nZXRTdGFydFBvc09mVl9BdE9iaihjLGQpO3ZhciBhPXRoaXMuZ2V0SW50T2ZMX0F0T2JqKGMsZCk7cmV0dXJuIGIrYSoyfTt0aGlzLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaj1mdW5jdGlvbihmLGope3ZhciBjPW5ldyBBcnJheSgpO3ZhciBpPXRoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmooZixqKTtjLnB1c2goaSk7dmFyIGI9dGhpcy5nZXRJbnRPZkxfQXRPYmooZixqKTt2YXIgZz1pO3ZhciBkPTA7d2hpbGUoMSl7dmFyIGU9dGhpcy5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGYsZyk7aWYoZT09bnVsbHx8KGUtaT49KGIqMikpKXticmVha31pZihkPj0yMDApe2JyZWFrfWMucHVzaChlKTtnPWU7ZCsrfXJldHVybiBjfTt0aGlzLmdldE50aENoaWxkSW5kZXhfQXRPYmo9ZnVuY3Rpb24oZCxiLGUpe3ZhciBjPXRoaXMuZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsYik7cmV0dXJuIGNbZV19O3RoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3Q9ZnVuY3Rpb24oZSxkLGMpe2lmKGMubGVuZ3RoPT0wKXtyZXR1cm4gZH12YXIgZj1jLnNoaWZ0KCk7dmFyIGI9dGhpcy5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxkKTtyZXR1cm4gdGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChlLGJbZl0sYyl9O3RoaXMuZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0PWZ1bmN0aW9uKGQsYyxiKXt2YXIgYT10aGlzLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGQsYyxiKTtyZXR1cm4gdGhpcy5nZXRIZXhPZlRMVl9BdE9iaihkLGEpfTt0aGlzLmdldERlY2VuZGFudEhleFZCeU50aExpc3Q9ZnVuY3Rpb24oZCxjLGIpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO3JldHVybiB0aGlzLmdldEhleE9mVl9BdE9iaihkLGEpfX07QVNOMUhFWC5nZXRWYnlMaXN0PWZ1bmN0aW9uKGQsYyxiLGUpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO2lmKGE9PT11bmRlZmluZWQpe3Rocm93XCJjYW4ndCBmaW5kIG50aExpc3Qgb2JqZWN0XCJ9aWYoZSE9PXVuZGVmaW5lZCl7aWYoZC5zdWJzdHIoYSwyKSE9ZSl7dGhyb3dcImNoZWNraW5nIHRhZyBkb2Vzbid0IG1hdGNoOiBcIitkLnN1YnN0cihhLDIpK1wiIT1cIitlfX1yZXR1cm4gdGhpcy5nZXRIZXhPZlZfQXRPYmooZCxhKX07QVNOMUhFWC5oZXh0b29pZHN0cj1mdW5jdGlvbihlKXt2YXIgaD1mdW5jdGlvbihiLGEpe2lmKGIubGVuZ3RoPj1hKXtyZXR1cm4gYn1yZXR1cm4gbmV3IEFycmF5KGEtYi5sZW5ndGgrMSkuam9pbihcIjBcIikrYn07dmFyIGw9W107dmFyIG89ZS5zdWJzdHIoMCwyKTt2YXIgZj1wYXJzZUludChvLDE2KTtsWzBdPW5ldyBTdHJpbmcoTWF0aC5mbG9vcihmLzQwKSk7bFsxXT1uZXcgU3RyaW5nKGYlNDApO3ZhciBtPWUuc3Vic3RyKDIpO3ZhciBrPVtdO2Zvcih2YXIgZz0wO2c8bS5sZW5ndGgvMjtnKyspe2sucHVzaChwYXJzZUludChtLnN1YnN0cihnKjIsMiksMTYpKX12YXIgaj1bXTt2YXIgZD1cIlwiO2Zvcih2YXIgZz0wO2c8ay5sZW5ndGg7ZysrKXtpZihrW2ddJjEyOCl7ZD1kK2goKGtbZ10mMTI3KS50b1N0cmluZygyKSw3KX1lbHNle2Q9ZCtoKChrW2ddJjEyNykudG9TdHJpbmcoMiksNyk7ai5wdXNoKG5ldyBTdHJpbmcocGFyc2VJbnQoZCwyKSkpO2Q9XCJcIn19dmFyIG49bC5qb2luKFwiLlwiKTtpZihqLmxlbmd0aD4wKXtuPW4rXCIuXCIrai5qb2luKFwiLlwiKX1yZXR1cm4gbn07QVNOMUhFWC5kdW1wPWZ1bmN0aW9uKGUsYyxrLGcpe3ZhciBvPWZ1bmN0aW9uKHcsaSl7aWYody5sZW5ndGg8PWkqMil7cmV0dXJuIHd9ZWxzZXt2YXIgdj13LnN1YnN0cigwLGkpK1wiLi4odG90YWwgXCIrdy5sZW5ndGgvMitcImJ5dGVzKS4uXCIrdy5zdWJzdHIody5sZW5ndGgtaSxpKTtyZXR1cm4gdn19O2lmKGM9PT11bmRlZmluZWQpe2M9e29tbWl0X2xvbmdfb2N0ZXQ6MzJ9fWlmKGs9PT11bmRlZmluZWQpe2s9MH1pZihnPT09dW5kZWZpbmVkKXtnPVwiXCJ9dmFyIHI9Yy5vbW1pdF9sb25nX29jdGV0O2lmKGUuc3Vic3RyKGssMik9PVwiMDFcIil7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTtpZihoPT1cIjAwXCIpe3JldHVybiBnK1wiQk9PTEVBTiBGQUxTRVxcblwifWVsc2V7cmV0dXJuIGcrXCJCT09MRUFOIFRSVUVcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwMlwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO3JldHVybiBnK1wiSU5URUdFUiBcIitvKGgscikrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjAzXCIpe3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7cmV0dXJuIGcrXCJCSVRTVFJJTkcgXCIrbyhoLHIpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIwNFwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKEFTTjFIRVguaXNBU04xSEVYKGgpKXt2YXIgaj1nK1wiT0NURVRTVFJJTkcsIGVuY2Fwc3VsYXRlc1xcblwiO2o9aitBU04xSEVYLmR1bXAoaCxjLDAsZytcIiAgXCIpO3JldHVybiBqfWVsc2V7cmV0dXJuIGcrXCJPQ1RFVFNUUklORyBcIitvKGgscikrXCJcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwNVwiKXtyZXR1cm4gZytcIk5VTExcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjA2XCIpe3ZhciBsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGwpO3ZhciBuPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTt2YXIgYj1hLnJlcGxhY2UoL1xcLi9nLFwiIFwiKTtpZihuIT1cIlwiKXtyZXR1cm4gZytcIk9iamVjdElkZW50aWZpZXIgXCIrbitcIiAoXCIrYitcIilcXG5cIn1lbHNle3JldHVybiBnK1wiT2JqZWN0SWRlbnRpZmllciAoXCIrYitcIilcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwY1wiKXtyZXR1cm4gZytcIlVURjhTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjEzXCIpe3JldHVybiBnK1wiUHJpbnRhYmxlU3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxNFwiKXtyZXR1cm4gZytcIlRlbGV0ZXhTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE2XCIpe3JldHVybiBnK1wiSUE1U3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxN1wiKXtyZXR1cm4gZytcIlVUQ1RpbWUgXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxOFwiKXtyZXR1cm4gZytcIkdlbmVyYWxpemVkVGltZSBcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjMwXCIpe2lmKGUuc3Vic3RyKGssNCk9PVwiMzAwMFwiKXtyZXR1cm4gZytcIlNFUVVFTkNFIHt9XFxuXCJ9dmFyIGo9ZytcIlNFUVVFTkNFXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTt2YXIgZj1jO2lmKChkLmxlbmd0aD09Mnx8ZC5sZW5ndGg9PTMpJiZlLnN1YnN0cihkWzBdLDIpPT1cIjA2XCImJmUuc3Vic3RyKGRbZC5sZW5ndGgtMV0sMik9PVwiMDRcIil7dmFyIHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxkWzBdKTt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQodCk7dmFyIG49S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGEpO3ZhciBwPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYykpO3AueDUwOUV4dE5hbWU9bjtmPXB9Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe2o9aitBU04xSEVYLmR1bXAoZSxmLGRbcV0sZytcIiAgXCIpfXJldHVybiBqfWlmKGUuc3Vic3RyKGssMik9PVwiMzFcIil7dmFyIGo9ZytcIlNFVFxcblwiO3ZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsayk7Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe2o9aitBU04xSEVYLmR1bXAoZSxjLGRbcV0sZytcIiAgXCIpfXJldHVybiBqfXZhciB1PXBhcnNlSW50KGUuc3Vic3RyKGssMiksMTYpO2lmKCh1JjEyOCkhPTApe3ZhciBtPXUmMzE7aWYoKHUmMzIpIT0wKXt2YXIgaj1nK1wiW1wiK20rXCJdXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTtmb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7aj1qK0FTTjFIRVguZHVtcChlLGMsZFtxXSxnK1wiICBcIil9cmV0dXJuIGp9ZWxzZXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKGguc3Vic3RyKDAsOCk9PVwiNjg3NDc0NzBcIil7aD1oZXh0b3V0ZjgoaCl9aWYoYy54NTA5RXh0TmFtZT09PVwic3ViamVjdEFsdE5hbWVcIiYmbT09Mil7aD1oZXh0b3V0ZjgoaCl9dmFyIGo9ZytcIltcIittK1wiXSBcIitoK1wiXFxuXCI7cmV0dXJuIGp9fXJldHVybiBnK1wiVU5LTk9XTihcIitlLnN1YnN0cihrLDIpK1wiKSBcIitBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspK1wiXFxuXCJ9O0FTTjFIRVguaXNBU04xSEVYPWZ1bmN0aW9uKGQpe2lmKGQubGVuZ3RoJTI9PTEpe3JldHVybiBmYWxzZX12YXIgYz1BU04xSEVYLmdldEludE9mTF9BdE9iaihkLDApO3ZhciBiPWQuc3Vic3RyKDAsMik7dmFyIGU9QVNOMUhFWC5nZXRIZXhPZkxfQXRPYmooZCwwKTt2YXIgYT1kLmxlbmd0aC1iLmxlbmd0aC1lLmxlbmd0aDtpZihhPT1jKjIpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX07XG4vKiEgYXNuMXg1MDktMS4wLjE0LmpzIChjKSAyMDEzLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLng1MDk9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEueDUwOSl7S0pVUi5hc24xLng1MDk9e319S0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGU9ZnVuY3Rpb24oZyl7S0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGQ9bnVsbDt2YXIgZj1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt2YXIgZT1udWxsO3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzPWZ1bmN0aW9uKGksayl7dmFyIGg9UEtDUzVQS0VZLmdldERlY3J5cHRlZEtleUhleChpLGspO3ZhciBqPW5ldyBSU0FLZXkoKTtqLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoaCk7dGhpcy5wcnZLZXk9an07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnQuYXNuMVNpZ25hdHVyZUFsZztzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOlwiU0hBMXdpdGhSU0FcIn0pO3NpZy5pbml0KHRoaXMucHJ2S2V5KTtzaWcudXBkYXRlSGV4KHRoaXMuYXNuMVRCU0NlcnQuZ2V0RW5jb2RlZEhleCgpKTt0aGlzLmhleFNpZz1zaWcuc2lnbigpO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBoPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWguZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5zZXRTaWduYXR1cmVIZXg9ZnVuY3Rpb24oaCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnQuYXNuMVNpZ25hdHVyZUFsZzt0aGlzLmhleFNpZz1oO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBpPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWkuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBqPXRoaXMuZ2V0RW5jb2RlZEhleCgpO3ZhciBoPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uoaik7dmFyIGk9Q3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoaCk7dmFyIGs9aS5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcclxcblwiK2srXCJcXHJcXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXFxyXFxuXCJ9O2lmKHR5cGVvZiBnIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZy50YnNjZXJ0b2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFUQlNDZXJ0PWcudGJzY2VydG9ian1pZih0eXBlb2YgZy5wcnZrZXlvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMucHJ2S2V5PWcucHJ2a2V5b2JqfWVsc2V7aWYodHlwZW9mIGcucnNhcHJ2a2V5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnBydktleT1nLnJzYXBydmtleX1lbHNle2lmKCh0eXBlb2YgZy5yc2FwcnZwZW0hPVwidW5kZWZpbmVkXCIpJiYodHlwZW9mIGcucnNhcHJ2cGFzIT1cInVuZGVmaW5lZFwiKSl7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3MoZy5yc2FwcnZwZW0sZy5yc2FwcnZwYXMpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLl9pbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xVmVyc2lvbj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7b2JqOm5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjoyfSl9KTt0aGlzLmFzbjFTZXJpYWxOdW1iZXI9bnVsbDt0aGlzLmFzbjFTaWduYXR1cmVBbGc9bnVsbDt0aGlzLmFzbjFJc3N1ZXI9bnVsbDt0aGlzLmFzbjFOb3RCZWZvcmU9bnVsbDt0aGlzLmFzbjFOb3RBZnRlcj1udWxsO3RoaXMuYXNuMVN1YmplY3Q9bnVsbDt0aGlzLmFzbjFTdWJqUEtleT1udWxsO3RoaXMuZXh0ZW5zaW9uc0FycmF5PW5ldyBBcnJheSgpfTt0aGlzLnNldFNlcmlhbE51bWJlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU2VyaWFsTnVtYmVyPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihiKX07dGhpcy5zZXRTaWduYXR1cmVBbGdCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcihiKX07dGhpcy5zZXRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUlzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0Tm90QmVmb3JlQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFOb3RCZWZvcmU9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYil9O3RoaXMuc2V0Tm90QWZ0ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMU5vdEFmdGVyPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGIpfTt0aGlzLnNldFN1YmplY3RCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVN1YmplY3Q9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldFN1YmplY3RQdWJsaWNLZXlCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhiKX07dGhpcy5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXk9ZnVuY3Rpb24oYyl7dmFyIGI9S0VZVVRJTC5nZXRLZXkoYyk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKGIpfTt0aGlzLmFwcGVuZEV4dGVuc2lvbj1mdW5jdGlvbihiKXt0aGlzLmV4dGVuc2lvbnNBcnJheS5wdXNoKGIpfTt0aGlzLmFwcGVuZEV4dGVuc2lvbkJ5TmFtZT1mdW5jdGlvbihkLGIpe2lmKGQudG9Mb3dlckNhc2UoKT09XCJiYXNpY2NvbnN0cmFpbnRzXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImtleXVzYWdlXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5LZXlVc2FnZShiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJjcmxkaXN0cmlidXRpb25wb2ludHNcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cyhiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJleHRrZXl1c2FnZVwiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuRXh0S2V5VXNhZ2UoYik7dGhpcy5hcHBlbmRFeHRlbnNpb24oYyl9ZWxzZXtpZihkLnRvTG93ZXJDYXNlKCk9PVwiYXV0aG9yaXR5a2V5aWRlbnRpZmllclwiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllcihiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBleHRlbnNpb24gbmFtZTogXCIrZH19fX19fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmFzbjFOb3RCZWZvcmU9PW51bGx8fHRoaXMuYXNuMU5vdEFmdGVyPT1udWxsKXt0aHJvd1wibm90QmVmb3JlIGFuZC9vciBub3RBZnRlciBub3Qgc2V0XCJ9dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMU5vdEJlZm9yZSx0aGlzLmFzbjFOb3RBZnRlcl19KTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVZlcnNpb24pO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU2VyaWFsTnVtYmVyKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVNpZ25hdHVyZUFsZyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFJc3N1ZXIpO3RoaXMuYXNuMUFycmF5LnB1c2goYyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTdWJqZWN0KTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmpQS2V5KTtpZih0aGlzLmV4dGVuc2lvbnNBcnJheS5sZW5ndGg+MCl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5leHRlbnNpb25zQXJyYXl9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dHJ1ZSx0YWc6XCJhM1wiLG9iajpkfSk7dGhpcy5hc24xQXJyYXkucHVzaChiKX12YXIgZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2U7cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5faW5pdGlhbGl6ZSgpfTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5UQlNDZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkV4dGVuc2lvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDp0aGlzLm9pZH0pO3ZhciBlPW5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoe2hleDp0aGlzLmdldEV4dG5WYWx1ZUhleCgpfSk7dmFyIGQ9bmV3IEFycmF5KCk7ZC5wdXNoKGYpO2lmKHRoaXMuY3JpdGljYWwpe2QucHVzaChuZXcgS0pVUi5hc24xLkRFUkJvb2xlYW4oKSl9ZC5wdXNoKGUpO3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTtyZXR1cm4gYy5nZXRFbmNvZGVkSGV4KCl9O3RoaXMuY3JpdGljYWw9ZmFsc2U7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmNyaXRpY2FsIT1cInVuZGVmaW5lZFwiKXt0aGlzLmNyaXRpY2FsPWIuY3JpdGljYWx9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5LZXlVc2FnZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5LZXlVc2FnZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLm9pZD1cIjIuNS4yOS4xNVwiO2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5iaW4hPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyhhKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5LZXlVc2FnZSxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHM9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLng1MDkuQmFzaWNDb25zdHJhaW50cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjKTt2YXIgYT1mYWxzZTt2YXIgYj0tMTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBlPW5ldyBBcnJheSgpO2lmKHRoaXMuY0Epe2UucHVzaChuZXcgS0pVUi5hc24xLkRFUkJvb2xlYW4oKSl9aWYodGhpcy5wYXRoTGVuPi0xKXtlLnB1c2gobmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMucGF0aExlbn0pKX12YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5hc24xRXh0blZhbHVlPWQ7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjE5XCI7dGhpcy5jQT1mYWxzZTt0aGlzLnBhdGhMZW49LTE7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLmNBIT1cInVuZGVmaW5lZFwiKXt0aGlzLmNBPWMuY0F9aWYodHlwZW9mIGMucGF0aExlbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXRoTGVuPWMucGF0aExlbn19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLnNldEJ5RFBBcnJheT1mdW5jdGlvbihiKXt0aGlzLmFzbjFFeHRuVmFsdWU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Yn0pfTt0aGlzLnNldEJ5T25lVVJJPWZ1bmN0aW9uKGUpe3ZhciBiPW5ldyBLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMoW3t1cmk6ZX1dKTt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lKGIpO3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludCh7ZHBvYmo6ZH0pO3RoaXMuc2V0QnlEUEFycmF5KFtjXSl9O3RoaXMub2lkPVwiMi41LjI5LjMxXCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5RFBBcnJheShhLmFycmF5KX1lbHNle2lmKHR5cGVvZiBhLnVyaSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeU9uZVVSSShhLnVyaSl9fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cyxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuc2V0UHVycG9zZUFycmF5PWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKCk7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcihiW2NdKTt0aGlzLmFzbjFFeHRuVmFsdWUuYXBwZW5kQVNOMU9iamVjdChkKX19O3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjM3XCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFB1cnBvc2VBcnJheShhLmFycmF5KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5FeHRLZXlVc2FnZSxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmFzbjFLSUQ9bnVsbDt0aGlzLmFzbjFDZXJ0SXNzdWVyPW51bGw7dGhpcy5hc24xQ2VydFNOPW51bGw7dGhpcy5nZXRFeHRuVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYz1uZXcgQXJyYXkoKTtpZih0aGlzLmFzbjFLSUQpe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiODBcIixvYmo6dGhpcy5hc24xS0lEfSkpfWlmKHRoaXMuYXNuMUNlcnRJc3N1ZXIpe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiYTFcIixvYmo6dGhpcy5hc24xQ2VydElzc3Vlcn0pKX1pZih0aGlzLmFzbjFDZXJ0U04pe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiODJcIixvYmo6dGhpcy5hc24xQ2VydFNOfSkpfXZhciBiPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmN9KTt0aGlzLmFzbjFFeHRuVmFsdWU9YjtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5zZXRLSURCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUtJRD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKGIpfTt0aGlzLnNldENlcnRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUNlcnRJc3N1ZXI9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldENlcnRTTkJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xQ2VydFNOPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihiKX07dGhpcy5vaWQ9XCIyLjUuMjkuMzVcIjtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEua2lkIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEtJREJ5UGFyYW0oYS5raWQpfWlmKHR5cGVvZiBhLmlzc3VlciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0SXNzdWVyQnlQYXJhbShhLmlzc3Vlcil9aWYodHlwZW9mIGEuc24hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0Q2VydFNOQnlQYXJhbShhLnNuKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQ1JMPWZ1bmN0aW9uKGYpe0tKVVIuYXNuMS54NTA5LkNSTC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt2YXIgYz1udWxsO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt2YXIgZD1udWxsO3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzPWZ1bmN0aW9uKGgsail7dmFyIGc9UEtDUzVQS0VZLmdldERlY3J5cHRlZEtleUhleChoLGopO3ZhciBpPW5ldyBSU0FLZXkoKTtpLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoZyk7dGhpcy5yc2FQcnZLZXk9aX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnRMaXN0LmFzbjFTaWduYXR1cmVBbGc7c2lnPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpcIlNIQTF3aXRoUlNBXCIscHJvdjpcImNyeXB0b2pzL2pzcnNhXCJ9KTtzaWcuaW5pdFNpZ24odGhpcy5yc2FQcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xVEJTQ2VydExpc3QuZ2V0RW5jb2RlZEhleCgpKTt0aGlzLmhleFNpZz1zaWcuc2lnbigpO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBnPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0TGlzdCx0aGlzLmFzbjFTaWduYXR1cmVBbGcsdGhpcy5hc24xU2lnXX0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaXNNb2RpZmllZD09ZmFsc2UmJnRoaXMuaFRMViE9bnVsbCl7cmV0dXJuIHRoaXMuaFRMVn10aHJvd1wibm90IHNpZ25lZCB5ZXRcIn07dGhpcy5nZXRQRU1TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmdldEVuY29kZWRIZXgoKTt2YXIgZz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGkpO3ZhciBoPUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KGcpO3ZhciBqPWgucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7cmV0dXJuXCItLS0tLUJFR0lOIFg1MDkgQ1JMLS0tLS1cXHJcXG5cIitqK1wiXFxyXFxuLS0tLS1FTkQgWDUwOSBDUkwtLS0tLVxcclxcblwifTtpZih0eXBlb2YgZiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGYudGJzb2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFUQlNDZXJ0TGlzdD1mLnRic29ian1pZih0eXBlb2YgZi5yc2FwcnZrZXkhPVwidW5kZWZpbmVkXCIpe3RoaXMucnNhUHJ2S2V5PWYucnNhcHJ2a2V5fWlmKCh0eXBlb2YgZi5yc2FwcnZwZW0hPVwidW5kZWZpbmVkXCIpJiYodHlwZW9mIGYucnNhcHJ2cGFzIT1cInVuZGVmaW5lZFwiKSl7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3MoZi5yc2FwcnZwZW0sZi5yc2FwcnZwYXMpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3Q9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRTaWduYXR1cmVBbGdCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcihjKX07dGhpcy5zZXRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMUlzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYyl9O3RoaXMuc2V0VGhpc1VwZGF0ZUJ5UGFyYW09ZnVuY3Rpb24oYyl7dGhpcy5hc24xVGhpc1VwZGF0ZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShjKX07dGhpcy5zZXROZXh0VXBkYXRlQnlQYXJhbT1mdW5jdGlvbihjKXt0aGlzLmFzbjFOZXh0VXBkYXRlPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpfTt0aGlzLmFkZFJldm9rZWRDZXJ0PWZ1bmN0aW9uKGMsZCl7dmFyIGY9e307aWYoYyE9dW5kZWZpbmVkJiZjIT1udWxsKXtmLnNuPWN9aWYoZCE9dW5kZWZpbmVkJiZkIT1udWxsKXtmLnRpbWU9ZH12YXIgZT1uZXcgS0pVUi5hc24xLng1MDkuQ1JMRW50cnkoZik7dGhpcy5hUmV2b2tlZENlcnQucHVzaChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodGhpcy5hc24xVmVyc2lvbiE9bnVsbCl7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFWZXJzaW9uKX10aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVNpZ25hdHVyZUFsZyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFJc3N1ZXIpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xVGhpc1VwZGF0ZSk7aWYodGhpcy5hc24xTmV4dFVwZGF0ZSE9bnVsbCl7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFOZXh0VXBkYXRlKX1pZih0aGlzLmFSZXZva2VkQ2VydC5sZW5ndGg+MCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hUmV2b2tlZENlcnR9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGMpfXZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5hc24xVmVyc2lvbj1udWxsO3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1udWxsO3RoaXMuYXNuMUlzc3Vlcj1udWxsO3RoaXMuYXNuMVRoaXNVcGRhdGU9bnVsbDt0aGlzLmFzbjFOZXh0VXBkYXRlPW51bGw7dGhpcy5hUmV2b2tlZENlcnQ9bmV3IEFycmF5KCl9O3RoaXMuX2luaXRpYWxpemUoKX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3QsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkNSTEVudHJ5PWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS54NTA5LkNSTEVudHJ5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBhPW51bGw7dGhpcy5zZXRDZXJ0U2VyaWFsPWZ1bmN0aW9uKGQpe3RoaXMuc249bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGQpfTt0aGlzLnNldFJldm9jYXRpb25EYXRlPWZ1bmN0aW9uKGQpe3RoaXMudGltZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShkKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuc24sdGhpcy50aW1lXX0pO3RoaXMuVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLlRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnRpbWUhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0UmV2b2NhdGlvbkRhdGUoYy50aW1lKX1pZih0eXBlb2YgYy5zbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0U2VyaWFsKGMuc24pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTEVudHJ5LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5YNTAwTmFtZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5YNTAwTmFtZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5zZXRCeVN0cmluZz1mdW5jdGlvbihjKXt2YXIgZD1jLnNwbGl0KFwiL1wiKTtkLnNoaWZ0KCk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3RoaXMuYXNuMUFycmF5LnB1c2gobmV3IEtKVVIuYXNuMS54NTA5LlJETih7c3RyOmRbZV19KSl9fTt0aGlzLnNldEJ5T2JqZWN0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgYyBpbiBlKXtpZihlLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuUkROKHtzdHI6YytcIj1cIitlW2NdfSk7dGhpcy5hc24xQXJyYXk/dGhpcy5hc24xQXJyYXkucHVzaChkKTp0aGlzLmFzbjFBcnJheT1bZF19fX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFRMVj09XCJzdHJpbmdcIil7cmV0dXJuIHRoaXMuaFRMVn12YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5U3RyaW5nKGIuc3RyKX1lbHNle2lmKHR5cGVvZiBiPT09XCJvYmplY3RcIil7dGhpcy5zZXRCeU9iamVjdChiKX19aWYodHlwZW9mIGIuY2VydGlzc3VlciE9XCJ1bmRlZmluZWRcIil7dmFyIGE9bmV3IFg1MDkoKTthLmhleD1YNTA5LnBlbVRvSGV4KGIuY2VydGlzc3Vlcik7dGhpcy5oVExWPWEuZ2V0SXNzdWVySGV4KCl9aWYodHlwZW9mIGIuY2VydHN1YmplY3QhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBYNTA5KCk7YS5oZXg9WDUwOS5wZW1Ub0hleChiLmNlcnRzdWJqZWN0KTt0aGlzLmhUTFY9YS5nZXRTdWJqZWN0SGV4KCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuWDUwME5hbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlJETj1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5SRE4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYWRkQnlTdHJpbmc9ZnVuY3Rpb24oYil7dGhpcy5hc24xQXJyYXkucHVzaChuZXcgS0pVUi5hc24xLng1MDkuQXR0cmlidXRlVHlwZUFuZFZhbHVlKHtzdHI6Yn0pKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJTZXQoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5UTFY9Yi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuVExWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFkZEJ5U3RyaW5nKGEuc3RyKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5SRE4sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBkPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1cInV0ZjhcIjt0aGlzLnNldEJ5U3RyaW5nPWZ1bmN0aW9uKGUpe2lmKGUubWF0Y2goL14oW149XSspPSguKykkLykpe3RoaXMuc2V0QnlBdHRyVHlwZUFuZFZhbHVlU3RyKFJlZ0V4cC4kMSxSZWdFeHAuJDIpfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCBhdHRyVHlwZUFuZFZhbHVlU3RyOiBcIitlfX07dGhpcy5zZXRCeUF0dHJUeXBlQW5kVmFsdWVTdHI9ZnVuY3Rpb24oZyxmKXt0aGlzLnR5cGVPYmo9S0pVUi5hc24xLng1MDkuT0lELmF0eXBlMm9iaihnKTt2YXIgZT1hO2lmKGc9PVwiQ1wiKXtlPVwicHJuXCJ9dGhpcy52YWx1ZU9iaj10aGlzLmdldFZhbHVlT2JqKGUsZil9O3RoaXMuZ2V0VmFsdWVPYmo9ZnVuY3Rpb24oZixlKXtpZihmPT1cInV0ZjhcIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSVVRGOFN0cmluZyh7c3RyOmV9KX1pZihmPT1cInByblwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmcoe3N0cjplfSl9aWYoZj09XCJ0ZWxcIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZyh7c3RyOmV9KX1pZihmPT1cImlhNVwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjplfSl9dGhyb3dcInVuc3VwcG9ydGVkIGRpcmVjdG9yeSBzdHJpbmcgdHlwZTogdHlwZT1cIitmK1wiIHZhbHVlPVwiK2V9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLnR5cGVPYmosdGhpcy52YWx1ZU9ial19KTt0aGlzLlRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5zdHIhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlTdHJpbmcoYi5zdHIpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm89ZnVuY3Rpb24oZCl7S0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3RoaXMuc2V0UlNBS2V5PWZ1bmN0aW9uKGUpe2lmKCFSU0FLZXkucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZSkpe3Rocm93XCJhcmd1bWVudCBpcyBub3QgUlNBS2V5IGluc3RhbmNlXCJ9dGhpcy5yc2FLZXk9ZTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDplLm59KTt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6ZS5lfSk7dmFyIGk9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2csZl19KTt2YXIgaD1pLmdldEVuY29kZWRIZXgoKTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcInJzYUVuY3J5cHRpb25cIn0pO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK2h9KX07dGhpcy5zZXRSU0FQRU09ZnVuY3Rpb24oZyl7aWYoZy5tYXRjaCgvLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0vKSl7dmFyIG49ZztuPW4ucmVwbGFjZSgvXi0tLS0tW14tXSstLS0tLS8sXCJcIik7bj1uLnJlcGxhY2UoLy0tLS0tW14tXSstLS0tLVxccyokLyxcIlwiKTt2YXIgbT1uLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgZj1DcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKG0pO3ZhciBpPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KGYpO3ZhciBrPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGkpO3ZhciBoPWtbMV07dmFyIGw9aC5zdWJzdHIoMik7dmFyIGU9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgobCk7dmFyIGo9bmV3IFJTQUtleSgpO2ouc2V0UHVibGljKGVbMF0sZVsxXSk7dGhpcy5zZXRSU0FLZXkoail9ZWxzZXt0aHJvd1wia2V5IG5vdCBzdXBwb3J0ZWRcIn19O3RoaXMuZ2V0QVNOMU9iamVjdD1mdW5jdGlvbigpe2lmKHRoaXMuYXNuMUFsZ0lkPT1udWxsfHx0aGlzLmFzbjFTdWJqUEtleT09bnVsbCl7dGhyb3dcImFsZ0lkIGFuZC9vciBzdWJqUHViS2V5IG5vdCBzZXRcIn12YXIgZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xQWxnSWQsdGhpcy5hc24xU3VialBLZXldfSk7cmV0dXJuIGV9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QVNOMU9iamVjdCgpO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9zZXRSU0FLZXk9ZnVuY3Rpb24oZSl7dmFyIGc9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjp7YmlnaW50OmUubn19LHtcImludFwiOntcImludFwiOmUuZX19XX0pO3ZhciBmPWcuZ2V0RW5jb2RlZEhleCgpO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwicnNhRW5jcnlwdGlvblwifSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZn0pfTt0aGlzLl9zZXRFQz1mdW5jdGlvbihlKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe25hbWU6ZS5jdXJ2ZU5hbWV9KTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcImVjUHVibGljS2V5XCIsYXNuMXBhcmFtczpmfSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZS5wdWJLZXlIZXh9KX07dGhpcy5fc2V0RFNBPWZ1bmN0aW9uKGUpe3ZhciBmPW5ldyBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOntiaWdpbnQ6ZS5wfX0se1wiaW50XCI6e2JpZ2ludDplLnF9fSx7XCJpbnRcIjp7YmlnaW50OmUuZ319XX0pO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwiZHNhXCIsYXNuMXBhcmFtczpmfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6ZS55fSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZy5nZXRFbmNvZGVkSGV4KCl9KX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmQgaW5zdGFuY2VvZiBSU0FLZXkpe3RoaXMuX3NldFJTQUtleShkKX1lbHNle2lmKHR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmZCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXt0aGlzLl9zZXRFQyhkKX1lbHNle2lmKHR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3RoaXMuX3NldERTQShkKX1lbHNle2lmKHR5cGVvZiBkLnJzYWtleSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRSU0FLZXkoZC5yc2FrZXkpfWVsc2V7aWYodHlwZW9mIGQucnNhcGVtIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFJTQVBFTShkLnJzYXBlbSl9fX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5UaW1lPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS54NTA5LlRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLnNldFRpbWVQYXJhbXM9ZnVuY3Rpb24oZCl7dGhpcy50aW1lUGFyYW1zPWR9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBkPW51bGw7aWYodGhpcy50aW1lUGFyYW1zIT1udWxsKXtpZih0aGlzLnR5cGU9PVwidXRjXCIpe2Q9bmV3IEtKVVIuYXNuMS5ERVJVVENUaW1lKHRoaXMudGltZVBhcmFtcyl9ZWxzZXtkPW5ldyBLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lKHRoaXMudGltZVBhcmFtcyl9fWVsc2V7aWYodGhpcy50eXBlPT1cInV0Y1wiKXtkPW5ldyBLSlVSLmFzbjEuREVSVVRDVGltZSgpfWVsc2V7ZD1uZXcgS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZSgpfX10aGlzLlRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O3RoaXMudHlwZT1cInV0Y1wiO2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy50eXBlIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9Yy50eXBlfWVsc2V7aWYodHlwZW9mIGMuc3RyIT1cInVuZGVmaW5lZFwiKXtpZihjLnN0ci5tYXRjaCgvXlswLTldezEyfVokLykpe3RoaXMudHlwZT1cInV0Y1wifWlmKGMuc3RyLm1hdGNoKC9eWzAtOV17MTR9WiQvKSl7dGhpcy50eXBlPVwiZ2VuXCJ9fX10aGlzLnRpbWVQYXJhbXM9Y319O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlRpbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXI9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt2YXIgZD1udWxsO3ZhciBiPW51bGw7dmFyIGM9ZmFsc2U7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5uYW1lQWxnPT1udWxsJiZ0aGlzLmFzbjFBbGc9PW51bGwpe3Rocm93XCJhbGdvcml0aG0gbm90IHNwZWNpZmllZFwifWlmKHRoaXMubmFtZUFsZyE9bnVsbCYmdGhpcy5hc24xQWxnPT1udWxsKXt0aGlzLmFzbjFBbGc9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2JqKHRoaXMubmFtZUFsZyl9dmFyIGY9W3RoaXMuYXNuMUFsZ107aWYoIXRoaXMucGFyYW1FbXB0eSl7Zi5wdXNoKHRoaXMuYXNuMVBhcmFtcyl9dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Zn0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUubmFtZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5uYW1lQWxnPWUubmFtZX1pZih0eXBlb2YgZS5hc24xcGFyYW1zIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFQYXJhbXM9ZS5hc24xcGFyYW1zfWlmKHR5cGVvZiBlLnBhcmFtZW1wdHkhPVwidW5kZWZpbmVkXCIpe3RoaXMucGFyYW1FbXB0eT1lLnBhcmFtZW1wdHl9fWlmKHRoaXMuYXNuMVBhcmFtcz09bnVsbCl7dGhpcy5hc24xUGFyYW1zPW5ldyBLSlVSLmFzbjEuREVSTnVsbCgpfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWU9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBjPW51bGw7dmFyIGI9bnVsbDt2YXIgYT17cmZjODIyOlwiODFcIixkbnM6XCI4MlwiLGRuOlwiYTRcIix1cmk6XCI4NlwifTt0aGlzLmV4cGxpY2l0PWZhbHNlO3RoaXMuc2V0QnlQYXJhbT1mdW5jdGlvbihrKXt2YXIgaj1udWxsO3ZhciBnPW51bGw7aWYodHlwZW9mIGs9PVwidW5kZWZpbmVkXCIpe3JldHVybn1pZih0eXBlb2Ygay5yZmM4MjIhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cInJmYzgyMlwiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay5kbnMhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cImRuc1wiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay51cmkhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cInVyaVwiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay5jZXJ0aXNzdWVyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9XCJkblwiO3RoaXMuZXhwbGljaXQ9dHJ1ZTt2YXIgaD1rLmNlcnRpc3N1ZXI7dmFyIGY9bnVsbDtpZihoLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXtmPT1ofWlmKGguaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7Zj1YNTA5LnBlbVRvSGV4KGgpfWlmKGY9PW51bGwpe3Rocm93XCJjZXJ0aXNzdWVyIHBhcmFtIG5vdCBjZXJ0XCJ9dmFyIGU9bmV3IFg1MDkoKTtlLmhleD1mO3ZhciBpPWUuZ2V0SXNzdWVySGV4KCk7Zz1uZXcgS0pVUi5hc24xLkFTTjFPYmplY3QoKTtnLmhUTFY9aX1pZih0eXBlb2Ygay5jZXJ0c3ViaiE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwiZG5cIjt0aGlzLmV4cGxpY2l0PXRydWU7dmFyIGg9ay5jZXJ0c3Viajt2YXIgZj1udWxsO2lmKGgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe2Y9PWh9aWYoaC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXtmPVg1MDkucGVtVG9IZXgoaCl9aWYoZj09bnVsbCl7dGhyb3dcImNlcnRzdWJqIHBhcmFtIG5vdCBjZXJ0XCJ9dmFyIGU9bmV3IFg1MDkoKTtlLmhleD1mO3ZhciBpPWUuZ2V0U3ViamVjdEhleCgpO2c9bmV3IEtKVVIuYXNuMS5BU04xT2JqZWN0KCk7Zy5oVExWPWl9aWYodGhpcy50eXBlPT1udWxsKXt0aHJvd1widW5zdXBwb3J0ZWQgdHlwZSBpbiBwYXJhbXM9XCIra310aGlzLmFzbjFPYmo9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OnRoaXMuZXhwbGljaXQsdGFnOmFbdGhpcy50eXBlXSxvYmo6Z30pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc24xT2JqLmdldEVuY29kZWRIZXgoKX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlQYXJhbShkKX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXM9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWVzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3RoaXMuc2V0QnlQYXJhbUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgYz0wO2M8ZS5sZW5ndGg7YysrKXt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUoZVtjXSk7dGhpcy5hc24xQXJyYXkucHVzaChkKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7cmV0dXJuIGMuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeVBhcmFtQXJyYXkoYil9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBlPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBkPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy50eXBlIT1cImZ1bGxcIil7dGhyb3dcImN1cnJlbnRseSB0eXBlIHNoYWxsIGJlICdmdWxsJzogXCIrdGhpcy50eXBlfXRoaXMuYXNuMU9iaj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOnRoaXMudGFnLG9iajp0aGlzLmFzbjFWfSk7dGhpcy5oVExWPXRoaXMuYXNuMU9iai5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihiKSl7dGhpcy50eXBlPVwiZnVsbFwiO3RoaXMudGFnPVwiYTBcIjt0aGlzLmFzbjFWPWJ9ZWxzZXt0aHJvd1wiVGhpcyBjbGFzcyBzdXBwb3J0cyBHZW5lcmFsTmFtZXMgb25seSBhcyBhcmd1bWVudFwifX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSgpO2lmKHRoaXMuYXNuMURQIT1udWxsKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dHJ1ZSx0YWc6XCJhMFwiLG9iajp0aGlzLmFzbjFEUH0pO2MuYXBwZW5kQVNOMU9iamVjdChkKX10aGlzLmhUTFY9Yy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmRwb2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFEUD1iLmRwb2JqfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5PSUQ9bmV3IGZ1bmN0aW9uKGEpe3RoaXMuYXR5cGUyb2lkTGlzdD17QzpcIjIuNS40LjZcIixPOlwiMi41LjQuMTBcIixPVTpcIjIuNS40LjExXCIsU1Q6XCIyLjUuNC44XCIsTDpcIjIuNS40LjdcIixDTjpcIjIuNS40LjNcIixTTjpcIjIuNS40LjRcIixETjpcIjIuNS40LjQ5XCIsREM6XCIwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4yNVwiLH07dGhpcy5uYW1lMm9pZExpc3Q9e3NoYTE6XCIxLjMuMTQuMy4yLjI2XCIsc2hhMjU2OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuMVwiLHNoYTM4NDpcIjIuMTYuODQwLjEuMTAxLjMuNC4yLjJcIixzaGE1MTI6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4zXCIsc2hhMjI0OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuNFwiLG1kNTpcIjEuMi44NDAuMTEzNTQ5LjIuNVwiLG1kMjpcIjEuMy4xNC43LjIuMi4xXCIscmlwZW1kMTYwOlwiMS4zLjM2LjMuMi4xXCIsTUQyd2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4yXCIsTUQ0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4zXCIsTUQ1d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS40XCIsU0hBMXdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuNVwiLFNIQTIyNHdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTRcIixTSEEyNTZ3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjExXCIsU0hBMzg0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xMlwiLFNIQTUxMndpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTNcIixTSEExd2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjFcIixTSEEyMjR3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy4xXCIsU0hBMjU2d2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjMuMlwiLFNIQTM4NHdpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4zLjNcIixTSEE1MTJ3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy40XCIsZHNhOlwiMS4yLjg0MC4xMDA0MC40LjFcIixTSEExd2l0aERTQTpcIjEuMi44NDAuMTAwNDAuNC4zXCIsU0hBMjI0d2l0aERTQTpcIjIuMTYuODQwLjEuMTAxLjMuNC4zLjFcIixTSEEyNTZ3aXRoRFNBOlwiMi4xNi44NDAuMS4xMDEuMy40LjMuMlwiLHJzYUVuY3J5cHRpb246XCIxLjIuODQwLjExMzU0OS4xLjEuMVwiLGNvdW50cnlOYW1lOlwiMi41LjQuNlwiLG9yZ2FuaXphdGlvbjpcIjIuNS40LjEwXCIsb3JnYW5pemF0aW9uYWxVbml0OlwiMi41LjQuMTFcIixzdGF0ZU9yUHJvdmluY2VOYW1lOlwiMi41LjQuOFwiLGxvY2FsaXR5OlwiMi41LjQuN1wiLGNvbW1vbk5hbWU6XCIyLjUuNC4zXCIsc3ViamVjdEtleUlkZW50aWZpZXI6XCIyLjUuMjkuMTRcIixrZXlVc2FnZTpcIjIuNS4yOS4xNVwiLHN1YmplY3RBbHROYW1lOlwiMi41LjI5LjE3XCIsYmFzaWNDb25zdHJhaW50czpcIjIuNS4yOS4xOVwiLG5hbWVDb25zdHJhaW50czpcIjIuNS4yOS4zMFwiLGNSTERpc3RyaWJ1dGlvblBvaW50czpcIjIuNS4yOS4zMVwiLGNlcnRpZmljYXRlUG9saWNpZXM6XCIyLjUuMjkuMzJcIixhdXRob3JpdHlLZXlJZGVudGlmaWVyOlwiMi41LjI5LjM1XCIscG9saWN5Q29uc3RyYWludHM6XCIyLjUuMjkuMzZcIixleHRLZXlVc2FnZTpcIjIuNS4yOS4zN1wiLGF1dGhvcml0eUluZm9BY2Nlc3M6XCIxLjMuNi4xLjUuNS43LjEuMVwiLGFueUV4dGVuZGVkS2V5VXNhZ2U6XCIyLjUuMjkuMzcuMFwiLHNlcnZlckF1dGg6XCIxLjMuNi4xLjUuNS43LjMuMVwiLGNsaWVudEF1dGg6XCIxLjMuNi4xLjUuNS43LjMuMlwiLGNvZGVTaWduaW5nOlwiMS4zLjYuMS41LjUuNy4zLjNcIixlbWFpbFByb3RlY3Rpb246XCIxLjMuNi4xLjUuNS43LjMuNFwiLHRpbWVTdGFtcGluZzpcIjEuMy42LjEuNS41LjcuMy44XCIsb2NzcFNpZ25pbmc6XCIxLjMuNi4xLjUuNS43LjMuOVwiLGVjUHVibGljS2V5OlwiMS4yLjg0MC4xMDA0NS4yLjFcIixzZWNwMjU2cjE6XCIxLjIuODQwLjEwMDQ1LjMuMS43XCIsc2VjcDI1NmsxOlwiMS4zLjEzMi4wLjEwXCIsc2VjcDM4NHIxOlwiMS4zLjEzMi4wLjM0XCIscGtjczVQQkVTMjpcIjEuMi44NDAuMTEzNTQ5LjEuNS4xM1wiLHBrY3M1UEJLREYyOlwiMS4yLjg0MC4xMTM1NDkuMS41LjEyXCIsXCJkZXMtRURFMy1DQkNcIjpcIjEuMi44NDAuMTEzNTQ5LjMuN1wiLGRhdGE6XCIxLjIuODQwLjExMzU0OS4xLjcuMVwiLFwic2lnbmVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy4yXCIsXCJlbnZlbG9wZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjNcIixcImRpZ2VzdGVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy41XCIsXCJlbmNyeXB0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjZcIixcImF1dGhlbnRpY2F0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjEuMlwiLHRzdGluZm86XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMS40XCIsfTt0aGlzLm9iakNhY2hlPXt9O3RoaXMubmFtZTJvYmo9ZnVuY3Rpb24oYil7aWYodHlwZW9mIHRoaXMub2JqQ2FjaGVbYl0hPVwidW5kZWZpbmVkXCIpe3JldHVybiB0aGlzLm9iakNhY2hlW2JdfWlmKHR5cGVvZiB0aGlzLm5hbWUyb2lkTGlzdFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIk5hbWUgb2YgT2JqZWN0SWRlbnRpZmllciBub3QgZGVmaW5lZDogXCIrYn12YXIgYz10aGlzLm5hbWUyb2lkTGlzdFtiXTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDpjfSk7dGhpcy5vYmpDYWNoZVtiXT1kO3JldHVybiBkfTt0aGlzLmF0eXBlMm9iaj1mdW5jdGlvbihiKXtpZih0eXBlb2YgdGhpcy5vYmpDYWNoZVtiXSE9XCJ1bmRlZmluZWRcIil7cmV0dXJuIHRoaXMub2JqQ2FjaGVbYl19aWYodHlwZW9mIHRoaXMuYXR5cGUyb2lkTGlzdFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIkF0dHJpYnV0ZVR5cGUgbmFtZSB1bmRlZmluZWQ6IFwiK2J9dmFyIGM9dGhpcy5hdHlwZTJvaWRMaXN0W2JdO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmN9KTt0aGlzLm9iakNhY2hlW2JdPWQ7cmV0dXJuIGR9fTtLSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWU9ZnVuY3Rpb24oYil7dmFyIGM9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdDtmb3IodmFyIGEgaW4gYyl7aWYoY1thXT09Yil7cmV0dXJuIGF9fXJldHVyblwiXCJ9O0tKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZD1mdW5jdGlvbihhKXt2YXIgYj1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0O2lmKGJbYV09PT11bmRlZmluZWQpe3JldHVyblwiXCJ9cmV0dXJuIGJbYV19O0tKVVIuYXNuMS54NTA5Llg1MDlVdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuZ2V0UEtDUzhQdWJLZXlQRU1mcm9tUlNBS2V5PWZ1bmN0aW9uKGkpe3ZhciBoPW51bGw7dmFyIGY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGkubik7dmFyIGo9S0pVUi5hc24xLkFTTjFVdGlsLmludGVnZXJUb0J5dGVIZXgoaS5lKTt2YXIgYT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2hleDpmfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtoZXg6an0pO3ZhciBsPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OlthLGddfSk7dmFyIGM9bC5nZXRFbmNvZGVkSGV4KCk7dmFyIGQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJyc2FFbmNyeXB0aW9uXCJ9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitjfSk7dmFyIGs9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2QsYl19KTt2YXIgZT1rLmdldEVuY29kZWRIZXgoKTt2YXIgaD1LSlVSLmFzbjEuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChlLFwiUFVCTElDIEtFWVwiKTtyZXR1cm4gaH19O0tKVVIuYXNuMS54NTA5Llg1MDlVdGlsLm5ld0NlcnRQRU09ZnVuY3Rpb24oZil7dmFyIGM9S0pVUi5hc24xLng1MDk7dmFyIGU9bmV3IGMuVEJTQ2VydGlmaWNhdGUoKTtpZihmLnNlcmlhbCE9PXVuZGVmaW5lZCl7ZS5zZXRTZXJpYWxOdW1iZXJCeVBhcmFtKGYuc2VyaWFsKX1lbHNle3Rocm93XCJzZXJpYWwgbnVtYmVyIHVuZGVmaW5lZC5cIn1pZih0eXBlb2YgZi5zaWdhbGcubmFtZT09XCJzdHJpbmdcIil7ZS5zZXRTaWduYXR1cmVBbGdCeVBhcmFtKGYuc2lnYWxnKX1lbHNle3Rocm93XCJ1bnByb3BlciBzaWduYXR1cmUgYWxnb3JpdGhtIG5hbWVcIn1pZihmLmlzc3VlciE9PXVuZGVmaW5lZCl7ZS5zZXRJc3N1ZXJCeVBhcmFtKGYuaXNzdWVyKX1lbHNle3Rocm93XCJpc3N1ZXIgbmFtZSB1bmRlZmluZWQuXCJ9aWYoZi5ub3RiZWZvcmUhPT11bmRlZmluZWQpe2Uuc2V0Tm90QmVmb3JlQnlQYXJhbShmLm5vdGJlZm9yZSl9ZWxzZXt0aHJvd1wibm90YmVmb3JlIHVuZGVmaW5lZC5cIn1pZihmLm5vdGFmdGVyIT09dW5kZWZpbmVkKXtlLnNldE5vdEFmdGVyQnlQYXJhbShmLm5vdGFmdGVyKX1lbHNle3Rocm93XCJub3RhZnRlciB1bmRlZmluZWQuXCJ9aWYoZi5zdWJqZWN0IT09dW5kZWZpbmVkKXtlLnNldFN1YmplY3RCeVBhcmFtKGYuc3ViamVjdCl9ZWxzZXt0aHJvd1wic3ViamVjdCBuYW1lIHVuZGVmaW5lZC5cIn1pZihmLnNianB1YmtleSE9PXVuZGVmaW5lZCl7ZS5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXkoZi5zYmpwdWJrZXkpfWVsc2V7dGhyb3dcInN1YmplY3QgcHVibGljIGtleSB1bmRlZmluZWQuXCJ9aWYoZi5leHQhPT11bmRlZmluZWQmJmYuZXh0Lmxlbmd0aCE9PXVuZGVmaW5lZCl7Zm9yKHZhciBiPTA7YjxmLmV4dC5sZW5ndGg7YisrKXtmb3Ioa2V5IGluIGYuZXh0W2JdKXtlLmFwcGVuZEV4dGVuc2lvbkJ5TmFtZShrZXksZi5leHRbYl1ba2V5XSl9fX1pZihmLmNha2V5PT09dW5kZWZpbmVkJiZmLnNpZ2hleD09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtIGNha2V5IGFuZCBzaWdoZXggdW5kZWZpbmVkLlwifXZhciBkPW51bGw7dmFyIGE9bnVsbDtpZihmLmNha2V5KXtkPUtFWVVUSUwuZ2V0S2V5LmFwcGx5KG51bGwsZi5jYWtleSk7YT1uZXcgYy5DZXJ0aWZpY2F0ZSh7dGJzY2VydG9iajplLHBydmtleW9iajpkfSk7YS5zaWduKCl9aWYoZi5zaWdoZXgpe2E9bmV3IGMuQ2VydGlmaWNhdGUoe3Ric2NlcnRvYmo6ZX0pO2Euc2V0U2lnbmF0dXJlSGV4KGYuc2lnaGV4KX1yZXR1cm4gYS5nZXRQRU1TdHJpbmcoKX07XG4vKiEgYXNuMWNtcy0xLjAuMi5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS5jbXM9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEuY21zKXtLSlVSLmFzbjEuY21zPXt9fUtKVVIuYXNuMS5jbXMuQXR0cmlidXRlPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1bXTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZixlLGM7Zj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDp0aGlzLmF0dHJUeXBlT2lkfSk7ZT1uZXcgS0pVUi5hc24xLkRFUlNldCh7YXJyYXk6dGhpcy52YWx1ZUxpc3R9KTt0cnl7ZS5nZXRFbmNvZGVkSGV4KCl9Y2F0Y2goZCl7dGhyb3dcImZhaWwgdmFsdWVTZXQuZ2V0RW5jb2RlZEhleCBpbiBBdHRyaWJ1dGUoMSkvXCIrZH1jPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltmLGVdfSk7dHJ5e3RoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKX1jYXRjaChkKXt0aHJvd1wiZmFpbGVkIHNlcS5nZXRFbmNvZGVkSGV4IGluIEF0dHJpYnV0ZSgyKS9cIitkfXJldHVybiB0aGlzLmhUTFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5Db250ZW50VHlwZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEuY21zLkNvbnRlbnRUeXBlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjNcIjt2YXIgYT1udWxsO2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXt2YXIgYT1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoYik7dGhpcy52YWx1ZUxpc3Q9W2FdfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Db250ZW50VHlwZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5NZXNzYWdlRGlnZXN0PWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jbXMuTWVzc2FnZURpZ2VzdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS40XCI7aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKGUuZWNpT2JqIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbyYmdHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7dmFyIGI9ZS5lY2lPYmouZUNvbnRlbnRWYWx1ZUhleDt2YXIgYT1lLmhhc2hBbGc7dmFyIGM9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGIsYSk7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyh7aGV4OmN9KTtkLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bZF19ZWxzZXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKGUpO2QuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtkXX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLk1lc3NhZ2VEaWdlc3QsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuU2lnbmluZ1RpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5TaWduaW5nVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS41XCI7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpO3RyeXthLmdldEVuY29kZWRIZXgoKX1jYXRjaChiKXt0aHJvd1wiU2lnbmluZ1RpbWUuZ2V0RW5jb2RlZEhleCgpIGZhaWxlZC9cIitifXRoaXMudmFsdWVMaXN0PVthXX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ1RpbWUsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTJcIjt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLmNtczt2YXIgYj1LSlVSLmNyeXB0bzt0aGlzLnNldENlcnRzPWZ1bmN0aW9uKGwpe3ZhciBqPVtdO2Zvcih2YXIgaD0wO2g8bC5sZW5ndGg7aCsrKXt2YXIgZj1LRVlVVElMLmdldEhleEZyb21QRU0obFtoXSk7dmFyIGU9Yi5VdGlsLmhhc2hIZXgoZixcInNoYTFcIik7dmFyIG09bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDplfSk7bS5nZXRFbmNvZGVkSGV4KCk7dmFyIGs9bmV3IGMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyKHtjZXJ0OmxbaF19KTtrLmdldEVuY29kZWRIZXgoKTt2YXIgbj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6W20sa119KTtuLmdldEVuY29kZWRIZXgoKTtqLnB1c2gobil9dmFyIGc9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Omp9KTtnLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bZ119O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZC5hcnJheT09XCJvYmplY3RcIil7dGhpcy5zZXRDZXJ0cyhkLmFycmF5KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGVWMj1mdW5jdGlvbihlKXtLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZVYyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuNDdcIjt2YXIgYj1LSlVSLmFzbjE7dmFyIGY9S0pVUi5hc24xLng1MDk7dmFyIGQ9S0pVUi5hc24xLmNtczt2YXIgYz1LSlVSLmNyeXB0bzt0aGlzLnNldENlcnRzPWZ1bmN0aW9uKHAsaCl7dmFyIG49W107Zm9yKHZhciBsPTA7bDxwLmxlbmd0aDtsKyspe3ZhciBqPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShwW2xdKTt2YXIgcj1bXTtpZihoIT1cInNoYTI1NlwiKXtyLnB1c2gobmV3IGYuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpofSkpfXZhciBnPWMuVXRpbC5oYXNoSGV4KGosaCk7dmFyIHE9bmV3IGIuREVST2N0ZXRTdHJpbmcoe2hleDpnfSk7cS5nZXRFbmNvZGVkSGV4KCk7ci5wdXNoKHEpO3ZhciBtPW5ldyBkLklzc3VlckFuZFNlcmlhbE51bWJlcih7Y2VydDpwW2xdfSk7bS5nZXRFbmNvZGVkSGV4KCk7ci5wdXNoKG0pO3ZhciBvPW5ldyBiLkRFUlNlcXVlbmNlKHthcnJheTpyfSk7by5nZXRFbmNvZGVkSGV4KCk7bi5wdXNoKG8pfXZhciBrPW5ldyBiLkRFUlNlcXVlbmNlKHthcnJheTpufSk7ay5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2tdfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUuYXJyYXk9PVwib2JqZWN0XCIpe3ZhciBhPVwic2hhMjU2XCI7aWYodHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7YT1lLmhhc2hBbGd9dGhpcy5zZXRDZXJ0cyhlLmFycmF5LGEpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlVjIsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgZT1udWxsO3ZhciBiPW51bGw7dmFyIGE9S0pVUi5hc24xO3ZhciBkPWEueDUwOTt0aGlzLnNldEJ5Q2VydFBFTT1mdW5jdGlvbihpKXt2YXIgZz1LRVlVVElMLmdldEhleEZyb21QRU0oaSk7dmFyIGY9bmV3IFg1MDkoKTtmLmhleD1nO3ZhciBqPWYuZ2V0SXNzdWVySGV4KCk7dGhpcy5kSXNzdWVyPW5ldyBkLlg1MDBOYW1lKCk7dGhpcy5kSXNzdWVyLmhUTFY9ajt2YXIgaD1mLmdldFNlcmlhbE51bWJlckhleCgpO3RoaXMuZFNlcmlhbD1uZXcgYS5ERVJJbnRlZ2VyKHtoZXg6aH0pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kSXNzdWVyLHRoaXMuZFNlcmlhbF19KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiJiZjLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe3RoaXMuc2V0QnlDZXJ0UEVNKGMpfWlmKGMuaXNzdWVyJiZjLnNlcmlhbCl7aWYoYy5pc3N1ZXIgaW5zdGFuY2VvZiBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZSl7dGhpcy5kSXNzdWVyPWMuaXNzdWVyfWVsc2V7dGhpcy5kSXNzdWVyPW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShjLmlzc3Vlcil9aWYoYy5zZXJpYWwgaW5zdGFuY2VvZiBLSlVSLmFzbjEuREVSSW50ZWdlcil7dGhpcy5kU2VyaWFsPWMuc2VyaWFsfWVsc2V7dGhpcy5kU2VyaWFsPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihjLnNlcmlhbCl9fWlmKHR5cGVvZiBjLmNlcnQ9PVwic3RyaW5nXCIpe3RoaXMuc2V0QnlDZXJ0UEVNKGMuY2VydCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZUxpc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMubGlzdD1uZXcgQXJyYXkoKTt0aGlzLnNvcnRGbGFnPXRydWU7dGhpcy5hZGQ9ZnVuY3Rpb24oYil7aWYoYiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKXt0aGlzLmxpc3QucHVzaChiKX19O3RoaXMubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGlzdC5sZW5ndGh9O3RoaXMuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmxpc3Q9bmV3IEFycmF5KCk7dGhpcy5oVExWPW51bGw7dGhpcy5oVj1udWxsfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBiPW5ldyBLSlVSLmFzbjEuREVSU2V0KHthcnJheTp0aGlzLmxpc3Qsc29ydGZsYWc6dGhpcy5zb3J0RmxhZ30pO3RoaXMuaFRMVj1iLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc29ydGZsYWchPVwidW5kZWZpbmVkXCImJmEuc29ydGZsYWc9PWZhbHNlKXt0aGlzLnNvcnRGbGFnPWZhbHNlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5TaWduZXJJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuU2lnbmVySW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jbXM7dmFyIGQ9S0pVUi5hc24xLng1MDk7dGhpcy5kQ01TVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRTaWduZXJJZGVudGlmaWVyPW51bGw7dGhpcy5kRGlnZXN0QWxnb3JpdGhtPW51bGw7dGhpcy5kU2lnbmVkQXR0cnM9bmV3IGIuQXR0cmlidXRlTGlzdCgpO3RoaXMuZFNpZ0FsZz1udWxsO3RoaXMuZFNpZz1udWxsO3RoaXMuZFVuc2lnbmVkQXR0cnM9bmV3IGIuQXR0cmlidXRlTGlzdCgpO3RoaXMuc2V0U2lnbmVySWRlbnRpZmllcj1mdW5jdGlvbihmKXtpZih0eXBlb2YgZj09XCJzdHJpbmdcIiYmZi5pbmRleE9mKFwiQ0VSVElGSUNBVEVcIikhPS0xJiZmLmluZGV4T2YoXCJCRUdJTlwiKSE9LTEmJmYuaW5kZXhPZihcIkVORFwiKSE9LTEpe3ZhciBlPWY7dGhpcy5kU2lnbmVySWRlbnRpZmllcj1uZXcgYi5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoe2NlcnQ6Zn0pfX07dGhpcy5zZXRGb3JDb250ZW50QW5kSGFzaD1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYoZS5lY2lPYmogaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvKXt0aGlzLmRTaWduZWRBdHRycy5hZGQobmV3IGIuQ29udGVudFR5cGUoe29pZDpcIjEuMi44NDAuMTEzNTQ5LjEuNy4xXCJ9KSk7dGhpcy5kU2lnbmVkQXR0cnMuYWRkKG5ldyBiLk1lc3NhZ2VEaWdlc3Qoe2VjaU9iajplLmVjaU9iaixoYXNoQWxnOmUuaGFzaEFsZ30pKX1pZih0eXBlb2YgZS5zZE9iaiE9XCJ1bmRlZmluZWRcIiYmZS5zZE9iaiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YSl7aWYoZS5zZE9iai5kaWdlc3RBbGdOYW1lTGlzdC5qb2luKFwiOlwiKS5pbmRleE9mKGUuaGFzaEFsZyk9PS0xKXtlLnNkT2JqLmRpZ2VzdEFsZ05hbWVMaXN0LnB1c2goZS5oYXNoQWxnKX19aWYodHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7dGhpcy5kRGlnZXN0QWxnb3JpdGhtPW5ldyBkLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6ZS5oYXNoQWxnfSl9fX07dGhpcy5zaWduPWZ1bmN0aW9uKGosZil7dGhpcy5kU2lnQWxnPW5ldyBkLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6Zn0pO3ZhciBnPXRoaXMuZFNpZ25lZEF0dHJzLmdldEVuY29kZWRIZXgoKTt2YXIgZT1LRVlVVElMLmdldEtleShqKTt2YXIgaT1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6Zn0pO2kuaW5pdChlKTtpLnVwZGF0ZUhleChnKTt2YXIgaD1pLnNpZ24oKTt0aGlzLmRTaWc9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpofSl9O3RoaXMuYWRkVW5zaWduZWQ9ZnVuY3Rpb24oZSl7dGhpcy5oVExWPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycy5oVExWPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycy5hZGQoZSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZFNpZ25lZEF0dHJzIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGVMaXN0JiZ0aGlzLmRTaWduZWRBdHRycy5sZW5ndGgoKT09MCl7dGhyb3dcIlNpZ25lZEF0dHJzIGxlbmd0aCA9IDAgKGVtcHR5KVwifXZhciBlPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZFNpZ25lZEF0dHJzLHRhZzpcImEwXCIsZXhwbGljaXQ6ZmFsc2V9KTt2YXIgaD1udWxsO2lmKHRoaXMuZFVuc2lnbmVkQXR0cnMubGVuZ3RoKCk+MCl7aD1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajp0aGlzLmRVbnNpZ25lZEF0dHJzLHRhZzpcImExXCIsZXhwbGljaXQ6ZmFsc2V9KX12YXIgZz1bdGhpcy5kQ01TVmVyc2lvbix0aGlzLmRTaWduZXJJZGVudGlmaWVyLHRoaXMuZERpZ2VzdEFsZ29yaXRobSxlLHRoaXMuZFNpZ0FsZyx0aGlzLmRTaWcsXTtpZihoIT1udWxsKXtnLnB1c2goaCl9dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Omd9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmVySW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTpcImRhdGFcIn0pO3RoaXMuZEVDb250ZW50PW51bGw7dGhpcy5pc0RldGFjaGVkPWZhbHNlO3RoaXMuZUNvbnRlbnRWYWx1ZUhleD1udWxsO3RoaXMuc2V0Q29udGVudFR5cGU9ZnVuY3Rpb24oZSl7aWYoZS5tYXRjaCgvXlswLTJdWy5dWzAtOS5dKyQvKSl7dGhpcy5kRUNvbnRlbnRUeXBlPW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDplfSl9ZWxzZXt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTplfSl9fTt0aGlzLnNldENvbnRlbnRWYWx1ZT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUuaGV4PT1cInN0cmluZ1wiKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9ZS5oZXh9ZWxzZXtpZih0eXBlb2YgZS5zdHI9PVwic3RyaW5nXCIpe3RoaXMuZUNvbnRlbnRWYWx1ZUhleD11dGY4dG9oZXgoZS5zdHIpfX19fTt0aGlzLnNldENvbnRlbnRWYWx1ZUhleD1mdW5jdGlvbihlKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9ZX07dGhpcy5zZXRDb250ZW50VmFsdWVTdHI9ZnVuY3Rpb24oZSl7dGhpcy5lQ29udGVudFZhbHVlSGV4PXV0Zjh0b2hleChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuZUNvbnRlbnRWYWx1ZUhleCE9XCJzdHJpbmdcIil7dGhyb3dcImVDb250ZW50VmFsdWUgbm90IHlldCBzZXRcIn12YXIgZz1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OnRoaXMuZUNvbnRlbnRWYWx1ZUhleH0pO3RoaXMuZEVDb250ZW50PW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOmcsdGFnOlwiYTBcIixleHBsaWNpdDp0cnVlfSk7dmFyIGU9W3RoaXMuZEVDb250ZW50VHlwZV07aWYoIXRoaXMuaXNEZXRhY2hlZCl7ZS5wdXNoKHRoaXMuZEVDb250ZW50KX12YXIgZj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZX0pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5Db250ZW50SW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLkNvbnRlbnRJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRDb250ZW50VHlwZT1udWxsO3RoaXMuZENvbnRlbnQ9bnVsbDt0aGlzLnNldENvbnRlbnRUeXBlPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT1cInN0cmluZ1wiKXt0aGlzLmRDb250ZW50VHlwZT1kLk9JRC5uYW1lMm9iaihlKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZENvbnRlbnQsdGFnOlwiYTBcIixleHBsaWNpdDp0cnVlfSk7dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRDb250ZW50VHlwZSxmXX0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYoYy50eXBlKXt0aGlzLnNldENvbnRlbnRUeXBlKGMudHlwZSl9aWYoYy5vYmomJmMub2JqIGluc3RhbmNlb2YgYS5BU04xT2JqZWN0KXt0aGlzLmRDb250ZW50PWMub2JqfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQ29udGVudEluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YT1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLlNpZ25lZERhdGEuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY21zO3ZhciBkPUtKVVIuYXNuMS54NTA5O3RoaXMuZENNU1ZlcnNpb249bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjoxfSk7dGhpcy5kRGlnZXN0QWxncz1udWxsO3RoaXMuZGlnZXN0QWxnTmFtZUxpc3Q9W107dGhpcy5kRW5jYXBDb250ZW50SW5mbz1uZXcgYi5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbygpO3RoaXMuZENlcnRzPW51bGw7dGhpcy5jZXJ0aWZpY2F0ZUxpc3Q9W107dGhpcy5jcmxMaXN0PVtdO3RoaXMuc2lnbmVySW5mb0xpc3Q9W25ldyBiLlNpZ25lckluZm8oKV07dGhpcy5hZGRDZXJ0aWZpY2F0ZXNCeVBFTT1mdW5jdGlvbihlKXt2YXIgZj1LRVlVVElMLmdldEhleEZyb21QRU0oZSk7dmFyIGc9bmV3IGEuQVNOMU9iamVjdCgpO2cuaFRMVj1mO3RoaXMuY2VydGlmaWNhdGVMaXN0LnB1c2goZyl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhUTFY9PVwic3RyaW5nXCIpe3JldHVybiB0aGlzLmhUTFZ9aWYodGhpcy5kRGlnZXN0QWxncz09bnVsbCl7dmFyIGs9W107Zm9yKHZhciBqPTA7ajx0aGlzLmRpZ2VzdEFsZ05hbWVMaXN0Lmxlbmd0aDtqKyspe3ZhciBoPXRoaXMuZGlnZXN0QWxnTmFtZUxpc3Rbal07dmFyIG09bmV3IGQuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpofSk7ay5wdXNoKG0pfXRoaXMuZERpZ2VzdEFsZ3M9bmV3IGEuREVSU2V0KHthcnJheTprfSl9dmFyIGU9W3RoaXMuZENNU1ZlcnNpb24sdGhpcy5kRGlnZXN0QWxncyx0aGlzLmRFbmNhcENvbnRlbnRJbmZvXTtpZih0aGlzLmRDZXJ0cz09bnVsbCl7aWYodGhpcy5jZXJ0aWZpY2F0ZUxpc3QubGVuZ3RoPjApe3ZhciBsPW5ldyBhLkRFUlNldCh7YXJyYXk6dGhpcy5jZXJ0aWZpY2F0ZUxpc3R9KTt0aGlzLmRDZXJ0cz1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpsLHRhZzpcImEwXCIsZXhwbGljaXQ6ZmFsc2V9KX19aWYodGhpcy5kQ2VydHMhPW51bGwpe2UucHVzaCh0aGlzLmRDZXJ0cyl9dmFyIGc9bmV3IGEuREVSU2V0KHthcnJheTp0aGlzLnNpZ25lckluZm9MaXN0fSk7ZS5wdXNoKGcpO3ZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuZ2V0Q29udGVudEluZm89ZnVuY3Rpb24oKXt0aGlzLmdldEVuY29kZWRIZXgoKTt2YXIgZT1uZXcgYi5Db250ZW50SW5mbyh7dHlwZTpcInNpZ25lZC1kYXRhXCIsb2JqOnRoaXN9KTtyZXR1cm4gZX07dGhpcy5nZXRDb250ZW50SW5mb0VuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbnRlbnRJbmZvKCk7dmFyIGY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIGZ9O3RoaXMuZ2V0UEVNPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb250ZW50SW5mb0VuY29kZWRIZXgoKTt2YXIgZj1hLkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoZSxcIkNNU1wiKTtyZXR1cm4gZn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5DTVNVdGlsPW5ldyBmdW5jdGlvbigpe307S0pVUi5hc24xLmNtcy5DTVNVdGlsLm5ld1NpZ25lZERhdGE9ZnVuY3Rpb24oYSl7dmFyIGg9S0pVUi5hc24xLmNtczt2YXIgZz1LSlVSLmFzbjEuY2FkZXM7dmFyIGY9bmV3IGguU2lnbmVkRGF0YSgpO2YuZEVuY2FwQ29udGVudEluZm8uc2V0Q29udGVudFZhbHVlKGEuY29udGVudCk7aWYodHlwZW9mIGEuY2VydHM9PVwib2JqZWN0XCIpe2Zvcih2YXIgYj0wO2I8YS5jZXJ0cy5sZW5ndGg7YisrKXtmLmFkZENlcnRpZmljYXRlc0J5UEVNKGEuY2VydHNbYl0pfX1mLnNpZ25lckluZm9MaXN0PVtdO2Zvcih2YXIgYj0wO2I8YS5zaWduZXJJbmZvcy5sZW5ndGg7YisrKXt2YXIgZD1hLnNpZ25lckluZm9zW2JdO3ZhciBjPW5ldyBoLlNpZ25lckluZm8oKTtjLnNldFNpZ25lcklkZW50aWZpZXIoZC5zaWduZXJDZXJ0KTtjLnNldEZvckNvbnRlbnRBbmRIYXNoKHtzZE9iajpmLGVjaU9iajpmLmRFbmNhcENvbnRlbnRJbmZvLGhhc2hBbGc6ZC5oYXNoQWxnfSk7Zm9yKGF0dHJOYW1lIGluIGQuc0F0dHIpe3ZhciBqPWQuc0F0dHJbYXR0ck5hbWVdO2lmKGF0dHJOYW1lPT1cIlNpZ25pbmdUaW1lXCIpe3ZhciBlPW5ldyBoLlNpZ25pbmdUaW1lKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduaW5nQ2VydGlmaWNhdGVcIil7dmFyIGU9bmV3IGguU2lnbmluZ0NlcnRpZmljYXRlKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduaW5nQ2VydGlmaWNhdGVWMlwiKXt2YXIgZT1uZXcgaC5TaWduaW5nQ2VydGlmaWNhdGVWMihqKTtjLmRTaWduZWRBdHRycy5hZGQoZSl9aWYoYXR0ck5hbWU9PVwiU2lnbmF0dXJlUG9saWN5SWRlbnRpZmllclwiKXt2YXIgZT1uZXcgZy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX19Yy5zaWduKGQuc2lnbmVyUHJ2S2V5LGQuc2lnQWxnKTtmLnNpZ25lckluZm9MaXN0LnB1c2goYyl9cmV0dXJuIGZ9O1xuLyohIGFzbjF0c3AtMS4wLjEuanMgKGMpIDIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLnRzcD09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS50c3Ape0tKVVIuYXNuMS50c3A9e319S0pVUi5hc24xLnRzcC5BY2N1cmFjeT1mdW5jdGlvbihiKXtLSlVSLmFzbjEudHNwLkFjY3VyYWN5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dGhpcy5zZWNvbmRzPW51bGw7dGhpcy5taWxsaXM9bnVsbDt0aGlzLm1pY3Jvcz1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPW51bGw7dmFyIGc9bnVsbDt2YXIgaT1udWxsO3ZhciBjPVtdO2lmKHRoaXMuc2Vjb25kcyE9bnVsbCl7ZT1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMuc2Vjb25kc30pO2MucHVzaChlKX1pZih0aGlzLm1pbGxpcyE9bnVsbCl7dmFyIGg9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjp0aGlzLm1pbGxpc30pO2c9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6aCx0YWc6XCI4MFwiLGV4cGxpY2l0OmZhbHNlfSk7Yy5wdXNoKGcpfWlmKHRoaXMubWljcm9zIT1udWxsKXt2YXIgZj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMubWljcm9zfSk7aT1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpmLHRhZzpcIjgxXCIsZXhwbGljaXQ6ZmFsc2V9KTtjLnB1c2goaSl9dmFyIGQ9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmN9KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLnNlY29uZHM9PVwibnVtYmVyXCIpe3RoaXMuc2Vjb25kcz1iLnNlY29uZHN9aWYodHlwZW9mIGIubWlsbGlzPT1cIm51bWJlclwiKXt0aGlzLm1pbGxpcz1iLm1pbGxpc31pZih0eXBlb2YgYi5taWNyb3M9PVwibnVtYmVyXCIpe3RoaXMubWljcm9zPWIubWljcm9zfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuQWNjdXJhY3ksS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBjPUtKVVIuYXNuMS54NTA5O3RoaXMuZEhhc2hBbGc9bnVsbDt0aGlzLmRIYXNoVmFsdWU9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kSGFzaEFsZyx0aGlzLmRIYXNoVmFsdWVdfSk7cmV0dXJuIGQuZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuaGFzaEFsZz09XCJzdHJpbmdcIil7dGhpcy5kSGFzaEFsZz1uZXcgYy5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmIuaGFzaEFsZ30pfWlmKHR5cGVvZiBiLmhhc2hWYWx1ZT09XCJzdHJpbmdcIil7dGhpcy5kSGFzaFZhbHVlPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6Yi5oYXNoVmFsdWV9KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcT1mdW5jdGlvbihjKXtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRNZXNzYWdlSW1wcmludD1udWxsO3RoaXMuZFBvbGljeT1udWxsO3RoaXMuZE5vbmNlPW51bGw7dGhpcy5jZXJ0UmVxPXRydWU7dGhpcy5zZXRNZXNzYWdlSW1wcmludD1mdW5jdGlvbihkKXtpZihkIGluc3RhbmNlb2YgS0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludCl7dGhpcy5kTWVzc2FnZUltcHJpbnQ9ZDtyZXR1cm59aWYodHlwZW9mIGQ9PVwib2JqZWN0XCIpe3RoaXMuZE1lc3NhZ2VJbXByaW50PW5ldyBiLk1lc3NhZ2VJbXByaW50KGQpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kTWVzc2FnZUltcHJpbnQ9PW51bGwpe3Rocm93XCJtZXNzYWdlSW1wcmludCBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZD1bdGhpcy5kVmVyc2lvbix0aGlzLmRNZXNzYWdlSW1wcmludF07aWYodGhpcy5kUG9saWN5IT1udWxsKXtkLnB1c2godGhpcy5kUG9saWN5KX1pZih0aGlzLmROb25jZSE9bnVsbCl7ZC5wdXNoKHRoaXMuZE5vbmNlKX1pZih0aGlzLmNlcnRSZXEpe2QucHVzaChuZXcgYS5ERVJCb29sZWFuKCkpfXZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5taT09XCJvYmplY3RcIil7dGhpcy5zZXRNZXNzYWdlSW1wcmludChjLm1pKX1pZih0eXBlb2YgYy5wb2xpY3k9PVwib2JqZWN0XCIpe3RoaXMuZFBvbGljeT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKGMucG9saWN5KX1pZih0eXBlb2YgYy5ub25jZT09XCJvYmplY3RcIil7dGhpcy5kTm9uY2U9bmV3IGEuREVSSW50ZWdlcihjLm5vbmNlKX1pZih0eXBlb2YgYy5jZXJ0cmVxPT1cImJvb2xlYW5cIil7dGhpcy5jZXJ0UmVxPWMuY2VydHJlcX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5UU1RJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVFNUSW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBkPUtKVVIuYXNuMS54NTA5O3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRQb2xpY3k9bnVsbDt0aGlzLmRNZXNzYWdlSW1wcmludD1udWxsO3RoaXMuZFNlcmlhbE51bWJlcj1udWxsO3RoaXMuZEdlblRpbWU9bnVsbDt0aGlzLmRBY2N1cmFjeT1udWxsO3RoaXMuZE9yZGVyaW5nPW51bGw7dGhpcy5kTm9uY2U9bnVsbDt0aGlzLmRUc2E9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT1bdGhpcy5kVmVyc2lvbl07aWYodGhpcy5kUG9saWN5PT1udWxsKXt0aHJvd1wicG9saWN5IHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kUG9saWN5KTtpZih0aGlzLmRNZXNzYWdlSW1wcmludD09bnVsbCl7dGhyb3dcIm1lc3NhZ2VJbXByaW50IHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kTWVzc2FnZUltcHJpbnQpO2lmKHRoaXMuZFNlcmlhbE51bWJlcj09bnVsbCl7dGhyb3dcInNlcmlhbE51bWJlciBzaGFsbCBiZSBzcGVjaWZpZWQuXCJ9ZS5wdXNoKHRoaXMuZFNlcmlhbE51bWJlcik7aWYodGhpcy5kR2VuVGltZT09bnVsbCl7dGhyb3dcImdlblRpbWUgc2hhbGwgYmUgc3BlY2lmaWVkLlwifWUucHVzaCh0aGlzLmRHZW5UaW1lKTtpZih0aGlzLmRBY2N1cmFjeSE9bnVsbCl7ZS5wdXNoKHRoaXMuZEFjY3VyYWN5KX1pZih0aGlzLmRPcmRlcmluZyE9bnVsbCl7ZS5wdXNoKHRoaXMuZE9yZGVyaW5nKX1pZih0aGlzLmROb25jZSE9bnVsbCl7ZS5wdXNoKHRoaXMuZE5vbmNlKX1pZih0aGlzLmRUc2EhPW51bGwpe2UucHVzaCh0aGlzLmRUc2EpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5wb2xpY3k9PVwic3RyaW5nXCIpe2lmKCFjLnBvbGljeS5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJwb2xpY3kgc2hhbGwgYmUgb2lkIGxpa2UgMC4xLjQuMTM0XCJ9dGhpcy5kUG9saWN5PW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDpjLnBvbGljeX0pfWlmKHR5cGVvZiBjLm1lc3NhZ2VJbXByaW50IT1cInVuZGVmaW5lZFwiKXt0aGlzLmRNZXNzYWdlSW1wcmludD1uZXcgYi5NZXNzYWdlSW1wcmludChjLm1lc3NhZ2VJbXByaW50KX1pZih0eXBlb2YgYy5zZXJpYWxOdW1iZXIhPVwidW5kZWZpbmVkXCIpe3RoaXMuZFNlcmlhbE51bWJlcj1uZXcgYS5ERVJJbnRlZ2VyKGMuc2VyaWFsTnVtYmVyKX1pZih0eXBlb2YgYy5nZW5UaW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLmRHZW5UaW1lPW5ldyBhLkRFUkdlbmVyYWxpemVkVGltZShjLmdlblRpbWUpfWlmKHR5cGVvZiBjLmFjY3VyYWN5IT1cInVuZGVmaW5kXCIpe3RoaXMuZEFjY3VyYWN5PW5ldyBiLkFjY3VyYWN5KGMuYWNjdXJhY3kpfWlmKHR5cGVvZiBjLm9yZGVyaW5nIT1cInVuZGVmaW5lZFwiJiZjLm9yZGVyaW5nPT10cnVlKXt0aGlzLmRPcmRlcmluZz1uZXcgYS5ERVJCb29sZWFuKCl9aWYodHlwZW9mIGMubm9uY2UhPVwidW5kZWZpbmVkXCIpe3RoaXMuZE5vbmNlPW5ldyBhLkRFUkludGVnZXIoYy5ub25jZSl9aWYodHlwZW9mIGMudHNhIT1cInVuZGVmaW5lZFwiKXt0aGlzLmRUc2E9bmV3IGQuWDUwME5hbWUoYy50c2EpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuVFNUSW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVzcC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kU3RhdHVzPW51bGw7dGhpcy5kVFNUPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kU3RhdHVzPT1udWxsKXt0aHJvd1wic3RhdHVzIHNoYWxsIGJlIHNwZWNpZmllZFwifXZhciBkPVt0aGlzLmRTdGF0dXNdO2lmKHRoaXMuZFRTVCE9bnVsbCl7ZC5wdXNoKHRoaXMuZFRTVCl9dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnN0YXR1cz09XCJvYmplY3RcIil7dGhpcy5kU3RhdHVzPW5ldyBiLlBLSVN0YXR1c0luZm8oYy5zdGF0dXMpfWlmKHR5cGVvZiBjLnRzdCE9XCJ1bmRlZmluZWRcIiYmYy50c3QgaW5zdGFuY2VvZiBLSlVSLmFzbjEuQVNOMU9iamVjdCl7dGhpcy5kVFNUPWMudHN0LmdldENvbnRlbnRJbmZvKCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1c0luZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXNJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRTdGF0dXM9bnVsbDt0aGlzLmRTdGF0dXNTdHJpbmc9bnVsbDt0aGlzLmRGYWlsdXJlSW5mbz1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZFN0YXR1cz09bnVsbCl7dGhyb3dcInN0YXR1cyBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZD1bdGhpcy5kU3RhdHVzXTtpZih0aGlzLmRTdGF0dXNTdHJpbmchPW51bGwpe2QucHVzaCh0aGlzLmRTdGF0dXNTdHJpbmcpfWlmKHRoaXMuZEZhaWx1cmVJbmZvIT1udWxsKXtkLnB1c2godGhpcy5kRmFpbHVyZUluZm8pfXZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5zdGF0dXM9PVwib2JqZWN0XCIpe3RoaXMuZFN0YXR1cz1uZXcgYi5QS0lTdGF0dXMoYy5zdGF0dXMpfWlmKHR5cGVvZiBjLnN0YXRzdHI9PVwib2JqZWN0XCIpe3RoaXMuZFN0YXR1c1N0cmluZz1uZXcgYi5QS0lGcmVlVGV4dCh7YXJyYXk6Yy5zdGF0c3RyfSl9aWYodHlwZW9mIGMuZmFpbGluZm89PVwib2JqZWN0XCIpe3RoaXMuZEZhaWx1cmVJbmZvPW5ldyBiLlBLSUZhaWx1cmVJbmZvKGMuZmFpbGluZm8pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJU3RhdHVzSW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXM9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3ZhciBkPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5oVExWPXRoaXMuZFN0YXR1cy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBlLm5hbWUhPVwidW5kZWZpbmVkXCIpe3ZhciBjPWIuUEtJU3RhdHVzLnZhbHVlTGlzdDtpZih0eXBlb2YgY1tlLm5hbWVdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wibmFtZSB1bmRlZmluZWQ6IFwiK2UubmFtZX10aGlzLmRTdGF0dXM9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjpjW2UubmFtZV19KX1lbHNle3RoaXMuZFN0YXR1cz1uZXcgYS5ERVJJbnRlZ2VyKGUpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJU3RhdHVzLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1cy52YWx1ZUxpc3Q9e2dyYW50ZWQ6MCxncmFudGVkV2l0aE1vZHM6MSxyZWplY3Rpb246Mix3YWl0aW5nOjMscmV2b2NhdGlvbldhcm5pbmc6NCxyZXZvY2F0aW9uTm90aWZpY2F0aW9uOjV9O0tKVVIuYXNuMS50c3AuUEtJRnJlZVRleHQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLnRzcC5QS0lGcmVlVGV4dC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3RoaXMudGV4dExpc3Q9W107dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9W107Zm9yKHZhciBlPTA7ZTx0aGlzLnRleHRMaXN0Lmxlbmd0aDtlKyspe2MucHVzaChuZXcgYS5ERVJVVEY4U3RyaW5nKHtzdHI6dGhpcy50ZXh0TGlzdFtlXX0pKX12YXIgZD1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6Y30pO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuYXJyYXk9PVwib2JqZWN0XCIpe3RoaXMudGV4dExpc3Q9Yi5hcnJheX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSUZyZWVUZXh0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3RoaXMudmFsdWU9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLnZhbHVlPT1udWxsKXt0aHJvd1widmFsdWUgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9dmFyIGU9bmV3IE51bWJlcih0aGlzLnZhbHVlKS50b1N0cmluZygyKTt2YXIgZj1uZXcgYS5ERVJCaXRTdHJpbmcoKTtmLnNldEJ5QmluYXJ5U3RyaW5nKGUpO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGQubmFtZT09XCJzdHJpbmdcIil7dmFyIGM9Yi5QS0lGYWlsdXJlSW5mby52YWx1ZUxpc3Q7aWYodHlwZW9mIGNbZC5uYW1lXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIm5hbWUgdW5kZWZpbmVkOiBcIitkLm5hbWV9dGhpcy52YWx1ZT1jW2QubmFtZV19ZWxzZXtpZih0eXBlb2YgZFtcImludFwiXT09XCJudW1iZXJcIil7dGhpcy52YWx1ZT1kW1wiaW50XCJdfX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvLnZhbHVlTGlzdD17YmFkQWxnOjAsYmFkUmVxdWVzdDoyLGJhZERhdGFGb3JtYXQ6NSx0aW1lTm90QXZhaWxhYmxlOjE0LHVuYWNjZXB0ZWRQb2xpY3k6MTUsdW5hY2NlcHRlZEV4dGVuc2lvbjoxNixhZGRJbmZvTm90QXZhaWxhYmxlOjE3LHN5c3RlbUZhaWx1cmU6MjV9O0tKVVIuYXNuMS50c3AuQWJzdHJhY3RUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dGhyb3dcIm5vdCBpbXBsZW1lbnRlZCB5ZXRcIn19O0tKVVIuYXNuMS50c3AuU2ltcGxlVFNBQWRhcHRlcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEudHNwLlNpbXBsZVRTQUFkYXB0ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMucGFyYW1zPW51bGw7dGhpcy5zZXJpYWw9MDt0aGlzLmdldFRTVEhleD1mdW5jdGlvbihjLGIpe3ZhciBlPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChjLGIpO3RoaXMucGFyYW1zLnRzdEluZm8ubWVzc2FnZUltcHJpbnQ9e2hhc2hBbGc6YixoYXNoVmFsdWU6ZX07dGhpcy5wYXJhbXMudHN0SW5mby5zZXJpYWxOdW1iZXI9e1wiaW50XCI6dGhpcy5zZXJpYWwrK307dmFyIGQ9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjEwMDAwMDAwMDApO3RoaXMucGFyYW1zLnRzdEluZm8ubm9uY2U9e1wiaW50XCI6ZH07dmFyIGY9S0pVUi5hc24xLnRzcC5UU1BVdGlsLm5ld1RpbWVTdGFtcFRva2VuKHRoaXMucGFyYW1zKTtyZXR1cm4gZi5nZXRDb250ZW50SW5mb0VuY29kZWRIZXgoKX07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe3RoaXMucGFyYW1zPWF9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlNpbXBsZVRTQUFkYXB0ZXIsS0pVUi5hc24xLnRzcC5BYnN0cmFjdFRTQUFkYXB0ZXIpO0tKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLnBhcmFtcz1udWxsO3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dmFyIGQ9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGMsYik7dGhpcy5wYXJhbXMudHN0SW5mby5tZXNzYWdlSW1wcmludD17aGFzaEFsZzpiLGhhc2hWYWx1ZTpkfTt2YXIgZT1LSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW4odGhpcy5wYXJhbXMpO3JldHVybiBlLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXJhbXM9YX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyLEtKVVIuYXNuMS50c3AuQWJzdHJhY3RUU0FBZGFwdGVyKTtLSlVSLmFzbjEudHNwLlRTUFV0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW49ZnVuY3Rpb24oYil7dmFyIGo9S0pVUi5hc24xLmNtczt2YXIgYT1LSlVSLmFzbjEudHNwO3ZhciBnPW5ldyBqLlNpZ25lZERhdGEoKTt2YXIgZT1uZXcgYS5UU1RJbmZvKGIudHN0SW5mbyk7dmFyIGY9ZS5nZXRFbmNvZGVkSGV4KCk7Zy5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VmFsdWUoe2hleDpmfSk7Zy5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VHlwZShcInRzdGluZm9cIik7aWYodHlwZW9mIGIuY2VydHM9PVwib2JqZWN0XCIpe2Zvcih2YXIgYz0wO2M8Yi5jZXJ0cy5sZW5ndGg7YysrKXtnLmFkZENlcnRpZmljYXRlc0J5UEVNKGIuY2VydHNbY10pfX12YXIgZD1nLnNpZ25lckluZm9MaXN0WzBdO2Quc2V0U2lnbmVySWRlbnRpZmllcihiLnNpZ25lckNlcnQpO2Quc2V0Rm9yQ29udGVudEFuZEhhc2goe3NkT2JqOmcsZWNpT2JqOmcuZEVuY2FwQ29udGVudEluZm8saGFzaEFsZzpiLmhhc2hBbGd9KTt2YXIgaD1uZXcgai5TaWduaW5nQ2VydGlmaWNhdGUoe2FycmF5OltiLnNpZ25lckNlcnRdfSk7ZC5kU2lnbmVkQXR0cnMuYWRkKGgpO2Quc2lnbihiLnNpZ25lclBydktleSxiLnNpZ0FsZyk7cmV0dXJuIGd9O0tKVVIuYXNuMS50c3AuVFNQVXRpbC5wYXJzZVRpbWVTdGFtcFJlcT1mdW5jdGlvbihkKXt2YXIgZj17fTtmLmNlcnRyZXE9ZmFsc2U7dmFyIGg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCwwKTtpZihoLmxlbmd0aDwyKXt0aHJvd1wiVGltZVN0YW1wUmVxIG11c3QgaGF2ZSBhdCBsZWFzdCAyIGl0ZW1zXCJ9dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGhbMV0pO2YubWk9S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlTWVzc2FnZUltcHJpbnQoYyk7Zm9yKHZhciBlPTI7ZTxoLmxlbmd0aDtlKyspe3ZhciBiPWhbZV07dmFyIGE9ZC5zdWJzdHIoYiwyKTtpZihhPT1cIjA2XCIpe3ZhciBnPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGQsYik7Zi5wb2xpY3k9QVNOMUhFWC5oZXh0b29pZHN0cihnKX1pZihhPT1cIjAyXCIpe2Yubm9uY2U9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZCxiKX1pZihhPT1cIjAxXCIpe2YuY2VydHJlcT10cnVlfX1yZXR1cm4gZn07S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlTWVzc2FnZUltcHJpbnQ9ZnVuY3Rpb24oYyl7dmFyIGg9e307aWYoYy5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wiaGVhZCBvZiBtZXNzYWdlSW1wcmludCBoZXggc2hhbGwgYmUgJzMwJ1wifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7dmFyIGk9QVNOMUhFWC5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChjLDAsWzAsMF0pO3ZhciBkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsaSk7dmFyIGU9QVNOMUhFWC5oZXh0b29pZHN0cihkKTt2YXIgZz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoZSk7aWYoZz09XCJcIil7dGhyb3dcImhhc2hBbGcgbmFtZSB1bmRlZmluZWQ6IFwiK2V9dmFyIGI9Zzt2YXIgZj1BU04xSEVYLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGMsMCxbMV0pO2guaGFzaEFsZz1iO2guaGFzaFZhbHVlPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsZik7cmV0dXJuIGh9O1xuLyohIGFzbjFjYWRlcy0xLjAuMC5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS5jYWRlcz09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jYWRlcyl7S0pVUi5hc24xLmNhZGVzPXt9fUtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyPWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTVcIjt2YXIgYj1LSlVSLmFzbjE7dmFyIGQ9S0pVUi5hc24xLmNhZGVzO2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5vaWQ9PVwic3RyaW5nXCImJnR5cGVvZiBlLmhhc2g9PVwib2JqZWN0XCIpe3ZhciBmPW5ldyBiLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDplLm9pZH0pO3ZhciBhPW5ldyBkLk90aGVySGFzaEFsZ0FuZFZhbHVlKGUuaGFzaCk7dmFyIGM9bmV3IGIuREVSU2VxdWVuY2Uoe2FycmF5OltmLGFdfSk7dGhpcy52YWx1ZUxpc3Q9W2NdfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoQWxnQW5kVmFsdWU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaEFsZ0FuZFZhbHVlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLng1MDk7dGhpcy5kQWxnPW51bGw7dGhpcy5kSGFzaD1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kQWxnLHRoaXMuZEhhc2hdfSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5hbGc9PVwic3RyaW5nXCImJnR5cGVvZiBiLmhhc2g9PVwic3RyaW5nXCIpe3RoaXMuZEFsZz1uZXcgYy5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmIuYWxnfSk7dGhpcy5kSGFzaD1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OmIuaGFzaH0pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2hBbGdBbmRWYWx1ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVRpbWVTdGFtcD1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTRcIjt0aGlzLnRzdEhleD1udWxsO3ZhciBhPUtKVVIuYXNuMTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMucmVzIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5yZXM9PVwic3RyaW5nXCImJmMucmVzLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt9ZWxzZXtpZihjLnJlcyBpbnN0YW5jZW9mIEtKVVIuYXNuMS5BU04xT2JqZWN0KXt9ZWxzZXt0aHJvd1wicmVzIHBhcmFtIHNoYWxsIGJlIEFTTjFPYmplY3Qgb3IgaGV4IHN0cmluZ1wifX19aWYodHlwZW9mIGMudHN0IT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy50c3Q9PVwic3RyaW5nXCImJmMudHN0Lm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt2YXIgYj1uZXcgYS5BU04xT2JqZWN0KCk7dGhpcy50c3RIZXg9Yy50c3Q7Yi5oVExWPXRoaXMudHN0SGV4O2IuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtiXX1lbHNle2lmKGMudHN0IGluc3RhbmNlb2YgS0pVUi5hc24xLkFTTjFPYmplY3Qpe31lbHNle3Rocm93XCJ0c3QgcGFyYW0gc2hhbGwgYmUgQVNOMU9iamVjdCBvciBoZXggc3RyaW5nXCJ9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuQ29tcGxldGVDZXJ0aWZpY2F0ZVJlZnM9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNhZGVzLkNvbXBsZXRlQ2VydGlmaWNhdGVSZWZzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMjFcIjt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNhZGVzO3RoaXMuc2V0QnlBcnJheT1mdW5jdGlvbihkKXt0aGlzLnZhbHVlTGlzdD1bXTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9bmV3IGIuT3RoZXJDZXJ0SUQoZFtlXSk7dGhpcy52YWx1ZUxpc3QucHVzaChmKX19O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJvYmplY3RcIiYmdHlwZW9mIGMubGVuZ3RoPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5QXJyYXkoYyl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLkNvbXBsZXRlQ2VydGlmaWNhdGVSZWZzLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQ9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLmNhZGVzLk90aGVyQ2VydElELnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLmNtczt2YXIgYj1LSlVSLmFzbjEuY2FkZXM7dGhpcy5oYXNJc3N1ZXJTZXJpYWw9dHJ1ZTt0aGlzLmRPdGhlckNlcnRIYXNoPW51bGw7dGhpcy5kSXNzdWVyU2VyaWFsPW51bGw7dGhpcy5zZXRCeUNlcnRQRU09ZnVuY3Rpb24oZSl7dGhpcy5kT3RoZXJDZXJ0SGFzaD1uZXcgYi5PdGhlckhhc2goZSk7aWYodGhpcy5oYXNJc3N1ZXJTZXJpYWwpe3RoaXMuZElzc3VlclNlcmlhbD1uZXcgYy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoZSl9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmhUTFYhPW51bGwpe3JldHVybiB0aGlzLmhUTFZ9aWYodGhpcy5kT3RoZXJDZXJ0SGFzaD09bnVsbCl7dGhyb3dcIm90aGVyQ2VydEhhc2ggbm90IHNldFwifXZhciBlPVt0aGlzLmRPdGhlckNlcnRIYXNoXTtpZih0aGlzLmRJc3N1ZXJTZXJpYWwhPW51bGwpe2UucHVzaCh0aGlzLmRJc3N1ZXJTZXJpYWwpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZD09XCJzdHJpbmdcIiYmZC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0aGlzLnNldEJ5Q2VydFBFTShkKX1pZih0eXBlb2YgZD09XCJvYmplY3RcIil7aWYoZC5oYXNpcz09PWZhbHNlKXt0aGlzLmhhc0lzc3VlclNlcmlhbD1mYWxzZX1pZih0eXBlb2YgZC5jZXJ0PT1cInN0cmluZ1wiKXt0aGlzLnNldEJ5Q2VydFBFTShkLmNlcnQpfX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2g9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jYWRlczt0aGlzLmFsZz1cInNoYTI1NlwiO3RoaXMuZE90aGVySGFzaD1udWxsO3RoaXMuc2V0QnlDZXJ0UEVNPWZ1bmN0aW9uKGQpe2lmKGQuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpPT0tMSl7dGhyb3dcImNlcnRQRU0gbm90IHRvIHNlZW0gUEVNIGZvcm1hdFwifXZhciBlPVg1MDkucGVtVG9IZXgoZCk7dmFyIGY9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGUsdGhpcy5hbGcpO3RoaXMuZE90aGVySGFzaD1uZXcgYi5PdGhlckhhc2hBbGdBbmRWYWx1ZSh7YWxnOnRoaXMuYWxnLGhhc2g6Zn0pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRPdGhlckhhc2g9PW51bGwpe3Rocm93XCJPdGhlckhhc2ggbm90IHNldFwifXJldHVybiB0aGlzLmRPdGhlckhhc2guZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwic3RyaW5nXCIpe2lmKGMuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7dGhpcy5zZXRCeUNlcnRQRU0oYyl9ZWxzZXtpZihjLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt0aGlzLmRPdGhlckhhc2g9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpjfSl9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgc3RyaW5nIHZhbHVlIGZvciBwYXJhbXNcIn19fWVsc2V7aWYodHlwZW9mIGM9PVwib2JqZWN0XCIpe2lmKHR5cGVvZiBjLmNlcnQ9PVwic3RyaW5nXCIpe2lmKHR5cGVvZiBjLmFsZz09XCJzdHJpbmdcIil7dGhpcy5hbGc9Yy5hbGd9dGhpcy5zZXRCeUNlcnRQRU0oYy5jZXJ0KX1lbHNle3RoaXMuZE90aGVySGFzaD1uZXcgYi5PdGhlckhhc2hBbGdBbmRWYWx1ZShjKX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2gsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsLmFkZFNpZ1RTPWZ1bmN0aW9uKGMsYixhKXt9O0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWwucGFyc2VTaWduZWREYXRhRm9yQWRkaW5nVW5zaWduZWQ9ZnVuY3Rpb24oZCl7dmFyIHE9S0pVUi5hc24xO3ZhciBwPUtKVVIuYXNuMS5jbXM7dmFyIGM9S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbDt2YXIgYT17fTtpZihBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdChkLDAsWzBdKSE9XCIwNjA5MmE4NjQ4ODZmNzBkMDEwNzAyXCIpe3Rocm93XCJoZXggaXMgbm90IENNUyBTaWduZWREYXRhXCJ9dmFyIHM9QVNOMUhFWC5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChkLDAsWzEsMF0pO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQscyk7aWYoYi5sZW5ndGg8NCl7dGhyb3dcIm51bSBvZiBTaWduZWREYXRhIGVsZW0gc2hhbGwgYmUgNCBhdCBsZWFzdFwifXZhciBmPWIuc2hpZnQoKTthLnZlcnNpb249QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGYpO3ZhciBsPWIuc2hpZnQoKTthLmFsZ3M9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGwpO3ZhciBtPWIuc2hpZnQoKTthLmVuY2FwY29udGVudD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbSk7YS5jZXJ0cz1udWxsO2EucmV2cz1udWxsO2Euc2k9W107dmFyIG49Yi5zaGlmdCgpO2lmKGQuc3Vic3RyKG4sMik9PVwiYTBcIil7YS5jZXJ0cz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbik7bj1iLnNoaWZ0KCl9aWYoZC5zdWJzdHIobiwyKT09XCJhMVwiKXthLnJldnM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLG4pO249Yi5zaGlmdCgpfXZhciBrPW47aWYoZC5zdWJzdHIoaywyKSE9XCIzMVwiKXt0aHJvd1wiQ2FuJ3QgZmluZCBzaWduZXJJbmZvc1wifXZhciBqPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsayk7Zm9yKHZhciBoPTA7aDxqLmxlbmd0aDtoKyspe3ZhciBvPWpbaF07dmFyIGU9Yy5wYXJzZVNpZ25lckluZm9Gb3JBZGRpbmdVbnNpZ25lZChkLG8saCk7YS5zaVtoXT1lfXZhciBnPW51bGw7YS5vYmo9bmV3IHAuU2lnbmVkRGF0YSgpO2c9bmV3IHEuQVNOMU9iamVjdCgpO2cuaFRMVj1hLnZlcnNpb247YS5vYmouZENNU1ZlcnNpb249ZztnPW5ldyBxLkFTTjFPYmplY3QoKTtnLmhUTFY9YS5hbGdzO2Eub2JqLmREaWdlc3RBbGdzPWc7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEuZW5jYXBjb250ZW50O2Eub2JqLmRFbmNhcENvbnRlbnRJbmZvPWc7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEuY2VydHM7YS5vYmouZENlcnRzPWc7YS5vYmouc2lnbmVySW5mb0xpc3Q9W107Zm9yKHZhciBoPTA7aDxhLnNpLmxlbmd0aDtoKyspe2Eub2JqLnNpZ25lckluZm9MaXN0LnB1c2goYS5zaVtoXS5vYmopfXJldHVybiBhfTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsLnBhcnNlU2lnbmVySW5mb0ZvckFkZGluZ1Vuc2lnbmVkPWZ1bmN0aW9uKGQsayxhKXt2YXIgbT1LSlVSLmFzbjE7dmFyIGw9S0pVUi5hc24xLmNtczt2YXIgYj17fTt2YXIgZT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLGspO2lmKGUubGVuZ3RoIT02KXt0aHJvd1wibm90IHN1cHBvcnRlZCBpdGVtcyBmb3IgU2lnbmVySW5mbyAoIT02KVwifXZhciBmPWUuc2hpZnQoKTtiLnZlcnNpb249QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGYpO3ZhciBuPWUuc2hpZnQoKTtiLnNpPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxuKTt2YXIgaD1lLnNoaWZ0KCk7Yi5kaWdhbGc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGgpO3ZhciBjPWUuc2hpZnQoKTtiLnNhdHRycz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsYyk7dmFyIGk9ZS5zaGlmdCgpO2Iuc2lnYWxnPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxpKTt2YXIgaj1lLnNoaWZ0KCk7Yi5zaWc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGopO2Iuc2lndmFsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGQsaik7dmFyIGc9bnVsbDtiLm9iaj1uZXcgbC5TaWduZXJJbmZvKCk7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIudmVyc2lvbjtiLm9iai5kQ01TVmVyc2lvbj1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnNpO2Iub2JqLmRTaWduZXJJZGVudGlmaWVyPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuZGlnYWxnO2Iub2JqLmREaWdlc3RBbGdvcml0aG09ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zYXR0cnM7Yi5vYmouZFNpZ25lZEF0dHJzPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuc2lnYWxnO2Iub2JqLmRTaWdBbGc9ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zaWc7Yi5vYmouZFNpZz1nO2Iub2JqLmRVbnNpZ25lZEF0dHJzPW5ldyBsLkF0dHJpYnV0ZUxpc3QoKTtyZXR1cm4gYn07XG4vKiEgYXNuMWNzci0xLjAuMC5qcyAoYykgMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUi5hc24xLmNzcj09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jc3Ipe0tKVVIuYXNuMS5jc3I9e319S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdD1mdW5jdGlvbihmKXtLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBkPW51bGw7dmFyIGU9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dGhpcy5zaWduPWZ1bmN0aW9uKGksaCl7aWYodGhpcy5wcnZLZXk9PW51bGwpe3RoaXMucHJ2S2V5PWh9dGhpcy5hc24xU2lnbmF0dXJlQWxnPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOml9KTtzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOml9KTtzaWcuaW5pdFNpZ24odGhpcy5wcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xQ1NSSW5mby5nZXRFbmNvZGVkSGV4KCkpO3RoaXMuaGV4U2lnPXNpZy5zaWduKCk7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMUNTUkluZm8sdGhpcy5hc24xU2lnbmF0dXJlQWxnLHRoaXMuYXNuMVNpZ119KTt0aGlzLmhUTFY9Zy5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBnPUtKVVIuYXNuMS5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KHRoaXMuZ2V0RW5jb2RlZEhleCgpLFwiQ0VSVElGSUNBVEUgUkVRVUVTVFwiKTtyZXR1cm4gZ307dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTtpZih0eXBlb2YgZiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGYuY3NyaW5mbyE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xQ1NSSW5mbz1mLmNzcmluZm99fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm89ZnVuY3Rpb24oYSl7S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFWZXJzaW9uPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dGhpcy5hc24xU3ViamVjdD1udWxsO3RoaXMuYXNuMVN1YmpQS2V5PW51bGw7dGhpcy5leHRlbnNpb25zQXJyYXk9bmV3IEFycmF5KCl9O3RoaXMuc2V0U3ViamVjdEJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU3ViamVjdD1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5PWZ1bmN0aW9uKGMpe3ZhciBiPUtFWVVUSUwuZ2V0S2V5KGMpO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhiKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFWZXJzaW9uKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmplY3QpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU3VialBLZXkpO3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuZXh0ZW5zaW9uc0FycmF5fSk7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OmZhbHNlLHRhZzpcImEwXCIsb2JqOmN9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGIpO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplKCl9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY3NyLkNTUlV0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY3NyLkNTUlV0aWwubmV3Q1NSUEVNPWZ1bmN0aW9uKGYpe3ZhciBjPUtKVVIuYXNuMS5jc3I7aWYoZi5zdWJqZWN0PT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHN1YmplY3QgdW5kZWZpbmVkXCJ9aWYoZi5zYmpwdWJrZXk9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbWV0ZXIgc2JqcHVia2V5IHVuZGVmaW5lZFwifWlmKGYuc2lnYWxnPT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHNpZ2FsZyB1bmRlZmluZWRcIn1pZihmLnNianBydmtleT09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtZXRlciBzYmpwdWJrZXkgdW5kZWZpbmVkXCJ9dmFyIGI9bmV3IGMuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvKCk7Yi5zZXRTdWJqZWN0QnlQYXJhbShmLnN1YmplY3QpO2Iuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5KGYuc2JqcHVia2V5KTt2YXIgZD1uZXcgYy5DZXJ0aWZpY2F0aW9uUmVxdWVzdCh7Y3NyaW5mbzpifSk7dmFyIGE9S0VZVVRJTC5nZXRLZXkoZi5zYmpwcnZrZXkpO2Quc2lnbihmLnNpZ2FsZyxhKTt2YXIgZT1kLmdldFBFTVN0cmluZygpO3JldHVybiBlfTtcbi8qISBiYXNlNjR4LTEuMS43IChjKSAyMDEyLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIEtKVVI7aWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmxhbmc9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmxhbmcpe0tKVVIubGFuZz17fX1LSlVSLmxhbmcuU3RyaW5nPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBCYXNlNjR4KCl7fWZ1bmN0aW9uIHN0b0JBKGQpe3ZhciBiPW5ldyBBcnJheSgpO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXtiW2NdPWQuY2hhckNvZGVBdChjKX1yZXR1cm4gYn1mdW5jdGlvbiBCQXRvcyhiKXt2YXIgZD1cIlwiO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWQrU3RyaW5nLmZyb21DaGFyQ29kZShiW2NdKX1yZXR1cm4gZH1mdW5jdGlvbiBCQXRvaGV4KGIpe3ZhciBlPVwiXCI7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBjPWJbZF0udG9TdHJpbmcoMTYpO2lmKGMubGVuZ3RoPT0xKXtjPVwiMFwiK2N9ZT1lK2N9cmV0dXJuIGV9ZnVuY3Rpb24gc3RvaGV4KGEpe3JldHVybiBCQXRvaGV4KHN0b0JBKGEpKX1mdW5jdGlvbiBzdG9iNjQoYSl7cmV0dXJuIGhleDJiNjQoc3RvaGV4KGEpKX1mdW5jdGlvbiBzdG9iNjR1KGEpe3JldHVybiBiNjR0b2I2NHUoaGV4MmI2NChzdG9oZXgoYSkpKX1mdW5jdGlvbiBiNjR1dG9zKGEpe3JldHVybiBCQXRvcyhiNjR0b0JBKGI2NHV0b2I2NChhKSkpfWZ1bmN0aW9uIGI2NHRvYjY0dShhKXthPWEucmVwbGFjZSgvXFw9L2csXCJcIik7YT1hLnJlcGxhY2UoL1xcKy9nLFwiLVwiKTthPWEucmVwbGFjZSgvXFwvL2csXCJfXCIpO3JldHVybiBhfWZ1bmN0aW9uIGI2NHV0b2I2NChhKXtpZihhLmxlbmd0aCU0PT0yKXthPWErXCI9PVwifWVsc2V7aWYoYS5sZW5ndGglND09Myl7YT1hK1wiPVwifX1hPWEucmVwbGFjZSgvLS9nLFwiK1wiKTthPWEucmVwbGFjZSgvXy9nLFwiL1wiKTtyZXR1cm4gYX1mdW5jdGlvbiBoZXh0b2I2NHUoYSl7aWYoYS5sZW5ndGglMj09MSl7YT1cIjBcIithfXJldHVybiBiNjR0b2I2NHUoaGV4MmI2NChhKSl9ZnVuY3Rpb24gYjY0dXRvaGV4KGEpe3JldHVybiBiNjR0b2hleChiNjR1dG9iNjQoYSkpfXZhciB1dGY4dG9iNjR1LGI2NHV0b3V0Zjg7aWYodHlwZW9mIEJ1ZmZlcj09PVwiZnVuY3Rpb25cIil7dXRmOHRvYjY0dT1mdW5jdGlvbihhKXtyZXR1cm4gYjY0dG9iNjR1KG5ldyBCdWZmZXIoYSxcInV0ZjhcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpfTtiNjR1dG91dGY4PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgQnVmZmVyKGI2NHV0b2I2NChhKSxcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIil9fWVsc2V7dXRmOHRvYjY0dT1mdW5jdGlvbihhKXtyZXR1cm4gaGV4dG9iNjR1KHVyaWNtcHRvaGV4KGVuY29kZVVSSUNvbXBvbmVudEFsbChhKSkpfTtiNjR1dG91dGY4PWZ1bmN0aW9uKGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYjY0dXRvaGV4KGEpKSl9fWZ1bmN0aW9uIHV0Zjh0b2I2NChhKXtyZXR1cm4gaGV4MmI2NCh1cmljbXB0b2hleChlbmNvZGVVUklDb21wb25lbnRBbGwoYSkpKX1mdW5jdGlvbiBiNjR0b3V0ZjgoYSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChoZXh0b3VyaWNtcChiNjR0b2hleChhKSkpfWZ1bmN0aW9uIHV0Zjh0b2hleChhKXtyZXR1cm4gdXJpY21wdG9oZXgoZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpKX1mdW5jdGlvbiBoZXh0b3V0ZjgoYSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChoZXh0b3VyaWNtcChhKSl9ZnVuY3Rpb24gaGV4dG9yc3RyKGMpe3ZhciBiPVwiXCI7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aC0xO2ErPTIpe2IrPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoYy5zdWJzdHIoYSwyKSwxNikpfXJldHVybiBifWZ1bmN0aW9uIHJzdHJ0b2hleChjKXt2YXIgYT1cIlwiO2Zvcih2YXIgYj0wO2I8Yy5sZW5ndGg7YisrKXthKz0oXCIwXCIrYy5jaGFyQ29kZUF0KGIpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfXJldHVybiBhfWZ1bmN0aW9uIGhleHRvYjY0KGEpe3JldHVybiBoZXgyYjY0KGEpfWZ1bmN0aW9uIGhleHRvYjY0bmwoYil7dmFyIGE9aGV4dG9iNjQoYik7dmFyIGM9YS5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtjPWMucmVwbGFjZSgvXFxyXFxuJC8sXCJcIik7cmV0dXJuIGN9ZnVuY3Rpb24gYjY0bmx0b2hleChiKXt2YXIgYT1iLnJlcGxhY2UoL1teMC05QS1aYS16XFwvKz1dKi9nLFwiXCIpO3ZhciBjPWI2NHRvaGV4KGEpO3JldHVybiBjfWZ1bmN0aW9uIHVyaWNtcHRvaGV4KGEpe3JldHVybiBhLnJlcGxhY2UoLyUvZyxcIlwiKX1mdW5jdGlvbiBoZXh0b3VyaWNtcChhKXtyZXR1cm4gYS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIil9ZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpe3ZhciBkPWVuY29kZVVSSUNvbXBvbmVudChhKTt2YXIgYj1cIlwiO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXtpZihkW2NdPT1cIiVcIil7Yj1iK2Quc3Vic3RyKGMsMyk7Yz1jKzJ9ZWxzZXtiPWIrXCIlXCIrc3RvaGV4KGRbY10pfX1yZXR1cm4gYn1mdW5jdGlvbiBuZXdsaW5lX3RvVW5peChhKXthPWEucmVwbGFjZSgvXFxyXFxuL21nLFwiXFxuXCIpO3JldHVybiBhfWZ1bmN0aW9uIG5ld2xpbmVfdG9Eb3MoYSl7YT1hLnJlcGxhY2UoL1xcclxcbi9tZyxcIlxcblwiKTthPWEucmVwbGFjZSgvXFxuL21nLFwiXFxyXFxuXCIpO3JldHVybiBhfUtKVVIubGFuZy5TdHJpbmcuaXNJbnRlZ2VyPWZ1bmN0aW9uKGEpe2lmKGEubWF0Y2goL15bMC05XSskLykpe3JldHVybiB0cnVlfWVsc2V7aWYoYS5tYXRjaCgvXi1bMC05XSskLykpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX19O0tKVVIubGFuZy5TdHJpbmcuaXNIZXg9ZnVuY3Rpb24oYSl7aWYoYS5sZW5ndGglMj09MCYmKGEubWF0Y2goL15bMC05YS1mXSskLyl8fGEubWF0Y2goL15bMC05QS1GXSskLykpKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19O0tKVVIubGFuZy5TdHJpbmcuaXNCYXNlNjQ9ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoL1xccysvZyxcIlwiKTtpZihhLm1hdGNoKC9eWzAtOUEtWmEteitcXC9dKz17MCwzfSQvKSYmYS5sZW5ndGglND09MCl7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gZmFsc2V9fTtLSlVSLmxhbmcuU3RyaW5nLmlzQmFzZTY0VVJMPWZ1bmN0aW9uKGEpe2lmKGEubWF0Y2goL1srLz1dLykpe3JldHVybiBmYWxzZX1hPWI2NHV0b2I2NChhKTtyZXR1cm4gS0pVUi5sYW5nLlN0cmluZy5pc0Jhc2U2NChhKX07S0pVUi5sYW5nLlN0cmluZy5pc0ludGVnZXJBcnJheT1mdW5jdGlvbihhKXthPWEucmVwbGFjZSgvXFxzKy9nLFwiXCIpO2lmKGEubWF0Y2goL15cXFtbMC05LF0rXFxdJC8pKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBmYWxzZX19O2Z1bmN0aW9uIGludGFyeXN0cnRvaGV4KGIpe2I9Yi5yZXBsYWNlKC9eXFxzKlxcW1xccyovLFwiXCIpO2I9Yi5yZXBsYWNlKC9cXHMqXFxdXFxzKiQvLFwiXCIpO2I9Yi5yZXBsYWNlKC9cXHMqL2csXCJcIik7dHJ5e3ZhciBjPWIuc3BsaXQoLywvKS5tYXAoZnVuY3Rpb24oZyxlLGgpe3ZhciBmPXBhcnNlSW50KGcpO2lmKGY8MHx8MjU1PGYpe3Rocm93XCJpbnRlZ2VyIG5vdCBpbiByYW5nZSAwLTI1NVwifXZhciBkPShcIjAwXCIrZi50b1N0cmluZygxNikpLnNsaWNlKC0yKTtyZXR1cm4gZH0pLmpvaW4oXCJcIik7cmV0dXJuIGN9Y2F0Y2goYSl7dGhyb3dcIm1hbGZvcm1lZCBpbnRlZ2VyIGFycmF5IHN0cmluZzogXCIrYX19dmFyIHN0cmRpZmZpZHg9ZnVuY3Rpb24oYyxhKXt2YXIgZD1jLmxlbmd0aDtpZihjLmxlbmd0aD5hLmxlbmd0aCl7ZD1hLmxlbmd0aH1mb3IodmFyIGI9MDtiPGQ7YisrKXtpZihjLmNoYXJDb2RlQXQoYikhPWEuY2hhckNvZGVBdChiKSl7cmV0dXJuIGJ9fWlmKGMubGVuZ3RoIT1hLmxlbmd0aCl7cmV0dXJuIGR9cmV0dXJuIC0xfTtcbi8qISBjcnlwdG8tMS4xLjguanMgKGMpIDIwMTMtMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLlV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5ESUdFU1RJTkZPSEVBRD17c2hhMTpcIjMwMjEzMDA5MDYwNTJiMGUwMzAyMWEwNTAwMDQxNFwiLHNoYTIyNDpcIjMwMmQzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwNDA1MDAwNDFjXCIsc2hhMjU2OlwiMzAzMTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAxMDUwMDA0MjBcIixzaGEzODQ6XCIzMDQxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDIwNTAwMDQzMFwiLHNoYTUxMjpcIjMwNTEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMzA1MDAwNDQwXCIsbWQyOlwiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwMjA1MDAwNDEwXCIsbWQ1OlwiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwNTA1MDAwNDEwXCIscmlwZW1kMTYwOlwiMzAyMTMwMDkwNjA1MmIyNDAzMDIwMTA1MDAwNDE0XCIsfTt0aGlzLkRFRkFVTFRQUk9WSURFUj17bWQ1OlwiY3J5cHRvanNcIixzaGExOlwiY3J5cHRvanNcIixzaGEyMjQ6XCJjcnlwdG9qc1wiLHNoYTI1NjpcImNyeXB0b2pzXCIsc2hhMzg0OlwiY3J5cHRvanNcIixzaGE1MTI6XCJjcnlwdG9qc1wiLHJpcGVtZDE2MDpcImNyeXB0b2pzXCIsaG1hY21kNTpcImNyeXB0b2pzXCIsaG1hY3NoYTE6XCJjcnlwdG9qc1wiLGhtYWNzaGEyMjQ6XCJjcnlwdG9qc1wiLGhtYWNzaGEyNTY6XCJjcnlwdG9qc1wiLGhtYWNzaGEzODQ6XCJjcnlwdG9qc1wiLGhtYWNzaGE1MTI6XCJjcnlwdG9qc1wiLGhtYWNyaXBlbWQxNjA6XCJjcnlwdG9qc1wiLE1ENXdpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyNTZ3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixSSVBFTUQxNjB3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixNRDV3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTUxMndpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsTUQ1d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBNTEyd2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFJJUEVNRDE2MHdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIix9O3RoaXMuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRT17bWQ1OkNyeXB0b0pTLmFsZ28uTUQ1LHNoYTE6Q3J5cHRvSlMuYWxnby5TSEExLHNoYTIyNDpDcnlwdG9KUy5hbGdvLlNIQTIyNCxzaGEyNTY6Q3J5cHRvSlMuYWxnby5TSEEyNTYsc2hhMzg0OkNyeXB0b0pTLmFsZ28uU0hBMzg0LHNoYTUxMjpDcnlwdG9KUy5hbGdvLlNIQTUxMixyaXBlbWQxNjA6Q3J5cHRvSlMuYWxnby5SSVBFTUQxNjB9O3RoaXMuZ2V0RGlnZXN0SW5mb0hleD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiB0aGlzLkRJR0VTVElORk9IRUFEW2JdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiYWxnIG5vdCBzdXBwb3J0ZWQgaW4gVXRpbC5ESUdFU1RJTkZPSEVBRDogXCIrYn1yZXR1cm4gdGhpcy5ESUdFU1RJTkZPSEVBRFtiXSthfTt0aGlzLmdldFBhZGRlZERpZ2VzdEluZm9IZXg9ZnVuY3Rpb24oaCxhLGope3ZhciBjPXRoaXMuZ2V0RGlnZXN0SW5mb0hleChoLGEpO3ZhciBkPWovNDtpZihjLmxlbmd0aCsyMj5kKXt0aHJvd1wia2V5IGlzIHRvbyBzaG9ydCBmb3IgU2lnQWxnOiBrZXlsZW49XCIraitcIixcIithfXZhciBiPVwiMDAwMVwiO3ZhciBrPVwiMDBcIitjO3ZhciBnPVwiXCI7dmFyIGw9ZC1iLmxlbmd0aC1rLmxlbmd0aDtmb3IodmFyIGY9MDtmPGw7Zis9Mil7Zys9XCJmZlwifXZhciBlPWIrZytrO3JldHVybiBlfTt0aGlzLmhhc2hTdHJpbmc9ZnVuY3Rpb24oYSxjKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOmN9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuaGFzaEhleD1mdW5jdGlvbihiLGMpe3ZhciBhPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6Y30pO3JldHVybiBhLmRpZ2VzdEhleChiKX07dGhpcy5zaGExPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGExXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhMjU2PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGEyNTZcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5zaGEyNTZIZXg9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTI1NlwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0SGV4KGEpfTt0aGlzLnNoYTUxMj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhNTEyXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhNTEySGV4PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGE1MTJcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdEhleChhKX07dGhpcy5tZDU9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcIm1kNVwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnJpcGVtZDE2MD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwicmlwZW1kMTYwXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuZ2V0Q3J5cHRvSlNNREJ5TmFtZT1mdW5jdGlvbihhKXt9fTtLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0PWZ1bmN0aW9uKGMpe3ZhciBiPW51bGw7dmFyIGE9bnVsbDt2YXIgZD1udWxsO3RoaXMuc2V0QWxnQW5kUHJvdmlkZXI9ZnVuY3Rpb24oZyxmKXtpZihnIT1udWxsJiZmPT09dW5kZWZpbmVkKXtmPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW2ddfWlmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZihnKSE9LTEmJmY9PVwiY3J5cHRvanNcIil7dHJ5e3RoaXMubWQ9S0pVUi5jcnlwdG8uVXRpbC5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FW2ddLmNyZWF0ZSgpfWNhdGNoKGUpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBhbGc9XCIrZytcIi9cIitlfXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihoKXt2YXIgaT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGgpO3RoaXMubWQudXBkYXRlKGkpfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBoPXRoaXMubWQuZmluYWxpemUoKTtyZXR1cm4gaC50b1N0cmluZyhDcnlwdG9KUy5lbmMuSGV4KX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVTdHJpbmcoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9O3RoaXMuZGlnZXN0SGV4PWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlSGV4KGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfX1pZihcIjpzaGEyNTY6XCIuaW5kZXhPZihnKSE9LTEmJmY9PVwic2pjbFwiKXt0cnl7dGhpcy5tZD1uZXcgc2pjbC5oYXNoLnNoYTI1NigpfWNhdGNoKGUpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBhbGc9XCIrZytcIi9cIitlfXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihpKXt2YXIgaD1zamNsLmNvZGVjLmhleC50b0JpdHMoaSk7dGhpcy5tZC51cGRhdGUoaCl9O3RoaXMuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5tZC5maW5hbGl6ZSgpO3JldHVybiBzamNsLmNvZGVjLmhleC5mcm9tQml0cyhoKX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVTdHJpbmcoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9O3RoaXMuZGlnZXN0SGV4PWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlSGV4KGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfX19O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGUpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oZSl7dGhyb3dcInVwZGF0ZUhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3Rocm93XCJkaWdlc3QoKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oZSl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihlKXt0aHJvd1wiZGlnZXN0SGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O2lmKGMhPT11bmRlZmluZWQpe2lmKGMuYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9Yy5hbGc7aWYoYy5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19dGhpcy5zZXRBbGdBbmRQcm92aWRlcih0aGlzLmFsZ05hbWUsdGhpcy5wcm92TmFtZSl9fX07S0pVUi5jcnlwdG8uTWFjPWZ1bmN0aW9uKGQpe3ZhciBmPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKGssaSl7az1rLnRvTG93ZXJDYXNlKCk7aWYoaz09bnVsbCl7az1cImhtYWNzaGExXCJ9az1rLnRvTG93ZXJDYXNlKCk7aWYoay5zdWJzdHIoMCw0KSE9XCJobWFjXCIpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciB1bnN1cHBvcnRlZCBITUFDIGFsZzogXCIra31pZihpPT09dW5kZWZpbmVkKXtpPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW2tdfXRoaXMuYWxnUHJvdj1rK1wiL1wiK2k7dmFyIGc9ay5zdWJzdHIoNCk7aWYoXCI6bWQ1OnNoYTE6c2hhMjI0OnNoYTI1NjpzaGEzODQ6c2hhNTEyOnJpcGVtZDE2MDpcIi5pbmRleE9mKGcpIT0tMSYmaT09XCJjcnlwdG9qc1wiKXt0cnl7dmFyIGo9S0pVUi5jcnlwdG8uVXRpbC5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FW2ddO3RoaXMubWFjPUNyeXB0b0pTLmFsZ28uSE1BQy5jcmVhdGUoaix0aGlzLnBhc3MpfWNhdGNoKGgpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBoYXNoQWxnPVwiK2crXCIvXCIraH10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihsKXt0aGlzLm1hYy51cGRhdGUobCl9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGwpe3ZhciBtPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UobCk7dGhpcy5tYWMudXBkYXRlKG0pfTt0aGlzLmRvRmluYWw9ZnVuY3Rpb24oKXt2YXIgbD10aGlzLm1hYy5maW5hbGl6ZSgpO3JldHVybiBsLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5IZXgpfTt0aGlzLmRvRmluYWxTdHJpbmc9ZnVuY3Rpb24obCl7dGhpcy51cGRhdGVTdHJpbmcobCk7cmV0dXJuIHRoaXMuZG9GaW5hbCgpfTt0aGlzLmRvRmluYWxIZXg9ZnVuY3Rpb24obCl7dGhpcy51cGRhdGVIZXgobCk7cmV0dXJuIHRoaXMuZG9GaW5hbCgpfX19O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGcpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGcpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbD1mdW5jdGlvbigpe3Rocm93XCJkaWdlc3QoKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbFN0cmluZz1mdW5jdGlvbihnKXt0aHJvd1wiZGlnZXN0U3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWxIZXg9ZnVuY3Rpb24oZyl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5zZXRQYXNzd29yZD1mdW5jdGlvbihoKXtpZih0eXBlb2YgaD09XCJzdHJpbmdcIil7dmFyIGc9aDtpZihoLmxlbmd0aCUyPT0xfHwhaC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7Zz1yc3RydG9oZXgoaCl9dGhpcy5wYXNzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoZyk7cmV0dXJufWlmKHR5cGVvZiBoIT1cIm9iamVjdFwiKXt0aHJvd1wiS0pVUi5jcnlwdG8uTWFjIHVuc3VwcG9ydGVkIHBhc3N3b3JkIHR5cGU6IFwiK2h9dmFyIGc9bnVsbDtpZihoLmhleCE9PXVuZGVmaW5lZCl7aWYoaC5oZXgubGVuZ3RoJTIhPTB8fCFoLmhleC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7dGhyb3dcIk1hYzogd3JvbmcgaGV4IHBhc3N3b3JkOiBcIitoLmhleH1nPWguaGV4fWlmKGgudXRmOCE9PXVuZGVmaW5lZCl7Zz11dGY4dG9oZXgoaC51dGY4KX1pZihoLnJzdHIhPT11bmRlZmluZWQpe2c9cnN0cnRvaGV4KGgucnN0cil9aWYoaC5iNjQhPT11bmRlZmluZWQpe2c9YjY0dG9oZXgoaC5iNjQpfWlmKGguYjY0dSE9PXVuZGVmaW5lZCl7Zz1iNjR1dG9oZXgoaC5iNjR1KX1pZihnPT1udWxsKXt0aHJvd1wiS0pVUi5jcnlwdG8uTWFjIHVuc3VwcG9ydGVkIHBhc3N3b3JkIHR5cGU6IFwiK2h9dGhpcy5wYXNzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoZyl9O2lmKGQhPT11bmRlZmluZWQpe2lmKGQucGFzcyE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQYXNzd29yZChkLnBhc3MpfWlmKGQuYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9ZC5hbGc7aWYoZC5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19dGhpcy5zZXRBbGdBbmRQcm92aWRlcih0aGlzLmFsZ05hbWUsdGhpcy5wcm92TmFtZSl9fX07S0pVUi5jcnlwdG8uU2lnbmF0dXJlPWZ1bmN0aW9uKG8pe3ZhciBxPW51bGw7dmFyIG49bnVsbDt2YXIgcj1udWxsO3ZhciBjPW51bGw7dmFyIGw9bnVsbDt2YXIgZD1udWxsO3ZhciBrPW51bGw7dmFyIGg9bnVsbDt2YXIgcD1udWxsO3ZhciBlPW51bGw7dmFyIGI9LTE7dmFyIGc9bnVsbDt2YXIgaj1udWxsO3ZhciBhPW51bGw7dmFyIGk9bnVsbDt2YXIgZj1udWxsO3RoaXMuX3NldEFsZ05hbWVzPWZ1bmN0aW9uKCl7aWYodGhpcy5hbGdOYW1lLm1hdGNoKC9eKC4rKXdpdGgoLispJC8pKXt0aGlzLm1kQWxnTmFtZT1SZWdFeHAuJDEudG9Mb3dlckNhc2UoKTt0aGlzLnB1YmtleUFsZ05hbWU9UmVnRXhwLiQyLnRvTG93ZXJDYXNlKCl9fTt0aGlzLl96ZXJvUGFkZGluZ09mU2lnbmF0dXJlPWZ1bmN0aW9uKHgsdyl7dmFyIHY9XCJcIjt2YXIgdD13LzQteC5sZW5ndGg7Zm9yKHZhciB1PTA7dTx0O3UrKyl7dj12K1wiMFwifXJldHVybiB2K3h9O3RoaXMuc2V0QWxnQW5kUHJvdmlkZXI9ZnVuY3Rpb24odSx0KXt0aGlzLl9zZXRBbGdOYW1lcygpO2lmKHQhPVwiY3J5cHRvanMvanNyc2FcIil7dGhyb3dcInByb3ZpZGVyIG5vdCBzdXBwb3J0ZWQ6IFwiK3R9aWYoXCI6bWQ1OnNoYTE6c2hhMjI0OnNoYTI1NjpzaGEzODQ6c2hhNTEyOnJpcGVtZDE2MDpcIi5pbmRleE9mKHRoaXMubWRBbGdOYW1lKSE9LTEpe3RyeXt0aGlzLm1kPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6dGhpcy5tZEFsZ05hbWV9KX1jYXRjaChzKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK3RoaXMubWRBbGdOYW1lK1wiL1wiK3N9dGhpcy5pbml0PWZ1bmN0aW9uKHcseCl7dmFyIHk9bnVsbDt0cnl7aWYoeD09PXVuZGVmaW5lZCl7eT1LRVlVVElMLmdldEtleSh3KX1lbHNle3k9S0VZVVRJTC5nZXRLZXkodyx4KX19Y2F0Y2godil7dGhyb3dcImluaXQgZmFpbGVkOlwiK3Z9aWYoeS5pc1ByaXZhdGU9PT10cnVlKXt0aGlzLnBydktleT15O3RoaXMuc3RhdGU9XCJTSUdOXCJ9ZWxzZXtpZih5LmlzUHVibGljPT09dHJ1ZSl7dGhpcy5wdWJLZXk9eTt0aGlzLnN0YXRlPVwiVkVSSUZZXCJ9ZWxzZXt0aHJvd1wiaW5pdCBmYWlsZWQuOlwiK3l9fX07dGhpcy5pbml0U2lnbj1mdW5jdGlvbih2KXtpZih0eXBlb2Ygdi5lY3BydmhleD09XCJzdHJpbmdcIiYmdHlwZW9mIHYuZWNjdXJ2ZW5hbWU9PVwic3RyaW5nXCIpe3RoaXMuZWNwcnZoZXg9di5lY3BydmhleDt0aGlzLmVjY3VydmVuYW1lPXYuZWNjdXJ2ZW5hbWV9ZWxzZXt0aGlzLnBydktleT12fXRoaXMuc3RhdGU9XCJTSUdOXCJ9O3RoaXMuaW5pdFZlcmlmeUJ5UHVibGljS2V5PWZ1bmN0aW9uKHYpe2lmKHR5cGVvZiB2LmVjcHViaGV4PT1cInN0cmluZ1wiJiZ0eXBlb2Ygdi5lY2N1cnZlbmFtZT09XCJzdHJpbmdcIil7dGhpcy5lY3B1YmhleD12LmVjcHViaGV4O3RoaXMuZWNjdXJ2ZW5hbWU9di5lY2N1cnZlbmFtZX1lbHNle2lmKHYgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7dGhpcy5wdWJLZXk9dn1lbHNle2lmKHYgaW5zdGFuY2VvZiBSU0FLZXkpe3RoaXMucHViS2V5PXZ9fX10aGlzLnN0YXRlPVwiVkVSSUZZXCJ9O3RoaXMuaW5pdFZlcmlmeUJ5Q2VydGlmaWNhdGVQRU09ZnVuY3Rpb24odil7dmFyIHc9bmV3IFg1MDkoKTt3LnJlYWRDZXJ0UEVNKHYpO3RoaXMucHViS2V5PXcuc3ViamVjdFB1YmxpY0tleVJTQTt0aGlzLnN0YXRlPVwiVkVSSUZZXCJ9O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKHYpe3RoaXMubWQudXBkYXRlU3RyaW5nKHYpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbih2KXt0aGlzLm1kLnVwZGF0ZUhleCh2KX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5zSGFzaEhleD10aGlzLm1kLmRpZ2VzdCgpO2lmKHR5cGVvZiB0aGlzLmVjcHJ2aGV4IT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5lY2N1cnZlbmFtZSE9XCJ1bmRlZmluZWRcIil7dmFyIHY9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp0aGlzLmVjY3VydmVuYW1lfSk7dGhpcy5oU2lnbj12LnNpZ25IZXgodGhpcy5zSGFzaEhleCx0aGlzLmVjcHJ2aGV4KX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhYW5kbWdmMVwiKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2hQU1ModGhpcy5zSGFzaEhleCx0aGlzLm1kQWxnTmFtZSx0aGlzLnBzc1NhbHRMZW4pfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FcIil7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdGhpcy5tZEFsZ05hbWUpfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgpfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4KX1lbHNle3Rocm93XCJTaWduYXR1cmU6IHVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnOiBcIit0aGlzLnB1YmtleUFsZ05hbWV9fX19fXJldHVybiB0aGlzLmhTaWdufTt0aGlzLnNpZ25TdHJpbmc9ZnVuY3Rpb24odil7dGhpcy51cGRhdGVTdHJpbmcodik7cmV0dXJuIHRoaXMuc2lnbigpfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24odil7dGhpcy51cGRhdGVIZXgodik7cmV0dXJuIHRoaXMuc2lnbigpfTt0aGlzLnZlcmlmeT1mdW5jdGlvbih2KXt0aGlzLnNIYXNoSGV4PXRoaXMubWQuZGlnZXN0KCk7aWYodHlwZW9mIHRoaXMuZWNwdWJoZXghPVwidW5kZWZpbmVkXCImJnR5cGVvZiB0aGlzLmVjY3VydmVuYW1lIT1cInVuZGVmaW5lZFwiKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnRoaXMuZWNjdXJ2ZW5hbWV9KTtyZXR1cm4gdy52ZXJpZnlIZXgodGhpcy5zSGFzaEhleCx2LHRoaXMuZWNwdWJoZXgpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FhbmRtZ2YxXCIpe3JldHVybiB0aGlzLnB1YktleS52ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1ModGhpcy5zSGFzaEhleCx2LHRoaXMubWRBbGdOYW1lLHRoaXMucHNzU2FsdExlbil9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIFJTQUtleSYmdGhpcy5wdWJrZXlBbGdOYW1lPT1cInJzYVwiKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7dGhyb3dcIlNpZ25hdHVyZTogdW5zdXBwb3J0ZWQgcHVibGljIGtleSBhbGc6IFwiK3RoaXMucHVia2V5QWxnTmFtZX19fX19fX19O3RoaXMuaW5pdD1mdW5jdGlvbihzLHQpe3Rocm93XCJpbml0KGtleSwgcGFzcykgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRWZXJpZnlCeVB1YmxpY0tleT1mdW5jdGlvbihzKXt0aHJvd1wiaW5pdFZlcmlmeUJ5UHVibGljS2V5KHJzYVB1YktleXkpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0VmVyaWZ5QnlDZXJ0aWZpY2F0ZVBFTT1mdW5jdGlvbihzKXt0aHJvd1wiaW5pdFZlcmlmeUJ5Q2VydGlmaWNhdGVQRU0oY2VydFBFTSkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRTaWduPWZ1bmN0aW9uKHMpe3Rocm93XCJpbml0U2lnbihwcnZLZXkpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24ocyl7dGhyb3dcInVwZGF0ZVN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24ocyl7dGhyb3dcInVwZGF0ZUhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhyb3dcInNpZ24oKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuc2lnblN0cmluZz1mdW5jdGlvbihzKXt0aHJvd1wiZGlnZXN0U3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24ocyl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24ocyl7dGhyb3dcInZlcmlmeShoU2lnVmFsKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuaW5pdFBhcmFtcz1vO2lmKG8hPT11bmRlZmluZWQpe2lmKG8uYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9by5hbGc7aWYoby5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19ZWxzZXt0aGlzLnByb3ZOYW1lPW8ucHJvdn10aGlzLmFsZ1Byb3ZOYW1lPXRoaXMuYWxnTmFtZStcIjpcIit0aGlzLnByb3ZOYW1lO3RoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpO3RoaXMuX3NldEFsZ05hbWVzKCl9aWYoby5wc3NzYWx0bGVuIT09dW5kZWZpbmVkKXt0aGlzLnBzc1NhbHRMZW49by5wc3NzYWx0bGVufWlmKG8ucHJ2a2V5cGVtIT09dW5kZWZpbmVkKXtpZihvLnBydmtleXBhcyE9PXVuZGVmaW5lZCl7dGhyb3dcImJvdGggcHJ2a2V5cGVtIGFuZCBwcnZrZXlwYXMgcGFyYW1ldGVycyBub3Qgc3VwcG9ydGVkXCJ9ZWxzZXt0cnl7dmFyIHE9bmV3IFJTQUtleSgpO3EucmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nKG8ucHJ2a2V5cGVtKTt0aGlzLmluaXRTaWduKHEpfWNhdGNoKG0pe3Rocm93XCJmYXRhbCBlcnJvciB0byBsb2FkIHBlbSBwcml2YXRlIGtleTogXCIrbX19fX19O0tKVVIuY3J5cHRvLk9JRD1uZXcgZnVuY3Rpb24oKXt0aGlzLm9pZGhleDJuYW1lPXtcIjJhODY0ODg2ZjcwZDAxMDEwMVwiOlwicnNhRW5jcnlwdGlvblwiLFwiMmE4NjQ4Y2UzZDAyMDFcIjpcImVjUHVibGljS2V5XCIsXCIyYTg2NDhjZTM4MDQwMVwiOlwiZHNhXCIsXCIyYTg2NDhjZTNkMDMwMTA3XCI6XCJzZWNwMjU2cjFcIixcIjJiODEwNDAwMWZcIjpcInNlY3AxOTJrMVwiLFwiMmI4MTA0MDAyMVwiOlwic2VjcDIyNHIxXCIsXCIyYjgxMDQwMDBhXCI6XCJzZWNwMjU2azFcIixcIjJiODEwNDAwMjNcIjpcInNlY3A1MjFyMVwiLFwiMmI4MTA0MDAyMlwiOlwic2VjcDM4NHIxXCIsXCIyYTg2NDhjZTM4MDQwM1wiOlwiU0hBMXdpdGhEU0FcIixcIjYwODY0ODAxNjUwMzA0MDMwMVwiOlwiU0hBMjI0d2l0aERTQVwiLFwiNjA4NjQ4MDE2NTAzMDQwMzAyXCI6XCJTSEEyNTZ3aXRoRFNBXCIsfX07XG4vKiEgZWNkc2EtbW9kaWZpZWQtMS4wLjUuanMgKGMpIFN0ZXBoYW4gVGhvbWFzLCBLZW5qaSBVcnVzaGltYSB8IGdpdGh1Yi5jb20vYml0Y29pbmpzL2JpdGNvaW5qcy1saWIvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkVDRFNBPWZ1bmN0aW9uKGgpe3ZhciBlPVwic2VjcDI1NnIxXCI7dmFyIGc9bnVsbDt2YXIgYj1udWxsO3ZhciBmPW51bGw7dmFyIGE9bmV3IFNlY3VyZVJhbmRvbSgpO3ZhciBkPW51bGw7dGhpcy50eXBlPVwiRUNcIjtmdW5jdGlvbiBjKHMsbyxyLG4pe3ZhciBqPU1hdGgubWF4KG8uYml0TGVuZ3RoKCksbi5iaXRMZW5ndGgoKSk7dmFyIHQ9cy5hZGQyRChyKTt2YXIgcT1zLmN1cnZlLmdldEluZmluaXR5KCk7Zm9yKHZhciBwPWotMTtwPj0wOy0tcCl7cT1xLnR3aWNlMkQoKTtxLno9QmlnSW50ZWdlci5PTkU7aWYoby50ZXN0Qml0KHApKXtpZihuLnRlc3RCaXQocCkpe3E9cS5hZGQyRCh0KX1lbHNle3E9cS5hZGQyRChzKX19ZWxzZXtpZihuLnRlc3RCaXQocCkpe3E9cS5hZGQyRChyKX19fXJldHVybiBxfXRoaXMuZ2V0QmlnUmFuZG9tPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcgQmlnSW50ZWdlcihpLmJpdExlbmd0aCgpLGEpLm1vZChpLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSkuYWRkKEJpZ0ludGVnZXIuT05FKX07dGhpcy5zZXROYW1lZEN1cnZlPWZ1bmN0aW9uKGkpe3RoaXMuZWNwYXJhbXM9S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5nZXRCeU5hbWUoaSk7dGhpcy5wcnZLZXlIZXg9bnVsbDt0aGlzLnB1YktleUhleD1udWxsO3RoaXMuY3VydmVOYW1lPWl9O3RoaXMuc2V0UHJpdmF0ZUtleUhleD1mdW5jdGlvbihpKXt0aGlzLmlzUHJpdmF0ZT10cnVlO3RoaXMucHJ2S2V5SGV4PWl9O3RoaXMuc2V0UHVibGljS2V5SGV4PWZ1bmN0aW9uKGkpe3RoaXMuaXNQdWJsaWM9dHJ1ZTt0aGlzLnB1YktleUhleD1pfTt0aGlzLmdldFB1YmxpY0tleVhZSGV4PWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5wdWJLZXlIZXg7aWYoay5zdWJzdHIoMCwyKSE9PVwiMDRcIil7dGhyb3dcInRoaXMgbWV0aG9kIHN1cHBvcnRzIHVuY29tcHJlc3NlZCBmb3JtYXQoMDQpIG9ubHlcIn12YXIgaj10aGlzLmVjcGFyYW1zLmtleWxlbi80O2lmKGsubGVuZ3RoIT09MitqKjIpe3Rocm93XCJtYWxmb3JtZWQgcHVibGljIGtleSBoZXggbGVuZ3RoXCJ9dmFyIGk9e307aS54PWsuc3Vic3RyKDIsaik7aS55PWsuc3Vic3RyKDIraik7cmV0dXJuIGl9O3RoaXMuZ2V0U2hvcnROSVNUUEN1cnZlTmFtZT1mdW5jdGlvbigpe3ZhciBpPXRoaXMuY3VydmVOYW1lO2lmKGk9PT1cInNlY3AyNTZyMVwifHxpPT09XCJOSVNUIFAtMjU2XCJ8fGk9PT1cIlAtMjU2XCJ8fGk9PT1cInByaW1lMjU2djFcIil7cmV0dXJuXCJQLTI1NlwifWlmKGk9PT1cInNlY3AzODRyMVwifHxpPT09XCJOSVNUIFAtMzg0XCJ8fGk9PT1cIlAtMzg0XCIpe3JldHVyblwiUC0zODRcIn1yZXR1cm4gbnVsbH07dGhpcy5nZW5lcmF0ZUtleVBhaXJIZXg9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLmVjcGFyYW1zLm47dmFyIG49dGhpcy5nZXRCaWdSYW5kb20oayk7dmFyIGw9dGhpcy5lY3BhcmFtcy5HLm11bHRpcGx5KG4pO3ZhciBxPWwuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBvPWwuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBpPXRoaXMuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIG09KFwiMDAwMDAwMDAwMFwiK24udG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIHI9KFwiMDAwMDAwMDAwMFwiK3EudG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIHA9KFwiMDAwMDAwMDAwMFwiK28udG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIGo9XCIwNFwiK3IrcDt0aGlzLnNldFByaXZhdGVLZXlIZXgobSk7dGhpcy5zZXRQdWJsaWNLZXlIZXgoaik7cmV0dXJue2VjcHJ2aGV4Om0sZWNwdWJoZXg6an19O3RoaXMuc2lnbldpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5zaWduSGV4KGksdGhpcy5wcnZLZXlIZXgpfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24obyxqKXt2YXIgdD1uZXcgQmlnSW50ZWdlcihqLDE2KTt2YXIgbD10aGlzLmVjcGFyYW1zLm47dmFyIHE9bmV3IEJpZ0ludGVnZXIobywxNik7ZG97dmFyIG09dGhpcy5nZXRCaWdSYW5kb20obCk7dmFyIHU9dGhpcy5lY3BhcmFtcy5HO3ZhciBwPXUubXVsdGlwbHkobSk7dmFyIGk9cC5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGwpfXdoaWxlKGkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk8PTApO3ZhciB2PW0ubW9kSW52ZXJzZShsKS5tdWx0aXBseShxLmFkZCh0Lm11bHRpcGx5KGkpKSkubW9kKGwpO3JldHVybiBLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnKGksdil9O3RoaXMuc2lnbj1mdW5jdGlvbihtLHUpe3ZhciBxPXU7dmFyIGo9dGhpcy5lY3BhcmFtcy5uO3ZhciBwPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0pO2Rve3ZhciBsPXRoaXMuZ2V0QmlnUmFuZG9tKGopO3ZhciB0PXRoaXMuZWNwYXJhbXMuRzt2YXIgbz10Lm11bHRpcGx5KGwpO3ZhciBpPW8uZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZChqKX13aGlsZShpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPD0wKTt2YXIgdj1sLm1vZEludmVyc2UoaikubXVsdGlwbHkocC5hZGQocS5tdWx0aXBseShpKSkpLm1vZChqKTtyZXR1cm4gdGhpcy5zZXJpYWxpemVTaWcoaSx2KX07dGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24oaixpKXtyZXR1cm4gdGhpcy52ZXJpZnlIZXgoaixpLHRoaXMucHViS2V5SGV4KX07dGhpcy52ZXJpZnlIZXg9ZnVuY3Rpb24obSxpLHApe3ZhciBsLGo7dmFyIG89S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXgoaSk7bD1vLnI7aj1vLnM7dmFyIGs7az1FQ1BvaW50RnAuZGVjb2RlRnJvbUhleCh0aGlzLmVjcGFyYW1zLmN1cnZlLHApO3ZhciBuPW5ldyBCaWdJbnRlZ2VyKG0sMTYpO3JldHVybiB0aGlzLnZlcmlmeVJhdyhuLGwsaixrKX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24obyxwLGope3ZhciBsLGk7aWYoQml0Y29pbi5VdGlsLmlzQXJyYXkocCkpe3ZhciBuPXRoaXMucGFyc2VTaWcocCk7bD1uLnI7aT1uLnN9ZWxzZXtpZihcIm9iamVjdFwiPT09dHlwZW9mIHAmJnAuciYmcC5zKXtsPXAucjtpPXAuc31lbHNle3Rocm93XCJJbnZhbGlkIHZhbHVlIGZvciBzaWduYXR1cmVcIn19dmFyIGs7aWYoaiBpbnN0YW5jZW9mIEVDUG9pbnRGcCl7az1qfWVsc2V7aWYoQml0Y29pbi5VdGlsLmlzQXJyYXkoaikpe2s9RUNQb2ludEZwLmRlY29kZUZyb20odGhpcy5lY3BhcmFtcy5jdXJ2ZSxqKX1lbHNle3Rocm93XCJJbnZhbGlkIGZvcm1hdCBmb3IgcHVia2V5IHZhbHVlLCBtdXN0IGJlIGJ5dGUgYXJyYXkgb3IgRUNQb2ludEZwXCJ9fXZhciBtPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG8pO3JldHVybiB0aGlzLnZlcmlmeVJhdyhtLGwsaSxrKX07dGhpcy52ZXJpZnlSYXc9ZnVuY3Rpb24obyxpLHcsbSl7dmFyIGw9dGhpcy5lY3BhcmFtcy5uO3ZhciB1PXRoaXMuZWNwYXJhbXMuRztpZihpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8aS5jb21wYXJlVG8obCk+PTApe3JldHVybiBmYWxzZX1pZih3LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8dy5jb21wYXJlVG8obCk+PTApe3JldHVybiBmYWxzZX12YXIgcD13Lm1vZEludmVyc2UobCk7dmFyIGs9by5tdWx0aXBseShwKS5tb2QobCk7dmFyIGo9aS5tdWx0aXBseShwKS5tb2QobCk7dmFyIHE9dS5tdWx0aXBseShrKS5hZGQobS5tdWx0aXBseShqKSk7dmFyIHQ9cS5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGwpO3JldHVybiB0LmVxdWFscyhpKX07dGhpcy5zZXJpYWxpemVTaWc9ZnVuY3Rpb24oayxqKXt2YXIgbD1rLnRvQnl0ZUFycmF5U2lnbmVkKCk7dmFyIGk9ai50b0J5dGVBcnJheVNpZ25lZCgpO3ZhciBtPVtdO20ucHVzaCgyKTttLnB1c2gobC5sZW5ndGgpO209bS5jb25jYXQobCk7bS5wdXNoKDIpO20ucHVzaChpLmxlbmd0aCk7bT1tLmNvbmNhdChpKTttLnVuc2hpZnQobS5sZW5ndGgpO20udW5zaGlmdCg0OCk7cmV0dXJuIG19O3RoaXMucGFyc2VTaWc9ZnVuY3Rpb24obil7dmFyIG07aWYoblswXSE9NDgpe3Rocm93IG5ldyBFcnJvcihcIlNpZ25hdHVyZSBub3QgYSB2YWxpZCBERVJTZXF1ZW5jZVwiKX1tPTI7aWYoblttXSE9Mil7dGhyb3cgbmV3IEVycm9yKFwiRmlyc3QgZWxlbWVudCBpbiBzaWduYXR1cmUgbXVzdCBiZSBhIERFUkludGVnZXJcIil9dmFyIGw9bi5zbGljZShtKzIsbSsyK25bbSsxXSk7bSs9MituW20rMV07aWYoblttXSE9Mil7dGhyb3cgbmV3IEVycm9yKFwiU2Vjb25kIGVsZW1lbnQgaW4gc2lnbmF0dXJlIG11c3QgYmUgYSBERVJJbnRlZ2VyXCIpfXZhciBpPW4uc2xpY2UobSsyLG0rMituW20rMV0pO20rPTIrblttKzFdO3ZhciBrPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKGwpO3ZhciBqPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKGkpO3JldHVybntyOmssczpqfX07dGhpcy5wYXJzZVNpZ0NvbXBhY3Q9ZnVuY3Rpb24obSl7aWYobS5sZW5ndGghPT02NSl7dGhyb3dcIlNpZ25hdHVyZSBoYXMgdGhlIHdyb25nIGxlbmd0aFwifXZhciBqPW1bMF0tMjc7aWYoajwwfHxqPjcpe3Rocm93XCJJbnZhbGlkIHNpZ25hdHVyZSB0eXBlXCJ9dmFyIG89dGhpcy5lY3BhcmFtcy5uO3ZhciBsPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0uc2xpY2UoMSwzMykpLm1vZChvKTt2YXIgaz1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChtLnNsaWNlKDMzLDY1KSkubW9kKG8pO3JldHVybntyOmwsczprLGk6an19O2lmKGghPT11bmRlZmluZWQpe2lmKGguY3VydmUhPT11bmRlZmluZWQpe3RoaXMuY3VydmVOYW1lPWguY3VydmV9fWlmKHRoaXMuY3VydmVOYW1lPT09dW5kZWZpbmVkKXt0aGlzLmN1cnZlTmFtZT1lfXRoaXMuc2V0TmFtZWRDdXJ2ZSh0aGlzLmN1cnZlTmFtZSk7aWYoaCE9PXVuZGVmaW5lZCl7aWYoaC5wcnYhPT11bmRlZmluZWQpe3RoaXMuc2V0UHJpdmF0ZUtleUhleChoLnBydil9aWYoaC5wdWIhPT11bmRlZmluZWQpe3RoaXMuc2V0UHVibGljS2V5SGV4KGgucHViKX19fTtLSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleD1mdW5jdGlvbihhKXt2YXIgYj1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlMoYSk7dmFyIGQ9bmV3IEJpZ0ludGVnZXIoYi5yLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihiLnMsMTYpO3JldHVybntyOmQsczpjfX07S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXhJbkhleFJTPWZ1bmN0aW9uKGMpe2lmKGMuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcInNpZ25hdHVyZSBpcyBub3QgYSBBU04uMSBzZXF1ZW5jZVwifXZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7aWYoYi5sZW5ndGghPTIpe3Rocm93XCJudW1iZXIgb2Ygc2lnbmF0dXJlIEFTTi4xIHNlcXVlbmNlIGVsZW1lbnRzIHNlZW0gd3JvbmdcIn12YXIgZz1iWzBdO3ZhciBmPWJbMV07aWYoYy5zdWJzdHIoZywyKSE9XCIwMlwiKXt0aHJvd1wiMXN0IGl0ZW0gb2Ygc2VxdWVuZSBvZiBzaWduYXR1cmUgaXMgbm90IEFTTi4xIGludGVnZXJcIn1pZihjLnN1YnN0cihmLDIpIT1cIjAyXCIpe3Rocm93XCIybmQgaXRlbSBvZiBzZXF1ZW5lIG9mIHNpZ25hdHVyZSBpcyBub3QgQVNOLjEgaW50ZWdlclwifXZhciBlPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsZyk7dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxmKTtyZXR1cm57cjplLHM6ZH19O0tKVVIuY3J5cHRvLkVDRFNBLmFzbjFTaWdUb0NvbmNhdFNpZz1mdW5jdGlvbihjKXt2YXIgZD1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlMoYyk7dmFyIGI9ZC5yO3ZhciBhPWQucztpZihiLnN1YnN0cigwLDIpPT1cIjAwXCImJigoKGIubGVuZ3RoLzIpKjgpJSgxNio4KSk9PTgpe2I9Yi5zdWJzdHIoMil9aWYoYS5zdWJzdHIoMCwyKT09XCIwMFwiJiYoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpPT04KXthPWEuc3Vic3RyKDIpfWlmKCgoKGIubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyByIGxlbmd0aCBlcnJvclwifWlmKCgoKGEubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyBzIGxlbmd0aCBlcnJvclwifXJldHVybiBiK2F9O0tKVVIuY3J5cHRvLkVDRFNBLmNvbmNhdFNpZ1RvQVNOMVNpZz1mdW5jdGlvbihhKXtpZigoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpIT0wKXt0aHJvd1widW5rbm93biBFQ0RTQSBjb25jYXRpbmF0ZWQgci1zIHNpZyAgbGVuZ3RoIGVycm9yXCJ9dmFyIGM9YS5zdWJzdHIoMCxhLmxlbmd0aC8yKTt2YXIgYj1hLnN1YnN0cihhLmxlbmd0aC8yKTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWcoYyxiKX07S0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWc9ZnVuY3Rpb24oYixhKXt2YXIgZD1uZXcgQmlnSW50ZWdlcihiLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihhLDE2KTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuYmlSU1NpZ1RvQVNOMVNpZyhkLGMpfTtLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnPWZ1bmN0aW9uKGUsYyl7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6ZX0pO3ZhciBhPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmN9KTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbYixhXX0pO3JldHVybiBkLmdldEVuY29kZWRIZXgoKX07XG4vKiEgZWNwYXJhbS0xLjAuMC5qcyAoYykgMjAxMyBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREI9bmV3IGZ1bmN0aW9uKCl7dmFyIGI9e307dmFyIGM9e307ZnVuY3Rpb24gYShkKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoZCwxNil9dGhpcy5nZXRCeU5hbWU9ZnVuY3Rpb24oZSl7dmFyIGQ9ZTtpZih0eXBlb2YgY1tkXSE9XCJ1bmRlZmluZWRcIil7ZD1jW2VdfWlmKHR5cGVvZiBiW2RdIT1cInVuZGVmaW5lZFwiKXtyZXR1cm4gYltkXX10aHJvd1widW5yZWdpc3RlcmVkIEVDIGN1cnZlIG5hbWU6IFwiK2R9O3RoaXMucmVnaXN0PWZ1bmN0aW9uKEEsbCxvLGcsbSxlLGosZixrLHUsZCx4KXtiW0FdPXt9O3ZhciBzPWEobyk7dmFyIHo9YShnKTt2YXIgeT1hKG0pO3ZhciB0PWEoZSk7dmFyIHc9YShqKTt2YXIgcj1uZXcgRUNDdXJ2ZUZwKHMseix5KTt2YXIgcT1yLmRlY29kZVBvaW50SGV4KFwiMDRcIitmK2spO2JbQV1bXCJuYW1lXCJdPUE7YltBXVtcImtleWxlblwiXT1sO2JbQV1bXCJjdXJ2ZVwiXT1yO2JbQV1bXCJHXCJdPXE7YltBXVtcIm5cIl09dDtiW0FdW1wiaFwiXT13O2JbQV1bXCJvaWRcIl09ZDtiW0FdW1wiaW5mb1wiXT14O2Zvcih2YXIgdj0wO3Y8dS5sZW5ndGg7disrKXtjW3Vbdl1dPUF9fX07S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTI4cjFcIiwxMjgsXCJGRkZGRkZGREZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIkU4NzU3OUMxMTA3OUY0M0REODI0OTkzQzJDRUU1RUQzXCIsXCJGRkZGRkZGRTAwMDAwMDAwNzVBMzBEMUI5MDM4QTExNVwiLFwiMVwiLFwiMTYxRkY3NTI4Qjg5OUIyRDBDMjg2MDdDQTUyQzVCODZcIixcIkNGNUFDODM5NUJBRkVCMTNDMDJEQTI5MkRERUQ3QTgzXCIsW10sXCJcIixcInNlY3AxMjhyMSA6IFNFQ0cgY3VydmUgb3ZlciBhIDEyOCBiaXQgcHJpbWUgZmllbGRcIik7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTYwazFcIiwxNjAsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZBQzczXCIsXCIwXCIsXCI3XCIsXCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAxQjhGQTE2REZBQjlBQ0ExNkI2QjNcIixcIjFcIixcIjNCNEMzODJDRTM3QUExOTJBNDAxOUU3NjMwMzZGNEY1REQ0RDdFQkJcIixcIjkzOENGOTM1MzE4RkRDRUQ2QkMyODI4NjUzMTczM0MzRjAzQzRGRUVcIixbXSxcIlwiLFwic2VjcDE2MGsxIDogU0VDRyBjdXJ2ZSBvdmVyIGEgMTYwIGJpdCBwcmltZSBmaWVsZFwiKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxNjByMVwiLDE2MCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkNcIixcIjFDOTdCRUZDNTRCRDdBOEI2NUFDRjg5RjgxRDRENEFEQzU2NUZBNDVcIixcIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDFGNEM4RjkyN0FFRDNDQTc1MjI1N1wiLFwiMVwiLFwiNEE5NkI1Njg4RUY1NzMyODQ2NjQ2OTg5NjhDMzhCQjkxM0NCRkM4MlwiLFwiMjNBNjI4NTUzMTY4OTQ3RDU5RENDOTEyMDQyMzUxMzc3QUM1RkIzMlwiLFtdLFwiXCIsXCJzZWNwMTYwcjEgOiBTRUNHIGN1cnZlIG92ZXIgYSAxNjAgYml0IHByaW1lIGZpZWxkXCIpO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE5MmsxXCIsMTkyLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZFRTM3XCIsXCIwXCIsXCIzXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkUyNkYyRkMxNzBGNjk0NjZBNzRERUZEOERcIixcIjFcIixcIkRCNEZGMTBFQzA1N0U5QUUyNkIwN0QwMjgwQjdGNDM0MURBNUQxQjFFQUUwNkM3RFwiLFwiOUIyRjJGNkQ5QzU2MjhBNzg0NDE2M0QwMTVCRTg2MzQ0MDgyQUE4OEQ5NUUyRjlEXCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE5MnIxXCIsMTkyLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkNcIixcIjY0MjEwNTE5RTU5QzgwRTcwRkE3RTlBQjcyMjQzMDQ5RkVCOERFRUNDMTQ2QjlCMVwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGOTlERUY4MzYxNDZCQzlCMUI0RDIyODMxXCIsXCIxXCIsXCIxODhEQTgwRUIwMzA5MEY2N0NCRjIwRUI0M0ExODgwMEY0RkYwQUZEODJGRjEwMTJcIixcIjA3MTkyQjk1RkZDOERBNzg2MzEwMTFFRDZCMjRDREQ1NzNGOTc3QTExRTc5NDgxMVwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AyMjRyMVwiLDIyNCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRVwiLFwiQjQwNTBBODUwQzA0QjNBQkY1NDEzMjU2NTA0NEIwQjdEN0JGRDhCQTI3MEIzOTQzMjM1NUZGQjRcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYxNkEyRTBCOEYwM0UxM0REMjk0NTVDNUMyQTNEXCIsXCIxXCIsXCJCNzBFMENCRDZCQjRCRjdGMzIxMzkwQjk0QTAzQzFEMzU2QzIxMTIyMzQzMjgwRDYxMTVDMUQyMVwiLFwiQkQzNzYzODhCNUY3MjNGQjRDMjJERkU2Q0Q0Mzc1QTA1QTA3NDc2NDQ0RDU4MTk5ODUwMDdFMzRcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMjU2azFcIiwyNTYsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGQzJGXCIsXCIwXCIsXCI3XCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUJBQUVEQ0U2QUY0OEEwM0JCRkQyNUU4Q0QwMzY0MTQxXCIsXCIxXCIsXCI3OUJFNjY3RUY5RENCQkFDNTVBMDYyOTVDRTg3MEIwNzAyOUJGQ0RCMkRDRTI4RDk1OUYyODE1QjE2RjgxNzk4XCIsXCI0ODNBREE3NzI2QTNDNDY1NURBNEZCRkMwRTExMDhBOEZEMTdCNDQ4QTY4NTU0MTk5QzQ3RDA4RkZCMTBENEI4XCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDI1NnIxXCIsMjU2LFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiLFwiNUFDNjM1RDhBQTNBOTNFN0IzRUJCRDU1NzY5ODg2QkM2NTFEMDZCMENDNTNCMEY2M0JDRTNDM0UyN0QyNjA0QlwiLFwiRkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZCQ0U2RkFBREE3MTc5RTg0RjNCOUNBQzJGQzYzMjU1MVwiLFwiMVwiLFwiNkIxN0QxRjJFMTJDNDI0N0Y4QkNFNkU1NjNBNDQwRjI3NzAzN0Q4MTJERUIzM0EwRjRBMTM5NDVEODk4QzI5NlwiLFwiNEZFMzQyRTJGRTFBN0Y5QjhFRTdFQjRBN0MwRjlFMTYyQkNFMzM1NzZCMzE1RUNFQ0JCNjQwNjgzN0JGNTFGNVwiLFtcIk5JU1QgUC0yNTZcIixcIlAtMjU2XCIsXCJwcmltZTI1NnYxXCJdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AzODRyMVwiLDM4NCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZDXCIsXCJCMzMxMkZBN0UyM0VFN0U0OTg4RTA1NkJFM0Y4MkQxOTE4MUQ5QzZFRkU4MTQxMTIwMzE0MDg4RjUwMTM4NzVBQzY1NjM5OEQ4QTJFRDE5RDJBODVDOEVERDNFQzJBRUZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkM3NjM0RDgxRjQzNzJEREY1ODFBMERCMjQ4QjBBNzdBRUNFQzE5NkFDQ0M1Mjk3M1wiLFwiMVwiLFwiQUE4N0NBMjJCRThCMDUzNzhFQjFDNzFFRjMyMEFENzQ2RTFEM0I2MjhCQTc5Qjk4NTlGNzQxRTA4MjU0MkEzODU1MDJGMjVEQkY1NTI5NkMzQTU0NUUzODcyNzYwQUI3XCIsXCIzNjE3ZGU0YTk2MjYyYzZmNWQ5ZTk4YmY5MjkyZGMyOWY4ZjQxZGJkMjg5YTE0N2NlOWRhMzExM2I1ZjBiOGMwMGE2MGIxY2UxZDdlODE5ZDdhNDMxZDdjOTBlYTBlNWZcIixbXCJOSVNUIFAtMzg0XCIsXCJQLTM4NFwiXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwNTIxcjFcIiw1MjEsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIjA1MTk1M0VCOTYxOEUxQzlBMUY5MjlBMjFBMEI2ODU0MEVFQTJEQTcyNUI5OUIzMTVGM0I4QjQ4OTkxOEVGMTA5RTE1NjE5Mzk1MUVDN0U5MzdCMTY1MkMwQkQzQkIxQkYwNzM1NzNERjg4M0QyQzM0RjFFRjQ1MUZENDZCNTAzRjAwXCIsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZBNTE4Njg3ODNCRjJGOTY2QjdGQ0MwMTQ4RjcwOUE1RDAzQkI1QzlCODg5OUM0N0FFQkI2RkI3MUU5MTM4NjQwOVwiLFwiMVwiLFwiQzY4NThFMDZCNzA0MDRFOUNEOUUzRUNCNjYyMzk1QjQ0MjlDNjQ4MTM5MDUzRkI1MjFGODI4QUY2MDZCNEQzREJBQTE0QjVFNzdFRkU3NTkyOEZFMURDMTI3QTJGRkE4REUzMzQ4QjNDMTg1NkE0MjlCRjk3RTdFMzFDMkU1QkQ2NlwiLFwiMDExODM5Mjk2YTc4OWEzYmMwMDQ1YzhhNWZiNDJjN2QxYmQ5OThmNTQ0NDk1NzliNDQ2ODE3YWZiZDE3MjczZTY2MmM5N2VlNzI5OTVlZjQyNjQwYzU1MGI5MDEzZmFkMDc2MTM1M2M3MDg2YTI3MmMyNDA4OGJlOTQ3NjlmZDE2NjUwXCIsW1wiTklTVCBQLTUyMVwiLFwiUC01MjFcIl0pO1xuLyohIGRzYS1tb2RpZmllZC0xLjAuMS5qcyAoYykgUmVjdXJpdHkgTGFicyBHbWJILCBLZW5qaSBVcnVzaGltbWEgfCBnaXRodWIuY29tL29wZW5wZ3Bqcy9vcGVucGdwanMvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkRTQT1mdW5jdGlvbigpe3RoaXMucD1udWxsO3RoaXMucT1udWxsO3RoaXMuZz1udWxsO3RoaXMueT1udWxsO3RoaXMueD1udWxsO3RoaXMudHlwZT1cIkRTQVwiO3RoaXMuc2V0UHJpdmF0ZT1mdW5jdGlvbih6LHcsdixBLHUpe3RoaXMuaXNQcml2YXRlPXRydWU7dGhpcy5wPXo7dGhpcy5xPXc7dGhpcy5nPXY7dGhpcy55PUE7dGhpcy54PXV9O3RoaXMuc2V0UHVibGljPWZ1bmN0aW9uKHcsdix1LHope3RoaXMuaXNQdWJsaWM9dHJ1ZTt0aGlzLnA9dzt0aGlzLnE9djt0aGlzLmc9dTt0aGlzLnk9ejt0aGlzLng9bnVsbH07dGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKHope3ZhciB2PXRoaXMucDt2YXIgdT10aGlzLnE7dmFyIEM9dGhpcy5nO3ZhciBEPXRoaXMueTt2YXIgRT10aGlzLng7dmFyIEE9ei5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBCPW5ldyBCaWdJbnRlZ2VyKHosMTYpO3ZhciB3PW4oQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKSx1LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7dmFyIEc9KEMubW9kUG93KHcsdikpLm1vZCh1KTt2YXIgRj0ody5tb2RJbnZlcnNlKHUpLm11bHRpcGx5KEIuYWRkKEUubXVsdGlwbHkoRykpKSkubW9kKHUpO3ZhciBIPUtKVVIuYXNuMS5BU04xVXRpbC5qc29uVG9BU04xSEVYKHtzZXE6W3tcImludFwiOntiaWdpbnQ6R319LHtcImludFwiOntiaWdpbnQ6Rn19XX0pO3JldHVybiBIfTt0aGlzLnZlcmlmeVdpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihDLEIpe3ZhciB6PXRoaXMucDt2YXIgdT10aGlzLnE7dmFyIEc9dGhpcy5nO3ZhciBIPXRoaXMueTt2YXIgRT10aGlzLnBhcnNlQVNOMVNpZ25hdHVyZShCKTt2YXIgSz1FWzBdO3ZhciBKPUVbMV07dmFyIEM9Qy5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBEPW5ldyBCaWdJbnRlZ2VyKEMsMTYpO2lmKEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSyk+MHx8Sy5jb21wYXJlVG8odSk+MHx8QmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhKKT4wfHxKLmNvbXBhcmVUbyh1KT4wKXt0aHJvd1wiaW52YWxpZCBEU0Egc2lnbmF0dXJlXCJ9dmFyIEk9Si5tb2RJbnZlcnNlKHUpO3ZhciBBPUQubXVsdGlwbHkoSSkubW9kKHUpO3ZhciB2PUsubXVsdGlwbHkoSSkubW9kKHUpO3ZhciBGPUcubW9kUG93KEEseikubXVsdGlwbHkoSC5tb2RQb3codix6KSkubW9kKHopLm1vZCh1KTtyZXR1cm4gRi5jb21wYXJlVG8oSyk9PTB9O3RoaXMucGFyc2VBU04xU2lnbmF0dXJlPWZ1bmN0aW9uKHUpe3RyeXt2YXIgeT1uZXcgQmlnSW50ZWdlcihBU04xSEVYLmdldFZieUxpc3QodSwwLFswXSxcIjAyXCIpLDE2KTt2YXIgdj1uZXcgQmlnSW50ZWdlcihBU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpLDE2KTtyZXR1cm5beSx2XX1jYXRjaCh3KXt0aHJvd1wibWFsZm9ybWVkIERTQSBzaWduYXR1cmVcIn19O2Z1bmN0aW9uIGQoRSx3LEIsdix1LEMpe3ZhciB6PUtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyh3LEUudG9Mb3dlckNhc2UoKSk7dmFyIHo9ei5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBBPW5ldyBCaWdJbnRlZ2VyKHosMTYpO3ZhciB5PW4oQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKSx1LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7dmFyIEY9KEIubW9kUG93KHksdikpLm1vZCh1KTt2YXIgRD0oeS5tb2RJbnZlcnNlKHUpLm11bHRpcGx5KEEuYWRkKEMubXVsdGlwbHkoRikpKSkubW9kKHUpO3ZhciBHPW5ldyBBcnJheSgpO0dbMF09RjtHWzFdPUQ7cmV0dXJuIEd9ZnVuY3Rpb24gcih2KXt2YXIgdT1vcGVucGdwLmNvbmZpZy5jb25maWcucHJlZmVyX2hhc2hfYWxnb3JpdGhtO3N3aXRjaChNYXRoLnJvdW5kKHYuYml0TGVuZ3RoKCkvOCkpe2Nhc2UgMjA6aWYodSE9MiYmdT4xMSYmdSE9MTAmJnU8OCl7cmV0dXJuIDJ9cmV0dXJuIHU7Y2FzZSAyODppZih1PjExJiZ1PDgpe3JldHVybiAxMX1yZXR1cm4gdTtjYXNlIDMyOmlmKHU+MTAmJnU8OCl7cmV0dXJuIDh9cmV0dXJuIHU7ZGVmYXVsdDp1dGlsLnByaW50X2RlYnVnKFwiRFNBIHNlbGVjdCBoYXNoIGFsZ29yaXRobTogcmV0dXJuaW5nIG51bGwgZm9yIGFuIHVua25vd24gbGVuZ3RoIG9mIHFcIik7cmV0dXJuIG51bGx9fXRoaXMuc2VsZWN0X2hhc2hfYWxnb3JpdGhtPXI7ZnVuY3Rpb24gbShJLEssSixCLHosdSxGLEcpe3ZhciBDPUtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhCLEkudG9Mb3dlckNhc2UoKSk7dmFyIEM9Qy5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBEPW5ldyBCaWdJbnRlZ2VyKEMsMTYpO2lmKEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSyk+MHx8Sy5jb21wYXJlVG8odSk+MHx8QmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhKKT4wfHxKLmNvbXBhcmVUbyh1KT4wKXt1dGlsLnByaW50X2Vycm9yKFwiaW52YWxpZCBEU0EgU2lnbmF0dXJlXCIpO3JldHVybiBudWxsfXZhciBIPUoubW9kSW52ZXJzZSh1KTt2YXIgQT1ELm11bHRpcGx5KEgpLm1vZCh1KTt2YXIgdj1LLm11bHRpcGx5KEgpLm1vZCh1KTt2YXIgRT1GLm1vZFBvdyhBLHopLm11bHRpcGx5KEcubW9kUG93KHYseikpLm1vZCh6KS5tb2QodSk7cmV0dXJuIEUuY29tcGFyZVRvKEspPT0wfWZ1bmN0aW9uIGEoeil7dmFyIEE9bmV3IEJpZ0ludGVnZXIoeixwcmltZUNlbnRlcmllKTt2YXIgeT1qKHEsNTEyKTt2YXIgdT10KHAscSx6KTt2YXIgdjtkb3t2PW5ldyBCaWdJbnRlZ2VyKHEuYml0Q291bnQoKSxyYW5kKX13aGlsZSh4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pIT0xJiZ4LmNvbXBhcmVUbyhxKSE9LTEpO3ZhciB3PWcubW9kUG93KHgscCk7cmV0dXJue3g6dixxOkEscDp5LGc6dSx5Ond9fWZ1bmN0aW9uIGooeSx6LHcpe2lmKHolNjQhPTApe3JldHVybiBmYWxzZX12YXIgdTt2YXIgdjtkb3t1PXcoYml0Y291bnQsdHJ1ZSk7dj11LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt1PXUuc3VidHJhY3Qodi5yZW1haW5kZXIoeSkpfXdoaWxlKCF1LmlzUHJvYmFibGVQcmltZShwcmltZUNlbnRlcmllKXx8dS5iaXRMZW5ndGgoKSE9bCk7cmV0dXJuIHV9ZnVuY3Rpb24gdChCLHosQSx3KXt2YXIgdT1CLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgeT11LmRpdmlkZSh6KTt2YXIgdjtkb3t2PXcoQSl9d2hpbGUodi5jb21wYXJlVG8odSkhPS0xJiZ2LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTEpO3JldHVybiB2Lm1vZFBvdyh5LEIpfWZ1bmN0aW9uIG8odyx5LHUpe3ZhciB2O2Rve3Y9dSh5LGZhbHNlKX13aGlsZSh2LmNvbXBhcmVUbyh3KSE9LTEmJnYuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykhPTEpO3JldHVybiB2fWZ1bmN0aW9uIGkodix3KXtrPW8odik7dmFyIHU9Zy5tb2RQb3coayx3KS5tb2Qodik7cmV0dXJuIHV9ZnVuY3Rpb24gaChCLHcseSx2LHosdSl7dmFyIEE9Qih2KTtzPSh3Lm1vZEludmVyc2UoeikubXVsdGlwbHkoQS5hZGQodS5tdWx0aXBseSh5KSkpKS5tb2Qoeik7cmV0dXJuIHN9dGhpcy5zaWduPWQ7dGhpcy52ZXJpZnk9bTtmdW5jdGlvbiBuKHcsdSl7aWYodS5jb21wYXJlVG8odyk8PTApe3JldHVybn12YXIgdj11LnN1YnRyYWN0KHcpO3ZhciB5PWUodi5iaXRMZW5ndGgoKSk7d2hpbGUoeT52KXt5PWUodi5iaXRMZW5ndGgoKSl9cmV0dXJuIHcuYWRkKHkpfWZ1bmN0aW9uIGUodyl7aWYodzwwKXtyZXR1cm4gbnVsbH12YXIgdT1NYXRoLmZsb29yKCh3KzcpLzgpO3ZhciB2PWModSk7aWYodyU4PjApe3Y9U3RyaW5nLmZyb21DaGFyQ29kZSgoTWF0aC5wb3coMix3JTgpLTEpJnYuY2hhckNvZGVBdCgwKSkrdi5zdWJzdHJpbmcoMSl9cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGYodiksMTYpfWZ1bmN0aW9uIGModyl7dmFyIHU9XCJcIjtmb3IodmFyIHY9MDt2PHc7disrKXt1Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGIoKSl9cmV0dXJuIHV9ZnVuY3Rpb24gYigpe3ZhciB1PW5ldyBVaW50MzJBcnJheSgxKTt3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1KTtyZXR1cm4gdVswXSYyNTV9ZnVuY3Rpb24gZih5KXtpZih5PT1udWxsKXtyZXR1cm5cIlwifXZhciB2PVtdO3ZhciB3PXkubGVuZ3RoO3ZhciB6PTA7dmFyIHU7d2hpbGUoejx3KXt1PXlbeisrXS5jaGFyQ29kZUF0KCkudG9TdHJpbmcoMTYpO3doaWxlKHUubGVuZ3RoPDIpe3U9XCIwXCIrdX12LnB1c2goXCJcIit1KX1yZXR1cm4gdi5qb2luKFwiXCIpfXRoaXMuZ2V0UmFuZG9tQmlnSW50ZWdlckluUmFuZ2U9bjt0aGlzLmdldFJhbmRvbUJpZ0ludGVnZXI9ZTt0aGlzLmdldFJhbmRvbUJ5dGVzPWN9O1xuLyohIHBrY3M1cGtleS0xLjAuNi5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBQS0NTNVBLRVk9ZnVuY3Rpb24oKXt2YXIgYz1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGkoQ3J5cHRvSlMuQUVTLG4scCxvKX07dmFyIGQ9ZnVuY3Rpb24obixwLG8pe3JldHVybiBpKENyeXB0b0pTLlRyaXBsZURFUyxuLHAsbyl9O3ZhciBpPWZ1bmN0aW9uKHEsdixzLG8pe3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHU9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShzKTt2YXIgbj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKG8pO3ZhciByPXt9O3Iua2V5PXU7ci5pdj1uO3IuY2lwaGVydGV4dD1wO3ZhciB0PXEuZGVjcnlwdChyLHUse2l2Om59KTtyZXR1cm4gQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodCl9O3ZhciBqPWZ1bmN0aW9uKG4scCxvKXtyZXR1cm4gZShDcnlwdG9KUy5BRVMsbixwLG8pfTt2YXIgbT1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGUoQ3J5cHRvSlMuVHJpcGxlREVTLG4scCxvKX07dmFyIGU9ZnVuY3Rpb24ocyx4LHYscCl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocCk7dmFyIG49e307dmFyIHU9cy5lbmNyeXB0KHIsdyx7aXY6b30pO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodS50b1N0cmluZygpKTt2YXIgdD1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShxKTtyZXR1cm4gdH07dmFyIGc9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpjLGVwcm9jOmosa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6YyxlcHJvYzpqLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmMsZXByb2M6aixrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZCxlcHJvYzptLGtleWxlbjoyNCxpdmxlbjo4fX07dmFyIGI9ZnVuY3Rpb24obil7cmV0dXJuIGdbbl1bXCJwcm9jXCJdfTt2YXIgaz1mdW5jdGlvbihuKXt2YXIgcD1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbShuKTt2YXIgbz1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShwKTtyZXR1cm4gb307dmFyIGw9ZnVuY3Rpb24ocSl7dmFyIHI9e307aWYocS5tYXRjaChuZXcgUmVnRXhwKFwiREVLLUluZm86IChbXixdKyksKFswLTlBLUZhLWZdKylcIixcIm1cIikpKXtyLmNpcGhlcj1SZWdFeHAuJDE7ci5pdnNhbHQ9UmVnRXhwLiQyfWlmKHEubWF0Y2gobmV3IFJlZ0V4cChcIi0tLS0tQkVHSU4gKFtBLVpdKykgUFJJVkFURSBLRVktLS0tLVwiKSkpe3IudHlwZT1SZWdFeHAuJDF9dmFyIHA9LTE7dmFyIHQ9MDtpZihxLmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIikhPS0xKXtwPXEuaW5kZXhPZihcIlxcclxcblxcclxcblwiKTt0PTJ9aWYocS5pbmRleE9mKFwiXFxuXFxuXCIpIT0tMSl7cD1xLmluZGV4T2YoXCJcXG5cXG5cIik7dD0xfXZhciBvPXEuaW5kZXhPZihcIi0tLS0tRU5EXCIpO2lmKHAhPS0xJiZvIT0tMSl7dmFyIG49cS5zdWJzdHJpbmcocCt0KjIsby10KTtuPW4ucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3IuZGF0YT1ufXJldHVybiByfTt2YXIgaD1mdW5jdGlvbihvLHcsbil7dmFyIHQ9bi5zdWJzdHJpbmcoMCwxNik7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh0KTt2YXIgcD1DcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh3KTt2YXIgcz1nW29dW1wia2V5bGVuXCJdK2dbb11bXCJpdmxlblwiXTt2YXIgdj1cIlwiO3ZhciB1PW51bGw7Zm9yKDs7KXt2YXIgcT1DcnlwdG9KUy5hbGdvLk1ENS5jcmVhdGUoKTtpZih1IT1udWxsKXtxLnVwZGF0ZSh1KX1xLnVwZGF0ZShwKTtxLnVwZGF0ZShyKTt1PXEuZmluYWxpemUoKTt2PXYrQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodSk7aWYodi5sZW5ndGg+PXMqMil7YnJlYWt9fXZhciB4PXt9O3gua2V5aGV4PXYuc3Vic3RyKDAsZ1tvXVtcImtleWxlblwiXSoyKTt4Lml2aGV4PXYuc3Vic3RyKGdbb11bXCJrZXlsZW5cIl0qMixnW29dW1wiaXZsZW5cIl0qMik7cmV0dXJuIHh9O3ZhciBhPWZ1bmN0aW9uKG4sdCxwLHUpe3ZhciBxPUNyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2Uobik7dmFyIG89Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocSk7dmFyIHM9Z1t0XVtcInByb2NcIl07dmFyIHI9cyhvLHAsdSk7cmV0dXJuIHJ9O3ZhciBmPWZ1bmN0aW9uKG4scSxvLHMpe3ZhciBwPWdbcV1bXCJlcHJvY1wiXTt2YXIgcj1wKG4sbyxzKTtyZXR1cm4gcn07cmV0dXJue3ZlcnNpb246XCIxLjAuNVwiLGdldEhleEZyb21QRU06ZnVuY3Rpb24obyxyKXt2YXIgcD1vO2lmKHAuaW5kZXhPZihcIkJFR0lOIFwiK3IpPT0tMSl7dGhyb3dcImNhbid0IGZpbmQgUEVNIGhlYWRlcjogXCIrcn1wPXAucmVwbGFjZShcIi0tLS0tQkVHSU4gXCIrcitcIi0tLS0tXCIsXCJcIik7cD1wLnJlcGxhY2UoXCItLS0tLUVORCBcIityK1wiLS0tLS1cIixcIlwiKTt2YXIgcT1wLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgbj1iNjR0b2hleChxKTtyZXR1cm4gbn0sZ2V0RGVjcnlwdGVkS2V5SGV4QnlLZXlJVjpmdW5jdGlvbihvLHIscSxwKXt2YXIgbj1iKHIpO3JldHVybiBuKG8scSxwKX0scGFyc2VQS0NTNVBFTTpmdW5jdGlvbihuKXtyZXR1cm4gbChuKX0sZ2V0S2V5QW5kVW51c2VkSXZCeVBhc3Njb2RlQW5kSXZzYWx0OmZ1bmN0aW9uKG8sbixwKXtyZXR1cm4gaChvLG4scCl9LGRlY3J5cHRLZXlCNjQ6ZnVuY3Rpb24obixwLG8scSl7cmV0dXJuIGEobixwLG8scSl9LGdldERlY3J5cHRlZEtleUhleDpmdW5jdGlvbih3LHYpe3ZhciBvPWwodyk7dmFyIHI9by50eXBlO3ZhciBwPW8uY2lwaGVyO3ZhciBuPW8uaXZzYWx0O3ZhciBxPW8uZGF0YTt2YXIgdT1oKHAsdixuKTt2YXIgdD11LmtleWhleDt2YXIgcz1hKHEscCx0LG4pO3JldHVybiBzfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzVQRU06ZnVuY3Rpb24ocCxvKXt2YXIgcT10aGlzLmdldERlY3J5cHRlZEtleUhleChwLG8pO3ZhciBuPW5ldyBSU0FLZXkoKTtuLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcocSk7cmV0dXJuIG59LGdldEVyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXg6ZnVuY3Rpb24ocSx4LHIscCl7dmFyIG49XCJcIjtpZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7cj1cIkFFUy0yNTYtQ0JDXCJ9aWYodHlwZW9mIGdbcl09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJQS0NTNVBLRVkgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiBcIityfWlmKHR5cGVvZiBwPT1cInVuZGVmaW5lZFwifHxwPT1udWxsKXt2YXIgdD1nW3JdW1wiaXZsZW5cIl07dmFyIHM9ayh0KTtwPXMudG9VcHBlckNhc2UoKX12YXIgdz1oKHIseCxwKTt2YXIgdj13LmtleWhleDt2YXIgdT1mKHEscix2LHApO3ZhciBvPXUucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7dmFyIG49XCItLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tXFxyXFxuXCI7bis9XCJQcm9jLVR5cGU6IDQsRU5DUllQVEVEXFxyXFxuXCI7bis9XCJERUstSW5mbzogXCIrcitcIixcIitwK1wiXFxyXFxuXCI7bis9XCJcXHJcXG5cIjtuKz1vO24rPVwiXFxyXFxuLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtyZXR1cm4gbn0sZ2V0RXJ5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleTpmdW5jdGlvbihDLEQsbyxzKXt2YXIgQT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6MH0pO3ZhciB2PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMubn0pO3ZhciB6PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjpDLmV9KTt2YXIgQj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmR9KTt2YXIgdD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLnB9KTt2YXIgcj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLnF9KTt2YXIgeT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmRtcDF9KTt2YXIgdT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmRtcTF9KTt2YXIgeD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmNvZWZmfSk7dmFyIEU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W0Esdix6LEIsdCxyLHksdSx4XX0pO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmdldEVyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgodyxELG8scyl9LG5ld0VuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKG4sbyxyLHMpe2lmKHR5cGVvZiBvPT1cInVuZGVmaW5lZFwifHxvPT1udWxsKXtvPTEwMjR9aWYodHlwZW9mIHI9PVwidW5kZWZpbmVkXCJ8fHI9PW51bGwpe3I9XCIxMDAwMVwifXZhciBwPW5ldyBSU0FLZXkoKTtwLmdlbmVyYXRlKG8scik7dmFyIHE9bnVsbDtpZih0eXBlb2Ygcz09XCJ1bmRlZmluZWRcInx8cz09bnVsbCl7cT10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShwa2V5LG4pfWVsc2V7cT10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShwa2V5LG4scyl9cmV0dXJuIHF9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4UEVNOmZ1bmN0aW9uKHApe2lmKHAubWF0Y2goL0VOQ1JZUFRFRC8pKXt0aHJvd1wicGVtIHNoYWxsIGJlIG5vdCBFTkNSWVBURURcIn12YXIgbz10aGlzLmdldEhleEZyb21QRU0ocCxcIlBSSVZBVEUgS0VZXCIpO3ZhciBuPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgobyk7cmV0dXJuIG59LGdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTMpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDMgZWxlbWVudHM6IFwiK3AubGVuZ3RofXZhciBvPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzFdKTtpZihvIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWRlbnRpZmllciBpcyBub3QgcnNhRW5jOiBcIitvfXZhciBvPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzFdKTt2YXIgcj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHEscFsyXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoociwwKTt2YXIgbj1uZXcgUlNBS2V5KCk7bi5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHMpO3JldHVybiBufSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24odSl7dmFyIHE9e307dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSwwKTtpZihwLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDApLml0ZW1zICE9IDI6IFwiK3AubGVuZ3RofXEuY2lwaGVydGV4dD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih1LHBbMV0pO3ZhciB3PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUscFswXSk7aWYody5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjApLml0ZW1zICE9IDI6IFwiK3cubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsd1swXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBkXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQkVTMlwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUsd1sxXSk7aWYody5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrbi5sZW5ndGh9dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxuWzFdKTtpZihvLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjEpLml0ZW1zICE9IDI6IFwiK28ubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsb1swXSkhPVwiMmE4NjQ4ODZmNzBkMDMwN1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIFRyaXBsZURFU1wifXEuZW5jcnlwdGlvblNjaGVtZUFsZz1cIlRyaXBsZURFU1wiO3EuZW5jcnlwdGlvblNjaGVtZUlWPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsb1sxXSk7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxuWzBdKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjApLml0ZW1zICE9IDI6IFwiK3IubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsclswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBjXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQktERjJcIn12YXIgdj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LHJbMV0pO2lmKHYubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIrdi5sZW5ndGh9cS5wYmtkZjJTYWx0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsdlswXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSx2WzFdKTt0cnl7cS5wYmtkZjJJdGVyPXBhcnNlSW50KHMsMTYpfWNhdGNoKHQpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0IHBia2RmMkl0ZXI6IFwiK3N9cmV0dXJuIHF9LGdldFBCS0RGMktleUhleEZyb21QYXJhbTpmdW5jdGlvbihzLG4pe3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uocy5wYmtkZjJTYWx0KTt2YXIgbz1zLnBia2RmMkl0ZXI7dmFyIHE9Q3J5cHRvSlMuUEJLREYyKG4scix7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczpvfSk7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocSk7cmV0dXJuIHB9LGdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24odix3KXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0odixcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKTt2YXIgbj10aGlzLnBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTOChwKTt2YXIgcz1QS0NTNVBLRVkuZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtKG4sdyk7dmFyIHQ9e307dC5jaXBoZXJ0ZXh0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobi5jaXBoZXJ0ZXh0KTt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHMpO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobi5lbmNyeXB0aW9uU2NoZW1lSVYpO3ZhciB1PUNyeXB0b0pTLlRyaXBsZURFUy5kZWNyeXB0KHQscix7aXY6cX0pO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHUpO3JldHVybiBvfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocSxwKXt2YXIgbz10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocSxwKTt2YXIgbj10aGlzLmdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4KG8pO3JldHVybiBufSxnZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocSxvKXt2YXIgbj10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocSxvKTt2YXIgcD10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChuKTtyZXR1cm4gcH0scGFyc2VQbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgbz17fTtvLmFsZ3BhcmFtPW51bGw7aWYocS5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYocS5zdWJzdHIocFsxXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAzKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscFsxXSk7aWYobi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDQpXCJ9aWYocS5zdWJzdHIoblswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA1KVwifW8uYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblswXSk7aWYocS5zdWJzdHIoblsxXSwyKT09XCIwNlwiKXtvLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblsxXSl9aWYocS5zdWJzdHIocFsyXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA2KVwifW8ua2V5aWR4PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoocSxwWzJdKTtyZXR1cm4gb30sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFJJVkFURSBLRVlcIik7dmFyIHA9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgobik7cmV0dXJuIHB9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihuKXt2YXIgcD10aGlzLnBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXgobik7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3RoaXMucGFyc2VQcml2YXRlUmF3UlNBS2V5SGV4QXRPYmoobixwKTt2YXIgbz1wLmtleTt2YXIgcT1uZXcgUlNBS2V5KCk7cS5zZXRQcml2YXRlRXgoby5uLG8uZSxvLmQsby5wLG8ucSxvLmRwLG8uZHEsby5jbyk7cmV0dXJuIHF9ZWxzZXtpZihwLmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd0VDS2V5SGV4QXRPYmoobixwKTtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbcC5hbGdwYXJhbV09PT11bmRlZmluZWQpe3Rocm93XCJLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWUgdW5kZWZpbmVkOiBcIitwLmFsZ3BhcmFtfXZhciByPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXTt2YXIgcT1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnIscHJ2OnAua2V5fSk7cmV0dXJuIHF9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX0sZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFVCTElDIEtFWVwiKTt2YXIgbj10aGlzLmdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleChwKTtyZXR1cm4gbn0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFVCTElDIEtFWVwiKTt2YXIgbj10aGlzLmdldEtleUZyb21QdWJsaWNQS0NTOEhleChwKTtyZXR1cm4gbn0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMucGFyc2VQdWJsaWNQS0NTOEhleChvKTtpZihuLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dmFyIHI9dGhpcy5wYXJzZVB1YmxpY1Jhd1JTQUtleUhleChuLmtleSk7dmFyIHA9bmV3IFJTQUtleSgpO3Auc2V0UHVibGljKHIubixyLmUpO3JldHVybiBwfWVsc2V7aWYobi5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW24uYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrbi5hbGdwYXJhbX12YXIgcT1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbbi5hbGdwYXJhbV07dmFyIHA9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpxLHB1YjpuLmtleX0pO3JldHVybiBwfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnb3JpdGhtXCJ9fX0scGFyc2VQdWJsaWNSYXdSU0FLZXlIZXg6ZnVuY3Rpb24ocCl7dmFyIG49e307aWYocC5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDEpXCJ9dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocCwwKTtpZihvLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAyKVwifWlmKHAuc3Vic3RyKG9bMF0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAzKVwifW4ubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLG9bMF0pO2lmKHAuc3Vic3RyKG9bMV0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDA0KVwifW4uZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLG9bMV0pO3JldHVybiBufSxwYXJzZVByaXZhdGVSYXdSU0FLZXlIZXhBdE9iajpmdW5jdGlvbihvLHEpe3ZhciBwPXEua2V5aWR4O2lmKG8uc3Vic3RyKHAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobyxwKTtpZihuLmxlbmd0aCE9OSl7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9cS5rZXk9e307cS5rZXkubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMV0pO3Eua2V5LmU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzJdKTtxLmtleS5kPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sblszXSk7cS5rZXkucD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNF0pO3Eua2V5LnE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzVdKTtxLmtleS5kcD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNl0pO3Eua2V5LmRxPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls3XSk7cS5rZXkuY289QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzhdKX0scGFyc2VQcml2YXRlUmF3RUNLZXlIZXhBdE9iajpmdW5jdGlvbihvLHEpe3ZhciBwPXEua2V5aWR4O2lmKG8uc3Vic3RyKHAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBFQ0MgcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobyxwKTtpZihuLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBFQ0MgcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYoby5zdWJzdHIoblsxXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIEVDQyBwcml2YXRlIGtleShjb2RlOjAwMylcIn1xLmtleT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMV0pfSxwYXJzZVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBvPXt9O28uYWxncGFyYW09bnVsbDt2YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLDApO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitwLmxlbmd0aH12YXIgcj1wWzBdO2lmKHEuc3Vic3RyKHIsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAxKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscik7aWYobi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMilcIn1pZihxLnN1YnN0cihuWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMylcIn1vLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMF0pO2lmKHEuc3Vic3RyKG5bMV0sMik9PVwiMDZcIil7by5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMV0pfWlmKHEuc3Vic3RyKHBbMV0sMikhPVwiMDNcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDA0KVwifW8ua2V5PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsxXSkuc3Vic3RyKDIpO3JldHVybiBvfSxnZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24ocil7dmFyIHE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoociwwKTtpZihxLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrcS5sZW5ndGh9dmFyIHA9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihyLHFbMF0pO2lmKHAhPVwiMzAwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwXCIpe3Rocm93XCJQS0NTOCBBbGdvcml0aG1JZCBpcyBub3QgcnNhRW5jcnlwdGlvblwifWlmKHIuc3Vic3RyKHFbMV0sMikhPVwiMDNcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IEJJVFNUUklORyBlbmNhcHNsYXRlZC5cIn12YXIgdD1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHIscVsxXSkrMjtpZihyLnN1YnN0cih0LDIpIT1cIjMwXCIpe3Rocm93XCJQS0NTOCBQdWJsaWMgS2V5IGlzIG5vdCBTRVFVRU5DRS5cIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLHQpO2lmKG4ubGVuZ3RoIT0yKXt0aHJvd1wiaW5uZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIituLmxlbmd0aH1pZihyLnN1YnN0cihuWzBdLDIpIT1cIjAyXCIpe3Rocm93XCJOIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9aWYoci5zdWJzdHIoblsxXSwyKSE9XCIwMlwiKXt0aHJvd1wiRSBpcyBub3QgQVNOLjEgSU5URUdFUlwifXZhciB1PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIsblswXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixuWzFdKTt2YXIgbz1uZXcgUlNBS2V5KCk7by5zZXRQdWJsaWModSxzKTtyZXR1cm4gb30sfX0oKTtcbi8qISBrZXl1dGlsLTEuMC4xMy5qcyAoYykgMjAxMy0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBLRVlVVElMPWZ1bmN0aW9uKCl7dmFyIGQ9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBrKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBlPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gayhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgYT1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGsoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGs9ZnVuY3Rpb24ocyx4LHUscSl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHQ9e307dC5rZXk9dzt0Lml2PXA7dC5jaXBoZXJ0ZXh0PXI7dmFyIHY9cy5kZWNyeXB0KHQsdyx7aXY6cH0pO3JldHVybiBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh2KX07dmFyIGw9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBnKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBvPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gZyhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgZj1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGcoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGc9ZnVuY3Rpb24odCx5LHYscSl7dmFyIHM9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh5KTt2YXIgeD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHc9dC5lbmNyeXB0KHMseCx7aXY6cH0pO3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uody50b1N0cmluZygpKTt2YXIgdT1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShyKTtyZXR1cm4gdX07dmFyIGk9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpkLGVwcm9jOmwsa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6ZCxlcHJvYzpsLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmQsZXByb2M6bCxrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZSxlcHJvYzpvLGtleWxlbjoyNCxpdmxlbjo4fSxcIkRFUy1DQkNcIjp7cHJvYzphLGVwcm9jOmYsa2V5bGVuOjgsaXZsZW46OH19O3ZhciBjPWZ1bmN0aW9uKHApe3JldHVybiBpW3BdW1wicHJvY1wiXX07dmFyIG09ZnVuY3Rpb24ocCl7dmFyIHI9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20ocCk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocik7cmV0dXJuIHF9O3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciB1PXt9O2lmKHQubWF0Y2gobmV3IFJlZ0V4cChcIkRFSy1JbmZvOiAoW14sXSspLChbMC05QS1GYS1mXSspXCIsXCJtXCIpKSl7dS5jaXBoZXI9UmVnRXhwLiQxO3UuaXZzYWx0PVJlZ0V4cC4kMn1pZih0Lm1hdGNoKG5ldyBSZWdFeHAoXCItLS0tLUJFR0lOIChbQS1aXSspIFBSSVZBVEUgS0VZLS0tLS1cIikpKXt1LnR5cGU9UmVnRXhwLiQxfXZhciByPS0xO3ZhciB2PTA7aWYodC5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpIT0tMSl7cj10LmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIik7dj0yfWlmKHQuaW5kZXhPZihcIlxcblxcblwiKSE9LTEpe3I9dC5pbmRleE9mKFwiXFxuXFxuXCIpO3Y9MX12YXIgcT10LmluZGV4T2YoXCItLS0tLUVORFwiKTtpZihyIT0tMSYmcSE9LTEpe3ZhciBwPXQuc3Vic3RyaW5nKHIrdioyLHEtdik7cD1wLnJlcGxhY2UoL1xccysvZyxcIlwiKTt1LmRhdGE9cH1yZXR1cm4gdX07dmFyIGo9ZnVuY3Rpb24ocSx5LHApe3ZhciB2PXAuc3Vic3RyaW5nKDAsMTYpO3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHI9Q3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoeSk7dmFyIHU9aVtxXVtcImtleWxlblwiXStpW3FdW1wiaXZsZW5cIl07dmFyIHg9XCJcIjt2YXIgdz1udWxsO2Zvcig7Oyl7dmFyIHM9Q3J5cHRvSlMuYWxnby5NRDUuY3JlYXRlKCk7aWYodyE9bnVsbCl7cy51cGRhdGUodyl9cy51cGRhdGUocik7cy51cGRhdGUodCk7dz1zLmZpbmFsaXplKCk7eD14K0NyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHcpO2lmKHgubGVuZ3RoPj11KjIpe2JyZWFrfX12YXIgej17fTt6LmtleWhleD14LnN1YnN0cigwLGlbcV1bXCJrZXlsZW5cIl0qMik7ei5pdmhleD14LnN1YnN0cihpW3FdW1wia2V5bGVuXCJdKjIsaVtxXVtcIml2bGVuXCJdKjIpO3JldHVybiB6fTt2YXIgYj1mdW5jdGlvbihwLHYscix3KXt2YXIgcz1DcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHApO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3ZhciB1PWlbdl1bXCJwcm9jXCJdO3ZhciB0PXUocSxyLHcpO3JldHVybiB0fTt2YXIgaD1mdW5jdGlvbihwLHMscSx1KXt2YXIgcj1pW3NdW1wiZXByb2NcIl07dmFyIHQ9cihwLHEsdSk7cmV0dXJuIHR9O3JldHVybnt2ZXJzaW9uOlwiMS4wLjBcIixnZXRIZXhGcm9tUEVNOmZ1bmN0aW9uKHEsdSl7dmFyIHI9cTtpZihyLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKT09LTEpe3Rocm93XCJjYW4ndCBmaW5kIFBFTSBoZWFkZXI6IFwiK3V9aWYodHlwZW9mIHU9PVwic3RyaW5nXCImJnUhPVwiXCIpe3I9ci5yZXBsYWNlKFwiLS0tLS1CRUdJTiBcIit1K1wiLS0tLS1cIixcIlwiKTtyPXIucmVwbGFjZShcIi0tLS0tRU5EIFwiK3UrXCItLS0tLVwiLFwiXCIpfWVsc2V7cj1yLnJlcGxhY2UoLy0tLS0tQkVHSU4gW14tXSstLS0tLS8sXCJcIik7cj1yLnJlcGxhY2UoLy0tLS0tRU5EIFteLV0rLS0tLS0vLFwiXCIpfXZhciB0PXIucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBwPWI2NHRvaGV4KHQpO3JldHVybiBwfSxnZXREZWNyeXB0ZWRLZXlIZXhCeUtleUlWOmZ1bmN0aW9uKHEsdCxzLHIpe3ZhciBwPWModCk7cmV0dXJuIHAocSxzLHIpfSxwYXJzZVBLQ1M1UEVNOmZ1bmN0aW9uKHApe3JldHVybiBuKHApfSxnZXRLZXlBbmRVbnVzZWRJdkJ5UGFzc2NvZGVBbmRJdnNhbHQ6ZnVuY3Rpb24ocSxwLHIpe3JldHVybiBqKHEscCxyKX0sZGVjcnlwdEtleUI2NDpmdW5jdGlvbihwLHIscSxzKXtyZXR1cm4gYihwLHIscSxzKX0sZ2V0RGVjcnlwdGVkS2V5SGV4OmZ1bmN0aW9uKHkseCl7dmFyIHE9bih5KTt2YXIgdD1xLnR5cGU7dmFyIHI9cS5jaXBoZXI7dmFyIHA9cS5pdnNhbHQ7dmFyIHM9cS5kYXRhO3ZhciB3PWoocix4LHApO3ZhciB2PXcua2V5aGV4O3ZhciB1PWIocyxyLHYscCk7cmV0dXJuIHV9LGdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTNVBFTTpmdW5jdGlvbihyLHEpe3ZhciBzPXRoaXMuZ2V0RGVjcnlwdGVkS2V5SGV4KHIscSk7dmFyIHA9bmV3IFJTQUtleSgpO3AucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhzKTtyZXR1cm4gcH0sZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4OmZ1bmN0aW9uKHgscyxBLHQscil7dmFyIHA9XCJcIjtpZih0eXBlb2YgdD09XCJ1bmRlZmluZWRcInx8dD09bnVsbCl7dD1cIkFFUy0yNTYtQ0JDXCJ9aWYodHlwZW9mIGlbdF09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJLRVlVVElMIHVuc3VwcG9ydGVkIGFsZ29yaXRobTogXCIrdH1pZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7dmFyIHY9aVt0XVtcIml2bGVuXCJdO3ZhciB1PW0odik7cj11LnRvVXBwZXJDYXNlKCl9dmFyIHo9aih0LEEscik7dmFyIHk9ei5rZXloZXg7dmFyIHc9aChzLHQseSxyKTt2YXIgcT13LnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO3ZhciBwPVwiLS0tLS1CRUdJTiBcIit4K1wiIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtwKz1cIlByb2MtVHlwZTogNCxFTkNSWVBURURcXHJcXG5cIjtwKz1cIkRFSy1JbmZvOiBcIit0K1wiLFwiK3IrXCJcXHJcXG5cIjtwKz1cIlxcclxcblwiO3ArPXE7cCs9XCJcXHJcXG4tLS0tLUVORCBcIit4K1wiIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtyZXR1cm4gcH0sZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5OmZ1bmN0aW9uKEQsRSxyLHQpe3ZhciBCPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dmFyIHc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5ufSk7dmFyIEE9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOkQuZX0pO3ZhciBDPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZH0pO3ZhciB1PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQucH0pO3ZhciBzPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQucX0pO3ZhciB6PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZG1wMX0pO3ZhciB2PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZG1xMX0pO3ZhciB5PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuY29lZmZ9KTt2YXIgRj1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbQix3LEEsQyx1LHMseix2LHldfSk7dmFyIHg9Ri5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiUlNBXCIseCxFLHIsdCl9LG5ld0VuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKHAscSx0LHUpe2lmKHR5cGVvZiBxPT1cInVuZGVmaW5lZFwifHxxPT1udWxsKXtxPTEwMjR9aWYodHlwZW9mIHQ9PVwidW5kZWZpbmVkXCJ8fHQ9PW51bGwpe3Q9XCIxMDAwMVwifXZhciByPW5ldyBSU0FLZXkoKTtyLmdlbmVyYXRlKHEsdCk7dmFyIHM9bnVsbDtpZih0eXBlb2YgdT09XCJ1bmRlZmluZWRcInx8dT09bnVsbCl7cz10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShyLHApfWVsc2V7cz10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShyLHAsdSl9cmV0dXJuIHN9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4UEVNOmZ1bmN0aW9uKHIpe2lmKHIubWF0Y2goL0VOQ1JZUFRFRC8pKXt0aHJvd1wicGVtIHNoYWxsIGJlIG5vdCBFTkNSWVBURURcIn12YXIgcT10aGlzLmdldEhleEZyb21QRU0ocixcIlBSSVZBVEUgS0VZXCIpO3ZhciBwPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgocSk7cmV0dXJuIHB9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4OmZ1bmN0aW9uKHMpe3ZhciByPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsMCk7aWYoci5sZW5ndGghPTMpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDMgZWxlbWVudHM6IFwiK3IubGVuZ3RofXZhciBxPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzFdKTtpZihxIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWRlbnRpZmllciBpcyBub3QgcnNhRW5jOiBcIitxfXZhciBxPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzFdKTt2YXIgdD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHMsclsyXSk7dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodCwwKTt2YXIgcD1uZXcgUlNBS2V5KCk7cC5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHUpO3JldHVybiBwfSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24odyl7dmFyIHM9e307dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodywwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDApLml0ZW1zICE9IDI6IFwiK3IubGVuZ3RofXMuY2lwaGVydGV4dD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHJbMV0pO3ZhciB5PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcsclswXSk7aWYoeS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjApLml0ZW1zICE9IDI6IFwiK3kubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcseVswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBkXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQkVTMlwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcseVsxXSk7aWYoeS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrcC5sZW5ndGh9dmFyIHE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxwWzFdKTtpZihxLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjEpLml0ZW1zICE9IDI6IFwiK3EubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcscVswXSkhPVwiMmE4NjQ4ODZmNzBkMDMwN1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIFRyaXBsZURFU1wifXMuZW5jcnlwdGlvblNjaGVtZUFsZz1cIlRyaXBsZURFU1wiO3MuZW5jcnlwdGlvblNjaGVtZUlWPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcscVsxXSk7dmFyIHQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxwWzBdKTtpZih0Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjApLml0ZW1zICE9IDI6IFwiK3QubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcsdFswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBjXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQktERjJcIn12YXIgeD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHRbMV0pO2lmKHgubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIreC5sZW5ndGh9cy5wYmtkZjJTYWx0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcseFswXSk7dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx4WzFdKTt0cnl7cy5wYmtkZjJJdGVyPXBhcnNlSW50KHUsMTYpfWNhdGNoKHYpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0IHBia2RmMkl0ZXI6IFwiK3V9cmV0dXJuIHN9LGdldFBCS0RGMktleUhleEZyb21QYXJhbTpmdW5jdGlvbih1LHApe3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodS5wYmtkZjJTYWx0KTt2YXIgcT11LnBia2RmMkl0ZXI7dmFyIHM9Q3J5cHRvSlMuUEJLREYyKHAsdCx7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczpxfSk7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocyk7cmV0dXJuIHJ9LGdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24oeCx5KXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0oeCxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKTt2YXIgcD10aGlzLnBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTOChyKTt2YXIgdT1LRVlVVElMLmdldFBCS0RGMktleUhleEZyb21QYXJhbShwLHkpO3ZhciB2PXt9O3YuY2lwaGVydGV4dD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHAuY2lwaGVydGV4dCk7dmFyIHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh1KTt2YXIgcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHAuZW5jcnlwdGlvblNjaGVtZUlWKTt2YXIgdz1DcnlwdG9KUy5UcmlwbGVERVMuZGVjcnlwdCh2LHQse2l2OnN9KTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh3KTtyZXR1cm4gcX0sZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHMscil7dmFyIHE9dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHMscik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleChxKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHMscSl7dmFyIHA9dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHMscSk7dmFyIHI9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgocCk7cmV0dXJuIHJ9LHBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24ocyl7dmFyIHE9e307cS5hbGdwYXJhbT1udWxsO2lmKHMuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBwbGFpbiBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLDApO2lmKHIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAyKVwifWlmKHMuc3Vic3RyKHJbMV0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMylcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLHJbMV0pO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA0KVwifWlmKHMuc3Vic3RyKHBbMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNSlcIn1xLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMF0pO2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMDZcIil7cS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMV0pfWlmKHMuc3Vic3RyKHJbMl0sMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNilcIn1xLmtleWlkeD1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHMsclsyXSk7cmV0dXJuIHF9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0ocSxcIlBSSVZBVEUgS0VZXCIpO3ZhciByPXRoaXMuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4KHApO3JldHVybiByfSxnZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24ocCl7dmFyIHc9dGhpcy5wYXJzZVBsYWluUHJpdmF0ZVBLQ1M4SGV4KHApO2lmKHcuYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqKHAsdyk7dmFyIHU9dy5rZXk7dmFyIHo9bmV3IFJTQUtleSgpO3ouc2V0UHJpdmF0ZUV4KHUubix1LmUsdS5kLHUucCx1LnEsdS5kcCx1LmRxLHUuY28pO3JldHVybiB6fWVsc2V7aWYody5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7dGhpcy5wYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqKHAsdyk7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3cuYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrdy5hbGdwYXJhbX12YXIgdj1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbdy5hbGdwYXJhbV07dmFyIHo9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp2fSk7ei5zZXRQdWJsaWNLZXlIZXgody5wdWJrZXkpO3ouc2V0UHJpdmF0ZUtleUhleCh3LmtleSk7ei5pc1B1YmxpYz1mYWxzZTtyZXR1cm4gen1lbHNle2lmKHcuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciB0PUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwwXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwxXSxcIjAyXCIpO3ZhciB5PUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwyXSxcIjAyXCIpO3ZhciBCPUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzIsMF0sXCIwMlwiKTt2YXIgcj1uZXcgQmlnSW50ZWdlcih0LDE2KTt2YXIgcT1uZXcgQmlnSW50ZWdlcihzLDE2KTt2YXIgeD1uZXcgQmlnSW50ZWdlcih5LDE2KTt2YXIgQT1uZXcgQmlnSW50ZWdlcihCLDE2KTt2YXIgej1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7ei5zZXRQcml2YXRlKHIscSx4LG51bGwsQSk7cmV0dXJuIHp9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX19LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0ocSxcIlBVQkxJQyBLRVlcIik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXgocik7cmV0dXJuIHB9LGdldEtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0ocSxcIlBVQkxJQyBLRVlcIik7dmFyIHA9dGhpcy5nZXRLZXlGcm9tUHVibGljUEtDUzhIZXgocik7cmV0dXJuIHB9LGdldEtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgcD10aGlzLnBhcnNlUHVibGljUEtDUzhIZXgocSk7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3ZhciB1PXRoaXMucGFyc2VQdWJsaWNSYXdSU0FLZXlIZXgocC5rZXkpO3ZhciByPW5ldyBSU0FLZXkoKTtyLnNldFB1YmxpYyh1Lm4sdS5lKTtyZXR1cm4gcn1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXT09PXVuZGVmaW5lZCl7dGhyb3dcIktKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZSB1bmRlZmluZWQ6IFwiK3AuYWxncGFyYW19dmFyIHM9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3AuYWxncGFyYW1dO3ZhciByPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6cyxwdWI6cC5rZXl9KTtyZXR1cm4gcn1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciB0PXAuYWxncGFyYW07dmFyIHY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocC5rZXksMCk7dmFyIHI9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3Iuc2V0UHVibGljKG5ldyBCaWdJbnRlZ2VyKHQucCwxNiksbmV3IEJpZ0ludGVnZXIodC5xLDE2KSxuZXcgQmlnSW50ZWdlcih0LmcsMTYpLG5ldyBCaWdJbnRlZ2VyKHYsMTYpKTtyZXR1cm4gcn1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZ29yaXRobVwifX19fSxwYXJzZVB1YmxpY1Jhd1JTQUtleUhleDpmdW5jdGlvbihyKXt2YXIgcD17fTtpZihyLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMSlcIn12YXIgcT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLDApO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDIpXCJ9aWYoci5zdWJzdHIocVswXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDMpXCJ9cC5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIscVswXSk7aWYoci5zdWJzdHIocVsxXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDQpXCJ9cC5lPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIscVsxXSk7cmV0dXJuIHB9LHBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqOmZ1bmN0aW9uKHEscyl7dmFyIHI9cy5rZXlpZHg7aWYocS5zdWJzdHIociwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLHIpO2lmKHAubGVuZ3RoIT05KXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMilcIn1zLmtleT17fTtzLmtleS5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsxXSk7cy5rZXkuZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbMl0pO3Mua2V5LmQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzNdKTtzLmtleS5wPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs0XSk7cy5rZXkucT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbNV0pO3Mua2V5LmRwPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs2XSk7cy5rZXkuZHE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzddKTtzLmtleS5jbz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbOF0pfSxwYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqOmZ1bmN0aW9uKHAsdCl7dmFyIHE9dC5rZXlpZHg7dmFyIHI9QVNOMUhFWC5nZXRWYnlMaXN0KHAscSxbMV0sXCIwNFwiKTt2YXIgcz1BU04xSEVYLmdldFZieUxpc3QocCxxLFsyLDBdLFwiMDNcIikuc3Vic3RyKDIpO3Qua2V5PXI7dC5wdWJrZXk9c30scGFyc2VQdWJsaWNQS0NTOEhleDpmdW5jdGlvbihzKXt2YXIgcT17fTtxLmFsZ3BhcmFtPW51bGw7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocywwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrci5sZW5ndGh9dmFyIHQ9clswXTtpZihzLnN1YnN0cih0LDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMSlcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLHQpO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDIpXCJ9aWYocy5zdWJzdHIocFswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDMpXCJ9cS5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzBdKTtpZihzLnN1YnN0cihwWzFdLDIpPT1cIjA2XCIpe3EuYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzFdKX1lbHNle2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMzBcIil7cS5hbGdwYXJhbT17fTtxLmFsZ3BhcmFtLnA9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMF0sXCIwMlwiKTtxLmFsZ3BhcmFtLnE9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMV0sXCIwMlwiKTtxLmFsZ3BhcmFtLmc9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMl0sXCIwMlwiKX19aWYocy5zdWJzdHIoclsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDQpXCJ9cS5rZXk9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxyWzFdKS5zdWJzdHIoMik7cmV0dXJuIHF9LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbih0KXt2YXIgcz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih0LDApO2lmKHMubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitzLmxlbmd0aH12YXIgcj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHQsc1swXSk7aWYociE9XCIzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwMTA1MDBcIil7dGhyb3dcIlBLQ1M4IEFsZ29yaXRobUlkIGlzIG5vdCByc2FFbmNyeXB0aW9uXCJ9aWYodC5zdWJzdHIoc1sxXSwyKSE9XCIwM1wiKXt0aHJvd1wiUEtDUzggUHVibGljIEtleSBpcyBub3QgQklUU1RSSU5HIGVuY2Fwc2xhdGVkLlwifXZhciB2PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoodCxzWzFdKSsyO2lmKHQuc3Vic3RyKHYsMikhPVwiMzBcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IFNFUVVFTkNFLlwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHQsdik7aWYocC5sZW5ndGghPTIpe3Rocm93XCJpbm5lciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3AubGVuZ3RofWlmKHQuc3Vic3RyKHBbMF0sMikhPVwiMDJcIil7dGhyb3dcIk4gaXMgbm90IEFTTi4xIElOVEVHRVJcIn1pZih0LnN1YnN0cihwWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJFIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9dmFyIHc9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodCxwWzBdKTt2YXIgdT1BU04xSEVYLmdldEhleE9mVl9BdE9iaih0LHBbMV0pO3ZhciBxPW5ldyBSU0FLZXkoKTtxLnNldFB1YmxpYyh3LHUpO3JldHVybiBxfSx9fSgpO0tFWVVUSUwuZ2V0S2V5PWZ1bmN0aW9uKGYsZSxoKXtpZih0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZmIGluc3RhbmNlb2YgUlNBS2V5KXtyZXR1cm4gZn1pZih0eXBlb2YgS0pVUi5jcnlwdG8uRUNEU0EhPVwidW5kZWZpbmVkXCImJmYgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7cmV0dXJuIGZ9aWYodHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmZiBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7cmV0dXJuIGZ9aWYoZi5jdXJ2ZSE9PXVuZGVmaW5lZCYmZi54eSE9PXVuZGVmaW5lZCYmZi5kPT09dW5kZWZpbmVkKXtyZXR1cm4gbmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtwdWI6Zi54eSxjdXJ2ZTpmLmN1cnZlfSl9aWYoZi5jdXJ2ZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkKXtyZXR1cm4gbmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtwcnY6Zi5kLGN1cnZlOmYuY3VydmV9KX1pZihmLmt0eT09PXVuZGVmaW5lZCYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHVibGljKGYubixmLmUpO3JldHVybiB3fWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5kcCE9PXVuZGVmaW5lZCYmZi5kcSE9PXVuZGVmaW5lZCYmZi5jbyE9PXVuZGVmaW5lZCYmZi5xaT09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZUV4KGYubixmLmUsZi5kLGYucCxmLnEsZi5kcCxmLmRxLGYuY28pO3JldHVybiB3fWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnA9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGUoZi5uLGYuZSxmLmQpO3JldHVybiB3fWlmKGYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmchPT11bmRlZmluZWQmJmYueSE9PXVuZGVmaW5lZCYmZi54PT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQdWJsaWMoZi5wLGYucSxmLmcsZi55KTtyZXR1cm4gd31pZihmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5nIT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYueCE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShmLnAsZi5xLGYuZyxmLnksZi54KTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQ9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFB1YmxpYyhiNjR1dG9oZXgoZi5uKSxiNjR1dG9oZXgoZi5lKSk7cmV0dXJuIHd9aWYoZi5rdHk9PT1cIlJTQVwiJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5kcCE9PXVuZGVmaW5lZCYmZi5kcSE9PXVuZGVmaW5lZCYmZi5xaSE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZUV4KGI2NHV0b2hleChmLm4pLGI2NHV0b2hleChmLmUpLGI2NHV0b2hleChmLmQpLGI2NHV0b2hleChmLnApLGI2NHV0b2hleChmLnEpLGI2NHV0b2hleChmLmRwKSxiNjR1dG9oZXgoZi5kcSksYjY0dXRvaGV4KGYucWkpKTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGUoYjY0dXRvaGV4KGYubiksYjY0dXRvaGV4KGYuZSksYjY0dXRvaGV4KGYuZCkpO3JldHVybiB3fWlmKGYua3R5PT09XCJFQ1wiJiZmLmNydiE9PXVuZGVmaW5lZCYmZi54IT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIGQ9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpmLmNydn0pO3ZhciBsPWQuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIHI9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLngpKS5zbGljZSgtbCk7dmFyIG49KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLnkpKS5zbGljZSgtbCk7dmFyIG09XCIwNFwiK3IrbjtkLnNldFB1YmxpY0tleUhleChtKTtyZXR1cm4gZH1pZihmLmt0eT09PVwiRUNcIiYmZi5jcnYhPT11bmRlZmluZWQmJmYueCE9PXVuZGVmaW5lZCYmZi55IT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3ZhciBkPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6Zi5jcnZ9KTt2YXIgbD1kLmVjcGFyYW1zLmtleWxlbi80O3ZhciByPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgoZi54KSkuc2xpY2UoLWwpO3ZhciBuPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgoZi55KSkuc2xpY2UoLWwpO3ZhciBtPVwiMDRcIityK247dmFyIGE9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLmQpKS5zbGljZSgtbCk7ZC5zZXRQdWJsaWNLZXlIZXgobSk7ZC5zZXRQcml2YXRlS2V5SGV4KGEpO3JldHVybiBkfWlmKGYuaW5kZXhPZihcIi1FTkQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxmLmluZGV4T2YoXCItRU5EIFg1MDkgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxmLmluZGV4T2YoXCItRU5EIFRSVVNURUQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xKXtyZXR1cm4gWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTShmKX1pZihoPT09XCJwa2NzOHB1YlwiKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tUHVibGljUEtDUzhIZXgoZil9aWYoZi5pbmRleE9mKFwiLUVORCBQVUJMSUMgS0VZLVwiKSE9LTEpe3JldHVybiBLRVlVVElMLmdldEtleUZyb21QdWJsaWNQS0NTOFBFTShmKX1pZihoPT09XCJwa2NzNXBydlwiKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGYpO3JldHVybiB3fWlmKGg9PT1cInBrY3M1cHJ2XCIpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoZik7cmV0dXJuIHd9aWYoZi5pbmRleE9mKFwiLUVORCBSU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIik9PS0xKXt2YXIgaT1LRVlVVElMLmdldEhleEZyb21QRU0oZixcIlJTQSBQUklWQVRFIEtFWVwiKTtyZXR1cm4gS0VZVVRJTC5nZXRLZXkoaSxudWxsLFwicGtjczVwcnZcIil9aWYoZi5pbmRleE9mKFwiLUVORCBEU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIik9PS0xKXt2YXIgdT10aGlzLmdldEhleEZyb21QRU0oZixcIkRTQSBQUklWQVRFIEtFWVwiKTt2YXIgdD1BU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzJdLFwiMDJcIik7dmFyIHY9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbM10sXCIwMlwiKTt2YXIgaj1BU04xSEVYLmdldFZieUxpc3QodSwwLFs0XSxcIjAyXCIpO3ZhciBrPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzVdLFwiMDJcIik7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShuZXcgQmlnSW50ZWdlcih0LDE2KSxuZXcgQmlnSW50ZWdlcihzLDE2KSxuZXcgQmlnSW50ZWdlcih2LDE2KSxuZXcgQmlnSW50ZWdlcihqLDE2KSxuZXcgQmlnSW50ZWdlcihrLDE2KSk7cmV0dXJuIHd9aWYoZi5pbmRleE9mKFwiLUVORCBQUklWQVRFIEtFWS1cIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhQRU0oZil9aWYoZi5pbmRleE9mKFwiLUVORCBSU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzVQRU0oZixlKX1pZihmLmluZGV4T2YoXCItRU5EIEVDIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7dmFyIHU9S0VZVVRJTC5nZXREZWNyeXB0ZWRLZXlIZXgoZixlKTt2YXIgdz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjA0XCIpO3ZhciBjPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzIsMF0sXCIwNlwiKTt2YXIgbz1BU04xSEVYLmdldFZieUxpc3QodSwwLFszLDBdLFwiMDNcIikuc3Vic3RyKDIpO3ZhciBiPVwiXCI7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW2NdIT09dW5kZWZpbmVkKXtiPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtjXX1lbHNle3Rocm93XCJ1bmRlZmluZWQgT0lEKGhleCkgaW4gS0pVUi5jcnlwdG8uT0lEOiBcIitjfXZhciBkPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7bmFtZTpifSk7ZC5zZXRQdWJsaWNLZXlIZXgobyk7ZC5zZXRQcml2YXRlS2V5SGV4KHcpO2QuaXNQdWJsaWM9ZmFsc2U7cmV0dXJuIGR9aWYoZi5pbmRleE9mKFwiLUVORCBEU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIikhPS0xKXt2YXIgdT1LRVlVVElMLmdldERlY3J5cHRlZEtleUhleChmLGUpO3ZhciB0PUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzFdLFwiMDJcIik7dmFyIHM9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMl0sXCIwMlwiKTt2YXIgdj1BU04xSEVYLmdldFZieUxpc3QodSwwLFszXSxcIjAyXCIpO3ZhciBqPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzRdLFwiMDJcIik7dmFyIGs9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbNV0sXCIwMlwiKTt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQcml2YXRlKG5ldyBCaWdJbnRlZ2VyKHQsMTYpLG5ldyBCaWdJbnRlZ2VyKHMsMTYpLG5ldyBCaWdJbnRlZ2VyKHYsMTYpLG5ldyBCaWdJbnRlZ2VyKGosMTYpLG5ldyBCaWdJbnRlZ2VyKGssMTYpKTtyZXR1cm4gd31pZihmLmluZGV4T2YoXCItRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS1cIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU0oZixlKX10aHJvd1wibm90IHN1cHBvcnRlZCBhcmd1bWVudFwifTtLRVlVVElMLmdlbmVyYXRlS2V5cGFpcj1mdW5jdGlvbihhLGMpe2lmKGE9PVwiUlNBXCIpe3ZhciBiPWM7dmFyIGg9bmV3IFJTQUtleSgpO2guZ2VuZXJhdGUoYixcIjEwMDAxXCIpO2guaXNQcml2YXRlPXRydWU7aC5pc1B1YmxpYz10cnVlO3ZhciBmPW5ldyBSU0FLZXkoKTt2YXIgZT1oLm4udG9TdHJpbmcoMTYpO3ZhciBpPWguZS50b1N0cmluZygxNik7Zi5zZXRQdWJsaWMoZSxpKTtmLmlzUHJpdmF0ZT1mYWxzZTtmLmlzUHVibGljPXRydWU7dmFyIGs9e307ay5wcnZLZXlPYmo9aDtrLnB1YktleU9iaj1mO3JldHVybiBrfWVsc2V7aWYoYT09XCJFQ1wiKXt2YXIgZD1jO3ZhciBnPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZH0pO3ZhciBqPWcuZ2VuZXJhdGVLZXlQYWlySGV4KCk7dmFyIGg9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpkfSk7aC5zZXRQdWJsaWNLZXlIZXgoai5lY3B1YmhleCk7aC5zZXRQcml2YXRlS2V5SGV4KGouZWNwcnZoZXgpO2guaXNQcml2YXRlPXRydWU7aC5pc1B1YmxpYz1mYWxzZTt2YXIgZj1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmR9KTtmLnNldFB1YmxpY0tleUhleChqLmVjcHViaGV4KTtmLmlzUHJpdmF0ZT1mYWxzZTtmLmlzUHVibGljPXRydWU7dmFyIGs9e307ay5wcnZLZXlPYmo9aDtrLnB1YktleU9iaj1mO3JldHVybiBrfWVsc2V7dGhyb3dcInVua25vd24gYWxnb3JpdGhtOiBcIithfX19O0tFWVVUSUwuZ2V0UEVNPWZ1bmN0aW9uKGEscixvLGcsail7dmFyIHY9S0pVUi5hc24xO3ZhciB1PUtKVVIuY3J5cHRvO2Z1bmN0aW9uIHAocyl7dmFyIHc9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7XCJpbnRcIjp7YmlnaW50OnMubn19LHtcImludFwiOnMuZX0se1wiaW50XCI6e2JpZ2ludDpzLmR9fSx7XCJpbnRcIjp7YmlnaW50OnMucH19LHtcImludFwiOntiaWdpbnQ6cy5xfX0se1wiaW50XCI6e2JpZ2ludDpzLmRtcDF9fSx7XCJpbnRcIjp7YmlnaW50OnMuZG1xMX19LHtcImludFwiOntiaWdpbnQ6cy5jb2VmZn19XX0pO3JldHVybiB3fWZ1bmN0aW9uIHEodyl7dmFyIHM9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjoxfSx7b2N0c3RyOntoZXg6dy5wcnZLZXlIZXh9fSx7dGFnOltcImEwXCIsdHJ1ZSx7b2lkOntuYW1lOncuY3VydmVOYW1lfX1dfSx7dGFnOltcImExXCIsdHJ1ZSx7Yml0c3RyOntoZXg6XCIwMFwiK3cucHViS2V5SGV4fX1dfV19KTtyZXR1cm4gc31mdW5jdGlvbiBuKHMpe3ZhciB3PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se1wiaW50XCI6e2JpZ2ludDpzLnB9fSx7XCJpbnRcIjp7YmlnaW50OnMucX19LHtcImludFwiOntiaWdpbnQ6cy5nfX0se1wiaW50XCI6e2JpZ2ludDpzLnl9fSx7XCJpbnRcIjp7YmlnaW50OnMueH19XX0pO3JldHVybiB3fWlmKCgodHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSl8fCh0eXBlb2YgdS5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiB1LkRTQSl8fCh0eXBlb2YgdS5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIHUuRUNEU0EpKSYmYS5pc1B1YmxpYz09dHJ1ZSYmKHI9PT11bmRlZmluZWR8fHI9PVwiUEtDUzhQVUJcIikpe3ZhciB0PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQVUJMSUMgS0VZXCIpfWlmKHI9PVwiUEtDUzFQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSYmKG89PT11bmRlZmluZWR8fG89PW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9cChhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJSU0EgUFJJVkFURSBLRVlcIil9aWYocj09XCJQS0NTMVBSVlwiJiZ0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJihvPT09dW5kZWZpbmVkfHxvPT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBmPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTphLmN1cnZlTmFtZX0pO3ZhciBsPWYuZ2V0RW5jb2RlZEhleCgpO3ZhciBlPXEoYSk7dmFyIGs9ZS5nZXRFbmNvZGVkSGV4KCk7dmFyIGk9XCJcIjtpKz12LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobCxcIkVDIFBBUkFNRVRFUlNcIik7aSs9di5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFQyBQUklWQVRFIEtFWVwiKTtyZXR1cm4gaX1pZihyPT1cIlBLQ1MxUFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0EmJihvPT09dW5kZWZpbmVkfHxvPT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PW4oYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiRFNBIFBSSVZBVEUgS0VZXCIpfWlmKHI9PVwiUEtDUzVQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSYmKG8hPT11bmRlZmluZWQmJm8hPW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9cChhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihnPT09dW5kZWZpbmVkKXtnPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiUlNBXCIsbSxvLGcpfWlmKHI9PVwiUEtDUzVQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkVDRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJihvIT09dW5kZWZpbmVkJiZvIT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PXEoYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYoZz09PXVuZGVmaW5lZCl7Zz1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIkVDXCIsbSxvLGcpfWlmKHI9PVwiUEtDUzVQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSYmKG8hPT11bmRlZmluZWQmJm8hPW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9bihhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihnPT09dW5kZWZpbmVkKXtnPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiRFNBXCIsbSxvLGcpfXZhciBoPWZ1bmN0aW9uKHcscyl7dmFyIHk9Yih3LHMpO3ZhciB4PW5ldyBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tzZXE6W3tvaWQ6e25hbWU6XCJwa2NzNVBCRVMyXCJ9fSx7c2VxOlt7c2VxOlt7b2lkOntuYW1lOlwicGtjczVQQktERjJcIn19LHtzZXE6W3tvY3RzdHI6e2hleDp5LnBia2RmMlNhbHR9fSx7XCJpbnRcIjp5LnBia2RmMkl0ZXJ9XX1dfSx7c2VxOlt7b2lkOntuYW1lOlwiZGVzLUVERTMtQ0JDXCJ9fSx7b2N0c3RyOntoZXg6eS5lbmNyeXB0aW9uU2NoZW1lSVZ9fV19XX1dfSx7b2N0c3RyOntoZXg6eS5jaXBoZXJ0ZXh0fX1dfSk7cmV0dXJuIHguZ2V0RW5jb2RlZEhleCgpfTt2YXIgYj1mdW5jdGlvbihELEUpe3ZhciB4PTEwMDt2YXIgQz1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSg4KTt2YXIgQj1cIkRFUy1FREUzLUNCQ1wiO3ZhciBzPUNyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKDgpO3ZhciB5PUNyeXB0b0pTLlBCS0RGMihFLEMse2tleVNpemU6MTkyLzMyLGl0ZXJhdGlvbnM6eH0pO3ZhciB6PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoRCk7dmFyIEE9Q3J5cHRvSlMuVHJpcGxlREVTLmVuY3J5cHQoeix5LHtpdjpzfSkrXCJcIjt2YXIgdz17fTt3LmNpcGhlcnRleHQ9QTt3LnBia2RmMlNhbHQ9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkoQyk7dy5wYmtkZjJJdGVyPXg7dy5lbmNyeXB0aW9uU2NoZW1lQWxnPUI7dy5lbmNyeXB0aW9uU2NoZW1lSVY9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocyk7cmV0dXJuIHd9O2lmKHI9PVwiUEtDUzhQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBkPXAoYSk7dmFyIGM9ZC5nZXRFbmNvZGVkSGV4KCk7dmFyIHQ9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7c2VxOlt7b2lkOntuYW1lOlwicnNhRW5jcnlwdGlvblwifX0se1wibnVsbFwiOnRydWV9XX0se29jdHN0cjp7aGV4OmN9fV19KTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihvPT09dW5kZWZpbmVkfHxvPT1udWxsKXtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQUklWQVRFIEtFWVwiKX1lbHNle3ZhciBrPWgobSxvKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fWlmKHI9PVwiUEtDUzhQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkVDRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZD1uZXcgS0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjoxfSx7b2N0c3RyOntoZXg6YS5wcnZLZXlIZXh9fSx7dGFnOltcImExXCIsdHJ1ZSx7Yml0c3RyOntoZXg6XCIwMFwiK2EucHViS2V5SGV4fX1dfV19KTt2YXIgYz1kLmdldEVuY29kZWRIZXgoKTt2YXIgdD1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJlY1B1YmxpY0tleVwifX0se29pZDp7bmFtZTphLmN1cnZlTmFtZX19XX0se29jdHN0cjp7aGV4OmN9fV19KTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihvPT09dW5kZWZpbmVkfHxvPT1udWxsKXtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQUklWQVRFIEtFWVwiKX1lbHNle3ZhciBrPWgobSxvKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fWlmKHI9PVwiUEtDUzhQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmEueH0pO3ZhciBjPWQuZ2V0RW5jb2RlZEhleCgpO3ZhciB0PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcImRzYVwifX0se3NlcTpbe1wiaW50XCI6e2JpZ2ludDphLnB9fSx7XCJpbnRcIjp7YmlnaW50OmEucX19LHtcImludFwiOntiaWdpbnQ6YS5nfX1dfV19LHtvY3RzdHI6e2hleDpjfX1dfSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYobz09PXVuZGVmaW5lZHx8bz09bnVsbCl7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgaz1oKG0sbyk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX10aHJvd1widW5zdXBwb3J0ZWQgb2JqZWN0IG5vciBmb3JtYXRcIn07S0VZVVRJTC5nZXRLZXlGcm9tQ1NSUEVNPWZ1bmN0aW9uKGIpe3ZhciBhPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShiLFwiQ0VSVElGSUNBVEUgUkVRVUVTVFwiKTt2YXIgYz1LRVlVVElMLmdldEtleUZyb21DU1JIZXgoYSk7cmV0dXJuIGN9O0tFWVVUSUwuZ2V0S2V5RnJvbUNTUkhleD1mdW5jdGlvbihhKXt2YXIgYz1LRVlVVElMLnBhcnNlQ1NSSGV4KGEpO3ZhciBiPUtFWVVUSUwuZ2V0S2V5KGMucDhwdWJrZXloZXgsbnVsbCxcInBrY3M4cHViXCIpO3JldHVybiBifTtLRVlVVElMLnBhcnNlQ1NSSGV4PWZ1bmN0aW9uKGMpe3ZhciBiPXt9O3ZhciBlPWM7aWYoZS5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwMSlcIn12YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLDApO2lmKGQubGVuZ3RoPDEpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAyKVwifWlmKGUuc3Vic3RyKGRbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDMpXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxkWzBdKTtpZihhLmxlbmd0aDwzKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwNClcIn1iLnA4cHVia2V5aGV4PUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZSxhWzJdKTtyZXR1cm4gYn07S0VZVVRJTC5nZXRKV0tGcm9tS2V5PWZ1bmN0aW9uKGQpe3ZhciBiPXt9O2lmKGQgaW5zdGFuY2VvZiBSU0FLZXkmJmQuaXNQcml2YXRlKXtiLmt0eT1cIlJTQVwiO2Iubj1oZXh0b2I2NHUoZC5uLnRvU3RyaW5nKDE2KSk7Yi5lPWhleHRvYjY0dShkLmUudG9TdHJpbmcoMTYpKTtiLmQ9aGV4dG9iNjR1KGQuZC50b1N0cmluZygxNikpO2IucD1oZXh0b2I2NHUoZC5wLnRvU3RyaW5nKDE2KSk7Yi5xPWhleHRvYjY0dShkLnEudG9TdHJpbmcoMTYpKTtiLmRwPWhleHRvYjY0dShkLmRtcDEudG9TdHJpbmcoMTYpKTtiLmRxPWhleHRvYjY0dShkLmRtcTEudG9TdHJpbmcoMTYpKTtiLnFpPWhleHRvYjY0dShkLmNvZWZmLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGJ9ZWxzZXtpZihkIGluc3RhbmNlb2YgUlNBS2V5JiZkLmlzUHVibGljKXtiLmt0eT1cIlJTQVwiO2Iubj1oZXh0b2I2NHUoZC5uLnRvU3RyaW5nKDE2KSk7Yi5lPWhleHRvYjY0dShkLmUudG9TdHJpbmcoMTYpKTtyZXR1cm4gYn1lbHNle2lmKGQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSYmZC5pc1ByaXZhdGUpe3ZhciBhPWQuZ2V0U2hvcnROSVNUUEN1cnZlTmFtZSgpO2lmKGEhPT1cIlAtMjU2XCImJmEhPT1cIlAtMzg0XCIpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lIGZvciBKV1Q6IFwiK2F9dmFyIGM9ZC5nZXRQdWJsaWNLZXlYWUhleCgpO2Iua3R5PVwiRUNcIjtiLmNydj1hO2IueD1oZXh0b2I2NHUoYy54KTtiLnk9aGV4dG9iNjR1KGMueSk7Yi5kPWhleHRvYjY0dShkLnBydktleUhleCk7cmV0dXJuIGJ9ZWxzZXtpZihkIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJmQuaXNQdWJsaWMpe3ZhciBhPWQuZ2V0U2hvcnROSVNUUEN1cnZlTmFtZSgpO2lmKGEhPT1cIlAtMjU2XCImJmEhPT1cIlAtMzg0XCIpe3Rocm93XCJ1bnN1cHBvcnRlZCBjdXJ2ZSBuYW1lIGZvciBKV1Q6IFwiK2F9dmFyIGM9ZC5nZXRQdWJsaWNLZXlYWUhleCgpO2Iua3R5PVwiRUNcIjtiLmNydj1hO2IueD1oZXh0b2I2NHUoYy54KTtiLnk9aGV4dG9iNjR1KGMueSk7cmV0dXJuIGJ9fX19dGhyb3dcIm5vdCBzdXBwb3J0ZWQga2V5IG9iamVjdFwifTtcbi8qISByc2FwZW0tMS4xLmpzIChjKSAyMDEyIEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIF9yc2FwZW1fcGVtVG9CYXNlNjQoYil7dmFyIGE9YjthPWEucmVwbGFjZShcIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cIixcIlwiKTthPWEucmVwbGFjZShcIi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tXCIsXCJcIik7YT1hLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTtyZXR1cm4gYX1mdW5jdGlvbiBfcnNhcGVtX2dldFBvc0FycmF5T2ZDaGlsZHJlbkZyb21IZXgoZCl7dmFyIGo9bmV3IEFycmF5KCk7dmFyIGs9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihkLDApO3ZhciBmPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGspO3ZhciBoPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGYpO3ZhciBiPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGgpO3ZhciBsPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGIpO3ZhciBlPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGwpO3ZhciBnPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGUpO3ZhciBjPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGcpO3ZhciBpPUFTTjFIRVguZ2V0UG9zT2ZOZXh0U2libGluZ19BdE9iaihkLGMpO2oucHVzaChrLGYsaCxiLGwsZSxnLGMsaSk7cmV0dXJuIGp9ZnVuY3Rpb24gX3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoaSl7dmFyIG89X3JzYXBlbV9nZXRQb3NBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGkpO3ZhciByPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1swXSk7dmFyIGY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzFdKTt2YXIgaj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bMl0pO3ZhciBrPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1szXSk7dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzRdKTt2YXIgYj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bNV0pO3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s2XSk7dmFyIGc9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzddKTt2YXIgbD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bOF0pO3ZhciBtPW5ldyBBcnJheSgpO20ucHVzaChyLGYsaixrLGMsYixoLGcsbCk7cmV0dXJuIG19ZnVuY3Rpb24gX3JzYXBlbV9yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGMpe3ZhciBiPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGMpO3RoaXMuc2V0UHJpdmF0ZUV4KGJbMV0sYlsyXSxiWzNdLGJbNF0sYls1XSxiWzZdLGJbN10sYls4XSl9ZnVuY3Rpb24gX3JzYXBlbV9yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmcoZSl7dmFyIGM9X3JzYXBlbV9wZW1Ub0Jhc2U2NChlKTt2YXIgZD1iNjR0b2hleChjKTt2YXIgYj1fcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChkKTt0aGlzLnNldFByaXZhdGVFeChiWzFdLGJbMl0sYlszXSxiWzRdLGJbNV0sYls2XSxiWzddLGJbOF0pfVJTQUtleS5wcm90b3R5cGUucmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nPV9yc2FwZW1fcmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nO1JTQUtleS5wcm90b3R5cGUucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZz1fcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmc7XG4vKiEgcnNhc2lnbi0xLjIuNy5qcyAoYykgMjAxMiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG52YXIgX1JFX0hFWERFQ09OTFk9bmV3IFJlZ0V4cChcIlwiKTtfUkVfSEVYREVDT05MWS5jb21waWxlKFwiW14wLTlhLWZdXCIsXCJnaVwiKTtmdW5jdGlvbiBfcnNhc2lnbl9nZXRIZXhQYWRkZWREaWdlc3RJbmZvRm9yU3RyaW5nKGQsZSxhKXt2YXIgYj1mdW5jdGlvbihmKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGYsYSl9O3ZhciBjPWIoZCk7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuZ2V0UGFkZGVkRGlnZXN0SW5mb0hleChjLGEsZSl9ZnVuY3Rpb24gX3plcm9QYWRkaW5nT2ZTaWduYXR1cmUoZSxkKXt2YXIgYz1cIlwiO3ZhciBhPWQvNC1lLmxlbmd0aDtmb3IodmFyIGI9MDtiPGE7YisrKXtjPWMrXCIwXCJ9cmV0dXJuIGMrZX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduU3RyaW5nKGQsYSl7dmFyIGI9ZnVuY3Rpb24oZSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhlLGEpfTt2YXIgYz1iKGQpO3JldHVybiB0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2goYyxhKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduV2l0aE1lc3NhZ2VIYXNoKGUsYyl7dmFyIGY9S0pVUi5jcnlwdG8uVXRpbC5nZXRQYWRkZWREaWdlc3RJbmZvSGV4KGUsYyx0aGlzLm4uYml0TGVuZ3RoKCkpO3ZhciBiPXBhcnNlQmlnSW50KGYsMTYpO3ZhciBkPXRoaXMuZG9Qcml2YXRlKGIpO3ZhciBhPWQudG9TdHJpbmcoMTYpO3JldHVybiBfemVyb1BhZGRpbmdPZlNpZ25hdHVyZShhLHRoaXMubi5iaXRMZW5ndGgoKSl9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEExKGEpe3JldHVybiBfcnNhc2lnbl9zaWduU3RyaW5nLmNhbGwodGhpcyxhLFwic2hhMVwiKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTI1NihhKXtyZXR1cm4gX3JzYXNpZ25fc2lnblN0cmluZy5jYWxsKHRoaXMsYSxcInNoYTI1NlwiKX1mdW5jdGlvbiBwc3NfbWdmMV9zdHIoYyxhLGUpe3ZhciBiPVwiXCIsZD0wO3doaWxlKGIubGVuZ3RoPGEpe2IrPWhleHRvcnN0cihlKHJzdHJ0b2hleChjK1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLFsoZCY0Mjc4MTkwMDgwKT4+MjQsKGQmMTY3MTE2ODApPj4xNiwoZCY2NTI4MCk+PjgsZCYyNTVdKSkpKTtkKz0xfXJldHVybiBifWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmdQU1MoZSxhLGQpe3ZhciBjPWZ1bmN0aW9uKGYpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoZixhKX07dmFyIGI9Yyhyc3RydG9oZXgoZSkpO2lmKGQ9PT11bmRlZmluZWQpe2Q9LTF9cmV0dXJuIHRoaXMuc2lnbldpdGhNZXNzYWdlSGFzaFBTUyhiLGEsZCl9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnbldpdGhNZXNzYWdlSGFzaFBTUyhsLGEsayl7dmFyIGI9aGV4dG9yc3RyKGwpO3ZhciBnPWIubGVuZ3RoO3ZhciBtPXRoaXMubi5iaXRMZW5ndGgoKS0xO3ZhciBjPU1hdGguY2VpbChtLzgpO3ZhciBkO3ZhciBvPWZ1bmN0aW9uKGkpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoaSxhKX07aWYoaz09PS0xfHxrPT09dW5kZWZpbmVkKXtrPWd9ZWxzZXtpZihrPT09LTIpe2s9Yy1nLTJ9ZWxzZXtpZihrPC0yKXt0aHJvd1wiaW52YWxpZCBzYWx0IGxlbmd0aFwifX19aWYoYzwoZytrKzIpKXt0aHJvd1wiZGF0YSB0b28gbG9uZ1wifXZhciBmPVwiXCI7aWYoaz4wKXtmPW5ldyBBcnJheShrKTtuZXcgU2VjdXJlUmFuZG9tKCkubmV4dEJ5dGVzKGYpO2Y9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZil9dmFyIG49aGV4dG9yc3RyKG8ocnN0cnRvaGV4KFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiK2IrZikpKTt2YXIgaj1bXTtmb3IoZD0wO2Q8Yy1rLWctMjtkKz0xKXtqW2RdPTB9dmFyIGU9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaikrXCJcXHgwMVwiK2Y7dmFyIGg9cHNzX21nZjFfc3RyKG4sZS5sZW5ndGgsbyk7dmFyIHE9W107Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrPTEpe3FbZF09ZS5jaGFyQ29kZUF0KGQpXmguY2hhckNvZGVBdChkKX12YXIgcD0oNjUyODA+Pig4KmMtbSkpJjI1NTtxWzBdJj1+cDtmb3IoZD0wO2Q8ZztkKyspe3EucHVzaChuLmNoYXJDb2RlQXQoZCkpfXEucHVzaCgxODgpO3JldHVybiBfemVyb1BhZGRpbmdPZlNpZ25hdHVyZSh0aGlzLmRvUHJpdmF0ZShuZXcgQmlnSW50ZWdlcihxKSkudG9TdHJpbmcoMTYpLHRoaXMubi5iaXRMZW5ndGgoKSl9ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0RGVjcnlwdFNpZ25hdHVyZUJJKGEsZCxjKXt2YXIgYj1uZXcgUlNBS2V5KCk7Yi5zZXRQdWJsaWMoZCxjKTt2YXIgZT1iLmRvUHVibGljKGEpO3JldHVybiBlfWZ1bmN0aW9uIF9yc2FzaWduX2dldEhleERpZ2VzdEluZm9Gcm9tU2lnKGEsYyxiKXt2YXIgZT1fcnNhc2lnbl9nZXREZWNyeXB0U2lnbmF0dXJlQkkoYSxjLGIpO3ZhciBkPWUudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14xZiswMC8sXCJcIik7cmV0dXJuIGR9ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZil7Zm9yKHZhciBlIGluIEtKVVIuY3J5cHRvLlV0aWwuRElHRVNUSU5GT0hFQUQpe3ZhciBkPUtKVVIuY3J5cHRvLlV0aWwuRElHRVNUSU5GT0hFQURbZV07dmFyIGI9ZC5sZW5ndGg7aWYoZi5zdWJzdHJpbmcoMCxiKT09ZCl7dmFyIGM9W2UsZi5zdWJzdHJpbmcoYildO3JldHVybiBjfX1yZXR1cm5bXX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlTaWduYXR1cmVXaXRoQXJncyhmLGIsZyxqKXt2YXIgZT1fcnNhc2lnbl9nZXRIZXhEaWdlc3RJbmZvRnJvbVNpZyhiLGcsaik7dmFyIGg9X3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZSk7aWYoaC5sZW5ndGg9PTApe3JldHVybiBmYWxzZX12YXIgZD1oWzBdO3ZhciBpPWhbMV07dmFyIGE9ZnVuY3Rpb24oayl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhrLGQpfTt2YXIgYz1hKGYpO3JldHVybihpPT1jKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlIZXhTaWduYXR1cmVGb3JNZXNzYWdlKGMsYil7dmFyIGQ9cGFyc2VCaWdJbnQoYywxNik7dmFyIGE9X3JzYXNpZ25fdmVyaWZ5U2lnbmF0dXJlV2l0aEFyZ3MoYixkLHRoaXMubi50b1N0cmluZygxNiksdGhpcy5lLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGF9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5U3RyaW5nKGYsail7aj1qLnJlcGxhY2UoX1JFX0hFWERFQ09OTFksXCJcIik7aj1qLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTt2YXIgYj1wYXJzZUJpZ0ludChqLDE2KTtpZihiLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIDB9dmFyIGk9dGhpcy5kb1B1YmxpYyhiKTt2YXIgZT1pLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3ZhciBnPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGUpO2lmKGcubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9Z1swXTt2YXIgaD1nWzFdO3ZhciBhPWZ1bmN0aW9uKGspe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoayxkKX07dmFyIGM9YShmKTtyZXR1cm4oaD09Yyl9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKGUsYSl7YT1hLnJlcGxhY2UoX1JFX0hFWERFQ09OTFksXCJcIik7YT1hLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTt2YXIgYj1wYXJzZUJpZ0ludChhLDE2KTtpZihiLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIDB9dmFyIGg9dGhpcy5kb1B1YmxpYyhiKTt2YXIgZz1oLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3ZhciBjPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGcpO2lmKGMubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9Y1swXTt2YXIgZj1jWzFdO3JldHVybihmPT1lKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlTdHJpbmdQU1MoYyxiLGEsZil7dmFyIGU9ZnVuY3Rpb24oZyl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChnLGEpfTt2YXIgZD1lKHJzdHJ0b2hleChjKSk7aWYoZj09PXVuZGVmaW5lZCl7Zj0tMX1yZXR1cm4gdGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1MoZCxiLGEsZil9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTKGYscyxsLGMpe3ZhciBrPW5ldyBCaWdJbnRlZ2VyKHMsMTYpO2lmKGsuYml0TGVuZ3RoKCk+dGhpcy5uLmJpdExlbmd0aCgpKXtyZXR1cm4gZmFsc2V9dmFyIHI9ZnVuY3Rpb24oaSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChpLGwpfTt2YXIgaj1oZXh0b3JzdHIoZik7dmFyIGg9ai5sZW5ndGg7dmFyIGc9dGhpcy5uLmJpdExlbmd0aCgpLTE7dmFyIG09TWF0aC5jZWlsKGcvOCk7dmFyIHE7aWYoYz09PS0xfHxjPT09dW5kZWZpbmVkKXtjPWh9ZWxzZXtpZihjPT09LTIpe2M9bS1oLTJ9ZWxzZXtpZihjPC0yKXt0aHJvd1wiaW52YWxpZCBzYWx0IGxlbmd0aFwifX19aWYobTwoaCtjKzIpKXt0aHJvd1wiZGF0YSB0b28gbG9uZ1wifXZhciBhPXRoaXMuZG9QdWJsaWMoaykudG9CeXRlQXJyYXkoKTtmb3IocT0wO3E8YS5sZW5ndGg7cSs9MSl7YVtxXSY9MjU1fXdoaWxlKGEubGVuZ3RoPG0pe2EudW5zaGlmdCgwKX1pZihhW20tMV0hPT0xODgpe3Rocm93XCJlbmNvZGVkIG1lc3NhZ2UgZG9lcyBub3QgZW5kIGluIDB4YmNcIn1hPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGEpO3ZhciBkPWEuc3Vic3RyKDAsbS1oLTEpO3ZhciBlPWEuc3Vic3RyKGQubGVuZ3RoLGgpO3ZhciBwPSg2NTI4MD4+KDgqbS1nKSkmMjU1O2lmKChkLmNoYXJDb2RlQXQoMCkmcCkhPT0wKXt0aHJvd1wiYml0cyBiZXlvbmQga2V5c2l6ZSBub3QgemVyb1wifXZhciBuPXBzc19tZ2YxX3N0cihlLGQubGVuZ3RoLHIpO3ZhciBvPVtdO2ZvcihxPTA7cTxkLmxlbmd0aDtxKz0xKXtvW3FdPWQuY2hhckNvZGVBdChxKV5uLmNoYXJDb2RlQXQocSl9b1swXSY9fnA7dmFyIGI9bS1oLWMtMjtmb3IocT0wO3E8YjtxKz0xKXtpZihvW3FdIT09MCl7dGhyb3dcImxlZnRtb3N0IG9jdGV0cyBub3QgemVyb1wifX1pZihvW2JdIT09MSl7dGhyb3dcIjB4MDEgbWFya2VyIG5vdCBmb3VuZFwifXJldHVybiBlPT09aGV4dG9yc3RyKHIocnN0cnRvaGV4KFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiK2orU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsby5zbGljZSgtYykpKSkpfVJTQUtleS5wcm90b3R5cGUuc2lnbldpdGhNZXNzYWdlSGFzaD1fcnNhc2lnbl9zaWduV2l0aE1lc3NhZ2VIYXNoO1JTQUtleS5wcm90b3R5cGUuc2lnblN0cmluZz1fcnNhc2lnbl9zaWduU3RyaW5nO1JTQUtleS5wcm90b3R5cGUuc2lnblN0cmluZ1dpdGhTSEExPV9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMTtSU0FLZXkucHJvdG90eXBlLnNpZ25TdHJpbmdXaXRoU0hBMjU2PV9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMjU2O1JTQUtleS5wcm90b3R5cGUuc2lnbj1fcnNhc2lnbl9zaWduU3RyaW5nO1JTQUtleS5wcm90b3R5cGUuc2lnbldpdGhTSEExPV9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMTtSU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoU0hBMjU2PV9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMjU2O1JTQUtleS5wcm90b3R5cGUuc2lnbldpdGhNZXNzYWdlSGFzaFBTUz1fcnNhc2lnbl9zaWduV2l0aE1lc3NhZ2VIYXNoUFNTO1JTQUtleS5wcm90b3R5cGUuc2lnblN0cmluZ1BTUz1fcnNhc2lnbl9zaWduU3RyaW5nUFNTO1JTQUtleS5wcm90b3R5cGUuc2lnblBTUz1fcnNhc2lnbl9zaWduU3RyaW5nUFNTO1JTQUtleS5TQUxUX0xFTl9ITEVOPS0xO1JTQUtleS5TQUxUX0xFTl9NQVg9LTI7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlXaXRoTWVzc2FnZUhhc2g9X3JzYXNpZ25fdmVyaWZ5V2l0aE1lc3NhZ2VIYXNoO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5U3RyaW5nPV9yc2FzaWduX3ZlcmlmeVN0cmluZztSU0FLZXkucHJvdG90eXBlLnZlcmlmeUhleFNpZ25hdHVyZUZvck1lc3NhZ2U9X3JzYXNpZ25fdmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZTtSU0FLZXkucHJvdG90eXBlLnZlcmlmeT1fcnNhc2lnbl92ZXJpZnlTdHJpbmc7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlIZXhTaWduYXR1cmVGb3JCeXRlQXJyYXlNZXNzYWdlPV9yc2FzaWduX3ZlcmlmeUhleFNpZ25hdHVyZUZvck1lc3NhZ2U7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1M9X3JzYXNpZ25fdmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5U3RyaW5nUFNTPV9yc2FzaWduX3ZlcmlmeVN0cmluZ1BTUztSU0FLZXkucHJvdG90eXBlLnZlcmlmeVBTUz1fcnNhc2lnbl92ZXJpZnlTdHJpbmdQU1M7UlNBS2V5LlNBTFRfTEVOX1JFQ09WRVI9LTI7XG4vKiEgeDUwOS0xLjEuOS5qcyAoYykgMjAxMi0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIFg1MDkoKXt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0E9bnVsbDt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaE49bnVsbDt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaEU9bnVsbDt0aGlzLmhleD1udWxsO3RoaXMuZ2V0U2VyaWFsTnVtYmVySGV4PWZ1bmN0aW9uKCl7cmV0dXJuIEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDFdKX07dGhpcy5nZXRTaWduYXR1cmVBbGdvcml0aG1GaWVsZD1mdW5jdGlvbigpe3ZhciBiPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDIsMF0pO3ZhciBhPUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludChiKTt2YXIgYz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYSk7cmV0dXJuIGN9O3RoaXMuZ2V0SXNzdWVySGV4PWZ1bmN0aW9uKCl7cmV0dXJuIEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsM10pfTt0aGlzLmdldElzc3VlclN0cmluZz1mdW5jdGlvbigpe3JldHVybiBYNTA5LmhleDJkbihBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDNdKSl9O3RoaXMuZ2V0U3ViamVjdEhleD1mdW5jdGlvbigpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDVdKX07dGhpcy5nZXRTdWJqZWN0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFg1MDkuaGV4MmRuKEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsNV0pKX07dGhpcy5nZXROb3RCZWZvcmU9ZnVuY3Rpb24oKXt2YXIgYT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCw0LDBdKTthPWEucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpO2E9ZGVjb2RlVVJJQ29tcG9uZW50KGEpO3JldHVybiBhfTt0aGlzLmdldE5vdEFmdGVyPWZ1bmN0aW9uKCl7dmFyIGE9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsNCwxXSk7YT1hLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTthPWRlY29kZVVSSUNvbXBvbmVudChhKTtyZXR1cm4gYX07dGhpcy5yZWFkQ2VydFBFTT1mdW5jdGlvbihjKXt2YXIgZT1YNTA5LnBlbVRvSGV4KGMpO3ZhciBiPVg1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydEhleChlKTt2YXIgZD1uZXcgUlNBS2V5KCk7ZC5zZXRQdWJsaWMoYlswXSxiWzFdKTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0E9ZDt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaE49YlswXTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaEU9YlsxXTt0aGlzLmhleD1lfTt0aGlzLnJlYWRDZXJ0UEVNV2l0aG91dFJTQUluaXQ9ZnVuY3Rpb24oYyl7dmFyIGQ9WDUwOS5wZW1Ub0hleChjKTt2YXIgYj1YNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRIZXgoZCk7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBLnNldFB1YmxpYyhiWzBdLGJbMV0pO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oTj1iWzBdO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oRT1iWzFdO3RoaXMuaGV4PWR9O3RoaXMuZ2V0SW5mbz1mdW5jdGlvbigpe3ZhciBwPVwiQmFzaWMgRmllbGRzXFxuXCI7cCs9XCIgIHNlcmlhbCBudW1iZXI6IFwiK3RoaXMuZ2V0U2VyaWFsTnVtYmVySGV4KCkrXCJcXG5cIjtwKz1cIiAgc2lnbmF0dXJlIGFsZ29yaXRobTogXCIrdGhpcy5nZXRTaWduYXR1cmVBbGdvcml0aG1GaWVsZCgpK1wiXFxuXCI7cCs9XCIgIGlzc3VlcjogXCIrdGhpcy5nZXRJc3N1ZXJTdHJpbmcoKStcIlxcblwiO3ArPVwiICBub3RCZWZvcmU6IFwiK3RoaXMuZ2V0Tm90QmVmb3JlKCkrXCJcXG5cIjtwKz1cIiAgbm90QWZ0ZXI6IFwiK3RoaXMuZ2V0Tm90QWZ0ZXIoKStcIlxcblwiO3ArPVwiICBzdWJqZWN0OiBcIit0aGlzLmdldFN1YmplY3RTdHJpbmcoKStcIlxcblwiO3ArPVwiICBzdWJqZWN0IHB1YmxpYyBrZXkgaW5mbzogXFxuXCI7dmFyIGo9WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5SW5mb1Bvc0Zyb21DZXJ0SGV4KHRoaXMuaGV4KTt2YXIgZD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHRoaXMuaGV4LGopO3ZhciBuPUtFWVVUSUwuZ2V0S2V5KGQsbnVsbCxcInBrY3M4cHViXCIpO2lmKG4gaW5zdGFuY2VvZiBSU0FLZXkpe3ArPVwiICAgIGtleSBhbGdvcml0aG06IFJTQVxcblwiO3ArPVwiICAgIG49XCIrbi5uLnRvU3RyaW5nKDE2KS5zdWJzdHIoMCwxNikrXCIuLi5cXG5cIjtwKz1cIiAgICBlPVwiK24uZS50b1N0cmluZygxNikrXCJcXG5cIn1wKz1cIlg1MDl2MyBFeHRlbnNpb25zOlxcblwiO3ZhciBtPVg1MDkuZ2V0VjNFeHRJbmZvTGlzdE9mQ2VydEhleCh0aGlzLmhleCk7Zm9yKHZhciBlPTA7ZTxtLmxlbmd0aDtlKyspe3ZhciBiPW1bZV07dmFyIG89S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGIub2lkKTtpZihvPT09XCJcIil7bz1iLm9pZH12YXIgaz1cIlwiO2lmKGIuY3JpdGljYWw9PT10cnVlKXtrPVwiQ1JJVElDQUxcIn1wKz1cIiAgXCIrbytcIiBcIitrK1wiOlxcblwiO2lmKG89PT1cImJhc2ljQ29uc3RyYWludHNcIil7dmFyIGc9WDUwOS5nZXRFeHRCYXNpY0NvbnN0cmFpbnRzKHRoaXMuaGV4KTtpZihnLmNBPT09dW5kZWZpbmVkKXtwKz1cIiAgICB7fVxcblwifWVsc2V7cCs9XCIgICAgY0E9dHJ1ZVwiO2lmKGcucGF0aExlbiE9PXVuZGVmaW5lZCl7cCs9XCIsIHBhdGhMZW49XCIrZy5wYXRoTGVufXArPVwiXFxuXCJ9fWVsc2V7aWYobz09PVwia2V5VXNhZ2VcIil7cCs9XCIgICAgXCIrWDUwOS5nZXRFeHRLZXlVc2FnZVN0cmluZyh0aGlzLmhleCkrXCJcXG5cIn1lbHNle2lmKG89PT1cInN1YmplY3RLZXlJZGVudGlmaWVyXCIpe3ArPVwiICAgIFwiK1g1MDkuZ2V0RXh0U3ViamVjdEtleUlkZW50aWZpZXIodGhpcy5oZXgpK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJhdXRob3JpdHlLZXlJZGVudGlmaWVyXCIpe3ZhciBhPVg1MDkuZ2V0RXh0QXV0aG9yaXR5S2V5SWRlbnRpZmllcih0aGlzLmhleCk7aWYoYS5raWQhPT11bmRlZmluZWQpe3ArPVwiICAgIGtpZD1cIithLmtpZCtcIlxcblwifX1lbHNle2lmKG89PT1cImV4dEtleVVzYWdlXCIpe3ZhciBoPVg1MDkuZ2V0RXh0RXh0S2V5VXNhZ2VOYW1lKHRoaXMuaGV4KTtwKz1cIiAgICBcIitoLmpvaW4oXCIsIFwiKStcIlxcblwifWVsc2V7aWYobz09PVwic3ViamVjdEFsdE5hbWVcIil7dmFyIGY9WDUwOS5nZXRFeHRTdWJqZWN0QWx0TmFtZSh0aGlzLmhleCk7cCs9XCIgICAgXCIrZi5qb2luKFwiLCBcIikrXCJcXG5cIn1lbHNle2lmKG89PT1cImNSTERpc3RyaWJ1dGlvblBvaW50c1wiKXt2YXIgbD1YNTA5LmdldEV4dENSTERpc3RyaWJ1dGlvblBvaW50c1VSSSh0aGlzLmhleCk7cCs9XCIgICAgXCIrbCtcIlxcblwifWVsc2V7aWYobz09PVwiYXV0aG9yaXR5SW5mb0FjY2Vzc1wiKXt2YXIgYz1YNTA5LmdldEV4dEFJQUluZm8odGhpcy5oZXgpO2lmKGMub2NzcCE9PXVuZGVmaW5lZCl7cCs9XCIgICAgb2NzcDogXCIrYy5vY3NwLmpvaW4oXCIsXCIpK1wiXFxuXCJ9aWYoYy5jYWlzc3VlciE9PXVuZGVmaW5lZCl7cCs9XCIgICAgY2Fpc3N1ZXI6IFwiK2MuY2Fpc3N1ZXIuam9pbihcIixcIikrXCJcXG5cIn19fX19fX19fX1wKz1cInNpZ25hdHVyZSBhbGdvcml0aG06IFwiK1g1MDkuZ2V0U2lnbmF0dXJlQWxnb3JpdGhtTmFtZSh0aGlzLmhleCkrXCJcXG5cIjtwKz1cInNpZ25hdHVyZTogXCIrWDUwOS5nZXRTaWduYXR1cmVWYWx1ZUhleCh0aGlzLmhleCkuc3Vic3RyKDAsMTYpK1wiLi4uXFxuXCI7cmV0dXJuIHB9fVg1MDkucGVtVG9CYXNlNjQ9ZnVuY3Rpb24oYSl7dmFyIGI9YTtiPWIucmVwbGFjZShcIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVwiLFwiXCIpO2I9Yi5yZXBsYWNlKFwiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVwiLFwiXCIpO2I9Yi5yZXBsYWNlKC9bIFxcbl0rL2csXCJcIik7cmV0dXJuIGJ9O1g1MDkucGVtVG9IZXg9ZnVuY3Rpb24oYSl7dmFyIGM9WDUwOS5wZW1Ub0Jhc2U2NChhKTt2YXIgYj1iNjR0b2hleChjKTtyZXR1cm4gYn07WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5UG9zRnJvbUNlcnRIZXg9ZnVuY3Rpb24oZil7dmFyIGU9WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5SW5mb1Bvc0Zyb21DZXJ0SGV4KGYpO2lmKGU9PS0xKXtyZXR1cm4gLTF9dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixlKTtpZihiLmxlbmd0aCE9Mil7cmV0dXJuIC0xfXZhciBkPWJbMV07aWYoZi5zdWJzdHJpbmcoZCxkKzIpIT1cIjAzXCIpe3JldHVybiAtMX12YXIgYz1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGYsZCk7aWYoZi5zdWJzdHJpbmcoYyxjKzIpIT1cIjAwXCIpe3JldHVybiAtMX1yZXR1cm4gYysyfTtYNTA5LmdldFN1YmplY3RQdWJsaWNLZXlJbmZvUG9zRnJvbUNlcnRIZXg9ZnVuY3Rpb24oZCl7dmFyIGM9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihkLDApO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsYyk7aWYoYi5sZW5ndGg8MSl7cmV0dXJuIC0xfWlmKGQuc3Vic3RyaW5nKGJbMF0sYlswXSsxMCk9PVwiYTAwMzAyMDEwMlwiKXtpZihiLmxlbmd0aDw2KXtyZXR1cm4gLTF9cmV0dXJuIGJbNl19ZWxzZXtpZihiLmxlbmd0aDw1KXtyZXR1cm4gLTF9cmV0dXJuIGJbNV19fTtYNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRIZXg9ZnVuY3Rpb24oZil7dmFyIGU9WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5UG9zRnJvbUNlcnRIZXgoZik7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixlKTtpZihiLmxlbmd0aCE9Mil7cmV0dXJuW119dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixiWzBdKTt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGJbMV0pO2lmKGQhPW51bGwmJmMhPW51bGwpe3JldHVybltkLGNdfWVsc2V7cmV0dXJuW119fTtYNTA5LmdldEhleFRic0NlcnRpZmljYXRlRnJvbUNlcnQ9ZnVuY3Rpb24oYil7dmFyIGE9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihiLDApO3JldHVybiBhfTtYNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRQRU09ZnVuY3Rpb24oYyl7dmFyIGQ9WDUwOS5wZW1Ub0hleChjKTt2YXIgYj1YNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRIZXgoZCk7cmV0dXJuIGJ9O1g1MDkuaGV4MmRuPWZ1bmN0aW9uKGUpe3ZhciBmPVwiXCI7dmFyIGM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSwwKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGI9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihlLGNbZF0pO2Y9ZitcIi9cIitYNTA5LmhleDJyZG4oYil9cmV0dXJuIGZ9O1g1MDkuaGV4MnJkbj1mdW5jdGlvbihhKXt2YXIgZj1BU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdChhLDAsWzAsMF0pO3ZhciBlPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdChhLDAsWzAsMV0pO3ZhciBjPVwiXCI7dHJ5e2M9WDUwOS5ETl9BVFRSSEVYW2ZdfWNhdGNoKGIpe2M9Zn1lPWUucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpO3ZhciBkPWRlY29kZVVSSUNvbXBvbmVudChlKTtyZXR1cm4gYytcIj1cIitkfTtYNTA5LkROX0FUVFJIRVg9e1wiMDYwMzU1MDQwNlwiOlwiQ1wiLFwiMDYwMzU1MDQwYVwiOlwiT1wiLFwiMDYwMzU1MDQwYlwiOlwiT1VcIixcIjA2MDM1NTA0MDNcIjpcIkNOXCIsXCIwNjAzNTUwNDA1XCI6XCJTTlwiLFwiMDYwMzU1MDQwOFwiOlwiU1RcIixcIjA2MDM1NTA0MDdcIjpcIkxcIixcIjA2MDM1NTA0MDlcIjpcInN0cmVldEFkZHJlc3NcIixcIjA2MDM1NTA0MGZcIjpcImJ1c2luZXNzQ2F0ZWdvcnlcIixcIjA2MDM1NTA0MTFcIjpcInBvc3RhbENvZGVcIixcIjA2MGIyYjA2MDEwNDAxODIzNzNjMDIwMTAyXCI6XCJqdXJpc2RpY3Rpb25PZkluY29ycG9yYXRpb25TUFwiLFwiMDYwYjJiMDYwMTA0MDE4MjM3M2MwMjAxMDNcIjpcImp1cmlzZGljdGlvbk9mSW5jb3Jwb3JhdGlvbkNcIix9O1g1MDkuZ2V0UHVibGljS2V5RnJvbUNlcnRQRU09ZnVuY3Rpb24oZil7dmFyIGM9WDUwOS5nZXRQdWJsaWNLZXlJbmZvUHJvcE9mQ2VydFBFTShmKTtpZihjLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dmFyIGk9S0VZVVRJTC5wYXJzZVB1YmxpY1Jhd1JTQUtleUhleChjLmtleWhleCk7dmFyIGo9bmV3IFJTQUtleSgpO2ouc2V0UHVibGljKGkubixpLmUpO3JldHVybiBqfWVsc2V7aWYoYy5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7dmFyIGU9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW2MuYWxncGFyYW1dO3ZhciBqPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZSxpbmZvOmMua2V5aGV4fSk7ai5zZXRQdWJsaWNLZXlIZXgoYy5rZXloZXgpO3JldHVybiBqfWVsc2V7aWYoYy5hbGdvaWQ9PVwiMmE4NjQ4Y2UzODA0MDFcIil7dmFyIGI9QVNOMUhFWC5nZXRWYnlMaXN0KGMuYWxncGFyYW0sMCxbMF0sXCIwMlwiKTt2YXIgYT1BU04xSEVYLmdldFZieUxpc3QoYy5hbGdwYXJhbSwwLFsxXSxcIjAyXCIpO3ZhciBkPUFTTjFIRVguZ2V0VmJ5TGlzdChjLmFsZ3BhcmFtLDAsWzJdLFwiMDJcIik7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYy5rZXloZXgsMCk7aD1oLnN1YnN0cigyKTt2YXIgaj1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7ai5zZXRQdWJsaWMobmV3IEJpZ0ludGVnZXIoYiwxNiksbmV3IEJpZ0ludGVnZXIoYSwxNiksbmV3IEJpZ0ludGVnZXIoZCwxNiksbmV3IEJpZ0ludGVnZXIoaCwxNikpO3JldHVybiBqfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIGtleVwifX19fTtYNTA5LmdldFB1YmxpY0tleUluZm9Qcm9wT2ZDZXJ0UEVNPWZ1bmN0aW9uKGUpe3ZhciBpPXt9O2kuYWxncGFyYW09bnVsbDt2YXIgZj1YNTA5LnBlbVRvSGV4KGUpO3ZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsMCk7aWYoZC5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihmLnN1YnN0cihkWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGRbMF0pO3ZhciBnPTY7aWYoZi5zdWJzdHIoY1swXSwyKSE9PVwiYTBcIil7Zz01fWlmKGMubGVuZ3RoPGcrMSl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAzKVwifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsY1tnXSk7aWYoYS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNClcIn12YXIgaD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGFbMF0pO2lmKGgubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDUpXCJ9aS5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixoWzBdKTtpZihmLnN1YnN0cihoWzFdLDIpPT1cIjA2XCIpe2kuYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixoWzFdKX1lbHNle2lmKGYuc3Vic3RyKGhbMV0sMik9PVwiMzBcIil7aS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGYsaFsxXSl9fWlmKGYuc3Vic3RyKGFbMV0sMikhPVwiMDNcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA2KVwifXZhciBiPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsYVsxXSk7aS5rZXloZXg9Yi5zdWJzdHIoMik7cmV0dXJuIGl9O1g1MDkuZ2V0UHVibGljS2V5SW5mb1Bvc09mQ2VydEhFWD1mdW5jdGlvbihjKXt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihjLDApO2lmKGIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDEpXCJ9aWYoYy5zdWJzdHIoYlswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDIpXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooYyxiWzBdKTtpZihhLmxlbmd0aDw3KXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDMpXCJ9cmV0dXJuIGFbNl19O1g1MDkuZ2V0VjNFeHRJbmZvTGlzdE9mQ2VydEhleD1mdW5jdGlvbihnKXt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLDApO2lmKGIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDEpXCJ9aWYoZy5zdWJzdHIoYlswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDIpXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxiWzBdKTtpZihhLmxlbmd0aDw4KXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDMpXCJ9aWYoZy5zdWJzdHIoYVs3XSwyKSE9XCJhM1wiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDQpXCJ9dmFyIGg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxhWzddKTtpZihoLmxlbmd0aCE9MSl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA1KVwifWlmKGcuc3Vic3RyKGhbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA2KVwifXZhciBmPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsaFswXSk7dmFyIGU9Zi5sZW5ndGg7dmFyIGQ9bmV3IEFycmF5KGUpO2Zvcih2YXIgYz0wO2M8ZTtjKyspe2RbY109WDUwOS5nZXRWM0V4dEl0ZW1JbmZvX0F0T2JqKGcsZltjXSl9cmV0dXJuIGR9O1g1MDkuZ2V0VjNFeHRJdGVtSW5mb19BdE9iaj1mdW5jdGlvbihmLGcpe3ZhciBlPXt9O2UucG9zVExWPWc7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixnKTtpZihiLmxlbmd0aCE9MiYmYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDl2MyBFeHQgKGNvZGU6MDAxKVwifWlmKGYuc3Vic3RyKGJbMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOXYzIEV4dCAoY29kZTowMDIpXCJ9dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixiWzBdKTtlLm9pZD1BU04xSEVYLmhleHRvb2lkc3RyKGQpO2UuY3JpdGljYWw9ZmFsc2U7aWYoYi5sZW5ndGg9PTMpe2UuY3JpdGljYWw9dHJ1ZX12YXIgYz1iW2IubGVuZ3RoLTFdO2lmKGYuc3Vic3RyKGMsMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOXYzIEV4dCAoY29kZTowMDMpXCJ9ZS5wb3NWPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooZixjKTtyZXR1cm4gZX07WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlPWZ1bmN0aW9uKGIsYSl7dmFyIGM9WDUwOS5nZXRQb3NPZlRMVl9WM0V4dFZhbHVlKGIsYSk7aWYoYz09LTEpe3JldHVybiBudWxsfXJldHVybiBBU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGIsYyl9O1g1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWU9ZnVuY3Rpb24oYixhKXt2YXIgYz1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoYixhKTtpZihjPT0tMSl7cmV0dXJuIG51bGx9cmV0dXJuIEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGIsYyl9O1g1MDkuZ2V0UG9zT2ZUTFZfVjNFeHRWYWx1ZT1mdW5jdGlvbihmLGIpe3ZhciBkPWI7aWYoIWIubWF0Y2goL15bMC05Ll0rJC8pKXtkPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZChiKX1pZihkPT1cIlwiKXtyZXR1cm4gLTF9dmFyIGM9WDUwOS5nZXRWM0V4dEluZm9MaXN0T2ZDZXJ0SGV4KGYpO2Zvcih2YXIgYT0wO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZT1jW2FdO2lmKGUub2lkPT1kKXtyZXR1cm4gZS5wb3NWfX1yZXR1cm4gLTF9O1g1MDkuZ2V0RXh0QmFzaWNDb25zdHJhaW50cz1mdW5jdGlvbihkKXt2YXIgYT1YNTA5LmdldEhleE9mVl9WM0V4dFZhbHVlKGQsXCJiYXNpY0NvbnN0cmFpbnRzXCIpO2lmKGE9PT1udWxsKXtyZXR1cm4gbnVsbH1pZihhPT09XCJcIil7cmV0dXJue319aWYoYT09PVwiMDEwMWZmXCIpe3JldHVybntjQTp0cnVlfX1pZihhLnN1YnN0cigwLDgpPT09XCIwMTAxZmYwMlwiKXt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihhLDYpO3ZhciBiPXBhcnNlSW50KGMsMTYpO3JldHVybntjQTp0cnVlLHBhdGhMZW46Yn19dGhyb3dcInVua25vd24gZXJyb3JcIn07WDUwOS5LRVlVU0FHRV9OQU1FPVtcImRpZ2l0YWxTaWduYXR1cmVcIixcIm5vblJlcHVkaWF0aW9uXCIsXCJrZXlFbmNpcGhlcm1lbnRcIixcImRhdGFFbmNpcGhlcm1lbnRcIixcImtleUFncmVlbWVudFwiLFwia2V5Q2VydFNpZ25cIixcImNSTFNpZ25cIixcImVuY2lwaGVyT25seVwiLFwiZGVjaXBoZXJPbmx5XCJdO1g1MDkuZ2V0RXh0S2V5VXNhZ2VCaW49ZnVuY3Rpb24oZCl7dmFyIGI9WDUwOS5nZXRIZXhPZlZfVjNFeHRWYWx1ZShkLFwia2V5VXNhZ2VcIik7aWYoYj09XCJcIil7cmV0dXJuXCJcIn1pZihiLmxlbmd0aCUyIT0wfHxiLmxlbmd0aDw9Mil7dGhyb3dcIm1hbGZvcm1lZCBrZXkgdXNhZ2UgdmFsdWVcIn12YXIgYT1wYXJzZUludChiLnN1YnN0cigwLDIpKTt2YXIgYz1wYXJzZUludChiLnN1YnN0cigyKSwxNikudG9TdHJpbmcoMik7cmV0dXJuIGMuc3Vic3RyKDAsYy5sZW5ndGgtYSl9O1g1MDkuZ2V0RXh0S2V5VXNhZ2VTdHJpbmc9ZnVuY3Rpb24oZSl7dmFyIGQ9WDUwOS5nZXRFeHRLZXlVc2FnZUJpbihlKTt2YXIgYj1uZXcgQXJyYXkoKTtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7aWYoZC5zdWJzdHIoYywxKT09XCIxXCIpe2IucHVzaChYNTA5LktFWVVTQUdFX05BTUVbY10pfX1yZXR1cm4gYi5qb2luKFwiLFwiKX07WDUwOS5nZXRFeHRTdWJqZWN0S2V5SWRlbnRpZmllcj1mdW5jdGlvbihiKXt2YXIgYT1YNTA5LmdldEhleE9mVl9WM0V4dFZhbHVlKGIsXCJzdWJqZWN0S2V5SWRlbnRpZmllclwiKTtyZXR1cm4gYX07WDUwOS5nZXRFeHRBdXRob3JpdHlLZXlJZGVudGlmaWVyPWZ1bmN0aW9uKGYpe3ZhciBiPXt9O3ZhciBlPVg1MDkuZ2V0SGV4T2ZUTFZfVjNFeHRWYWx1ZShmLFwiYXV0aG9yaXR5S2V5SWRlbnRpZmllclwiKTtpZihlPT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSwwKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7aWYoZS5zdWJzdHIoY1tkXSwyKT09PVwiODBcIil7Yi5raWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxjW2RdKX19cmV0dXJuIGJ9O1g1MDkuZ2V0RXh0RXh0S2V5VXNhZ2VOYW1lPWZ1bmN0aW9uKGspe3ZhciBiPW5ldyBBcnJheSgpO3ZhciBmPVg1MDkuZ2V0SGV4T2ZUTFZfVjNFeHRWYWx1ZShrLFwiZXh0S2V5VXNhZ2VcIik7aWYoZj09PW51bGwpe3JldHVybiBudWxsfXZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsMCk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBqPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsY1tlXSk7dmFyIGc9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGopO3ZhciBkPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShnKTtiLnB1c2goZCl9cmV0dXJuIGJ9O1g1MDkuZ2V0RXh0U3ViamVjdEFsdE5hbWU9ZnVuY3Rpb24oZyl7dmFyIGI9bmV3IEFycmF5KCk7dmFyIGY9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKGcsXCJzdWJqZWN0QWx0TmFtZVwiKTt2YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLDApO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXtpZihmLnN1YnN0cihjW2VdLDIpPT09XCI4MlwiKXt2YXIgZD1oZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixjW2VdKSk7Yi5wdXNoKGQpfX1yZXR1cm4gYn07WDUwOS5nZXRFeHRDUkxEaXN0cmlidXRpb25Qb2ludHNVUkk9ZnVuY3Rpb24obil7dmFyIHA9bmV3IEFycmF5KCk7dmFyIGs9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKG4sXCJjUkxEaXN0cmlidXRpb25Qb2ludHNcIik7dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooaywwKTtmb3IodmFyIGc9MDtnPG8ubGVuZ3RoO2crKyl7dmFyIGw9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihrLG9bZ10pO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGwsMCk7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe2lmKGwuc3Vic3RyKGJbZV0sMik9PT1cImEwXCIpe3ZhciBmPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGwsYltlXSk7aWYoZi5zdWJzdHIoMCwyKT09PVwiYTBcIil7dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZiwwKTtpZihjLnN1YnN0cigwLDIpPT09XCI4NlwiKXt2YXIgbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihjLDApO3ZhciBkPWhleHRvdXRmOChtKTtwLnB1c2goZCl9fX19fXJldHVybiBwfTtYNTA5LmdldEV4dEFJQUluZm89ZnVuY3Rpb24oZyl7dmFyIGo9e307ai5vY3NwPVtdO2ouY2Fpc3N1ZXI9W107dmFyIGg9WDUwOS5nZXRQb3NPZlRMVl9WM0V4dFZhbHVlKGcsXCJhdXRob3JpdHlJbmZvQWNjZXNzXCIpO2lmKGg9PS0xKXtyZXR1cm4gbnVsbH1pZihnLnN1YnN0cihoLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgQUlBIEV4dG4gVmFsdWVcIn12YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGgpO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXt2YXIgYT1kW2NdO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsYSk7aWYoYi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgQWNjZXNzRGVzY3JpcHRpb24gb2YgQUlBIEV4dG5cIn12YXIgZT1iWzBdO3ZhciBmPWJbMV07aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxlKT09XCIyYjA2MDEwNTA1MDczMDAxXCIpe2lmKGcuc3Vic3RyKGYsMik9PVwiODZcIil7ai5vY3NwLnB1c2goaGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGcsZikpKX19aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxlKT09XCIyYjA2MDEwNTA1MDczMDAyXCIpe2lmKGcuc3Vic3RyKGYsMik9PVwiODZcIil7ai5jYWlzc3Vlci5wdXNoKGhleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGYpKSl9fX1yZXR1cm4gan07WDUwOS5nZXRTaWduYXR1cmVBbGdvcml0aG1OYW1lPWZ1bmN0aW9uKGQpe3ZhciBiPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdChkLDAsWzEsMF0pO3ZhciBhPUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludChiKTt2YXIgYz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYSk7cmV0dXJuIGN9O1g1MDkuZ2V0U2lnbmF0dXJlVmFsdWVIZXg9ZnVuY3Rpb24oYil7dmFyIGE9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KGIsMCxbMl0pO2lmKGEuc3Vic3RyKDAsMikhPT1cIjAwXCIpe3Rocm93XCJjYW4ndCBnZXQgc2lnbmF0dXJlIHZhbHVlXCJ9cmV0dXJuIGEuc3Vic3RyKDIpfTtYNTA5LmdldFNlcmlhbE51bWJlckhleD1mdW5jdGlvbihhKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KGEsMCxbMCwxXSl9O1xuLyohIGp3cy0zLjMuNCAoYykgMjAxMy0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5qd3M9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmp3cyl7S0pVUi5qd3M9e319S0pVUi5qd3MuSldTPWZ1bmN0aW9uKCl7dmFyIGE9S0pVUi5qd3MuSldTO3RoaXMucGFyc2VKV1M9ZnVuY3Rpb24oZSxnKXtpZigodGhpcy5wYXJzZWRKV1MhPT11bmRlZmluZWQpJiYoZ3x8KHRoaXMucGFyc2VkSldTLnNpZ3ZhbEghPT11bmRlZmluZWQpKSl7cmV0dXJufWlmKGUubWF0Y2goL14oW14uXSspXFwuKFteLl0rKVxcLihbXi5dKykkLyk9PW51bGwpe3Rocm93XCJKV1Mgc2lnbmF0dXJlIGlzIG5vdCBhIGZvcm0gb2YgJ0hlYWQuUGF5bG9hZC5TaWdWYWx1ZScuXCJ9dmFyIGg9UmVnRXhwLiQxO3ZhciBjPVJlZ0V4cC4kMjt2YXIgaT1SZWdFeHAuJDM7dmFyIGs9aCtcIi5cIitjO3RoaXMucGFyc2VkSldTPXt9O3RoaXMucGFyc2VkSldTLmhlYWRCNjRVPWg7dGhpcy5wYXJzZWRKV1MucGF5bG9hZEI2NFU9Yzt0aGlzLnBhcnNlZEpXUy5zaWd2YWxCNjRVPWk7dGhpcy5wYXJzZWRKV1Muc2k9aztpZighZyl7dmFyIGY9YjY0dXRvaGV4KGkpO3ZhciBkPXBhcnNlQmlnSW50KGYsMTYpO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEg9Zjt0aGlzLnBhcnNlZEpXUy5zaWd2YWxCST1kfXZhciBiPWI2NHV0b3V0ZjgoaCk7dmFyIGo9YjY0dXRvdXRmOChjKTt0aGlzLnBhcnNlZEpXUy5oZWFkUz1iO3RoaXMucGFyc2VkSldTLnBheWxvYWRTPWo7aWYoIWEuaXNTYWZlSlNPTlN0cmluZyhiLHRoaXMucGFyc2VkSldTLFwiaGVhZFBcIikpe3Rocm93XCJtYWxmb3JtZWQgSlNPTiBzdHJpbmcgZm9yIEpXUyBIZWFkOiBcIitifX19O0tKVVIuandzLkpXUy5zaWduPWZ1bmN0aW9uKGEsaSxjLG0sbCl7dmFyIGs9S0pVUi5qd3MuSldTO3ZhciBxLGUsajtpZih0eXBlb2YgaSE9XCJzdHJpbmdcIiYmdHlwZW9mIGkhPVwib2JqZWN0XCIpe3Rocm93XCJzcEhlYWRlciBtdXN0IGJlIEpTT04gc3RyaW5nIG9yIG9iamVjdDogXCIraX1pZih0eXBlb2YgaT09XCJvYmplY3RcIil7ZT1pO3E9SlNPTi5zdHJpbmdpZnkoZSl9aWYodHlwZW9mIGk9PVwic3RyaW5nXCIpe3E9aTtpZighay5pc1NhZmVKU09OU3RyaW5nKHEpKXt0aHJvd1wiSldTIEhlYWQgaXMgbm90IHNhZmUgSlNPTiBzdHJpbmc6IFwiK3F9ZT1rLnJlYWRTYWZlSlNPTlN0cmluZyhxKX1qPWM7aWYodHlwZW9mIGM9PVwib2JqZWN0XCIpe2o9SlNPTi5zdHJpbmdpZnkoYyl9aWYoKGE9PVwiXCJ8fGE9PW51bGwpJiZlLmFsZyE9PXVuZGVmaW5lZCl7YT1lLmFsZ31pZigoYSE9XCJcIiYmYSE9bnVsbCkmJmUuYWxnPT09dW5kZWZpbmVkKXtlLmFsZz1hO3E9SlNPTi5zdHJpbmdpZnkoZSl9aWYoYSE9PWUuYWxnKXt0aHJvd1wiYWxnIGFuZCBzSGVhZGVyLmFsZyBkb2Vzbid0IG1hdGNoOiBcIithK1wiIT1cIitlLmFsZ312YXIgZD1udWxsO2lmKGsuandzYWxnMnNpZ2FsZ1thXT09PXVuZGVmaW5lZCl7dGhyb3dcInVuc3VwcG9ydGVkIGFsZyBuYW1lOiBcIithfWVsc2V7ZD1rLmp3c2FsZzJzaWdhbGdbYV19dmFyIGI9dXRmOHRvYjY0dShxKTt2YXIgZz11dGY4dG9iNjR1KGopO3ZhciBvPWIrXCIuXCIrZzt2YXIgbj1cIlwiO2lmKGQuc3Vic3RyKDAsNCk9PVwiSG1hY1wiKXtpZihtPT09dW5kZWZpbmVkKXt0aHJvd1wibWFjIGtleSBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yIEhTKiBhbGdcIn12YXIgaD1uZXcgS0pVUi5jcnlwdG8uTWFjKHthbGc6ZCxwcm92OlwiY3J5cHRvanNcIixwYXNzOm19KTtoLnVwZGF0ZVN0cmluZyhvKTtuPWguZG9GaW5hbCgpfWVsc2V7aWYoZC5pbmRleE9mKFwid2l0aEVDRFNBXCIpIT0tMSl7dmFyIHA9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOmR9KTtwLmluaXQobSxsKTtwLnVwZGF0ZVN0cmluZyhvKTtoQVNOMVNpZz1wLnNpZ24oKTtuPUtKVVIuY3J5cHRvLkVDRFNBLmFzbjFTaWdUb0NvbmNhdFNpZyhoQVNOMVNpZyl9ZWxzZXtpZihkIT1cIm5vbmVcIil7dmFyIHA9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOmR9KTtwLmluaXQobSxsKTtwLnVwZGF0ZVN0cmluZyhvKTtuPXAuc2lnbigpfX19dmFyIGY9aGV4dG9iNjR1KG4pO3JldHVybiBvK1wiLlwiK2Z9O0tKVVIuandzLkpXUy52ZXJpZnk9ZnVuY3Rpb24ocCx0LGope3ZhciBtPUtKVVIuandzLkpXUzt2YXIgcT1wLnNwbGl0KFwiLlwiKTt2YXIgZD1xWzBdO3ZhciBsPXFbMV07dmFyIGI9ZCtcIi5cIitsO3ZhciByPWI2NHV0b2hleChxWzJdKTt2YXIgaT1tLnJlYWRTYWZlSlNPTlN0cmluZyhiNjR1dG91dGY4KHFbMF0pKTt2YXIgaD1udWxsO3ZhciBzPW51bGw7aWYoaS5hbGc9PT11bmRlZmluZWQpe3Rocm93XCJhbGdvcml0aG0gbm90IHNwZWNpZmllZCBpbiBoZWFkZXJcIn1lbHNle2g9aS5hbGc7cz1oLnN1YnN0cigwLDIpfWlmKGohPW51bGwmJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChqKT09PVwiW29iamVjdCBBcnJheV1cIiYmai5sZW5ndGg+MCl7dmFyIGM9XCI6XCIrai5qb2luKFwiOlwiKStcIjpcIjtpZihjLmluZGV4T2YoXCI6XCIraCtcIjpcIik9PS0xKXt0aHJvd1wiYWxnb3JpdGhtICdcIitoK1wiJyBub3QgYWNjZXB0ZWQgaW4gdGhlIGxpc3RcIn19aWYoaCE9XCJub25lXCImJnQ9PT1udWxsKXt0aHJvd1wia2V5IHNoYWxsIGJlIHNwZWNpZmllZCB0byB2ZXJpZnkuXCJ9aWYodHlwZW9mIHQ9PVwic3RyaW5nXCImJnQuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7dD1LRVlVVElMLmdldEtleSh0KX1pZihzPT1cIlJTXCJ8fHM9PVwiUFNcIil7aWYoISh0IGluc3RhbmNlb2YgUlNBS2V5KSl7dGhyb3dcImtleSBzaGFsbCBiZSBhIFJTQUtleSBvYmogZm9yIFJTKiBhbmQgUFMqIGFsZ3NcIn19aWYocz09XCJFU1wiKXtpZighKHQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSkpe3Rocm93XCJrZXkgc2hhbGwgYmUgYSBFQ0RTQSBvYmogZm9yIEVTKiBhbGdzXCJ9fWlmKGg9PVwibm9uZVwiKXt9dmFyIG49bnVsbDtpZihtLmp3c2FsZzJzaWdhbGdbaS5hbGddPT09dW5kZWZpbmVkKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnIG5hbWU6IFwiK2h9ZWxzZXtuPW0uandzYWxnMnNpZ2FsZ1toXX1pZihuPT1cIm5vbmVcIil7dGhyb3dcIm5vdCBzdXBwb3J0ZWRcIn1lbHNle2lmKG4uc3Vic3RyKDAsNCk9PVwiSG1hY1wiKXt2YXIgaz1udWxsO2lmKHQ9PT11bmRlZmluZWQpe3Rocm93XCJoZXhhZGVjaW1hbCBrZXkgc2hhbGwgYmUgc3BlY2lmaWVkIGZvciBITUFDXCJ9dmFyIGc9bmV3IEtKVVIuY3J5cHRvLk1hYyh7YWxnOm4scGFzczp0fSk7Zy51cGRhdGVTdHJpbmcoYik7az1nLmRvRmluYWwoKTtyZXR1cm4gcj09a31lbHNle2lmKG4uaW5kZXhPZihcIndpdGhFQ0RTQVwiKSE9LTEpe3ZhciBmPW51bGw7dHJ5e2Y9S0pVUi5jcnlwdG8uRUNEU0EuY29uY2F0U2lnVG9BU04xU2lnKHIpfWNhdGNoKG8pe3JldHVybiBmYWxzZX12YXIgZT1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6bn0pO2UuaW5pdCh0KTtlLnVwZGF0ZVN0cmluZyhiKTtyZXR1cm4gZS52ZXJpZnkoZil9ZWxzZXt2YXIgZT1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6bn0pO2UuaW5pdCh0KTtlLnVwZGF0ZVN0cmluZyhiKTtyZXR1cm4gZS52ZXJpZnkocil9fX19O0tKVVIuandzLkpXUy5wYXJzZT1mdW5jdGlvbihnKXt2YXIgYz1nLnNwbGl0KFwiLlwiKTt2YXIgYj17fTt2YXIgZixlLGQ7aWYoYy5sZW5ndGghPTImJmMubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIHNKV1M6IHdyb25nIG51bWJlciBvZiAnLicgc3BsaXR0ZWQgZWxlbWVudHNcIn1mPWNbMF07ZT1jWzFdO2lmKGMubGVuZ3RoPT0zKXtkPWNbMl19Yi5oZWFkZXJPYmo9S0pVUi5qd3MuSldTLnJlYWRTYWZlSlNPTlN0cmluZyhiNjR1dG91dGY4KGYpKTtiLnBheWxvYWRPYmo9S0pVUi5qd3MuSldTLnJlYWRTYWZlSlNPTlN0cmluZyhiNjR1dG91dGY4KGUpKTtiLmhlYWRlclBQPUpTT04uc3RyaW5naWZ5KGIuaGVhZGVyT2JqLG51bGwsXCIgIFwiKTtpZihiLnBheWxvYWRPYmo9PW51bGwpe2IucGF5bG9hZFBQPWI2NHV0b3V0ZjgoZSl9ZWxzZXtiLnBheWxvYWRQUD1KU09OLnN0cmluZ2lmeShiLnBheWxvYWRPYmosbnVsbCxcIiAgXCIpfWlmKGQhPT11bmRlZmluZWQpe2Iuc2lnSGV4PWI2NHV0b2hleChkKX1yZXR1cm4gYn07S0pVUi5qd3MuSldTLnZlcmlmeUpXVD1mdW5jdGlvbihkLGosbCl7dmFyIGg9S0pVUi5qd3MuSldTO3ZhciBpPWQuc3BsaXQoXCIuXCIpO3ZhciBjPWlbMF07dmFyIGc9aVsxXTt2YXIgbT1jK1wiLlwiK2c7dmFyIGs9YjY0dXRvaGV4KGlbMl0pO3ZhciBmPWgucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoYykpO3ZhciBlPWgucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZykpO2lmKGYuYWxnPT09dW5kZWZpbmVkKXtyZXR1cm4gZmFsc2V9aWYobC5hbGc9PT11bmRlZmluZWQpe3Rocm93XCJhY2NlcHRGaWVsZC5hbGcgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9aWYoIWguaW5BcnJheShmLmFsZyxsLmFsZykpe3JldHVybiBmYWxzZX1pZihlLmlzcyE9PXVuZGVmaW5lZCYmdHlwZW9mIGwuaXNzPT09XCJvYmplY3RcIil7aWYoIWguaW5BcnJheShlLmlzcyxsLmlzcykpe3JldHVybiBmYWxzZX19aWYoZS5zdWIhPT11bmRlZmluZWQmJnR5cGVvZiBsLnN1Yj09PVwib2JqZWN0XCIpe2lmKCFoLmluQXJyYXkoZS5zdWIsbC5zdWIpKXtyZXR1cm4gZmFsc2V9fWlmKGUuYXVkIT09dW5kZWZpbmVkJiZ0eXBlb2YgbC5hdWQ9PT1cIm9iamVjdFwiKXtpZih0eXBlb2YgZS5hdWQ9PVwic3RyaW5nXCIpe2lmKCFoLmluQXJyYXkoZS5hdWQsbC5hdWQpKXtyZXR1cm4gZmFsc2V9fWVsc2V7aWYodHlwZW9mIGUuYXVkPT1cIm9iamVjdFwiKXtpZighaC5pbmNsdWRlZEFycmF5KGUuYXVkLGwuYXVkKSl7cmV0dXJuIGZhbHNlfX19fXZhciBiPUtKVVIuandzLkludERhdGUuZ2V0Tm93KCk7aWYobC52ZXJpZnlBdCE9PXVuZGVmaW5lZCYmdHlwZW9mIGwudmVyaWZ5QXQ9PT1cIm51bWJlclwiKXtiPWwudmVyaWZ5QXR9aWYobC5ncmFjZVBlcmlvZD09PXVuZGVmaW5lZHx8dHlwZW9mIGwuZ3JhY2VQZXJpb2QhPT1cIm51bWJlclwiKXtsLmdyYWNlUGVyaW9kPTB9aWYoZS5leHAhPT11bmRlZmluZWQmJnR5cGVvZiBlLmV4cD09XCJudW1iZXJcIil7aWYoZS5leHArbC5ncmFjZVBlcmlvZDxiKXtyZXR1cm4gZmFsc2V9fWlmKGUubmJmIT09dW5kZWZpbmVkJiZ0eXBlb2YgZS5uYmY9PVwibnVtYmVyXCIpe2lmKGI8ZS5uYmYtbC5ncmFjZVBlcmlvZCl7cmV0dXJuIGZhbHNlfX1pZihlLmlhdCE9PXVuZGVmaW5lZCYmdHlwZW9mIGUuaWF0PT1cIm51bWJlclwiKXtpZihiPGUuaWF0LWwuZ3JhY2VQZXJpb2Qpe3JldHVybiBmYWxzZX19aWYoZS5qdGkhPT11bmRlZmluZWQmJmwuanRpIT09dW5kZWZpbmVkKXtpZihlLmp0aSE9PWwuanRpKXtyZXR1cm4gZmFsc2V9fWlmKCFLSlVSLmp3cy5KV1MudmVyaWZ5KGQsaixsLmFsZykpe3JldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX07S0pVUi5qd3MuSldTLmluY2x1ZGVkQXJyYXk9ZnVuY3Rpb24oYixhKXt2YXIgZD1LSlVSLmp3cy5KV1MuaW5BcnJheTtpZihiPT09bnVsbCl7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiIT09XCJvYmplY3RcIil7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiLmxlbmd0aCE9PVwibnVtYmVyXCIpe3JldHVybiBmYWxzZX1mb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7aWYoIWQoYltjXSxhKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX07S0pVUi5qd3MuSldTLmluQXJyYXk9ZnVuY3Rpb24oZCxiKXtpZihiPT09bnVsbCl7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiIT09XCJvYmplY3RcIil7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiBiLmxlbmd0aCE9PVwibnVtYmVyXCIpe3JldHVybiBmYWxzZX1mb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7aWYoYltjXT09ZCl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX07S0pVUi5qd3MuSldTLmp3c2FsZzJzaWdhbGc9e0hTMjU2OlwiSG1hY1NIQTI1NlwiLEhTMzg0OlwiSG1hY1NIQTM4NFwiLEhTNTEyOlwiSG1hY1NIQTUxMlwiLFJTMjU2OlwiU0hBMjU2d2l0aFJTQVwiLFJTMzg0OlwiU0hBMzg0d2l0aFJTQVwiLFJTNTEyOlwiU0hBNTEyd2l0aFJTQVwiLEVTMjU2OlwiU0hBMjU2d2l0aEVDRFNBXCIsRVMzODQ6XCJTSEEzODR3aXRoRUNEU0FcIixQUzI1NjpcIlNIQTI1NndpdGhSU0FhbmRNR0YxXCIsUFMzODQ6XCJTSEEzODR3aXRoUlNBYW5kTUdGMVwiLFBTNTEyOlwiU0hBNTEyd2l0aFJTQWFuZE1HRjFcIixub25lOlwibm9uZVwiLH07S0pVUi5qd3MuSldTLmlzU2FmZUpTT05TdHJpbmc9ZnVuY3Rpb24oYyxiLGQpe3ZhciBlPW51bGw7dHJ5e2U9anNvblBhcnNlKGMpO2lmKHR5cGVvZiBlIT1cIm9iamVjdFwiKXtyZXR1cm4gMH1pZihlLmNvbnN0cnVjdG9yPT09QXJyYXkpe3JldHVybiAwfWlmKGIpe2JbZF09ZX1yZXR1cm4gMX1jYXRjaChhKXtyZXR1cm4gMH19O0tKVVIuandzLkpXUy5yZWFkU2FmZUpTT05TdHJpbmc9ZnVuY3Rpb24oYil7dmFyIGM9bnVsbDt0cnl7Yz1qc29uUGFyc2UoYik7aWYodHlwZW9mIGMhPVwib2JqZWN0XCIpe3JldHVybiBudWxsfWlmKGMuY29uc3RydWN0b3I9PT1BcnJheSl7cmV0dXJuIG51bGx9cmV0dXJuIGN9Y2F0Y2goYSl7cmV0dXJuIG51bGx9fTtLSlVSLmp3cy5KV1MuZ2V0RW5jb2RlZFNpZ25hdHVyZVZhbHVlRnJvbUpXUz1mdW5jdGlvbihhKXtpZihhLm1hdGNoKC9eW14uXStcXC5bXi5dK1xcLihbXi5dKykkLyk9PW51bGwpe3Rocm93XCJKV1Mgc2lnbmF0dXJlIGlzIG5vdCBhIGZvcm0gb2YgJ0hlYWQuUGF5bG9hZC5TaWdWYWx1ZScuXCJ9cmV0dXJuIFJlZ0V4cC4kMX07S0pVUi5qd3MuSldTLmdldEpXS3RodW1icHJpbnQ9ZnVuY3Rpb24oZCl7aWYoZC5rdHkhPT1cIlJTQVwiJiZkLmt0eSE9PVwiRUNcIiYmZC5rdHkhPT1cIm9jdFwiKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnb3JpdGhtIGZvciBKV0sgVGh1bXByaW50XCJ9dmFyIGE9XCJ7XCI7aWYoZC5rdHk9PT1cIlJTQVwiKXtpZih0eXBlb2YgZC5uIT1cInN0cmluZ1wifHx0eXBlb2YgZC5lIT1cInN0cmluZ1wiKXt0aHJvd1wid3JvbmcgbiBhbmQgZSB2YWx1ZSBmb3IgUlNBIGtleVwifWErPSdcImVcIjpcIicrZC5lKydcIiwnO2ErPSdcImt0eVwiOlwiJytkLmt0eSsnXCIsJzthKz0nXCJuXCI6XCInK2QubisnXCJ9J31lbHNle2lmKGQua3R5PT09XCJFQ1wiKXtpZih0eXBlb2YgZC5jcnYhPVwic3RyaW5nXCJ8fHR5cGVvZiBkLnghPVwic3RyaW5nXCJ8fHR5cGVvZiBkLnkhPVwic3RyaW5nXCIpe3Rocm93XCJ3cm9uZyBjcnYsIHggYW5kIHkgdmFsdWUgZm9yIEVDIGtleVwifWErPSdcImNydlwiOlwiJytkLmNydisnXCIsJzthKz0nXCJrdHlcIjpcIicrZC5rdHkrJ1wiLCc7YSs9J1wieFwiOlwiJytkLngrJ1wiLCc7YSs9J1wieVwiOlwiJytkLnkrJ1wifSd9ZWxzZXtpZihkLmt0eT09PVwib2N0XCIpe2lmKHR5cGVvZiBkLmshPVwic3RyaW5nXCIpe3Rocm93XCJ3cm9uZyBrIHZhbHVlIGZvciBvY3Qoc3ltbWV0cmljKSBrZXlcIn1hKz0nXCJrdHlcIjpcIicrZC5rdHkrJ1wiLCc7YSs9J1wia1wiOlwiJytkLmsrJ1wifSd9fX12YXIgYj1yc3RydG9oZXgoYSk7dmFyIGM9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGIsXCJzaGEyNTZcIik7dmFyIGU9aGV4dG9iNjR1KGMpO3JldHVybiBlfTtLSlVSLmp3cy5JbnREYXRlPXt9O0tKVVIuandzLkludERhdGUuZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9PVwibm93XCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpfWVsc2V7aWYoYT09XCJub3cgKyAxaG91clwiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKSs2MCo2MH1lbHNle2lmKGE9PVwibm93ICsgMWRheVwiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKSs2MCo2MCoyNH1lbHNle2lmKGE9PVwibm93ICsgMW1vbnRoXCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpKzYwKjYwKjI0KjMwfWVsc2V7aWYoYT09XCJub3cgKyAxeWVhclwiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKSs2MCo2MCoyNCozNjV9ZWxzZXtpZihhLm1hdGNoKC9aJC8pKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXRadWx1KGEpfWVsc2V7aWYoYS5tYXRjaCgvXlswLTldKyQvKSl7cmV0dXJuIHBhcnNlSW50KGEpfX19fX19fXRocm93XCJ1bnN1cHBvcnRlZCBmb3JtYXQ6IFwiK2F9O0tKVVIuandzLkludERhdGUuZ2V0WnVsdT1mdW5jdGlvbihsKXt2YXIgaztpZihrPWwubWF0Y2goLyhcXGQrKShcXGRcXGQpKFxcZFxcZCkoXFxkXFxkKShcXGRcXGQpKFxcZFxcZClaLykpe3ZhciBiPVJlZ0V4cC4kMTt2YXIgaT1wYXJzZUludChiKTtpZihiLmxlbmd0aD09NCl7fWVsc2V7aWYoYi5sZW5ndGg9PTIpe2lmKDUwPD1pJiZpPDEwMCl7aT0xOTAwK2l9ZWxzZXtpZigwPD1pJiZpPDUwKXtpPTIwMDAraX1lbHNle3Rocm93XCJtYWxmb3JtZWQgeWVhciBzdHJpbmcgZm9yIFVUQ1RpbWVcIn19fWVsc2V7dGhyb3dcIm1hbGZvcm1lZCB5ZWFyIHN0cmluZ1wifX12YXIgZz1wYXJzZUludChSZWdFeHAuJDIpLTE7dmFyIGo9cGFyc2VJbnQoUmVnRXhwLiQzKTt2YXIgYz1wYXJzZUludChSZWdFeHAuJDQpO3ZhciBlPXBhcnNlSW50KFJlZ0V4cC4kNSk7dmFyIGY9cGFyc2VJbnQoUmVnRXhwLiQ2KTt2YXIgaD1uZXcgRGF0ZShEYXRlLlVUQyhpLGcsaixjLGUsZikpO3JldHVybiB+fihoLzEwMDApfXRocm93XCJ1bnN1cHBvcnRlZCBmb3JtYXQ6IFwiK2x9O0tKVVIuandzLkludERhdGUuZ2V0Tm93PWZ1bmN0aW9uKCl7dmFyIGE9fn4obmV3IERhdGUoKS8xMDAwKTtyZXR1cm4gYX07S0pVUi5qd3MuSW50RGF0ZS5pbnREYXRlMlVUQ1N0cmluZz1mdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZShhKjEwMDApO3JldHVybiBiLnRvVVRDU3RyaW5nKCl9O0tKVVIuandzLkludERhdGUuaW50RGF0ZTJadWx1PWZ1bmN0aW9uKGUpe3ZhciBpPW5ldyBEYXRlKGUqMTAwMCk7dmFyIGg9KFwiMDAwMFwiK2kuZ2V0VVRDRnVsbFllYXIoKSkuc2xpY2UoLTQpO3ZhciBnPShcIjAwXCIrKGkuZ2V0VVRDTW9udGgoKSsxKSkuc2xpY2UoLTIpO3ZhciBiPShcIjAwXCIraS5nZXRVVENEYXRlKCkpLnNsaWNlKC0yKTt2YXIgYT0oXCIwMFwiK2kuZ2V0VVRDSG91cnMoKSkuc2xpY2UoLTIpO3ZhciBjPShcIjAwXCIraS5nZXRVVENNaW51dGVzKCkpLnNsaWNlKC0yKTt2YXIgZj0oXCIwMFwiK2kuZ2V0VVRDU2Vjb25kcygpKS5zbGljZSgtMik7cmV0dXJuIGgrZytiK2ErYytmK1wiWlwifTtcbi8qISBqd3Nqcy0yLjEuMCAoYykgMjAxMC0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5qd3M9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmp3cyl7S0pVUi5qd3M9e319S0pVUi5qd3MuSldTSlM9ZnVuY3Rpb24oKXt2YXIgYj1LSlVSLmp3cy5KV1M7dmFyIGE9S0pVUi5qd3MuSldTO3RoaXMuYUhlYWRlcj1bXTt0aGlzLnNQYXlsb2FkPVwiXCI7dGhpcy5hU2lnbmF0dXJlPVtdO3RoaXMuaW5pdD1mdW5jdGlvbigpe3RoaXMuYUhlYWRlcj1bXTt0aGlzLnNQYXlsb2FkPXVuZGVmaW5lZDt0aGlzLmFTaWduYXR1cmU9W119O3RoaXMuaW5pdFdpdGhKV1M9ZnVuY3Rpb24oZCl7dGhpcy5pbml0KCk7dmFyIGM9ZC5zcGxpdChcIi5cIik7aWYoYy5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgaW5wdXQgSldTXCJ9dGhpcy5hSGVhZGVyLnB1c2goY1swXSk7dGhpcy5zUGF5bG9hZD1jWzFdO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGNbMl0pfTt0aGlzLmFkZFNpZ25hdHVyZT1mdW5jdGlvbihjLGYsayxpKXtpZih0aGlzLnNQYXlsb2FkPT09dW5kZWZpbmVkfHx0aGlzLnNQYXlsb2FkPT09bnVsbCl7dGhyb3dcInRoZXJlJ3Mgbm8gSlNPTi1KUyBzaWduYXR1cmUgdG8gYWRkLlwifXZhciBqPXRoaXMuYUhlYWRlci5sZW5ndGg7aWYodGhpcy5hSGVhZGVyLmxlbmd0aCE9dGhpcy5hU2lnbmF0dXJlLmxlbmd0aCl7dGhyb3dcImFIZWFkZXIubGVuZ3RoICE9IGFTaWduYXR1cmUubGVuZ3RoXCJ9dHJ5e3ZhciBkPUtKVVIuandzLkpXUy5zaWduKGMsZix0aGlzLnNQYXlsb2FkLGssaSk7dmFyIGg9ZC5zcGxpdChcIi5cIik7dmFyIGw9aFswXTt2YXIgZT1oWzJdO3RoaXMuYUhlYWRlci5wdXNoKGhbMF0pO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGhbMl0pfWNhdGNoKGcpe2lmKHRoaXMuYUhlYWRlci5sZW5ndGg+ail7dGhpcy5hSGVhZGVyLnBvcCgpfWlmKHRoaXMuYVNpZ25hdHVyZS5sZW5ndGg+ail7dGhpcy5hU2lnbmF0dXJlLnBvcCgpfXRocm93XCJhZGRTaWduYXR1cmUgZmFpbGVkOiBcIitnfX07dGhpcy5hZGRTaWduYXR1cmVCeUhlYWRlcktleT1mdW5jdGlvbihmLGMpe3ZhciBlPWI2NHV0b3V0ZjgodGhpcy5zUGF5bG9hZCk7dmFyIGQ9bmV3IEtKVVIuandzLkpXUygpO3ZhciBnPWQuZ2VuZXJhdGVKV1NCeVAxUHJ2S2V5KGYsZSxjKTt0aGlzLmFIZWFkZXIucHVzaChkLnBhcnNlZEpXUy5oZWFkQjY0VSk7dGhpcy5hU2lnbmF0dXJlLnB1c2goZC5wYXJzZWRKV1Muc2lndmFsQjY0VSl9O3RoaXMuYWRkU2lnbmF0dXJlQnlIZWFkZXJQYXlsb2FkS2V5PWZ1bmN0aW9uKGYsZSxjKXt2YXIgZD1uZXcgS0pVUi5qd3MuSldTKCk7dmFyIGc9ZC5nZW5lcmF0ZUpXU0J5UDFQcnZLZXkoZixlLGMpO3RoaXMuYUhlYWRlci5wdXNoKGQucGFyc2VkSldTLmhlYWRCNjRVKTt0aGlzLnNQYXlsb2FkPWQucGFyc2VkSldTLnBheWxvYWRCNjRVO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGQucGFyc2VkSldTLnNpZ3ZhbEI2NFUpfTt0aGlzLnZlcmlmeUFsbD1mdW5jdGlvbihmKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoIT09Zi5sZW5ndGh8fHRoaXMuYVNpZ25hdHVyZS5sZW5ndGghPT1mLmxlbmd0aCl7cmV0dXJuIGZhbHNlfWZvcih2YXIgZT0wO2U8Zi5sZW5ndGg7ZSsrKXt2YXIgZD1mW2VdO2lmKGQubGVuZ3RoIT09Mil7cmV0dXJuIGZhbHNlfXZhciBjPXRoaXMudmVyaWZ5TnRoKGUsZFswXSxkWzFdKTtpZihjPT09ZmFsc2Upe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O3RoaXMudmVyaWZ5TnRoPWZ1bmN0aW9uKGQsaCxlKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoPD1kfHx0aGlzLmFTaWduYXR1cmUubGVuZ3RoPD1kKXtyZXR1cm4gZmFsc2V9dmFyIGY9dGhpcy5hSGVhZGVyW2RdO3ZhciBpPXRoaXMuYVNpZ25hdHVyZVtkXTt2YXIgaj1mK1wiLlwiK3RoaXMuc1BheWxvYWQrXCIuXCIraTt2YXIgYz1mYWxzZTt0cnl7Yz1hLnZlcmlmeShqLGgsZSl9Y2F0Y2goZyl7cmV0dXJuIGZhbHNlfXJldHVybiBjfTt0aGlzLnZlcmlmeVdpdGhDZXJ0cz1mdW5jdGlvbihkKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoIT1kLmxlbmd0aCl7dGhyb3dcIm51bSBoZWFkZXJzIGRvZXMgbm90IG1hdGNoIHdpdGggbnVtIGNlcnRzXCJ9aWYodGhpcy5hU2lnbmF0dXJlLmxlbmd0aCE9ZC5sZW5ndGgpe3Rocm93XCJudW0gc2lnbmF0dXJlcyBkb2VzIG5vdCBtYXRjaCB3aXRoIG51bSBjZXJ0c1wifXZhciBsPXRoaXMuc1BheWxvYWQ7dmFyIGg9XCJcIjtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTt2YXIgZz10aGlzLmFIZWFkZXJbZV07dmFyIG49dGhpcy5hU2lnbmF0dXJlW2VdO3ZhciBjPWcrXCIuXCIrbCtcIi5cIituO3ZhciBrPW5ldyBLSlVSLmp3cy5KV1MoKTt0cnl7dmFyIG09ay52ZXJpZnlKV1NCeVBlbVg1MDlDZXJ0KGMsZik7aWYobSE9MSl7aCs9KGUrMSkrXCJ0aCBzaWduYXR1cmUgdW5tYXRjaC4gXCJ9fWNhdGNoKGope2grPShlKzEpK1widGggc2lnbmF0dXJlIGZhaWwoXCIraitcIikuIFwifX1pZihoPT1cIlwiKXtyZXR1cm4gMX1lbHNle3Rocm93IGh9fTt0aGlzLnJlYWRKV1NKUz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09PVwic3RyaW5nXCIpe3ZhciBkPWIucmVhZFNhZmVKU09OU3RyaW5nKGUpO2lmKGQ9PW51bGwpe3Rocm93XCJhcmd1bWVudCBpcyBub3Qgc2FmZSBKU09OIG9iamVjdCBzdHJpbmdcIn10aGlzLmFIZWFkZXI9ZC5oZWFkZXJzO3RoaXMuc1BheWxvYWQ9ZC5wYXlsb2FkO3RoaXMuYVNpZ25hdHVyZT1kLnNpZ25hdHVyZXN9ZWxzZXt0cnl7aWYoZS5oZWFkZXJzLmxlbmd0aD4wKXt0aGlzLmFIZWFkZXI9ZS5oZWFkZXJzfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCBoZWFkZXJcIn1pZih0eXBlb2YgZS5wYXlsb2FkPT09XCJzdHJpbmdcIil7dGhpcy5zUGF5bG9hZD1lLnBheWxvYWR9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIHNpZ25hdHVyZXNcIn1pZihlLnNpZ25hdHVyZXMubGVuZ3RoPjApe3RoaXMuc2lnbmF0dXJlcz1lLnNpZ25hdHVyZXN9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIHNpZ25hdHVyZXNcIn19Y2F0Y2goYyl7dGhyb3dcIm1hbGZvcm1lZCBKV1MtSlMgSlNPTiBvYmplY3Q6IFwiK2N9fX07dGhpcy5nZXRKU09OPWZ1bmN0aW9uKCl7cmV0dXJue2hlYWRlcnM6dGhpcy5hSGVhZGVyLHBheWxvYWQ6dGhpcy5zUGF5bG9hZCxzaWduYXR1cmVzOnRoaXMuYVNpZ25hdHVyZX19O3RoaXMuaXNFbXB0eT1mdW5jdGlvbigpe2lmKHRoaXMuYUhlYWRlci5sZW5ndGg9PTApe3JldHVybiAxfXJldHVybiAwfX07XG4vKiEgbm9kZXV0aWwtMS4wLjAgKGMpIDIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gcmVhZEZpbGVVVEY4KGEpe3JldHVybiByZXF1aXJlKFwiZnNcIikucmVhZEZpbGVTeW5jKGEsXCJ1dGY4XCIpfWZ1bmN0aW9uIHJlYWRGaWxlSGV4QnlCaW4oYyl7dmFyIGI9cmVxdWlyZShcImpzcnNhc2lnblwiKTt2YXIgYT1yZXF1aXJlKFwiZnNcIik7cmV0dXJuIGIucnN0cnRvaGV4KGEucmVhZEZpbGVTeW5jKGMsXCJiaW5hcnlcIikpfWZ1bmN0aW9uIHJlYWRGaWxlKGIpe3ZhciBhPXJlcXVpcmUoXCJmc1wiKTtyZXR1cm4gYS5yZWFkRmlsZVN5bmMoYixcImJpbmFyeVwiKX1mdW5jdGlvbiBzYXZlRmlsZShjLGIpe3ZhciBhPXJlcXVpcmUoXCJmc1wiKTthLndyaXRlRmlsZVN5bmMoYyxiLFwiYmluYXJ5XCIpfWZ1bmN0aW9uIHNhdmVGaWxlQmluQnlIZXgoZSxiKXt2YXIgYT1yZXF1aXJlKFwiZnNcIik7dmFyIGM9cmVxdWlyZShcImpzcnNhc2lnblwiKTt2YXIgZD1jLmhleHRvcnN0cihiKTthLndyaXRlRmlsZVN5bmMoZSxkLFwiYmluYXJ5XCIpfTtcbmV4cG9ydHMuU2VjdXJlUmFuZG9tID0gU2VjdXJlUmFuZG9tO1xuZXhwb3J0cy5ybmdfc2VlZF90aW1lID0gcm5nX3NlZWRfdGltZTtcblxuZXhwb3J0cy5CaWdJbnRlZ2VyID0gQmlnSW50ZWdlcjtcbmV4cG9ydHMuUlNBS2V5ID0gUlNBS2V5O1xuZXhwb3J0cy5FQ0RTQSA9IEtKVVIuY3J5cHRvLkVDRFNBO1xuZXhwb3J0cy5EU0EgPSBLSlVSLmNyeXB0by5EU0E7XG5leHBvcnRzLlNpZ25hdHVyZSA9IEtKVVIuY3J5cHRvLlNpZ25hdHVyZTtcbmV4cG9ydHMuTWVzc2FnZURpZ2VzdCA9IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Q7XG5leHBvcnRzLk1hYyA9IEtKVVIuY3J5cHRvLk1hYztcbmV4cG9ydHMuS0VZVVRJTCA9IEtFWVVUSUw7XG5leHBvcnRzLkFTTjFIRVggPSBBU04xSEVYO1xuZXhwb3J0cy5YNTA5ID0gWDUwOTtcbmV4cG9ydHMuQ3J5cHRvSlMgPSBDcnlwdG9KUztcblxuLy8gZXh0L2Jhc2U2NC5qc1xuZXhwb3J0cy5iNjR0b2hleCA9IGI2NHRvaGV4O1xuZXhwb3J0cy5iNjR0b0JBID0gYjY0dG9CQTtcblxuLy8gYmFzZTY0eC5qc1xuZXhwb3J0cy5zdG9CQSA9IHN0b0JBO1xuZXhwb3J0cy5CQXRvcyA9IEJBdG9zO1xuZXhwb3J0cy5CQXRvaGV4ID0gQkF0b2hleDtcbmV4cG9ydHMuc3RvaGV4ID0gc3RvaGV4O1xuZXhwb3J0cy5zdG9iNjQgPSBzdG9iNjQ7XG5leHBvcnRzLnN0b2I2NHUgPSBzdG9iNjR1O1xuZXhwb3J0cy5iNjR1dG9zID0gYjY0dXRvcztcbmV4cG9ydHMuYjY0dG9iNjR1ID0gYjY0dG9iNjR1O1xuZXhwb3J0cy5iNjR1dG9iNjQgPSBiNjR1dG9iNjQ7XG5leHBvcnRzLmhleDJiNjQgPSBoZXgyYjY0O1xuZXhwb3J0cy5oZXh0b2I2NHUgPSBoZXh0b2I2NHU7XG5leHBvcnRzLmI2NHV0b2hleCA9IGI2NHV0b2hleDtcbmV4cG9ydHMuYjY0dG9oZXggPSBiNjR0b2hleDtcbmV4cG9ydHMudXRmOHRvYjY0dSA9IHV0Zjh0b2I2NHU7XG5leHBvcnRzLmI2NHV0b3V0ZjggPSBiNjR1dG91dGY4O1xuZXhwb3J0cy51dGY4dG9iNjQgPSB1dGY4dG9iNjQ7XG5leHBvcnRzLmI2NHRvdXRmOCA9IGI2NHRvdXRmODtcbmV4cG9ydHMudXRmOHRvaGV4ID0gdXRmOHRvaGV4O1xuZXhwb3J0cy5oZXh0b3V0ZjggPSBoZXh0b3V0Zjg7XG5leHBvcnRzLmhleHRvcnN0ciA9IGhleHRvcnN0cjtcbmV4cG9ydHMucnN0cnRvaGV4ID0gcnN0cnRvaGV4O1xuZXhwb3J0cy5uZXdsaW5lX3RvVW5peCA9IG5ld2xpbmVfdG9Vbml4O1xuZXhwb3J0cy5uZXdsaW5lX3RvRG9zID0gbmV3bGluZV90b0RvcztcbmV4cG9ydHMuaW50YXJ5c3RydG9oZXggPSBpbnRhcnlzdHJ0b2hleDtcbmV4cG9ydHMuc3RyZGlmZmlkeCA9IHN0cmRpZmZpZHg7XG5cbmV4cG9ydHMuS0pVUiA9IEtKVVI7XG5leHBvcnRzLmNyeXB0byA9IEtKVVIuY3J5cHRvO1xuZXhwb3J0cy5hc24xID0gS0pVUi5hc24xO1xuZXhwb3J0cy5qd3MgPSBLSlVSLmp3cztcbmV4cG9ydHMubGFuZyA9IEtKVVIubGFuZztcblxuZXhwb3J0cy5yZWFkRmlsZVVURjggPSByZWFkRmlsZVVURjg7XG5leHBvcnRzLnJlYWRGaWxlSGV4QnlCaW4gPSByZWFkRmlsZUhleEJ5QmluO1xuZXhwb3J0cy5yZWFkRmlsZSA9IHJlYWRGaWxlO1xuZXhwb3J0cy5zYXZlRmlsZSA9IHNhdmVGaWxlO1xuZXhwb3J0cy5zYXZlRmlsZUJpbkJ5SGV4ID0gc2F2ZUZpbGVCaW5CeUhleDtcblxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pzcnNhc2lnbi9saWIvanNyc2FzaWduLmpzXG4vLyBtb2R1bGUgaWQgPSAxMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5pbXBvcnQgU2lnbmluU3RhdGUgZnJvbSAnLi9TaWduaW5TdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBTaWduaW5SZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3Rvcih7XG4gICAgICAgIC8vIG1hbmRhdG9yeVxuICAgICAgICB1cmwsIGNsaWVudF9pZCwgcmVkaXJlY3RfdXJpLCByZXNwb25zZV90eXBlLCBzY29wZSwgYXV0aG9yaXR5LFxuICAgICAgICAvLyBvcHRpb25hbFxuICAgICAgICBkYXRhLCBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXMsIHJlc291cmNlLFxuICAgICAgICByZXF1ZXN0LCByZXF1ZXN0X3VyaSwgZXh0cmFRdWVyeVBhcmFtcyxcbiAgICB9KSB7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB1cmwgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjbGllbnRfaWQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGNsaWVudF9pZCBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlZGlyZWN0X3VyaSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcmVkaXJlY3RfdXJpIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVkaXJlY3RfdXJpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzcG9uc2VfdHlwZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcmVzcG9uc2VfdHlwZSBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlX3R5cGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzY29wZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2NvcGUgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY29wZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWF1dGhvcml0eSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXV0aG9yaXR5IHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXR5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9pZGMgPSBTaWduaW5SZXF1ZXN0LmlzT2lkYyhyZXNwb25zZV90eXBlKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBTaWduaW5TdGF0ZSh7IG5vbmNlOiBvaWRjLCBkYXRhLCBjbGllbnRfaWQsIGF1dGhvcml0eSB9KTtcblxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcImNsaWVudF9pZFwiLCBjbGllbnRfaWQpO1xuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlZGlyZWN0X3VyaVwiLCByZWRpcmVjdF91cmkpO1xuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlc3BvbnNlX3R5cGVcIiwgcmVzcG9uc2VfdHlwZSk7XG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwic2NvcGVcIiwgc2NvcGUpO1xuICAgICAgICBcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcbiAgICAgICAgaWYgKG9pZGMpIHtcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwibm9uY2VcIiwgdGhpcy5zdGF0ZS5ub25jZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3B0aW9uYWwgPSB7IHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlcywgcmVzb3VyY2UsIHJlcXVlc3QsIHJlcXVlc3RfdXJpIH07XG4gICAgICAgIGZvcihsZXQga2V5IGluIG9wdGlvbmFsKXtcbiAgICAgICAgICAgIGlmIChvcHRpb25hbFtrZXldKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwga2V5LCBvcHRpb25hbFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihsZXQga2V5IGluIGV4dHJhUXVlcnlQYXJhbXMpe1xuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwga2V5LCBleHRyYVF1ZXJ5UGFyYW1zW2tleV0pXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNPaWRjKHJlc3BvbnNlX3R5cGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3BvbnNlX3R5cGUuc3BsaXQoL1xccysvZykuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtID09PSBcImlkX3Rva2VuXCI7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gISEocmVzdWx0WzBdKTtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGlzT0F1dGgocmVzcG9uc2VfdHlwZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gPT09IFwidG9rZW5cIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAhIShyZXN1bHRbMF0pO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TaWduaW5SZXF1ZXN0LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuZXhwb3J0IGNsYXNzIFVybFV0aWxpdHkge1xuICAgIHN0YXRpYyBhZGRRdWVyeVBhcmFtKHVybCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgICB1cmwgKz0gXCI/XCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXJsW3VybC5sZW5ndGggLSAxXSAhPT0gXCI/XCIpIHtcbiAgICAgICAgICAgIHVybCArPSBcIiZcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XG4gICAgICAgIHVybCArPSBcIj1cIjtcbiAgICAgICAgdXJsICs9IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2VVcmxGcmFnbWVudCh2YWx1ZSwgZGVsaW1pdGVyID0gXCIjXCIsIGdsb2JhbCA9IEdsb2JhbCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnRcIik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpe1xuICAgICAgICAgICAgdmFsdWUgPSBnbG9iYWwubG9jYXRpb24uaHJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpZHggPSB2YWx1ZS5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyKGlkeCArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBhcmFtcyA9IHt9LFxuICAgICAgICAgICAgcmVnZXggPSAvKFteJj1dKyk9KFteJl0qKS9nLFxuICAgICAgICAgICAgbTtcblxuICAgICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICAgIHdoaWxlIChtID0gcmVnZXguZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobVsxXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KG1bMl0pO1xuICAgICAgICAgICAgaWYgKGNvdW50ZXIrKyA+IDUwKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwicmVzcG9uc2UgZXhjZWVkZWQgZXhwZWN0ZWQgbnVtYmVyIG9mIHBhcmFtZXRlcnNcIiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBcIlJlc3BvbnNlIGV4Y2VlZGVkIGV4cGVjdGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXJsVXRpbGl0eS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xuaW1wb3J0IHJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbmV4cG9ydCBjbGFzcyBTaWduaW5TdGF0ZSBleHRlbmRzIFN0YXRlIHtcbiAgICBjb25zdHJ1Y3Rvcih7bm9uY2UsIGF1dGhvcml0eSwgY2xpZW50X2lkfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAobm9uY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gcmFuZG9tKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9uY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gbm9uY2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IGF1dGhvcml0eTtcbiAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gY2xpZW50X2lkO1xuICAgIH1cblxuICAgIGdldCBub25jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vbmNlO1xuICAgIH1cbiAgICBnZXQgYXV0aG9yaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yaXR5O1xuICAgIH1cbiAgICBnZXQgY2xpZW50X2lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2lkO1xuICAgIH1cbiAgICBcbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlNpZ25pblN0YXRlLnRvU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkLFxuICAgICAgICAgICAgbm9uY2U6IHRoaXMubm9uY2UsXG4gICAgICAgICAgICBhdXRob3JpdHk6IHRoaXMuYXV0aG9yaXR5LFxuICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudF9pZFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xuICAgICAgICBMb2cuZGVidWcoXCJTaWduaW5TdGF0ZS5mcm9tU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpO1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25pblN0YXRlKGRhdGEpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TaWduaW5TdGF0ZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IHJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioe2lkLCBkYXRhLCBjcmVhdGVkfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2lkID0gaWQgfHwgcmFuZG9tKCk7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY3JlYXRlZCA9PT0gJ251bWJlcicgJiYgY3JlYXRlZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZWQgPSBjcmVhdGVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlZCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIGdldCBjcmVhdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlZDtcbiAgICB9XG5cbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlN0YXRlLnRvU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xuICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZShKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYXJTdGFsZVN0YXRlKHN0b3JhZ2UsIGFnZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJTdGF0ZS5jbGVhclN0YWxlU3RhdGVcIik7XG5cbiAgICAgICAgdmFyIGN1dG9mZiA9IERhdGUubm93KCkgLyAxMDAwIC0gYWdlO1xuXG4gICAgICAgIHJldHVybiBzdG9yYWdlLmdldEFsbEtleXMoKS50aGVuKGtleXMgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IGtleXNcIiwga2V5cyk7XG5cbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIHAgPSBzdG9yYWdlLmdldChrZXkpLnRoZW4oaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhpdGVtKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IGl0ZW0gZnJvbSBrZXk6IFwiLCBrZXksIHN0YXRlLmNyZWF0ZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmNyZWF0ZWQgPD0gY3V0b2ZmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBwYXJzaW5nIHN0YXRlIGZvciBrZXlcIiwga2V5LCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJubyBpdGVtIGluIHN0b3JhZ2UgZm9yIGtleTogXCIsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicmVtb3ZlZCBpdGVtIGZvciBrZXk6IFwiLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIndhaXRpbmcgb24gcHJvbWlzZSBjb3VudDpcIiwgcHJvbWlzZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TdGF0ZS5qcyIsIi8vIE5PVElDRTogdGhlIGNvZGUgaW4gdGhpcyBmaWxlIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IE1pY3Jvc29mdFxuLy8gb3JpZ2luYWwgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmVBRC9henVyZS1hY3RpdmVkaXJlY3RvcnktbGlicmFyeS1mb3ItanMvYmxvYi9tYXN0ZXIvbGliL2FkYWwuanMjTDEwMjlcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRhbEpTIHYxLjAuOFxuLy8gQHByZXNlcnZlIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IE9wZW4gVGVjaG5vbG9naWVzLCBJbmMuXG4vLyBBbGwgUmlnaHRzIFJlc2VydmVkXG4vLyBBcGFjaGUgTGljZW5zZSAyLjBcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5kb20oKSB7XG4gICAgdmFyIGd1aWRIb2xkZXIgPSAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnO1xuICAgIHZhciBoZXggPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBndWlkUmVzcG9uc2UgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3VpZEhvbGRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZ3VpZEhvbGRlcltpXSAhPT0gJy0nICYmIGd1aWRIb2xkZXJbaV0gIT09ICc0Jykge1xuICAgICAgICAgICAgLy8gZWFjaCB4IGFuZCB5IG5lZWRzIHRvIGJlIHJhbmRvbVxuICAgICAgICAgICAgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ3VpZEhvbGRlcltpXSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBndWlkUmVzcG9uc2UgKz0gaGV4W3JdO1xuICAgICAgICB9IGVsc2UgaWYgKGd1aWRIb2xkZXJbaV0gPT09ICd5Jykge1xuICAgICAgICAgICAgLy8gY2xvY2stc2VxLWFuZC1yZXNlcnZlZCBmaXJzdCBoZXggaXMgZmlsdGVyZWQgYW5kIHJlbWFpbmluZyBoZXggdmFsdWVzIGFyZSByYW5kb21cbiAgICAgICAgICAgIHIgJj0gMHgzOyAvLyBiaXQgYW5kIHdpdGggMDAxMSB0byBzZXQgcG9zIDIgdG8gemVybyA/MD8/XG4gICAgICAgICAgICByIHw9IDB4ODsgLy8gc2V0IHBvcyAzIHRvIDEgYXMgMT8/P1xuICAgICAgICAgICAgZ3VpZFJlc3BvbnNlICs9IGhleFtyXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGd1aWRSZXNwb25zZSArPSBndWlkSG9sZGVyW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBndWlkUmVzcG9uc2U7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JhbmRvbS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5cbmNvbnN0IE9pZGNTY29wZSA9IFwib3BlbmlkXCI7XG5cbmV4cG9ydCBjbGFzcyBTaWduaW5SZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IodXJsKSB7XG5cbiAgICAgICAgdmFyIHZhbHVlcyA9IFVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudCh1cmwsIFwiI1wiKTtcblxuICAgICAgICB0aGlzLmVycm9yID0gdmFsdWVzLmVycm9yO1xuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gdmFsdWVzLmVycm9yX2Rlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlcy5zdGF0ZTtcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IHZhbHVlcy5pZF90b2tlbjtcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gdmFsdWVzLnNlc3Npb25fc3RhdGU7XG4gICAgICAgIHRoaXMuYWNjZXNzX3Rva2VuID0gdmFsdWVzLmFjY2Vzc190b2tlbjtcbiAgICAgICAgdGhpcy50b2tlbl90eXBlID0gdmFsdWVzLnRva2VuX3R5cGU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB2YWx1ZXMuc2NvcGU7XG4gICAgICAgIHRoaXMucHJvZmlsZSA9IHVuZGVmaW5lZDsgLy8gd2lsbCBiZSBzZXQgZnJvbSBSZXNwb25zZVZhbGlkYXRvclxuXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gcGFyc2VJbnQodmFsdWVzLmV4cGlyZXNfaW4pO1xuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZXNfaW4gPT09ICdudW1iZXInICYmIGV4cGlyZXNfaW4gPiAwKSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVzX2F0ID0gbm93ICsgZXhwaXJlc19pbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBleHBpcmVzX2luKCkge1xuICAgICAgICBpZiAodGhpcy5leHBpcmVzX2F0KSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwaXJlc19hdCAtIG5vdztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldCBleHBpcmVkKCkge1xuICAgICAgICBsZXQgZXhwaXJlc19pbiA9IHRoaXMuZXhwaXJlc19pbjtcbiAgICAgICAgaWYgKGV4cGlyZXNfaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGlyZXNfaW4gPD0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldCBzY29wZXMoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zY29wZSB8fCBcIlwiKS5zcGxpdChcIiBcIik7XG4gICAgfVxuXG4gICAgZ2V0IGlzT3BlbklkQ29ubmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVzLmluZGV4T2YoT2lkY1Njb3BlKSA+PSAwIHx8ICEhdGhpcy5pZF90b2tlbjtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lnbmluUmVzcG9uc2UuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5pbXBvcnQgU3RhdGUgZnJvbSAnLi9TdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBTaWdub3V0UmVxdWVzdCB7XG4gICAgY29uc3RydWN0b3Ioe3VybCwgaWRfdG9rZW5faGludCwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLCBkYXRhfSkge1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHBhc3NlZCB0byBTaWdub3V0UmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZF90b2tlbl9oaW50KSB7XG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcImlkX3Rva2VuX2hpbnRcIiwgaWRfdG9rZW5faGludCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpIHtcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwicG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpXCIsIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBTdGF0ZSh7IGRhdGEgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1NpZ25vdXRSZXF1ZXN0LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcblxuZXhwb3J0IGNsYXNzIFNpZ25vdXRSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IodXJsKSB7XG5cbiAgICAgICAgdmFyIHZhbHVlcyA9IFVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudCh1cmwsIFwiP1wiKTtcblxuICAgICAgICB0aGlzLmVycm9yID0gdmFsdWVzLmVycm9yO1xuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gdmFsdWVzLmVycm9yX2Rlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlcy5zdGF0ZTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU2lnbm91dFJlc3BvbnNlLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeVdlYlN0b3JhZ2V7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cblxuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkluTWVtb3J5V2ViU3RvcmFnZS5nZXRJdGVtXCIsIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhW2tleV07XG4gICAgfVxuXG4gICAgc2V0SXRlbShrZXksIHZhbHVlKXtcbiAgICAgICAgTG9nLmRlYnVnKFwiSW5NZW1vcnlXZWJTdG9yYWdlLnNldEl0ZW1cIiwga2V5KTtcbiAgICAgICAgdGhpcy5fZGF0YVtrZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShrZXkpe1xuICAgICAgICBMb2cuZGVidWcoXCJJbk1lbW9yeVdlYlN0b3JhZ2UucmVtb3ZlSXRlbVwiLCBrZXkpO1xuICAgICAgICBkZWxldGUgdGhpcy5fZGF0YVtrZXldO1xuICAgIH1cblxuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kYXRhKS5sZW5ndGg7XG4gICAgfVxuXG4gICAga2V5KGluZGV4KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kYXRhKVtpbmRleF07XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0luTWVtb3J5V2ViU3RvcmFnZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IE9pZGNDbGllbnQgZnJvbSAnLi9PaWRjQ2xpZW50JztcbmltcG9ydCBVc2VyTWFuYWdlclNldHRpbmdzIGZyb20gJy4vVXNlck1hbmFnZXJTZXR0aW5ncyc7XG5pbXBvcnQgVXNlciBmcm9tICcuL1VzZXInO1xuaW1wb3J0IFVzZXJNYW5hZ2VyRXZlbnRzIGZyb20gJy4vVXNlck1hbmFnZXJFdmVudHMnO1xuaW1wb3J0IFNpbGVudFJlbmV3U2VydmljZSBmcm9tICcuL1NpbGVudFJlbmV3U2VydmljZSc7XG5pbXBvcnQgU2Vzc2lvbk1vbml0b3IgZnJvbSAnLi9TZXNzaW9uTW9uaXRvcic7XG5pbXBvcnQgVG9rZW5SZXZvY2F0aW9uQ2xpZW50IGZyb20gJy4vVG9rZW5SZXZvY2F0aW9uQ2xpZW50JztcblxuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VyIGV4dGVuZHMgT2lkY0NsaWVudCB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MgPSB7fSxcbiAgICAgICAgU2lsZW50UmVuZXdTZXJ2aWNlQ3RvciA9IFNpbGVudFJlbmV3U2VydmljZSxcbiAgICAgICAgU2Vzc2lvbk1vbml0b3JDdG9yID0gU2Vzc2lvbk1vbml0b3IsXG4gICAgICAgIFRva2VuUmV2b2NhdGlvbkNsaWVudEN0b3IgPSBUb2tlblJldm9jYXRpb25DbGllbnRcbiAgICApIHtcblxuICAgICAgICBpZiAoIShzZXR0aW5ncyBpbnN0YW5jZW9mIFVzZXJNYW5hZ2VyU2V0dGluZ3MpKSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IG5ldyBVc2VyTWFuYWdlclNldHRpbmdzKHNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XG5cbiAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IFVzZXJNYW5hZ2VyRXZlbnRzKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdTZXJ2aWNlID0gbmV3IFNpbGVudFJlbmV3U2VydmljZUN0b3IodGhpcyk7XG5cbiAgICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50IGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM7IHRoZXNlIHNlcnZpY2VzIGRlcGVuZCB1cG9uIHRoZSBldmVudHMuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9tYXRpY1NpbGVudFJlbmV3KSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJhdXRvbWF0aWNTaWxlbnRSZW5ldyBpcyBjb25maWd1cmVkLCBzZXR0aW5nIHVwIHNpbGVudCByZW5ld1wiKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTaWxlbnRSZW5ldygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubW9uaXRvclNlc3Npb24pIHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIm1vbml0b3JTZXNzaW9uIGlzIGNvbmZpZ3VyZWQsIHNldHRpbmcgdXAgc2Vzc2lvbiBtb25pdG9yXCIpO1xuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbk1vbml0b3IgPSBuZXcgU2Vzc2lvbk1vbml0b3JDdG9yKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdG9rZW5SZXZvY2F0aW9uQ2xpZW50ID0gbmV3IFRva2VuUmV2b2NhdGlvbkNsaWVudEN0b3IodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIGdldCBfcmVkaXJlY3ROYXZpZ2F0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnJlZGlyZWN0TmF2aWdhdG9yO1xuICAgIH1cbiAgICBnZXQgX3BvcHVwTmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5wb3B1cE5hdmlnYXRvcjtcbiAgICB9XG4gICAgZ2V0IF9pZnJhbWVOYXZpZ2F0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmlmcmFtZU5hdmlnYXRvcjtcbiAgICB9XG4gICAgZ2V0IF91c2VyU3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnVzZXJTdG9yZTtcbiAgICB9XG5cbiAgICBnZXQgZXZlbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzO1xuICAgIH1cblxuICAgIGdldFVzZXIoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLmdldFVzZXJcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIGxvYWRlZFwiKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIG5vdCBmb3VuZCBpbiBzdG9yYWdlXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVVc2VyKCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5yZW1vdmVVc2VyXCIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcihudWxsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciByZW1vdmVkIGZyb20gc3RvcmFnZVwiKTtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cy51bmxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2lnbmluUmVkaXJlY3QoYXJncykge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5SZWRpcmVjdFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yKS50aGVuKCgpPT57XG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblJlZGlyZWN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaWduaW5SZWRpcmVjdENhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5SZWRpcmVjdENhbGxiYWNrXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluRW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgIGlmICh1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLnN1Yikge1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblJlZGlyZWN0Q2FsbGJhY2sgc3VjY2Vzc2Z1bCwgc2lnbmVkIGluIHN1YjogXCIsIHVzZXIucHJvZmlsZS5zdWIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5SZWRpcmVjdENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2lnbmluUG9wdXAoYXJncyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwXCIpO1xuXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnBvcHVwX3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnJlZGlyZWN0X3VyaTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHBvcHVwX3JlZGlyZWN0X3VyaSBvciByZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XG4gICAgICAgIGFyZ3MuZGlzcGxheSA9IFwicG9wdXBcIjtcblxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX3BvcHVwTmF2aWdhdG9yLCB7XG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxuICAgICAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlczogYXJncy5wb3B1cFdpbmRvd0ZlYXR1cmVzIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyxcbiAgICAgICAgICAgIHBvcHVwV2luZG93VGFyZ2V0OiBhcmdzLnBvcHVwV2luZG93VGFyZ2V0IHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dUYXJnZXRcbiAgICAgICAgfSkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluUG9wdXAgc3VjY2Vzc2Z1bCwgc2lnbmVkIGluIHN1YjogXCIsIHVzZXIucHJvZmlsZS5zdWIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5Qb3B1cCBzdWNjZXNzZnVsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaWduaW5Qb3B1cENhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cENhbGxiYWNrXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluQ2FsbGJhY2sodXJsLCB0aGlzLl9wb3B1cE5hdmlnYXRvcikudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluUG9wdXBDYWxsYmFjayBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblBvcHVwQ2FsbGJhY2sgc3VjY2Vzc2Z1bFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaWduaW5TaWxlbnQoYXJncyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudFwiKTtcblxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5zaWxlbnRfcmVkaXJlY3RfdXJpO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2lsZW50X3JlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzLnJlZGlyZWN0X3VyaSA9IHVybDtcbiAgICAgICAgYXJncy5wcm9tcHQgPSBcIm5vbmVcIjtcblxuICAgICAgICBsZXQgc2V0SWRUb2tlbjtcbiAgICAgICAgaWYgKGFyZ3MuaWRfdG9rZW5faGludCB8fCAhdGhpcy5zZXR0aW5ncy5pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcpIHtcbiAgICAgICAgICAgIHNldElkVG9rZW4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldElkVG9rZW4gPSB0aGlzLl9sb2FkVXNlcigpLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgICAgICAgYXJncy5pZF90b2tlbl9oaW50ID0gdXNlciAmJiB1c2VyLmlkX3Rva2VuO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2V0SWRUb2tlbi50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWduaW4oYXJncywgdGhpcy5faWZyYW1lTmF2aWdhdG9yLCB7XG4gICAgICAgICAgICAgICAgc3RhcnRVcmw6IHVybCxcbiAgICAgICAgICAgICAgICBzaWxlbnRSZXF1ZXN0VGltZW91dDogYXJncy5zaWxlbnRSZXF1ZXN0VGltZW91dCB8fCB0aGlzLnNldHRpbmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUuc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluU2lsZW50IHN1Y2Nlc3NmdWwsIHNpZ25lZCBpbiBzdWI6IFwiLCB1c2VyLnByb2ZpbGUuc3ViKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbmluU2lsZW50IHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNpZ25pblNpbGVudENhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5TaWxlbnRDYWxsYmFja1wiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkNhbGxiYWNrKHVybCwgdGhpcy5faWZyYW1lTmF2aWdhdG9yKS50aGVuKHVzZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlci5wcm9maWxlICYmIHVzZXIucHJvZmlsZS5zdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJzaWduaW5TaWxlbnRDYWxsYmFjayBzdWNjZXNzZnVsLCBzaWduZWQgaW4gc3ViOiBcIiwgdXNlci5wcm9maWxlLnN1Yik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25pblNpbGVudENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcXVlcnlTZXNzaW9uU3RhdHVzKGFyZ3MgPSB7fSkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5xdWVyeVNlc3Npb25TdGF0dXNcIik7XG5cbiAgICAgICAgbGV0IHVybCA9IGFyZ3MucmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50X3JlZGlyZWN0X3VyaTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWxlbnRfcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XG4gICAgICAgIGFyZ3MucHJvbXB0ID0gXCJub25lXCI7XG4gICAgICAgIGFyZ3MucmVzcG9uc2VfdHlwZSA9IFwiaWRfdG9rZW5cIjtcbiAgICAgICAgYXJncy5zY29wZSA9IFwib3BlbmlkXCI7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwge1xuICAgICAgICAgICAgc3RhcnRVcmw6IHVybCxcbiAgICAgICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0OiBhcmdzLnNpbGVudFJlcXVlc3RUaW1lb3V0IHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50UmVxdWVzdFRpbWVvdXRcbiAgICAgICAgfSkudGhlbihuYXZSZXNwb25zZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2lnbmluUmVzcG9uc2UobmF2UmVzcG9uc2UudXJsKS50aGVuKHNpZ25pblJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJnb3Qgc2lnbmluIHJlc3BvbnNlXCIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNpZ25pblJlc3BvbnNlLnNlc3Npb25fc3RhdGUgJiYgc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zdWIgJiYgc2lnbmluUmVzcG9uc2UucHJvZmlsZS5zaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJxdWVyeVNlc3Npb25TdGF0dXMgc3VjY2VzcyBmb3Igc3ViOiBcIiwgIHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fc3RhdGU6IHNpZ25pblJlc3BvbnNlLnNlc3Npb25fc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWI6IHNpZ25pblJlc3BvbnNlLnByb2ZpbGUuc3ViLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lkOiBzaWduaW5SZXNwb25zZS5wcm9maWxlLnNpZFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJxdWVyeVNlc3Npb25TdGF0dXMgc3VjY2Vzc2Z1bCwgdXNlciBub3QgYXV0aGVudGljYXRlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3NpZ25pbihhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIl9zaWduaW5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5TdGFydChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcykudGhlbihuYXZSZXNwb25zZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluRW5kKG5hdlJlc3BvbnNlLnVybCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc2lnbmluU3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMgPSB7fSkge1xuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluU3RhcnRcIik7XG5cbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5wcmVwYXJlKG5hdmlnYXRvclBhcmFtcykudGhlbihoYW5kbGUgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWduaW5SZXF1ZXN0KGFyZ3MpLnRoZW4oc2lnbmluUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25pbiByZXF1ZXN0XCIpO1xuXG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yUGFyYW1zLnVybCA9IHNpZ25pblJlcXVlc3QudXJsO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy5pZCA9IHNpZ25pblJlcXVlc3Quc3RhdGUuaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuY2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiRXJyb3IgYWZ0ZXIgcHJlcGFyaW5nIG5hdmlnYXRvciwgY2xvc2luZyBuYXZpZ2F0b3Igd2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc2lnbmluRW5kKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluRW5kXCIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWduaW5SZXNwb25zZSh1cmwpLnRoZW4oc2lnbmluUmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25pbiByZXNwb25zZVwiKTtcblxuICAgICAgICAgICAgbGV0IHVzZXIgPSBuZXcgVXNlcihzaWduaW5SZXNwb25zZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlVXNlcih1c2VyKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ1c2VyIHN0b3JlZFwiKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zaWduaW5DYWxsYmFjayh1cmwsIG5hdmlnYXRvcikge1xuICAgICAgICBMb2cuZGVidWcoXCJfc2lnbmluQ2FsbGJhY2tcIik7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2FsbGJhY2sodXJsKTtcbiAgICB9XG5cbiAgICBzaWdub3V0UmVkaXJlY3QoYXJncyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyLnNpZ25vdXRSZWRpcmVjdFwiKTtcbiAgICAgICAgbGV0IHBvc3RMb2dvdXRSZWRpcmVjdFVyaSA9IGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xuICAgICAgICBpZiAocG9zdExvZ291dFJlZGlyZWN0VXJpKXtcbiAgICAgICAgICAgIGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9zdExvZ291dFJlZGlyZWN0VXJpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IpLnRoZW4oKCk9PntcbiAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbm91dFJlZGlyZWN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaWdub3V0UmVkaXJlY3RDYWxsYmFjayh1cmwpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIuc2lnbm91dFJlZGlyZWN0Q2FsbGJhY2tcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0RW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpLnRoZW4ocmVzcG9uc2U9PntcbiAgICAgICAgICAgIExvZy5pbmZvKFwic2lnbm91dFJlZGlyZWN0Q2FsbGJhY2sgc3VjY2Vzc2Z1bFwiKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2lnbm91dFBvcHVwKGFyZ3MgPSB7fSkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cFwiKTtcblxuICAgICAgICBsZXQgdXJsID0gYXJncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XG4gICAgICAgIGFyZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gdXJsO1xuICAgICAgICBhcmdzLmRpc3BsYXkgPSBcInBvcHVwXCI7XG4gICAgICAgIGlmIChhcmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSl7XG4gICAgICAgICAgICAvLyB3ZSdyZSBwdXR0aW5nIGEgZHVtbXkgZW50cnkgaW4gaGVyZSBiZWNhdXNlIHdlXG4gICAgICAgICAgICAvLyBuZWVkIGEgdW5pcXVlIGlkIGZyb20gdGhlIHN0YXRlIGZvciBub3RpZmljYXRpb25cbiAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJlbnQgd2luZG93LCB3aGljaCBpcyBuZWNlc3NhcnkgaWYgd2VcbiAgICAgICAgICAgIC8vIHBsYW4gdG8gcmV0dXJuIGJhY2sgdG8gdGhlIGNsaWVudCBhZnRlciBzaWdub3V0XG4gICAgICAgICAgICAvLyBhbmQgc28gd2UgY2FuIGNsb3NlIHRoZSBwb3B1cCBhZnRlciBzaWdub3V0XG4gICAgICAgICAgICBhcmdzLnN0YXRlID0gYXJncy5zdGF0ZSB8fCB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0KGFyZ3MsIHRoaXMuX3BvcHVwTmF2aWdhdG9yLCB7XG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxuICAgICAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlczogYXJncy5wb3B1cFdpbmRvd0ZlYXR1cmVzIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyxcbiAgICAgICAgICAgIHBvcHVwV2luZG93VGFyZ2V0OiBhcmdzLnBvcHVwV2luZG93VGFyZ2V0IHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dUYXJnZXRcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25vdXRQb3B1cCBzdWNjZXNzZnVsXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2lnbm91dFBvcHVwQ2FsbGJhY2sodXJsLCBrZWVwT3Blbikge1xuICAgICAgICBpZiAodHlwZW9mKGtlZXBPcGVuKSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mKHVybCkgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdXJsID0gbnVsbDtcbiAgICAgICAgICAgIGtlZXBPcGVuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlci5zaWdub3V0UG9wdXBDYWxsYmFja1wiKTtcbiAgICAgICAgbGV0IGRlbGltaXRlciA9ICc/JztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwTmF2aWdhdG9yLmNhbGxiYWNrKHVybCwga2VlcE9wZW4sIGRlbGltaXRlcikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInNpZ25vdXRQb3B1cENhbGxiYWNrIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9zaWdub3V0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiX3NpZ25vdXRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMpLnRoZW4obmF2UmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25vdXRFbmQobmF2UmVzcG9uc2UudXJsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zaWdub3V0U3RhcnQoYXJncyA9IHt9LCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIl9zaWdub3V0U3RhcnRcIik7XG5cbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5wcmVwYXJlKG5hdmlnYXRvclBhcmFtcykudGhlbihoYW5kbGUgPT4ge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFVzZXIoKS50aGVuKHVzZXIgPT4ge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcImxvYWRlZCBjdXJyZW50IHVzZXIgZnJvbSBzdG9yYWdlXCIpO1xuXG4gICAgICAgICAgICAgICAgdmFyIHJldm9rZVByb21pc2UgPSB0aGlzLl9zZXR0aW5ncy5yZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCA/IHRoaXMuX3Jldm9rZUludGVybmFsKHVzZXIpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldm9rZVByb21pc2UudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkX3Rva2VuID0gYXJncy5pZF90b2tlbl9oaW50IHx8IHVzZXIgJiYgdXNlci5pZF90b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTZXR0aW5nIGlkX3Rva2VuIGludG8gc2lnbm91dCByZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5pZF90b2tlbl9oaW50ID0gaWRfdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVVc2VyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ1c2VyIHJlbW92ZWQsIGNyZWF0aW5nIHNpZ25vdXQgcmVxdWVzdFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbm91dFJlcXVlc3QoYXJncykudGhlbihzaWdub3V0UmVxdWVzdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiZ290IHNpZ25vdXQgcmVxdWVzdFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy51cmwgPSBzaWdub3V0UmVxdWVzdC51cmw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25vdXRSZXF1ZXN0LnN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy5pZCA9IHNpZ25vdXRSZXF1ZXN0LnN0YXRlLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuY2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiRXJyb3IgYWZ0ZXIgcHJlcGFyaW5nIG5hdmlnYXRvciwgY2xvc2luZyBuYXZpZ2F0b3Igd2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc2lnbm91dEVuZCh1cmwpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiX3NpZ25vdXRFbmRcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25vdXRSZXNwb25zZSh1cmwpLnRoZW4oc2lnbm91dFJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImdvdCBzaWdub3V0IHJlc3BvbnNlXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gc2lnbm91dFJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXZva2VBY2Nlc3NUb2tlbigpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXIucmV2b2tlQWNjZXNzVG9rZW5cIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXZva2VJbnRlcm5hbCh1c2VyLCB0cnVlKS50aGVuKHN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlbW92aW5nIHRva2VuIHByb3BlcnRpZXMgZnJvbSB1c2VyIGFuZCByZS1zdG9yaW5nXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHVzZXIuYWNjZXNzX3Rva2VuID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5leHBpcmVzX2F0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdXNlci50b2tlbl90eXBlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVVzZXIodXNlcikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJ1c2VyIHN0b3JlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbigoKT0+e1xuICAgICAgICAgICAgTG9nLmluZm8oXCJhY2Nlc3MgdG9rZW4gcmV2b2tlZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXZva2VJbnRlcm5hbCh1c2VyLCByZXF1aXJlZCkge1xuICAgICAgICBMb2cuZGVidWcoXCJjaGVja2luZyBpZiB0b2tlbiByZXZvY2F0aW9uIGlzIG5lY2Vzc2FyeVwiKTtcblxuICAgICAgICB2YXIgYWNjZXNzX3Rva2VuID0gdXNlciAmJiB1c2VyLmFjY2Vzc190b2tlbjtcblxuICAgICAgICAvLyBjaGVjayBmb3IgSldUIHZzLiByZWZlcmVuY2UgdG9rZW5cbiAgICAgICAgaWYgKCFhY2Nlc3NfdG9rZW4gfHwgYWNjZXNzX3Rva2VuLmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJubyBuZWVkIHRvIHJldm9rZSBkdWUgdG8gbm8gdXNlciwgdG9rZW4sIG9yIEpXVCBmb3JtYXRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl90b2tlblJldm9jYXRpb25DbGllbnQucmV2b2tlKGFjY2Vzc190b2tlbiwgcmVxdWlyZWQpLnRoZW4oKCkgPT4gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc3RhcnRTaWxlbnRSZW5ldygpIHtcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdTZXJ2aWNlLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgc3RvcFNpbGVudFJlbmV3KCkge1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld1NlcnZpY2Uuc3RvcCgpO1xuICAgIH1cblxuICAgIGdldCBfdXNlclN0b3JlS2V5KCkge1xuICAgICAgICByZXR1cm4gYHVzZXI6JHt0aGlzLnNldHRpbmdzLmF1dGhvcml0eX06JHt0aGlzLnNldHRpbmdzLmNsaWVudF9pZH1gO1xuICAgIH1cblxuICAgIF9sb2FkVXNlcigpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiX2xvYWRVc2VyXCIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyU3RvcmUuZ2V0KHRoaXMuX3VzZXJTdG9yZUtleSkudGhlbihzdG9yYWdlU3RyaW5nID0+IHtcbiAgICAgICAgICAgIGlmIChzdG9yYWdlU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwidXNlciBzdG9yYWdlU3RyaW5nIGxvYWRlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gVXNlci5mcm9tU3RvcmFnZVN0cmluZyhzdG9yYWdlU3RyaW5nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgTG9nLmRlYnVnKFwibm8gdXNlciBzdG9yYWdlU3RyaW5nXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0b3JlVXNlcih1c2VyKSB7XG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJzdG9yZVVzZXIgc3RvcmluZyB1c2VyXCIpO1xuXG4gICAgICAgICAgICB2YXIgc3RvcmFnZVN0cmluZyA9IHVzZXIudG9TdG9yYWdlU3RyaW5nKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLnNldCh0aGlzLl91c2VyU3RvcmVLZXksIHN0b3JhZ2VTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwic3RvcmVVc2VyIHJlbW92aW5nIHVzZXIgc3RvcmFnZVwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyU3RvcmUucmVtb3ZlKHRoaXMuX3VzZXJTdG9yZUtleSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXNlck1hbmFnZXIuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBPaWRjQ2xpZW50U2V0dGluZ3MgZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MnO1xuaW1wb3J0IFJlZGlyZWN0TmF2aWdhdG9yIGZyb20gJy4vUmVkaXJlY3ROYXZpZ2F0b3InO1xuaW1wb3J0IFBvcHVwTmF2aWdhdG9yIGZyb20gJy4vUG9wdXBOYXZpZ2F0b3InO1xuaW1wb3J0IElGcmFtZU5hdmlnYXRvciBmcm9tICcuL0lGcmFtZU5hdmlnYXRvcic7XG5pbXBvcnQgV2ViU3RvcmFnZVN0YXRlU3RvcmUgZnJvbSAnLi9XZWJTdG9yYWdlU3RhdGVTdG9yZSc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuY29uc3QgRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gNjA7XG5jb25zdCBEZWZhdWx0Q2hlY2tTZXNzaW9uSW50ZXJ2YWwgPSAyMDAwO1xuXG5leHBvcnQgY2xhc3MgVXNlck1hbmFnZXJTZXR0aW5ncyBleHRlbmRzIE9pZGNDbGllbnRTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBwb3B1cF9yZWRpcmVjdF91cmksXG4gICAgICAgIHBvcHVwX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSxcbiAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlcyxcbiAgICAgICAgcG9wdXBXaW5kb3dUYXJnZXQsXG4gICAgICAgIHNpbGVudF9yZWRpcmVjdF91cmksXG4gICAgICAgIHNpbGVudFJlcXVlc3RUaW1lb3V0LFxuICAgICAgICBhdXRvbWF0aWNTaWxlbnRSZW5ldyA9IGZhbHNlLFxuICAgICAgICBpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcgPSB0cnVlLFxuICAgICAgICBtb25pdG9yU2Vzc2lvbiA9IHRydWUsXG4gICAgICAgIGNoZWNrU2Vzc2lvbkludGVydmFsID0gRGVmYXVsdENoZWNrU2Vzc2lvbkludGVydmFsLFxuICAgICAgICByZXZva2VBY2Nlc3NUb2tlbk9uU2lnbm91dCA9IGZhbHNlLFxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSxcbiAgICAgICAgcmVkaXJlY3ROYXZpZ2F0b3IgPSBuZXcgUmVkaXJlY3ROYXZpZ2F0b3IoKSxcbiAgICAgICAgcG9wdXBOYXZpZ2F0b3IgPSBuZXcgUG9wdXBOYXZpZ2F0b3IoKSxcbiAgICAgICAgaWZyYW1lTmF2aWdhdG9yID0gbmV3IElGcmFtZU5hdmlnYXRvcigpLFxuICAgICAgICB1c2VyU3RvcmUgPSBuZXcgV2ViU3RvcmFnZVN0YXRlU3RvcmUoeyBzdG9yZTogR2xvYmFsLnNlc3Npb25TdG9yYWdlIH0pXG4gICAgfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XG5cbiAgICAgICAgdGhpcy5fcG9wdXBfcmVkaXJlY3RfdXJpID0gcG9wdXBfcmVkaXJlY3RfdXJpO1xuICAgICAgICB0aGlzLl9wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XG4gICAgICAgIHRoaXMuX3BvcHVwV2luZG93RmVhdHVyZXMgPSBwb3B1cFdpbmRvd0ZlYXR1cmVzO1xuICAgICAgICB0aGlzLl9wb3B1cFdpbmRvd1RhcmdldCA9IHBvcHVwV2luZG93VGFyZ2V0O1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fc2lsZW50X3JlZGlyZWN0X3VyaSA9IHNpbGVudF9yZWRpcmVjdF91cmk7XG4gICAgICAgIHRoaXMuX3NpbGVudFJlcXVlc3RUaW1lb3V0ID0gc2lsZW50UmVxdWVzdFRpbWVvdXQ7XG4gICAgICAgIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3ID0gISFhdXRvbWF0aWNTaWxlbnRSZW5ldztcbiAgICAgICAgdGhpcy5faW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3ID0gaW5jbHVkZUlkVG9rZW5JblNpbGVudFJlbmV3O1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xuXG4gICAgICAgIHRoaXMuX21vbml0b3JTZXNzaW9uID0gbW9uaXRvclNlc3Npb247XG4gICAgICAgIHRoaXMuX2NoZWNrU2Vzc2lvbkludGVydmFsID0gY2hlY2tTZXNzaW9uSW50ZXJ2YWw7XG4gICAgICAgIHRoaXMuX3Jldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0ID0gcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQ7XG5cbiAgICAgICAgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IgPSByZWRpcmVjdE5hdmlnYXRvcjtcbiAgICAgICAgdGhpcy5fcG9wdXBOYXZpZ2F0b3IgPSBwb3B1cE5hdmlnYXRvcjtcbiAgICAgICAgdGhpcy5faWZyYW1lTmF2aWdhdG9yID0gaWZyYW1lTmF2aWdhdG9yO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fdXNlclN0b3JlID0gdXNlclN0b3JlO1xuICAgIH1cblxuICAgIGdldCBwb3B1cF9yZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cF9yZWRpcmVjdF91cmk7XG4gICAgfVxuICAgIGdldCBwb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cF9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XG4gICAgfVxuICAgIGdldCBwb3B1cFdpbmRvd0ZlYXR1cmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dGZWF0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBvcHVwV2luZG93VGFyZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dUYXJnZXQ7XG4gICAgfVxuXG4gICAgZ2V0IHNpbGVudF9yZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWxlbnRfcmVkaXJlY3RfdXJpO1xuICAgIH1cbiAgICAgZ2V0IHNpbGVudFJlcXVlc3RUaW1lb3V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lsZW50UmVxdWVzdFRpbWVvdXQ7XG4gICAgfVxuICAgIGdldCBhdXRvbWF0aWNTaWxlbnRSZW5ldygpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuc2lsZW50X3JlZGlyZWN0X3VyaSAmJiB0aGlzLl9hdXRvbWF0aWNTaWxlbnRSZW5ldyk7XG4gICAgfVxuICAgIGdldCBpbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmNsdWRlSWRUb2tlbkluU2lsZW50UmVuZXc7XG4gICAgfVxuICAgIGdldCBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xuICAgIH1cblxuICAgIGdldCBtb25pdG9yU2Vzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbml0b3JTZXNzaW9uO1xuICAgIH1cbiAgICBnZXQgY2hlY2tTZXNzaW9uSW50ZXJ2YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja1Nlc3Npb25JbnRlcnZhbDtcbiAgICB9XG4gICAgZ2V0IHJldm9rZUFjY2Vzc1Rva2VuT25TaWdub3V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlQWNjZXNzVG9rZW5PblNpZ25vdXQ7XG4gICAgfVxuXG4gICAgZ2V0IHJlZGlyZWN0TmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3I7XG4gICAgfVxuICAgIGdldCBwb3B1cE5hdmlnYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwTmF2aWdhdG9yO1xuICAgIH1cbiAgICBnZXQgaWZyYW1lTmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWZyYW1lTmF2aWdhdG9yO1xuICAgIH1cbiAgICBcbiAgICBnZXQgdXNlclN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9Vc2VyTWFuYWdlclNldHRpbmdzLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBjbGFzcyBSZWRpcmVjdE5hdmlnYXRvciB7XG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgIH1cblxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xuICAgICAgICBMb2cuZGVidWcoXCJSZWRpcmVjdE5hdmlnYXRvci5uYXZpZ2F0ZVwiKTtcblxuICAgICAgICBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBwYXJhbXMudXJsO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICBMb2cuZGVidWcoXCJSZWRpcmVjdE5hdmlnYXRvci51cmxcIik7XG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUmVkaXJlY3ROYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBQb3B1cFdpbmRvdyBmcm9tICcuL1BvcHVwV2luZG93JztcblxuZXhwb3J0IGNsYXNzIFBvcHVwTmF2aWdhdG9yIHtcblxuICAgIHByZXBhcmUocGFyYW1zKSB7XG4gICAgICAgIGxldCBwb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhwYXJhbXMpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvcHVwKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayh1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBOYXZpZ2F0b3IuY2FsbGJhY2tcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFBvcHVwV2luZG93Lm5vdGlmeU9wZW5lcih1cmwsIGtlZXBPcGVuLCBkZWxpbWl0ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUG9wdXBOYXZpZ2F0b3IuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5cbmNvbnN0IENoZWNrRm9yUG9wdXBDbG9zZWRJbnRlcnZhbCA9IDUwMDtcbmNvbnN0IERlZmF1bHRQb3B1cEZlYXR1cmVzID0gJ2xvY2F0aW9uPW5vLHRvb2xiYXI9bm8sd2lkdGg9NTAwLGhlaWdodD01MDAsbGVmdD0xMDAsdG9wPTEwMDsnO1xuLy9jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHdpZHRoPTUwMCxoZWlnaHQ9NTAwLGxlZnQ9MTAwLHRvcD0xMDA7cmVzaXphYmxlPXllcyc7XG5cbmNvbnN0IERlZmF1bHRQb3B1cFRhcmdldCA9IFwiX2JsYW5rXCI7XG5cbmV4cG9ydCBjbGFzcyBQb3B1cFdpbmRvdyB7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuY3RvclwiKTtcblxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB0YXJnZXQgPSBwYXJhbXMucG9wdXBXaW5kb3dUYXJnZXQgfHwgRGVmYXVsdFBvcHVwVGFyZ2V0O1xuICAgICAgICBsZXQgZmVhdHVyZXMgPSBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCBEZWZhdWx0UG9wdXBGZWF0dXJlcztcblxuICAgICAgICB0aGlzLl9wb3B1cCA9IHdpbmRvdy5vcGVuKCcnLCB0YXJnZXQsIGZlYXR1cmVzKTtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJwb3B1cCBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrRm9yUG9wdXBDbG9zZWRUaW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbCh0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkLmJpbmQodGhpcyksIENoZWNrRm9yUG9wdXBDbG9zZWRJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gICAgfVxuXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Lm5hdmlnYXRlXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiRXJyb3Igb3BlbmluZyBwb3B1cCB3aW5kb3dcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJTZXR0aW5nIFVSTCBpbiBwb3B1cFwiKTtcblxuICAgICAgICAgICAgdGhpcy5faWQgPSBwYXJhbXMuaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5faWQpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3dbXCJwb3B1cENhbGxiYWNrX1wiICsgcGFyYW1zLmlkXSA9IHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC53aW5kb3cubG9jYXRpb24gPSBwYXJhbXMudXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG5cbiAgICBfc3VjY2VzcyhkYXRhKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICBMb2cuZGVidWcoXCJTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gcG9wdXAgd2luZG93XCIpO1xuICAgICAgICB0aGlzLl9yZXNvbHZlKGRhdGEpO1xuICAgIH1cbiAgICBfZXJyb3IobWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG5cbiAgICAgICAgTG9nLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cChmYWxzZSk7XG4gICAgfVxuXG4gICAgX2NsZWFudXAoa2VlcE9wZW4pIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuX2NsZWFudXBcIik7XG5cbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyKTtcbiAgICAgICAgdGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyID0gbnVsbDtcblxuICAgICAgICBkZWxldGUgd2luZG93W1wicG9wdXBDYWxsYmFja19cIiArIHRoaXMuX2lkXTtcblxuICAgICAgICBpZiAodGhpcy5fcG9wdXAgJiYgIWtlZXBPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICB9XG5cbiAgICBfY2hlY2tGb3JQb3B1cENsb3NlZCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiUG9wdXBXaW5kb3cuX2NoZWNrRm9yUG9wdXBDbG9zZWRcIik7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9wb3B1cCB8fCB0aGlzLl9wb3B1cC5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXAgd2luZG93IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxsYmFjayh1cmwsIGtlZXBPcGVuKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Ll9jYWxsYmFja1wiKTtcblxuICAgICAgICB0aGlzLl9jbGVhbnVwKGtlZXBPcGVuKTtcblxuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiB1cmwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIkludmFsaWQgcmVzcG9uc2UgZnJvbSBwb3B1cFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBub3RpZnlPcGVuZXIodXJsLCBrZWVwT3BlbiwgZGVsaW1pdGVyKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lclwiKTtcblxuICAgICAgICBpZiAod2luZG93Lm9wZW5lcikge1xuICAgICAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgaWYgKHVybCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBkZWxpbWl0ZXIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBcInBvcHVwQ2FsbGJhY2tfXCIgKyBkYXRhLnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSB3aW5kb3cub3BlbmVyW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInBhc3NpbmcgdXJsIG1lc3NhZ2UgdG8gb3BlbmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodXJsLCBrZWVwT3Blbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cud2FybihcIm5vIG1hdGNoaW5nIGNhbGxiYWNrIGZvdW5kIG9uIG9wZW5lclwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJubyBzdGF0ZSBmb3VuZCBpbiByZXNwb25zZSB1cmxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1BvcHVwV2luZG93LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgSUZyYW1lV2luZG93IGZyb20gJy4vSUZyYW1lV2luZG93JztcblxuZXhwb3J0IGNsYXNzIElGcmFtZU5hdmlnYXRvciB7XG5cbiAgICBwcmVwYXJlKHBhcmFtcykge1xuICAgICAgICBsZXQgZnJhbWUgPSBuZXcgSUZyYW1lV2luZG93KHBhcmFtcyk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZnJhbWUpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVOYXZpZ2F0b3IuY2FsbGJhY2tcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIElGcmFtZVdpbmRvdy5ub3RpZnlQYXJlbnQodXJsKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0lGcmFtZU5hdmlnYXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBEZWZhdWx0VGltZW91dCA9IDEwMDAwO1xuXG5leHBvcnQgY2xhc3MgSUZyYW1lV2luZG93IHtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cuY3RvclwiKTtcblxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gdGhpcy5fbWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX2ZyYW1lID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG5cbiAgICAgICAgLy8gc2hvdGd1biBhcHByb2FjaFxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUud2lkdGggPSAwO1xuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5oZWlnaHQgPSAwO1xuICAgICAgICBcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZnJhbWUpO1xuICAgIH1cblxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cubmF2aWdhdGVcIik7XG5cbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRpbWVvdXQgPSBwYXJhbXMuc2lsZW50UmVxdWVzdFRpbWVvdXQgfHwgRGVmYXVsdFRpbWVvdXQ7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJVc2luZyB0aW1lb3V0IG9mOlwiLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gd2luZG93LnNldFRpbWVvdXQodGhpcy5fdGltZW91dC5iaW5kKHRoaXMpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLnNyYyA9IHBhcmFtcy51cmw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgfVxuXG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICAgIH1cblxuICAgIF9zdWNjZXNzKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBmcmFtZSB3aW5kb3dcIik7XG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZGF0YSk7XG4gICAgfVxuICAgIF9lcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICBMb2cuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX3JlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG4gICAgfVxuXG4gICAgX2NsZWFudXAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFtZSkge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Ll9jbGVhbnVwXCIpO1xuXG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5fZnJhbWUpO1xuXG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdGltZW91dCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiSUZyYW1lV2luZG93Ll90aW1lb3V0XCIpO1xuICAgICAgICB0aGlzLl9lcnJvcihcIkZyYW1lIHdpbmRvdyB0aW1lZCBvdXRcIik7XG4gICAgfVxuXG4gICAgX21lc3NhZ2UoZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cuX21lc3NhZ2VcIik7XG5cbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyICYmXG4gICAgICAgICAgICBlLm9yaWdpbiA9PT0gdGhpcy5fb3JpZ2luICYmXG4gICAgICAgICAgICBlLnNvdXJjZSA9PT0gdGhpcy5fZnJhbWUuY29udGVudFdpbmRvd1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBlLmRhdGE7XG4gICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3VjY2Vzcyh7IHVybDogdXJsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlIGZyb20gZnJhbWVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgX29yaWdpbigpIHtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdDtcbiAgICB9XG5cbiAgICBzdGF0aWMgbm90aWZ5UGFyZW50KHVybCkge1xuICAgICAgICBMb2cuZGVidWcoXCJJRnJhbWVXaW5kb3cubm90aWZ5UGFyZW50XCIpO1xuXG4gICAgICAgIGlmICh3aW5kb3cucGFyZW50ICYmIHdpbmRvdyAhPT0gd2luZG93LnBhcmVudCkge1xuICAgICAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcInBvc3RpbmcgdXJsIG1lc3NhZ2UgdG8gcGFyZW50XCIpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UodXJsLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0lGcmFtZVdpbmRvdy5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5leHBvcnQgY2xhc3MgVXNlciB7XG4gICAgY29uc3RydWN0b3Ioe2lkX3Rva2VuLCBzZXNzaW9uX3N0YXRlLCBhY2Nlc3NfdG9rZW4sIHRva2VuX3R5cGUsIHNjb3BlLCBwcm9maWxlLCBleHBpcmVzX2F0LCBzdGF0ZX0pIHtcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IGlkX3Rva2VuO1xuICAgICAgICB0aGlzLnNlc3Npb25fc3RhdGUgPSBzZXNzaW9uX3N0YXRlO1xuICAgICAgICB0aGlzLmFjY2Vzc190b2tlbiA9IGFjY2Vzc190b2tlbjtcbiAgICAgICAgdGhpcy50b2tlbl90eXBlID0gdG9rZW5fdHlwZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlO1xuICAgICAgICB0aGlzLmV4cGlyZXNfYXQgPSBleHBpcmVzX2F0O1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuXG4gICAgZ2V0IGV4cGlyZXNfaW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cGlyZXNfYXQpIHtcbiAgICAgICAgICAgIGxldCBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHBpcmVzX2F0IC0gbm93O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0IGV4cGlyZWQoKSB7XG4gICAgICAgIGxldCBleHBpcmVzX2luID0gdGhpcy5leHBpcmVzX2luO1xuICAgICAgICBpZiAoZXhwaXJlc19pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwaXJlc19pbiA8PSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHNjb3BlcygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3BlIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICB9XG5cbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXIudG9TdG9yYWdlU3RyaW5nXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgaWRfdG9rZW46IHRoaXMuaWRfdG9rZW4sXG4gICAgICAgICAgICBzZXNzaW9uX3N0YXRlOiB0aGlzLnNlc3Npb25fc3RhdGUsXG4gICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHRoaXMuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgdG9rZW5fdHlwZTogdGhpcy50b2tlbl90eXBlLFxuICAgICAgICAgICAgc2NvcGU6IHRoaXMuc2NvcGUsXG4gICAgICAgICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGUsXG4gICAgICAgICAgICBleHBpcmVzX2F0OiB0aGlzLmV4cGlyZXNfYXRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21TdG9yYWdlU3RyaW5nKHN0b3JhZ2VTdHJpbmcpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlci5mcm9tU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKEpTT04ucGFyc2Uoc3RvcmFnZVN0cmluZykpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9Vc2VyLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgQWNjZXNzVG9rZW5FdmVudHMgZnJvbSAnLi9BY2Nlc3NUb2tlbkV2ZW50cyc7XG5pbXBvcnQgRXZlbnQgZnJvbSAnLi9FdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBVc2VyTWFuYWdlckV2ZW50cyBleHRlbmRzIEFjY2Vzc1Rva2VuRXZlbnRzIHtcblxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZCA9IG5ldyBFdmVudChcIlVzZXIgbG9hZGVkXCIpO1xuICAgICAgICB0aGlzLl91c2VyVW5sb2FkZWQgPSBuZXcgRXZlbnQoXCJVc2VyIHVubG9hZGVkXCIpO1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yID0gbmV3IEV2ZW50KFwiU2lsZW50IHJlbmV3IGVycm9yXCIpO1xuICAgICAgICB0aGlzLl91c2VyU2lnbmVkT3V0ID0gbmV3IEV2ZW50KFwiVXNlciBzaWduZWQgb3V0XCIpO1xuICAgICAgICB0aGlzLl91c2VyU2Vzc2lvbkNoYW5nZWQgPSBuZXcgRXZlbnQoXCJVc2VyIHNlc3Npb24gY2hhbmdlZFwiKTtcbiAgICB9XG5cbiAgICBsb2FkKHVzZXIsIHJhaXNlRXZlbnQ9dHJ1ZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlckV2ZW50cy5sb2FkXCIpO1xuICAgICAgICBzdXBlci5sb2FkKHVzZXIpO1xuICAgICAgICBpZiAocmFpc2VFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvYWRlZC5yYWlzZSh1c2VyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bmxvYWQoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlVzZXJNYW5hZ2VyRXZlbnRzLnVubG9hZFwiKTtcbiAgICAgICAgc3VwZXIudW5sb2FkKCk7XG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yYWlzZSgpO1xuICAgIH1cblxuICAgIGFkZFVzZXJMb2FkZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlVXNlckxvYWRlZChjYikge1xuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBcbiAgICBhZGRVc2VyVW5sb2FkZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkLmFkZEhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICByZW1vdmVVc2VyVW5sb2FkZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cblxuICAgIGFkZFNpbGVudFJlbmV3RXJyb3IoY2IpIHtcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlU2lsZW50UmVuZXdFcnJvcihjYikge1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBfcmFpc2VTaWxlbnRSZW5ld0Vycm9yKGUpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMuX3JhaXNlU2lsZW50UmVuZXdFcnJvclwiLCBlLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJhaXNlKGUpO1xuICAgIH1cblxuICAgIGFkZFVzZXJTaWduZWRPdXQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlVXNlclNpZ25lZE91dChjYikge1xuICAgICAgICB0aGlzLl91c2VyU2lnbmVkT3V0LnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBfcmFpc2VVc2VyU2lnbmVkT3V0KGUpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVXNlck1hbmFnZXJFdmVudHMuX3JhaXNlVXNlclNpZ25lZE91dFwiKTtcbiAgICAgICAgdGhpcy5fdXNlclNpZ25lZE91dC5yYWlzZShlKTtcbiAgICB9XG5cbiAgICBhZGRVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclNlc3Npb25DaGFuZ2VkLmFkZEhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICByZW1vdmVVc2VyU2Vzc2lvbkNoYW5nZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclNlc3Npb25DaGFuZ2VkLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBfcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWQoZSkge1xuICAgICAgICBMb2cuZGVidWcoXCJVc2VyTWFuYWdlckV2ZW50cy5fcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWRcIik7XG4gICAgICAgIHRoaXMuX3VzZXJTZXNzaW9uQ2hhbmdlZC5yYWlzZShlKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVXNlck1hbmFnZXJFdmVudHMuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBUaW1lciBmcm9tICcuL1RpbWVyJztcblxuY29uc3QgRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gNjA7IC8vIHNlY29uZHNcblxuZXhwb3J0IGNsYXNzIEFjY2Vzc1Rva2VuRXZlbnRzIHtcblxuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUsXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmluZ1wiKSxcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVkVGltZXIgPSBuZXcgVGltZXIoXCJBY2Nlc3MgdG9rZW4gZXhwaXJlZFwiKVxuICAgIH0gPSB7fSkge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xuXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmcgPSBhY2Nlc3NUb2tlbkV4cGlyaW5nVGltZXI7XG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZCA9IGFjY2Vzc1Rva2VuRXhwaXJlZFRpbWVyO1xuICAgIH1cblxuICAgIGxvYWQoY29udGFpbmVyKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkFjY2Vzc1Rva2VuRXZlbnRzLmxvYWRcIik7XG5cbiAgICAgICAgdGhpcy5fY2FuY2VsVGltZXJzKCk7XG5cbiAgICAgICAgLy8gb25seSByZWdpc3RlciBldmVudHMgaWYgdGhlcmUncyBhbiBhY2Nlc3MgdG9rZW4gd2hlcmUgd2UgY2FyZSBhYm91dCBleHBpcmF0aW9uXG4gICAgICAgIGlmIChjb250YWluZXIuYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBjb250YWluZXIuZXhwaXJlc19pbjtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcImFjY2VzcyB0b2tlbiBwcmVzZW50LCByZW1haW5pbmcgZHVyYXRpb246XCIsIGR1cmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZXhwaXJpbmcgaWYgd2Ugc3RpbGwgaGF2ZSB0aW1lXG4gICAgICAgICAgICAgICAgbGV0IGV4cGlyaW5nID0gZHVyYXRpb24gLSB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmcgPD0gMCl7XG4gICAgICAgICAgICAgICAgICAgIGV4cGlyaW5nID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwicmVnaXN0ZXJpbmcgZXhwaXJpbmcgdGltZXIgaW46XCIsIGV4cGlyaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmluaXQoZXhwaXJpbmcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhbHdheXMgcmVnaXN0ZXIgZXhwaXJlZC4gaWYgaXQncyBuZWdhdGl2ZSwgaXQgd2lsbCBzdGlsbCBmaXJlXG4gICAgICAgICAgICBsZXQgZXhwaXJlZCA9IGR1cmF0aW9uICsgMTtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcInJlZ2lzdGVyaW5nIGV4cGlyZWQgdGltZXIgaW46XCIsIGV4cGlyZWQpO1xuICAgICAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkLmluaXQoZXhwaXJlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmxvYWQoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkFjY2Vzc1Rva2VuRXZlbnRzLnVubG9hZFwiKTtcbiAgICAgICAgdGhpcy5fY2FuY2VsVGltZXJzKCk7XG4gICAgfVxuXG4gICAgX2NhbmNlbFRpbWVycygpe1xuICAgICAgICBMb2cuZGVidWcoXCJjYW5jZWxpbmcgZXhpc3RpbmcgYWNjZXNzIHRva2VuIHRpbWVyc1wiKTtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkLmNhbmNlbCgpO1xuICAgIH1cblxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJpbmcoY2IpIHtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmluZyhjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cblxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQuYWRkSGFuZGxlcihjYik7XG4gICAgfVxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQucmVtb3ZlSGFuZGxlcihjYik7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0FjY2Vzc1Rva2VuRXZlbnRzLmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcbmltcG9ydCBFdmVudCBmcm9tICcuL0V2ZW50JztcblxuY29uc3QgVGltZXJEdXJhdGlvbiA9IDU7IC8vIHNlY29uZHNcblxuZXhwb3J0IGNsYXNzIFRpbWVyIGV4dGVuZHMgRXZlbnQge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdGltZXIgPSBHbG9iYWwudGltZXIpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgICAgIHRoaXMuX3RpbWVyID0gdGltZXI7XG4gICAgICAgIHRoaXMuX25vd0Z1bmMgPSAoKSA9PiBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICB9XG5cbiAgICBnZXQgbm93KCkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5fbm93RnVuYygpKTtcbiAgICB9XG5cbiAgICBpbml0KGR1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG5cbiAgICAgICAgaWYgKGR1cmF0aW9uIDw9IDApIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0gMTtcbiAgICAgICAgfVxuICAgICAgICBkdXJhdGlvbiA9IHBhcnNlSW50KGR1cmF0aW9uKTtcblxuICAgICAgICBMb2cuZGVidWcoXCJUaW1lci5pbml0IHRpbWVyIFwiICsgdGhpcy5fbmFtZSArIFwiIGZvciBkdXJhdGlvbjpcIiwgZHVyYXRpb24pO1xuICAgICAgICB0aGlzLl9leHBpcmF0aW9uID0gdGhpcy5ub3cgKyBkdXJhdGlvbjtcblxuICAgICAgICAvLyB3ZSdyZSB1c2luZyBhIGZhaXJseSBzaG9ydCB0aW1lciBhbmQgdGhlbiBjaGVja2luZyB0aGUgZXhwaXJhdGlvbiBpbiB0aGVcbiAgICAgICAgLy8gY2FsbGJhY2sgdG8gaGFuZGxlIHNjZW5hcmlvcyB3aGVyZSB0aGUgYnJvd3NlciBkZXZpY2Ugc2xlZXBzLCBhbmQgdGhlblxuICAgICAgICAvLyB0aGUgdGltZXJzIGVuZCB1cCBnZXR0aW5nIGRlbGF5ZWQuXG4gICAgICAgIHZhciB0aW1lckR1cmF0aW9uID0gVGltZXJEdXJhdGlvbjtcbiAgICAgICAgaWYgKGR1cmF0aW9uIDwgdGltZXJEdXJhdGlvbikge1xuICAgICAgICAgICAgdGltZXJEdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gdGhpcy5fdGltZXIuc2V0SW50ZXJ2YWwodGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSwgdGltZXJEdXJhdGlvbiAqIDEwMDApO1xuICAgIH1cblxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVySGFuZGxlKSB7XG4gICAgICAgICAgICBMb2cuZGVidWcoXCJUaW1lci5jYW5jZWw6IFwiLCB0aGlzLl9uYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyLmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXJIYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5fdGltZXJIYW5kbGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NhbGxiYWNrKCkge1xuICAgICAgICB2YXIgZGlmZiA9IHRoaXMuX2V4cGlyYXRpb24gLSB0aGlzLm5vdztcbiAgICAgICAgTG9nLmRlYnVnKFwiVGltZXIuX2NhbGxiYWNrOyBcIiArIHRoaXMuX25hbWUgKyBcIiB0aW1lciBleHBpcmVzIGluOlwiLCBkaWZmKTtcblxuICAgICAgICBpZiAodGhpcy5fZXhwaXJhdGlvbiA8PSB0aGlzLm5vdykge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgICAgIHN1cGVyLnJhaXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvVGltZXIuanMiLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuZXhwb3J0IGNsYXNzIEV2ZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgIH1cblxuICAgIGFkZEhhbmRsZXIoY2IpIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgIH1cblxuICAgIHJlbW92ZUhhbmRsZXIoY2IpIHtcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2NhbGxiYWNrcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSBjYik7XG4gICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmFpc2UoLi4ucGFyYW1zKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIlJhaXNpbmcgZXZlbnQ6IFwiICsgdGhpcy5fbmFtZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3NbaV0oLi4ucGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9FdmVudC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5leHBvcnQgY2xhc3MgU2lsZW50UmVuZXdTZXJ2aWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVzZXJNYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyID0gdXNlck1hbmFnZXI7XG4gICAgfVxuXG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdGhpcy5fdG9rZW5FeHBpcmluZy5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLmFkZEFjY2Vzc1Rva2VuRXhwaXJpbmcodGhpcy5fY2FsbGJhY2spO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgdHJpZ2dlciBsb2FkaW5nIG9mIHRoZSB1c2VyIHNvIHRoZSBleHBpcmluZyBldmVudHMgY2FuIGJlIGluaXRpYWxpemVkXG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5nZXRVc2VyKCkudGhlbih1c2VyPT57XG4gICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZSBub3BcbiAgICAgICAgICAgIH0pLmNhdGNoKGVycj0+e1xuICAgICAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGN0b3JcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIGdldFVzZXI6XCIsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMucmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmluZyh0aGlzLl9jYWxsYmFjayk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2s7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdG9rZW5FeHBpcmluZygpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiU2lsZW50UmVuZXdTZXJ2aWNlIGF1dG9tYXRpY2FsbHkgcmVuZXdpbmcgYWNjZXNzIHRva2VuXCIpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuc2lnbmluU2lsZW50KCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNpbGVudCB0b2tlbiByZW5ld2FsIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIHNpZ25pblNpbGVudDpcIiwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVNpbGVudFJlbmV3RXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1NpbGVudFJlbmV3U2VydmljZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IENoZWNrU2Vzc2lvbklGcmFtZSBmcm9tICcuL0NoZWNrU2Vzc2lvbklGcmFtZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTW9uaXRvciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1c2VyTWFuYWdlciwgQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvciA9IENoZWNrU2Vzc2lvbklGcmFtZSkge1xuICAgICAgICBpZiAoIXVzZXJNYW5hZ2VyKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB1c2VyIG1hbmFnZXIgcGFzc2VkIHRvIFNlc3Npb25Nb25pdG9yXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXNlck1hbmFnZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlciA9IHVzZXJNYW5hZ2VyO1xuICAgICAgICB0aGlzLl9DaGVja1Nlc3Npb25JRnJhbWVDdG9yID0gQ2hlY2tTZXNzaW9uSUZyYW1lQ3RvcjtcblxuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuYWRkVXNlckxvYWRlZCh0aGlzLl9zdGFydC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLmFkZFVzZXJVbmxvYWRlZCh0aGlzLl9zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmdldFVzZXIoKS50aGVuKHVzZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydCh1c2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIC8vIGNhdGNoIHRvIHN1cHByZXNzIGVycm9ycyBzaW5jZSB3ZSdyZSBpbiBhIGN0b3JcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlNlc3Npb25Nb25pdG9yIGN0b3I7IGVycm9yIGZyb20gZ2V0VXNlcjpcIiwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgX3NldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIuc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBfbWV0YWRhdGFTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck1hbmFnZXIubWV0YWRhdGFTZXJ2aWNlO1xuICAgIH1cbiAgICBnZXQgX2NsaWVudF9pZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcbiAgICB9XG4gICAgZ2V0IF9jaGVja1Nlc3Npb25JbnRlcnZhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLmNoZWNrU2Vzc2lvbkludGVydmFsO1xuICAgIH1cblxuICAgIF9zdGFydCh1c2VyKSB7XG4gICAgICAgIGxldCBzZXNzaW9uX3N0YXRlID0gdXNlci5zZXNzaW9uX3N0YXRlO1xuXG4gICAgICAgIGlmIChzZXNzaW9uX3N0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWIgPSB1c2VyLnByb2ZpbGUuc3ViO1xuICAgICAgICAgICAgdGhpcy5fc2lkID0gdXNlci5wcm9maWxlLnNpZDtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNlc3Npb25Nb25pdG9yLl9zdGFydDsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbl9zdGF0ZSwgXCIsIHN1YjpcIiwgdGhpcy5fc3ViKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lKCkudGhlbih1cmwgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJJbml0aWFsaXppbmcgY2hlY2sgc2Vzc2lvbiBpZnJhbWVcIilcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsaWVudF9pZCA9IHRoaXMuX2NsaWVudF9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnRlcnZhbCA9IHRoaXMuX2NoZWNrU2Vzc2lvbkludGVydmFsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUgPSBuZXcgdGhpcy5fQ2hlY2tTZXNzaW9uSUZyYW1lQ3Rvcih0aGlzLl9jYWxsYmFjay5iaW5kKHRoaXMpLCBjbGllbnRfaWQsIHVybCwgaW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lLmxvYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy53YXJuKFwiTm8gY2hlY2sgc2Vzc2lvbiBpZnJhbWUgZm91bmQgaW4gdGhlIG1ldGFkYXRhXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggdG8gc3VwcHJlc3MgZXJyb3JzIHNpbmNlIHdlJ3JlIGluIG5vbi1wcm9taXNlIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkVycm9yIGZyb20gZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lOlwiLCBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RhcnQoc2Vzc2lvbl9zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc3RvcCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX3N0b3BcIik7XG5cbiAgICAgICAgdGhpcy5fc3ViID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2lkID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja1Nlc3Npb25JRnJhbWUuc3RvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NhbGxiYWNrKCkge1xuICAgICAgICBMb2cuZGVidWcoXCJTZXNzaW9uTW9uaXRvci5fY2FsbGJhY2tcIik7XG5cbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIucXVlcnlTZXNzaW9uU3RhdHVzKCkudGhlbihzZXNzaW9uID0+IHtcbiAgICAgICAgICAgIHZhciByYWlzZVVzZXJTaWduZWRPdXRFdmVudCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uc3ViID09PSB0aGlzLl9zdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFpc2VVc2VyU2lnbmVkT3V0RXZlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTZXNzaW9uSUZyYW1lLnN0YXJ0KHNlc3Npb24uc2Vzc2lvbl9zdGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uc2lkID09PSB0aGlzLl9zaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNhbWUgc3ViIHN0aWxsIGxvZ2dlZCBpbiBhdCBPUCwgcmVzdGFydGluZyBjaGVjayBzZXNzaW9uIGlmcmFtZTsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbi5zZXNzaW9uX3N0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhcIlNhbWUgc3ViIHN0aWxsIGxvZ2dlZCBpbiBhdCBPUCwgc2Vzc2lvbiBzdGF0ZSBoYXMgY2hhbmdlZCwgcmVzdGFydGluZyBjaGVjayBzZXNzaW9uIGlmcmFtZTsgc2Vzc2lvbl9zdGF0ZTpcIiwgc2Vzc2lvbi5zZXNzaW9uX3N0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5fcmFpc2VVc2VyU2Vzc2lvbkNoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiRGlmZmVyZW50IHN1YmplY3Qgc2lnbmVkIGludG8gT1A6XCIsIHNlc3Npb24uc3ViKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJTdWJqZWN0IG5vIGxvbmdlciBzaWduZWQgaW50byBPUFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJhaXNlVXNlclNpZ25lZE91dEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiU2Vzc2lvbk1vbml0b3IuX2NhbGxiYWNrOyByYWlzaW5nIHNpZ25lZCBvdXQgZXZlbnRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVVzZXJTaWduZWRPdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIExvZy5kZWJ1ZyhcIkVycm9yIGNhbGxpbmcgcXVlcnlDdXJyZW50U2lnbmluU2Vzc2lvbjsgcmFpc2luZyBzaWduZWQgb3V0IGV2ZW50XCIsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5fcmFpc2VVc2VyU2lnbmVkT3V0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9TZXNzaW9uTW9uaXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBEZWZhdWx0SW50ZXJ2YWwgPSAyMDAwO1xuXG5leHBvcnQgY2xhc3MgQ2hlY2tTZXNzaW9uSUZyYW1lIHtcbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgY2xpZW50X2lkLCB1cmwsIGludGVydmFsKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsO1xuICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IGludGVydmFsIHx8IERlZmF1bHRJbnRlcnZhbDtcblxuICAgICAgICB2YXIgaWR4ID0gdXJsLmluZGV4T2YoXCIvXCIsIHVybC5pbmRleE9mKFwiLy9cIikgKyAyKTtcbiAgICAgICAgdGhpcy5fZnJhbWVfb3JpZ2luID0gdXJsLnN1YnN0cigwLCBpZHgpO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG5cbiAgICAgICAgLy8gc2hvdGd1biBhcHByb2FjaFxuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuX2ZyYW1lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUud2lkdGggPSAwO1xuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5oZWlnaHQgPSAwO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lLnNyYyA9IHVybDtcbiAgICB9XG4gICAgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9mcmFtZSk7XG4gICAgICAgICAgICB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCA9IHRoaXMuX21lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX21lc3NhZ2UoZSkge1xuICAgICAgICBpZiAoZS5vcmlnaW4gPT09IHRoaXMuX2ZyYW1lX29yaWdpbiAmJlxuICAgICAgICAgICAgZS5zb3VyY2UgPT09IHRoaXMuX2ZyYW1lLmNvbnRlbnRXaW5kb3dcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoZS5kYXRhID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJlcnJvciBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlLmRhdGEgPT09IFwiY2hhbmdlZFwiKSB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiY2hhbmdlZCBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIExvZy5kZWJ1ZyhlLmRhdGEgKyBcIiBtZXNzYWdlIGZyb20gY2hlY2sgc2Vzc2lvbiBvcCBpZnJhbWVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoc2Vzc2lvbl9zdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbl9zdGF0ZSAhPT0gc2Vzc2lvbl9zdGF0ZSkge1xuICAgICAgICAgICAgTG9nLmRlYnVnKFwiQ2hlY2tTZXNzaW9uSUZyYW1lLnN0YXJ0XCIpO1xuXG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbl9zdGF0ZSA9IHNlc3Npb25fc3RhdGU7XG5cbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHRoaXMuX2NsaWVudF9pZCArIFwiIFwiICsgdGhpcy5fc2Vzc2lvbl9zdGF0ZSwgdGhpcy5fZnJhbWVfb3JpZ2luKTtcbiAgICAgICAgICAgIH0sIHRoaXMuX2ludGVydmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0b3AoKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkNoZWNrU2Vzc2lvbklGcmFtZS5zdG9wXCIpO1xuXG4gICAgICAgIHRoaXMuX3Nlc3Npb25fc3RhdGUgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLl90aW1lcikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXIpO1xuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NoZWNrU2Vzc2lvbklGcmFtZS5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IE1ldGFkYXRhU2VydmljZSBmcm9tICcuL01ldGFkYXRhU2VydmljZSc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuY29uc3QgQWNjZXNzVG9rZW5UeXBlSGludCA9IFwiYWNjZXNzX3Rva2VuXCI7XG5cbmV4cG9ydCBjbGFzcyBUb2tlblJldm9jYXRpb25DbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBYTUxIdHRwUmVxdWVzdEN0b3IgPSBHbG9iYWwuWE1MSHR0cFJlcXVlc3QsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2V0dGluZ3MgcHJvdmlkZWRcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzZXR0aW5ncyBwcm92aWRlZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX1hNTEh0dHBSZXF1ZXN0Q3RvciA9IFhNTEh0dHBSZXF1ZXN0Q3RvcjtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHJldm9rZShhY2Nlc3NUb2tlbiwgcmVxdWlyZWQpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiVG9rZW5SZXZvY2F0aW9uQ2xpZW50LnJldm9rZVwiKTtcblxuICAgICAgICBpZiAoIWFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhY2Nlc3NUb2tlbiBwcm92aWRlZFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGFjY2Vzc1Rva2VuIHByb3ZpZGVkLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0UmV2b2NhdGlvbkVuZHBvaW50KCkudGhlbih1cmwgPT4ge1xuICAgICAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiUmV2b2NhdGlvbiBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXZvY2F0aW9uIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbm90IHJlcXVpcmVkLCBzbyBkb24ndCBlcnJvciBhbmQganVzdCByZXR1cm5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XG4gICAgICAgICAgICB2YXIgY2xpZW50X3NlY3JldCA9IHRoaXMuX3NldHRpbmdzLmNsaWVudF9zZWNyZXQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV2b2tlKHVybCwgY2xpZW50X2lkLCBjbGllbnRfc2VjcmV0LCBhY2Nlc3NUb2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXZva2UodXJsLCBjbGllbnRfaWQsIGNsaWVudF9zZWNyZXQsIGFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkNhbGxpbmcgcmV2b2NhdGlvbiBlbmRwb2ludFwiKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgICAgICB2YXIgeGhyID0gbmV3IHRoaXMuX1hNTEh0dHBSZXF1ZXN0Q3RvcigpO1xuICAgICAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIHVybCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmRlYnVnKFwiSFRUUCByZXNwb25zZSByZWNlaXZlZCwgc3RhdHVzXCIsIHhoci5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKHhoci5zdGF0dXNUZXh0ICsgXCIgKFwiICsgeGhyLnN0YXR1cyArIFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIGJvZHkgPSBcImNsaWVudF9pZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChjbGllbnRfaWQpOyBcbiAgICAgICAgICAgIGlmIChjbGllbnRfc2VjcmV0KSB7XG4gICAgICAgICAgICAgICAgYm9keSArPSBcIiZjbGllbnRfc2VjcmV0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNsaWVudF9zZWNyZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYm9keSArPSBcIiZ0b2tlbl90eXBlX2hpbnQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoQWNjZXNzVG9rZW5UeXBlSGludCk7XG4gICAgICAgICAgICBib2R5ICs9IFwiJnRva2VuPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgICAgICAgICB4aHIuc2VuZChib2R5KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1Rva2VuUmV2b2NhdGlvbkNsaWVudC5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IENvcmRvdmFQb3B1cFdpbmRvdyBmcm9tICcuL0NvcmRvdmFQb3B1cFdpbmRvdyc7XG5cbmV4cG9ydCBjbGFzcyBDb3Jkb3ZhUG9wdXBOYXZpZ2F0b3Ige1xuICAgIFxuICAgIHByZXBhcmUocGFyYW1zKSB7XG4gICAgICAgIGxldCBwb3B1cCA9IG5ldyBDb3Jkb3ZhUG9wdXBXaW5kb3cocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb3B1cCk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvcmRvdmFQb3B1cE5hdmlnYXRvci5qcyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHpvb209bm8nO1xuY29uc3QgRGVmYXVsdFBvcHVwVGFyZ2V0ID0gXCJfYmxhbmtcIjtcblxuZXhwb3J0IGNsYXNzIENvcmRvdmFQb3B1cFdpbmRvdyB7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93LmN0b3JcIik7XG5cbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZlYXR1cmVzID0gcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgfHwgRGVmYXVsdFBvcHVwRmVhdHVyZXM7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gcGFyYW1zLnBvcHVwV2luZG93VGFyZ2V0IHx8IERlZmF1bHRQb3B1cFRhcmdldDtcbiAgICAgICAgXG4gICAgICAgIHRoaXMucmVkaXJlY3RfdXJpID0gcGFyYW1zLnN0YXJ0VXJsO1xuICAgICAgICBMb2cuZGVidWcoXCJyZWRpcmVjdF91cmk6IFwiICsgdGhpcy5yZWRpcmVjdF91cmkpO1xuICAgIH1cblxuICAgIF9pc0luQXBwQnJvd3Nlckluc3RhbGxlZChjb3Jkb3ZhTWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFtcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3NlclwiLCBcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3Nlci5pbmFwcGJyb3dzZXJcIiwgXCJvcmcuYXBhY2hlLmNvcmRvdmEuaW5hcHBicm93c2VyXCJdLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3Jkb3ZhTWV0YWRhdGEuaGFzT3duUHJvcGVydHkobmFtZSlcbiAgICAgICAgfSlcbiAgICB9XG4gICAgXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XG4gICAgICAgIExvZy5kZWJ1ZyhcIkNvcmRvdmFQb3B1cFdpbmRvdy5uYXZpZ2F0ZVwiKTtcblxuICAgICAgICBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXdpbmRvdy5jb3Jkb3ZhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKFwiY29yZG92YSBpcyB1bmRlZmluZWRcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGNvcmRvdmFNZXRhZGF0YSA9IHdpbmRvdy5jb3Jkb3ZhLnJlcXVpcmUoXCJjb3Jkb3ZhL3BsdWdpbl9saXN0XCIpLm1ldGFkYXRhO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5BcHBCcm93c2VySW5zdGFsbGVkKGNvcmRvdmFNZXRhZGF0YSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKFwiSW5BcHBCcm93c2VyIHBsdWdpbiBub3QgZm91bmRcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gY29yZG92YS5JbkFwcEJyb3dzZXIub3BlbihwYXJhbXMudXJsLCB0aGlzLnRhcmdldCwgdGhpcy5mZWF0dXJlcyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgICAgICBMb2cuZGVidWcoXCJwb3B1cCBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCA9IHRoaXMuX2V4aXRDYWxsYmFjay5iaW5kKHRoaXMpOyBcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50ID0gdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2suYmluZCh0aGlzKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cC5hZGRFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2Fkc3RhcnRcIiwgdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihcIkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgfVxuXG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICAgIH1cblxuICAgIF9sb2FkU3RhcnRDYWxsYmFjayhldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudXJsLmluZGV4T2YodGhpcy5yZWRpcmVjdF91cmkpID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiBldmVudC51cmwgfSk7XG4gICAgICAgIH0gICAgXG4gICAgfVxuICAgIF9leGl0Q2FsbGJhY2sobWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9lcnJvcihtZXNzYWdlKTsgICAgXG4gICAgfVxuICAgIFxuICAgIF9zdWNjZXNzKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgIExvZy5kZWJ1ZyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBjb3Jkb3ZhIHBvcHVwIHdpbmRvd1wiKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZShkYXRhKTtcbiAgICB9XG4gICAgX2Vycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgIExvZy5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICB9XG5cbiAgICBfY2xlYW51cCgpIHtcbiAgICAgICAgTG9nLmRlYnVnKFwiQ29yZG92YVBvcHVwV2luZG93Ll9jbGVhbnVwXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCl7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImxvYWRzdGFydFwiLCB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50LCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvQ29yZG92YVBvcHVwV2luZG93LmpzIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgQ29yZG92YVBvcHVwV2luZG93IGZyb20gJy4vQ29yZG92YVBvcHVwV2luZG93JztcblxuZXhwb3J0IGNsYXNzIENvcmRvdmFJRnJhbWVOYXZpZ2F0b3Ige1xuXG4gICAgcHJlcGFyZShwYXJhbXMpIHtcbiAgICAgICAgcGFyYW1zLnBvcHVwV2luZG93RmVhdHVyZXMgPSAnaGlkZGVuPXllcyc7XG4gICAgICAgIGxldCBwb3B1cCA9IG5ldyBDb3Jkb3ZhUG9wdXBXaW5kb3cocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb3B1cCk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiXSwic291cmNlUm9vdCI6IiJ9 diff --git a/lib/oidc-client.min.js b/lib/oidc-client.min.js index 4a5828f4a..e16fd80c4 100644 --- a/lib/oidc-client.min.js +++ b/lib/oidc-client.min.js @@ -1,21 +1,21 @@ -!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n=e();for(var r in n)("object"==typeof exports?exports:t)[r]=n[r]}}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=e.Log=n(1),i=e.OidcClient=n(2),s=e.OidcClientSettings=n(3),o=e.WebStorageStateStore=n(4),a=e.InMemoryWebStorage=n(26),u=e.UserManager=n(27),h=e.AccessTokenEvents=n(36),c=e.MetadataService=n(7),f=e.CordovaPopupNavigator=n(43),l=e.CordovaIFrameNavigator=n(45),d=e.CheckSessionIFrame=n(41),g=e.TokenRevocationClient=n(42),p=e.SessionMonitor=n(40),y=e.Global=n(5),v=e.User=n(34);e.default={Log:r,OidcClient:i,OidcClientSettings:s,WebStorageStateStore:o,InMemoryWebStorage:a,UserManager:u,AccessTokenEvents:h,MetadataService:c,CordovaPopupNavigator:f,CordovaIFrameNavigator:l,CheckSessionIFrame:d,TokenRevocationClient:g,SessionMonitor:p,Global:y,User:v}},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n=h){for(var t=arguments.length,e=Array(t),n=0;n=u){for(var t=arguments.length,e=Array(t),n=0;n=a){for(var t=arguments.length,e=Array(t),n=0;n=o){for(var t=arguments.length,e=Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),e instanceof h.default?this._settings=e:this._settings=new h.default(e)}return t.prototype.createSigninRequest=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.response_type,r=e.scope,i=e.redirect_uri,s=e.data,o=e.state,u=e.prompt,h=e.display,c=e.max_age,f=e.ui_locales,l=e.id_token_hint,g=e.login_hint,p=e.acr_values,y=e.resource,v=e.request,m=e.request_uri,S=e.extraQueryParams,b=arguments[1];a.default.debug("OidcClient.createSigninRequest");var w=this._settings.client_id;n=n||this._settings.response_type,r=r||this._settings.scope,i=i||this._settings.redirect_uri,u=u||this._settings.prompt,h=h||this._settings.display,c=c||this._settings.max_age,f=f||this._settings.ui_locales,p=p||this._settings.acr_values,y=y||this._settings.resource,S=S||this._settings.extraQueryParams;var E=this._settings.authority;return this._metadataService.getAuthorizationEndpoint().then(function(e){a.default.debug("Received authorization endpoint",e);var _=new d.default({url:e,client_id:w,redirect_uri:i,response_type:n,scope:r,data:s||o,authority:E,prompt:u,display:h,max_age:c,ui_locales:f,id_token_hint:l,login_hint:g,acr_values:p,resource:y,request:v,request_uri:m,extraQueryParams:S}),x=_.state;return b=b||t._stateStore,b.set(x.id,x.toStorageString()).then(function(){return _})})},t.prototype.processSigninResponse=function(t,e){var n=this;a.default.debug("OidcClient.processSigninResponse");var r=new p.default(t);return r.state?(e=e||this._stateStore,e.remove(r.state).then(function(t){if(!t)throw a.default.error("No matching state found in storage"),new Error("No matching state found in storage");var e=w.default.fromStorageString(t);return a.default.debug("Received state from storage; validating response"),n._validator.validateSigninResponse(e,r)})):(a.default.error("No state in response"),Promise.reject(new Error("No state in response")))},t.prototype.createSignoutRequest=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.id_token_hint,r=e.data,i=e.state,s=e.post_logout_redirect_uri,o=arguments[1];return a.default.debug("OidcClient.createSignoutRequest"),s=s||this._settings.post_logout_redirect_uri,this._metadataService.getEndSessionEndpoint().then(function(e){if(!e)throw a.default.error("No end session endpoint url returned"),new Error("no end session endpoint");a.default.debug("Received end session endpoint",e);var u=new v.default({url:e,id_token_hint:n,post_logout_redirect_uri:s,data:r||i}),h=u.state;return h&&(a.default.debug("Signout request has state to persist"),o=o||t._stateStore,o.set(h.id,h.toStorageString())),u})},t.prototype.processSignoutResponse=function(t,e){var n=this;a.default.debug("OidcClient.processSignoutResponse");var r=new S.default(t);if(!r.state)return a.default.debug("No state in response"),r.error?(a.default.warn("Response was error",r.error),Promise.reject(new f.default(r))):Promise.resolve(r);var i=r.state;return e=e||this._stateStore,e.remove(i).then(function(t){if(!t)throw a.default.error("No matching state found in storage"),new Error("No matching state found in storage");var e=_.default.fromStorageString(t);return a.default.debug("Received state from storage; validating response"),n._validator.validateSignoutResponse(e,r)})},t.prototype.clearStaleState=function(t){return a.default.debug("OidcClient.clearStaleState"),t=t||this._stateStore,_.default.clearStaleState(t,this.settings.staleStateAge)},s(t,[{key:"_stateStore",get:function(){return this.settings.stateStore}},{key:"_validator",get:function(){return this.settings.validator}},{key:"_metadataService",get:function(){return this.settings.metadataService}},{key:"settings",get:function(){return this._settings}},{key:"metadataService",get:function(){return this._metadataService}}]),t}();e.default=x,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=e.authority,r=e.metadataUrl,o=e.metadata,a=e.signingKeys,u=e.client_id,h=e.client_secret,f=e.response_type,d=void 0===f?y:f,p=e.scope,b=void 0===p?v:p,w=e.redirect_uri,E=e.post_logout_redirect_uri,_=e.prompt,x=e.display,A=e.max_age,F=e.ui_locales,P=e.acr_values,O=e.resource,C=e.filterProtocolClaims,T=void 0===C||C,D=e.loadUserInfo,R=void 0===D||D,j=e.staleStateAge,H=void 0===j?m:j,I=e.clockSkew,k=void 0===I?S:I,B=e.stateStore,N=void 0===B?new c.default:B,V=e.ResponseValidatorCtor,M=void 0===V?l.default:V,K=e.MetadataServiceCtor,L=void 0===K?g.default:K,U=e.extraQueryParams,q=void 0===U?{}:U;i(this,t),this._authority=n,this._metadataUrl=r,this._metadata=o,this._signingKeys=a,this._client_id=u,this._client_secret=h,this._response_type=d,this._scope=b,this._redirect_uri=w,this._post_logout_redirect_uri=E,this._prompt=_,this._display=x,this._max_age=A,this._ui_locales=F,this._acr_values=P,this._resource=O,this._filterProtocolClaims=!!T,this._loadUserInfo=!!R,this._staleStateAge=H,this._clockSkew=k,this._stateStore=N,this._validator=new M(this),this._metadataService=new L(this),this._extraQueryParams="object"===("undefined"==typeof q?"undefined":s(q))?q:{}}return o(t,[{key:"client_id",get:function(){return this._client_id},set:function(t){if(this._client_id)throw u.default.error("client_id has already been assigned."),new Error("client_id has already been assigned.");this._client_id=t}},{key:"client_secret",get:function(){return this._client_secret}},{key:"response_type",get:function(){return this._response_type}},{key:"scope",get:function(){return this._scope}},{key:"redirect_uri",get:function(){return this._redirect_uri}},{key:"post_logout_redirect_uri",get:function(){return this._post_logout_redirect_uri}},{key:"prompt",get:function(){return this._prompt}},{key:"display",get:function(){return this._display}},{key:"max_age",get:function(){return this._max_age}},{key:"ui_locales",get:function(){return this._ui_locales}},{key:"acr_values",get:function(){return this._acr_values}},{key:"resource",get:function(){return this._resource}},{key:"authority",get:function(){return this._authority},set:function(t){if(this._authority)throw u.default.error("authority has already been assigned."),new Error("authority has already been assigned.");this._authority=t}},{key:"metadataUrl",get:function(){return this._metadataUrl||(this._metadataUrl=this.authority,this._metadataUrl&&this._metadataUrl.indexOf(p)<0&&("/"!==this._metadataUrl[this._metadataUrl.length-1]&&(this._metadataUrl+="/"),this._metadataUrl+=p)),this._metadataUrl}},{key:"metadata",get:function(){return this._metadata},set:function(t){this._metadata=t}},{key:"signingKeys",get:function(){return this._signingKeys},set:function(t){this._signingKeys=t}},{key:"filterProtocolClaims",get:function(){return this._filterProtocolClaims}},{key:"loadUserInfo",get:function(){return this._loadUserInfo}},{key:"staleStateAge",get:function(){return this._staleStateAge}},{key:"clockSkew",get:function(){return this._clockSkew}},{key:"stateStore",get:function(){return this._stateStore}},{key:"validator",get:function(){return this._validator}},{key:"metadataService",get:function(){return this._metadataService}},{key:"extraQueryParams",get:function(){return this._extraQueryParams},set:function(t){"object"===("undefined"==typeof t?"undefined":s(t))?this._extraQueryParams=t:this._extraQueryParams={}}}]),t}();e.default=b,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=r(s),a=n(5),u=r(a),h=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.prefix,r=void 0===n?"oidc.":n,s=e.store,o=void 0===s?u.default.localStorage:s;i(this,t),this._store=o,this._prefix=r}return t.prototype.set=function(t,e){return o.default.debug("WebStorageStateStore.set",t),t=this._prefix+t,this._store.setItem(t,e),Promise.resolve()},t.prototype.get=function(t){o.default.debug("WebStorageStateStore.get",t),t=this._prefix+t;var e=this._store.getItem(t);return Promise.resolve(e)},t.prototype.remove=function(t){o.default.debug("WebStorageStateStore.remove",t),t=this._prefix+t;var e=this._store.getItem(t);return this._store.removeItem(t),Promise.resolve(e)},t.prototype.getAllKeys=function(){o.default.debug("WebStorageStateStore.getAllKeys");for(var t=[],e=0;e1&&void 0!==arguments[1]?arguments[1]:u.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:c.default,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:g.default;if(i(this,t),!e)throw o.default.error("No settings passed to ResponseValidator"),new Error("settings");this._settings=e,this._metadataService=new n(this._settings),this._userInfoService=new r(this._settings),this._joseUtil=s}return t.prototype.validateSigninResponse=function(t,e){var n=this;return o.default.debug("ResponseValidator.validateSigninResponse"),this._processSigninParams(t,e).then(function(e){return o.default.debug("state processed"),n._validateTokens(t,e).then(function(t){return o.default.debug("tokens validated"),n._processClaims(t).then(function(t){return o.default.debug("claims processed"),t})})})},t.prototype.validateSignoutResponse=function(t,e){return o.default.debug("ResponseValidator.validateSignoutResponse"),t.id!==e.state?(o.default.error("State does not match"),Promise.reject(new Error("State does not match"))):(o.default.debug("state validated"),e.state=t.data,e.error?(o.default.warn("Response was error",e.error),Promise.reject(new l.default(e))):Promise.resolve(e))},t.prototype._processSigninParams=function(t,e){if(o.default.debug("ResponseValidator._processSigninParams"),t.id!==e.state)return o.default.error("State does not match"),Promise.reject(new Error("State does not match"));if(!t.client_id)return o.default.error("No client_id on state"),Promise.reject(new Error("No client_id on state"));if(!t.authority)return o.default.error("No authority on state"),Promise.reject(new Error("No authority on state"));if(this._settings.authority){if(this._settings.authority&&this._settings.authority!==t.authority)return o.default.error("authority mismatch on settings vs. signin state"),Promise.reject(new Error("authority mismatch on settings vs. signin state"))}else this._settings.authority=t.authority;if(this._settings.client_id){if(this._settings.client_id&&this._settings.client_id!==t.client_id)return o.default.error("client_id mismatch on settings vs. signin state"),Promise.reject(new Error("client_id mismatch on settings vs. signin state"))}else this._settings.client_id=t.client_id;return o.default.debug("state validated"),e.state=t.data,e.error?(o.default.warn("Response was error",e.error),Promise.reject(new l.default(e))):t.nonce&&!e.id_token?(o.default.error("Expecting id_token in response"),Promise.reject(new Error("No id_token in response"))):!t.nonce&&e.id_token?(o.default.error("Not expecting id_token in response"),Promise.reject(new Error("Unexpected id_token in response"))):Promise.resolve(e)},t.prototype._processClaims=function(t){var e=this;if(o.default.debug("ResponseValidator._processClaims"),t.isOpenIdConnect){if(o.default.debug("response is OIDC, processing claims"),t.profile=this._filterProtocolClaims(t.profile),this._settings.loadUserInfo&&t.access_token)return o.default.debug("loading user info"),this._userInfoService.getClaims(t.access_token).then(function(n){return o.default.debug("user info claims received from user info endpoint"),n.sub!==t.profile.sub?(o.default.error("sub from user info endpoint does not match sub in access_token"),Promise.reject(new Error("sub from user info endpoint does not match sub in access_token"))):(t.profile=e._mergeClaims(t.profile,n),o.default.debug("user info claims received, updated profile:",t.profile),t)});o.default.debug("not loading user info")}else o.default.debug("response is not OIDC, not processing claims");return Promise.resolve(t)},t.prototype._mergeClaims=function(t,e){var n=Object.assign({},t);for(var r in e){var i=e[r];Array.isArray(i)||(i=[i]);var s=!0,o=!1,a=void 0;try{for(var u,h=i[Symbol.iterator]();!(s=(u=h.next()).done);s=!0){var c=u.value;n[r]?Array.isArray(n[r])?n[r].indexOf(c)<0&&n[r].push(c):n[r]!==c&&(n[r]=[n[r],c]):n[r]=c}}catch(t){o=!0,a=t}finally{try{!s&&h.return&&h.return()}finally{if(o)throw a}}}return n},t.prototype._filterProtocolClaims=function(t){o.default.debug("ResponseValidator._filterProtocolClaims, incoming claims:",t);var e=Object.assign({},t);return this._settings._filterProtocolClaims?(p.forEach(function(t){delete e[t]}),o.default.debug("protocol claims filtered",e)):o.default.debug("protocol claims not filtered"),e},t.prototype._validateTokens=function(t,e){return o.default.debug("ResponseValidator._validateTokens"),e.id_token?e.access_token?(o.default.debug("Validating id_token and access_token"),this._validateIdTokenAndAccessToken(t,e)):(o.default.debug("Validating id_token"),this._validateIdToken(t,e)):(o.default.debug("No id_token to validate"),Promise.resolve(e))},t.prototype._validateIdTokenAndAccessToken=function(t,e){var n=this;return o.default.debug("ResponseValidator._validateIdTokenAndAccessToken"),this._validateIdToken(t,e).then(function(t){return n._validateAccessToken(t)})},t.prototype._validateIdToken=function(t,e){var n=this;if(o.default.debug("ResponseValidator._validateIdToken"),!t.nonce)return o.default.error("No nonce on state"),Promise.reject(new Error("No nonce on state"));var r=this._joseUtil.parseJwt(e.id_token);if(!r||!r.header||!r.payload)return o.default.error("Failed to parse id_token",r),Promise.reject(new Error("Failed to parse id_token"));if(t.nonce!==r.payload.nonce)return o.default.error("Invalid nonce in id_token"),Promise.reject(new Error("Invalid nonce in id_token"));var i=r.header.kid;return this._metadataService.getIssuer().then(function(s){return o.default.debug("Received issuer"),n._metadataService.getSigningKeys().then(function(a){if(!a)return o.default.error("No signing keys from metadata"),Promise.reject(new Error("No signing keys from metadata"));o.default.debug("Received signing keys");var u=void 0;if(i)u=a.filter(function(t){return t.kid===i})[0];else{if(a=n._filterByAlg(a,r.header.alg),a.length>1)return o.default.error("No kid found in id_token and more than one key found in metadata"),Promise.reject(new Error("No kid found in id_token and more than one key found in metadata"));u=a[0]}if(!u)return o.default.error("No key matching kid or alg found in signing keys"),Promise.reject(new Error("No key matching kid or alg found in signing keys"));var h=t.client_id,c=n._settings.clockSkew;return o.default.debug("Validaing JWT; using clock skew (in seconds) of: ",c),n._joseUtil.validateJwt(e.id_token,u,s,h,c).then(function(){return o.default.debug("JWT validation successful"),r.payload.sub?(e.profile=r.payload,e):(o.default.error("No sub present in id_token"),Promise.reject(new Error("No sub present in id_token")))})})})},t.prototype._filterByAlg=function(t,e){o.default.debug("ResponseValidator._filterByAlg",e);var n=null;if(e.startsWith("RS"))n="RSA";else if(e.startsWith("PS"))n="PS";else{if(!e.startsWith("ES"))return o.default.debug("alg not supported: ",e),[];n="EC"}return o.default.debug("Looking for keys that match kty: ",n),t=t.filter(function(t){return t.kty===n}),o.default.debug("Number of keys that match kty: ",n,t.length),t},t.prototype._validateAccessToken=function(t){if(o.default.debug("ResponseValidator._validateAccessToken"),!t.profile)return o.default.error("No profile loaded from id_token"),Promise.reject(new Error("No profile loaded from id_token"));if(!t.profile.at_hash)return o.default.error("No at_hash in id_token"),Promise.reject(new Error("No at_hash in id_token"));if(!t.id_token)return o.default.error("No id_token"),Promise.reject(new Error("No id_token"));var e=this._joseUtil.parseJwt(t.id_token);if(!e||!e.header)return o.default.error("Failed to parse id_token",e),Promise.reject(new Error("Failed to parse id_token"));var n=e.header.alg;if(!n||5!==n.length)return o.default.error("Unsupported alg:",n),Promise.reject(new Error("Unsupported alg: "+n));var r=n.substr(2,3);if(!r)return o.default.error("Unsupported alg:",n,r),Promise.reject(new Error("Unsupported alg: "+n));if(r=parseInt(r),256!==r&&384!==r&&512!==r)return o.default.error("Unsupported alg:",n,r),Promise.reject(new Error("Unsupported alg: "+n));var i="sha"+r,s=this._joseUtil.hashString(t.access_token,i);if(!s)return o.default.error("access_token hash failed:",i),Promise.reject(new Error("Failed to validate at_hash"));var a=s.substr(0,s.length/2),u=this._joseUtil.hexToBase64Url(a);return u!==t.profile.at_hash?(o.default.error("Failed to validate at_hash",u,t.profile.at_hash),Promise.reject(new Error("Failed to validate at_hash"))):Promise.resolve(t)},t}();e.default=y,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.default;if(i(this,t),!e)throw a.default.error("No settings passed to MetadataService"),new Error("settings");this._settings=e,this._jsonService=new n}return t.prototype.getMetadata=function(){var t=this;return a.default.debug("MetadataService.getMetadata"),this._settings.metadata?(a.default.debug("Returning metadata from settings"),Promise.resolve(this._settings.metadata)):this.metadataUrl?(a.default.debug("getting metadata from",this.metadataUrl),this._jsonService.getJson(this.metadataUrl).then(function(e){return a.default.debug("json received"),t._settings.metadata=e,e})):(a.default.error("No authority or metadataUrl configured on settings"),Promise.reject(new Error("No authority or metadataUrl configured on settings")))},t.prototype.getIssuer=function(){return a.default.debug("MetadataService.getIssuer"),this._getMetadataProperty("issuer")},t.prototype.getAuthorizationEndpoint=function(){return a.default.debug("MetadataService.getAuthorizationEndpoint"),this._getMetadataProperty("authorization_endpoint")},t.prototype.getUserInfoEndpoint=function(){return a.default.debug("MetadataService.getUserInfoEndpoint"),this._getMetadataProperty("userinfo_endpoint")},t.prototype.getTokenEndpoint=function(){return a.default.debug("MetadataService.getTokenEndpoint"),this._getMetadataProperty("token_endpoint",!0)},t.prototype.getCheckSessionIframe=function(){return a.default.debug("MetadataService.getCheckSessionIframe"),this._getMetadataProperty("check_session_iframe",!0)},t.prototype.getEndSessionEndpoint=function(){return a.default.debug("MetadataService.getEndSessionEndpoint"),this._getMetadataProperty("end_session_endpoint",!0)},t.prototype.getRevocationEndpoint=function(){return a.default.debug("MetadataService.getRevocationEndpoint"),this._getMetadataProperty("revocation_endpoint",!0)},t.prototype._getMetadataProperty=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return a.default.debug("MetadataService._getMetadataProperty",t),this.getMetadata().then(function(n){if(a.default.debug("metadata recieved"),void 0===n[t]){if(e===!0)return void a.default.warn("Metadata does not contain optional property "+t);throw a.default.error("Metadata does not contain property "+t),new Error("Metadata does not contain property "+t)}return n[t]})},t.prototype.getSigningKeys=function(){var t=this;return a.default.debug("MetadataService.getSigningKeys"),this._settings.signingKeys?(a.default.debug("Returning signingKeys from settings"),Promise.resolve(this._settings.signingKeys)):this._getMetadataProperty("jwks_uri").then(function(e){return a.default.debug("jwks_uri received",e),t._jsonService.getJson(e).then(function(e){if(a.default.debug("key set received",e),!e.keys)throw a.default.error("Missing keys on keyset"),new Error("Missing keys on keyset");return t._settings.signingKeys=e.keys,t._settings.signingKeys})})},s(t,[{key:"metadataUrl",get:function(){return this._metadataUrl||(this._settings.metadataUrl?this._metadataUrl=this._settings.metadataUrl:(this._metadataUrl=this._settings.authority,this._metadataUrl&&this._metadataUrl.indexOf(c)<0&&("/"!==this._metadataUrl[this._metadataUrl.length-1]&&(this._metadataUrl+="/"),this._metadataUrl+=c))),this._metadataUrl}}]),t}();e.default=f,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=r(s),a=n(5),u=r(a),h=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:u.default.XMLHttpRequest;i(this,t),this._XMLHttpRequest=e}return t.prototype.getJson=function(t,e){var n=this;if(o.default.debug("JsonService.getJson",t),!t)throw o.default.error("No url passed"),new Error("url");return new Promise(function(r,i){var s=new n._XMLHttpRequest;s.open("GET",t),s.onload=function(){if(o.default.debug("HTTP response received, status",s.status),200===s.status)try{r(JSON.parse(s.responseText))}catch(t){o.default.error("Error parsing JSON response",t.message),i(t)}else i(Error(s.statusText+" ("+s.status+")"))},s.onerror=function(){o.default.error("network error"),i(Error("Network Error"))},e&&(o.default.debug("token passed, setting Authorization header"),s.setRequestHeader("Authorization","Bearer "+e)),s.send()})},t}();e.default=h,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(8),o=r(s),a=n(7),u=r(a),h=n(1),c=r(h),f=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;if(i(this,t),!e)throw c.default.error("No settings passed to UserInfoService"),new Error("settings");this._settings=e,this._jsonService=new n,this._metadataService=new r(this._settings)}return t.prototype.getClaims=function(t){var e=this;return c.default.debug("UserInfoService.getClaims"),t?this._metadataService.getUserInfoEndpoint().then(function(n){return c.default.debug("received userinfo url",n),e._jsonService.getJson(n,t).then(function(t){return c.default.debug("claims received",t),t})}):(c.default.error("No token passed"),Promise.reject(new Error("A token is required")))},t}();e.default=f,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=n(1),u=r(a),h=function(t){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.error,o=n.error_description,a=n.error_uri,h=n.state;if(i(this,e),!r)throw u.default.error("No error passed to ErrorResponse"),new Error("error");var c=s(this,t.call(this,o||r));return c.name="ErrorResponse",c.error=r,c.error_description=o,c.error_uri=a,c.state=h,c}return o(e,t),e}(Error);e.default=h,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(12),o=n(1),a=r(o),u=["RS256","RS384","RS512","PS256","PS384","PS512","ES256","ES384","ES512"],h=function(){function t(){i(this,t)}return t.parseJwt=function(t){a.default.debug("JoseUtil.parseJwt");try{var e=s.jws.JWS.parse(t);return{header:e.headerObj,payload:e.payloadObj}}catch(t){a.default.error(t)}},t.validateJwt=function(e,n,r,i,o,u){a.default.debug("JoseUtil.validateJwt");try{if("RSA"===n.kty)if(n.e&&n.n)n=s.KEYUTIL.getKey(n);else{if(!n.x5c||!n.x5c.length)return a.default.error("RSA key missing key material",n),Promise.reject(new Error("RSA key missing key material"));n=s.KEYUTIL.getKey(s.X509.getPublicKeyFromCertPEM(n.x5c[0]))}else{if("EC"!==n.kty)return a.default.error("Unsupported key type",n&&n.kty),Promise.reject(new Error("Unsupported key type: "+n&&n.kty));if(!(n.crv&&n.x&&n.y))return a.default.error("EC key missing key material",n),Promise.reject(new Error("EC key missing key material"));n=s.KEYUTIL.getKey(n)}return t._validateJwt(e,n,r,i,o,u)}catch(t){return a.default.error(t&&t.message||t),Promise.reject("JWT validation failed")}},t._validateJwt=function(e,n,r,i,o,h){a.default.debug("JoseUtil._validateJwt"),o||(o=0),h||(h=parseInt(Date.now()/1e3));var c=t.parseJwt(e).payload;if(!c.iss)return a.default.error("issuer was not provided"),Promise.reject(new Error("issuer was not provided"));if(c.iss!==r)return a.default.error("Invalid issuer in token",c.iss),Promise.reject(new Error("Invalid issuer in token: "+c.iss));if(!c.aud)return a.default.error("aud was not provided"),Promise.reject(new Error("aud was not provided"));var f=c.aud===i||Array.isArray(c.aud)&&c.aud.indexOf(i)>=0; -if(!f)return a.default.error("Invalid audience in token",c.aud),Promise.reject(new Error("Invalid audience in token: "+c.aud));var l=h+o,d=h-o;if(!c.iat)return a.default.error("iat was not provided"),Promise.reject(new Error("iat was not provided"));if(l>6)+ur.charAt(63&n);if(e+1==t.length?(n=parseInt(t.substring(e,e+1),16),r+=ur.charAt(n<<2)):e+2==t.length&&(n=parseInt(t.substring(e,e+2),16),r+=ur.charAt(n>>2)+ur.charAt((3&n)<<4)),hr)for(;(3&r.length)>0;)r+=hr;return r}function i(t){var e,n,r,i="",s=0;for(e=0;e>2),n=3&r,s=1):1==s?(i+=f(n<<2|r>>4),n=15&r,s=2):2==s?(i+=f(n),i+=f(r>>2),n=3&r,s=3):(i+=f(n<<2|r>>4),i+=f(15&r),s=0));return 1==s&&(i+=f(n<<2)),i}function s(t){var e,n=i(t),r=new Array;for(e=0;2*e=0;){var o=e*this[t++]+n[r]+i;i=Math.floor(o/67108864),n[r++]=67108863&o}return i}function h(t,e,n,r,i,s){for(var o=32767&e,a=e>>15;--s>=0;){var u=32767&this[t],h=this[t++]>>15,c=a*u+h*o;u=o*u+((32767&c)<<15)+n[r]+(1073741823&i),i=(u>>>30)+(c>>>15)+a*h+(i>>>30),n[r++]=1073741823&u}return i}function c(t,e,n,r,i,s){for(var o=16383&e,a=e>>14;--s>=0;){var u=16383&this[t],h=this[t++]>>14,c=a*u+h*o;u=o*u+((16383&c)<<14)+n[r]+i,i=(u>>28)+(c>>14)+a*h,n[r++]=268435455&u}return i}function f(t){return pr.charAt(t)}function l(t,e){var n=yr[t.charCodeAt(e)];return null==n?-1:n}function d(t){for(var e=this.t-1;e>=0;--e)t[e]=this[e];t.t=this.t,t.s=this.s}function g(t){this.t=1,this.s=t<0?-1:0,t>0?this[0]=t:t<-1?this[0]=t+this.DV:this.t=0}function p(t){var e=a();return e.fromInt(t),e}function y(t,e){var n;if(16==e)n=4;else if(8==e)n=3;else if(256==e)n=8;else if(2==e)n=1;else if(32==e)n=5;else{if(4!=e)return void this.fromRadix(t,e);n=2}this.t=0,this.s=0;for(var r=t.length,i=!1,s=0;--r>=0;){var a=8==n?255&t[r]:l(t,r);a<0?"-"==t.charAt(r)&&(i=!0):(i=!1,0==s?this[this.t++]=a:s+n>this.DB?(this[this.t-1]|=(a&(1<>this.DB-s):this[this.t-1]|=a<=this.DB&&(s-=this.DB))}8==n&&0!=(128&t[0])&&(this.s=-1,s>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==t;)--this.t}function m(t){if(this.s<0)return"-"+this.negate().toString(t);var e;if(16==t)e=4;else if(8==t)e=3;else if(2==t)e=1;else if(32==t)e=5;else{if(4!=t)return this.toRadix(t);e=2}var n,r=(1<0)for(a>a)>0&&(i=!0,s=f(n));o>=0;)a>(a+=this.DB-e)):(n=this[o]>>(a-=e)&r,a<=0&&(a+=this.DB,--o)),n>0&&(i=!0),i&&(s+=f(n));return i?s:"0"}function S(){var t=a();return o.ZERO.subTo(this,t),t}function b(){return this.s<0?this.negate():this}function w(t){var e=this.s-t.s;if(0!=e)return e;var n=this.t;if(e=n-t.t,0!=e)return this.s<0?-e:e;for(;--n>=0;)if(0!=(e=this[n]-t[n]))return e;return 0}function E(t){var e,n=1;return 0!=(e=t>>>16)&&(t=e,n+=16),0!=(e=t>>8)&&(t=e,n+=8),0!=(e=t>>4)&&(t=e,n+=4),0!=(e=t>>2)&&(t=e,n+=2),0!=(e=t>>1)&&(t=e,n+=1),n}function _(){return this.t<=0?0:this.DB*(this.t-1)+E(this[this.t-1]^this.s&this.DM)}function x(t,e){var n;for(n=this.t-1;n>=0;--n)e[n+t]=this[n];for(n=t-1;n>=0;--n)e[n]=0;e.t=this.t+t,e.s=this.s}function A(t,e){for(var n=t;n=0;--n)e[n+o+1]=this[n]>>i|a,a=(this[n]&s)<=0;--n)e[n]=0;e[o]=a,e.t=this.t+o+1,e.s=this.s,e.clamp()}function P(t,e){e.s=this.s;var n=Math.floor(t/this.DB);if(n>=this.t)return void(e.t=0);var r=t%this.DB,i=this.DB-r,s=(1<>r;for(var o=n+1;o>r;r>0&&(e[this.t-n-1]|=(this.s&s)<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r-=t.s}e.s=r<0?-1:0,r<-1?e[n++]=this.DV+r:r>0&&(e[n++]=r),e.t=n,e.clamp()}function C(t,e){var n=this.abs(),r=t.abs(),i=n.t;for(e.t=i+r.t;--i>=0;)e[i]=0;for(i=0;i=0;)t[n]=0;for(n=0;n=e.DV&&(t[n+e.t]-=e.DV,t[n+e.t+1]=1)}t.t>0&&(t[t.t-1]+=e.am(n,e[n],t,2*n,0,1)),t.s=0,t.clamp()}function D(t,e,n){var r=t.abs();if(!(r.t<=0)){var i=this.abs();if(i.t0?(r.lShiftTo(c,s),i.lShiftTo(c,n)):(r.copyTo(s),i.copyTo(n));var f=s.t,l=s[f-1];if(0!=l){var d=l*(1<1?s[f-2]>>this.F2:0),g=this.FV/d,p=(1<=0&&(n[n.t++]=1,n.subTo(S,n)),o.ONE.dlShiftTo(f,S),S.subTo(s,s);s.t=0;){var b=n[--v]==l?this.DM:Math.floor(n[v]*g+(n[v-1]+y)*p);if((n[v]+=s.am(0,b,n,m,0,f))0&&n.rShiftTo(c,n),u<0&&o.ZERO.subTo(n,n)}}}function R(t){var e=a();return this.abs().divRemTo(t,null,e),this.s<0&&e.compareTo(o.ZERO)>0&&t.subTo(e,e),e}function j(t){this.m=t}function H(t){return t.s<0||t.compareTo(this.m)>=0?t.mod(this.m):t}function I(t){return t}function k(t){t.divRemTo(this.m,null,t)}function B(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function N(t,e){t.squareTo(e),this.reduce(e)}function V(){if(this.t<1)return 0;var t=this[0];if(0==(1&t))return 0;var e=3&t;return e=e*(2-(15&t)*e)&15,e=e*(2-(255&t)*e)&255,e=e*(2-((65535&t)*e&65535))&65535,e=e*(2-t*e%this.DV)%this.DV,e>0?this.DV-e:-e}function M(t){this.m=t,this.mp=t.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(e,e),e}function L(t){var e=a();return t.copyTo(e),this.reduce(e),e}function U(t){for(;t.t<=this.mt2;)t[t.t++]=0;for(var e=0;e>15)*this.mpl&this.um)<<15)&t.DM;for(n=e+this.m.t,t[n]+=this.m.am(0,r,t,e,0,this.m.t);t[n]>=t.DV;)t[n]-=t.DV,t[++n]++}t.clamp(),t.drShiftTo(this.m.t,t),t.compareTo(this.m)>=0&&t.subTo(this.m,t)}function q(t,e){t.squareTo(e),this.reduce(e)}function W(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function J(){return 0==(this.t>0?1&this[0]:this.s)}function z(t,e){if(t>4294967295||t<1)return o.ONE;var n=a(),r=a(),i=e.convert(this),s=E(t)-1;for(i.copyTo(n);--s>=0;)if(e.sqrTo(n,r),(t&1<0)e.mulTo(r,i,n);else{var u=n;n=r,r=u}return e.revert(n)}function Y(t,e){var n;return n=t<256||e.isEven()?new j(e):new M(e),this.exp(t,n)}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ +!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n=e();for(var r in n)("object"==typeof exports?exports:t)[r]=n[r]}}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=e.Log=n(1).Log,i=e.OidcClient=n(2).OidcClient,s=e.OidcClientSettings=n(3).OidcClientSettings,o=e.WebStorageStateStore=n(4).WebStorageStateStore,a=e.InMemoryWebStorage=n(22).InMemoryWebStorage,u=e.UserManager=n(23).UserManager,c=e.AccessTokenEvents=n(32).AccessTokenEvents,h=e.MetadataService=n(7).MetadataService,f=e.CordovaPopupNavigator=n(39).CordovaPopupNavigator,l=e.CordovaIFrameNavigator=n(41).CordovaIFrameNavigator,d=e.CheckSessionIFrame=n(37).CheckSessionIFrame,g=e.TokenRevocationClient=n(38).TokenRevocationClient,p=e.SessionMonitor=n(36).SessionMonitor,y=e.Global=n(5).Global,v=e.User=n(30).User;e.default={Log:r,OidcClient:i,OidcClientSettings:s,WebStorageStateStore:o,InMemoryWebStorage:a,UserManager:u,AccessTokenEvents:c,MetadataService:h,CordovaPopupNavigator:f,CordovaIFrameNavigator:l,CheckSessionIFrame:d,TokenRevocationClient:g,SessionMonitor:p,Global:y,User:v}},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n=c){for(var t=arguments.length,e=Array(t),n=0;n=u){for(var t=arguments.length,e=Array(t),n=0;n=a){for(var t=arguments.length,e=Array(t),n=0;n=o){for(var t=arguments.length,e=Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),e instanceof c.default?this._settings=e:this._settings=new c.default(e)}return t.prototype.createSigninRequest=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.response_type,r=e.scope,i=e.redirect_uri,s=e.data,o=e.state,u=e.prompt,c=e.display,h=e.max_age,f=e.ui_locales,l=e.id_token_hint,g=e.login_hint,p=e.acr_values,y=e.resource,v=e.request,m=e.request_uri,S=e.extraQueryParams,b=arguments[1];a.default.debug("OidcClient.createSigninRequest");var w=this._settings.client_id;n=n||this._settings.response_type,r=r||this._settings.scope,i=i||this._settings.redirect_uri,u=u||this._settings.prompt,c=c||this._settings.display,h=h||this._settings.max_age,f=f||this._settings.ui_locales,p=p||this._settings.acr_values,y=y||this._settings.resource,S=S||this._settings.extraQueryParams;var E=this._settings.authority;return this._metadataService.getAuthorizationEndpoint().then(function(e){a.default.debug("Received authorization endpoint",e);var x=new d.default({url:e,client_id:w,redirect_uri:i,response_type:n,scope:r,data:s||o,authority:E,prompt:u,display:c,max_age:h,ui_locales:f,id_token_hint:l,login_hint:g,acr_values:p,resource:y,request:v,request_uri:m,extraQueryParams:S}),_=x.state;return b=b||t._stateStore,b.set(_.id,_.toStorageString()).then(function(){return x})})},t.prototype.processSigninResponse=function(t,e){var n=this;a.default.debug("OidcClient.processSigninResponse");var r=new p.default(t);return r.state?(e=e||this._stateStore,e.remove(r.state).then(function(t){if(!t)throw a.default.error("No matching state found in storage"),new Error("No matching state found in storage");var e=w.default.fromStorageString(t);return a.default.debug("Received state from storage; validating response"),n._validator.validateSigninResponse(e,r)})):(a.default.error("No state in response"),Promise.reject(new Error("No state in response")))},t.prototype.createSignoutRequest=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.id_token_hint,r=e.data,i=e.state,s=e.post_logout_redirect_uri,o=arguments[1];return a.default.debug("OidcClient.createSignoutRequest"),s=s||this._settings.post_logout_redirect_uri,this._metadataService.getEndSessionEndpoint().then(function(e){if(!e)throw a.default.error("No end session endpoint url returned"),new Error("no end session endpoint");a.default.debug("Received end session endpoint",e);var u=new v.default({url:e,id_token_hint:n,post_logout_redirect_uri:s,data:r||i}),c=u.state;return c&&(a.default.debug("Signout request has state to persist"),o=o||t._stateStore,o.set(c.id,c.toStorageString())),u})},t.prototype.processSignoutResponse=function(t,e){var n=this;a.default.debug("OidcClient.processSignoutResponse");var r=new S.default(t);if(!r.state)return a.default.debug("No state in response"),r.error?(a.default.warn("Response was error",r.error),Promise.reject(new f.default(r))):Promise.resolve(r);var i=r.state;return e=e||this._stateStore,e.remove(i).then(function(t){if(!t)throw a.default.error("No matching state found in storage"),new Error("No matching state found in storage");var e=x.default.fromStorageString(t);return a.default.debug("Received state from storage; validating response"),n._validator.validateSignoutResponse(e,r)})},t.prototype.clearStaleState=function(t){return a.default.debug("OidcClient.clearStaleState"),t=t||this._stateStore,x.default.clearStaleState(t,this.settings.staleStateAge)},s(t,[{key:"_stateStore",get:function(){return this.settings.stateStore}},{key:"_validator",get:function(){return this.settings.validator}},{key:"_metadataService",get:function(){return this.settings.metadataService}},{key:"settings",get:function(){return this._settings}},{key:"metadataService",get:function(){return this._metadataService}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.OidcClientSettings=void 0;var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=e.authority,r=e.metadataUrl,o=e.metadata,a=e.signingKeys,u=e.client_id,c=e.client_secret,f=e.response_type,d=void 0===f?y:f,p=e.scope,b=void 0===p?v:p,w=e.redirect_uri,E=e.post_logout_redirect_uri,x=e.prompt,_=e.display,F=e.max_age,A=e.ui_locales,P=e.acr_values,O=e.resource,C=e.filterProtocolClaims,H=void 0===C||C,j=e.loadUserInfo,T=void 0===j||j,D=e.staleStateAge,I=void 0===D?m:D,R=e.clockSkew,k=void 0===R?S:R,N=e.stateStore,B=void 0===N?new h.default:N,V=e.ResponseValidatorCtor,M=void 0===V?l.default:V,K=e.MetadataServiceCtor,L=void 0===K?g.default:K,U=e.extraQueryParams,q=void 0===U?{}:U;i(this,t),this._authority=n,this._metadataUrl=r,this._metadata=o,this._signingKeys=a,this._client_id=u,this._client_secret=c,this._response_type=d,this._scope=b,this._redirect_uri=w,this._post_logout_redirect_uri=E,this._prompt=x,this._display=_,this._max_age=F,this._ui_locales=A,this._acr_values=P,this._resource=O,this._filterProtocolClaims=!!H,this._loadUserInfo=!!T,this._staleStateAge=I,this._clockSkew=k,this._stateStore=B,this._validator=new M(this),this._metadataService=new L(this),this._extraQueryParams="object"===("undefined"==typeof q?"undefined":s(q))?q:{}}return o(t,[{key:"client_id",get:function(){return this._client_id},set:function(t){if(this._client_id)throw u.default.error("client_id has already been assigned."),new Error("client_id has already been assigned.");this._client_id=t}},{key:"client_secret",get:function(){return this._client_secret}},{key:"response_type",get:function(){return this._response_type}},{key:"scope",get:function(){return this._scope}},{key:"redirect_uri",get:function(){return this._redirect_uri}},{key:"post_logout_redirect_uri",get:function(){return this._post_logout_redirect_uri}},{key:"prompt",get:function(){return this._prompt}},{key:"display",get:function(){return this._display}},{key:"max_age",get:function(){return this._max_age}},{key:"ui_locales",get:function(){return this._ui_locales}},{key:"acr_values",get:function(){return this._acr_values}},{key:"resource",get:function(){return this._resource}},{key:"authority",get:function(){return this._authority},set:function(t){if(this._authority)throw u.default.error("authority has already been assigned."),new Error("authority has already been assigned.");this._authority=t}},{key:"metadataUrl",get:function(){return this._metadataUrl||(this._metadataUrl=this.authority,this._metadataUrl&&this._metadataUrl.indexOf(p)<0&&("/"!==this._metadataUrl[this._metadataUrl.length-1]&&(this._metadataUrl+="/"),this._metadataUrl+=p)),this._metadataUrl}},{key:"metadata",get:function(){return this._metadata},set:function(t){this._metadata=t}},{key:"signingKeys",get:function(){return this._signingKeys},set:function(t){this._signingKeys=t}},{key:"filterProtocolClaims",get:function(){return this._filterProtocolClaims}},{key:"loadUserInfo",get:function(){return this._loadUserInfo}},{key:"staleStateAge",get:function(){return this._staleStateAge}},{key:"clockSkew",get:function(){return this._clockSkew}},{key:"stateStore",get:function(){return this._stateStore}},{key:"validator",get:function(){return this._validator}},{key:"metadataService",get:function(){return this._metadataService}},{key:"extraQueryParams",get:function(){return this._extraQueryParams},set:function(t){"object"===("undefined"==typeof t?"undefined":s(t))?this._extraQueryParams=t:this._extraQueryParams={}}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.WebStorageStateStore=void 0;var s=n(1),o=r(s),a=n(5),u=r(a);e.WebStorageStateStore=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.prefix,r=void 0===n?"oidc.":n,s=e.store,o=void 0===s?u.default.localStorage:s;i(this,t),this._store=o,this._prefix=r}return t.prototype.set=function(t,e){return o.default.debug("WebStorageStateStore.set",t),t=this._prefix+t,this._store.setItem(t,e),Promise.resolve()},t.prototype.get=function(t){o.default.debug("WebStorageStateStore.get",t),t=this._prefix+t;var e=this._store.getItem(t);return Promise.resolve(e)},t.prototype.remove=function(t){o.default.debug("WebStorageStateStore.remove",t),t=this._prefix+t;var e=this._store.getItem(t);return this._store.removeItem(t),Promise.resolve(e)},t.prototype.getAllKeys=function(){o.default.debug("WebStorageStateStore.getAllKeys");for(var t=[],e=0;e1&&void 0!==arguments[1]?arguments[1]:u.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:h.default,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:g.default;if(i(this,t),!e)throw o.default.error("No settings passed to ResponseValidator"),new Error("settings");this._settings=e,this._metadataService=new n(this._settings),this._userInfoService=new r(this._settings),this._joseUtil=s}return t.prototype.validateSigninResponse=function(t,e){var n=this;return o.default.debug("ResponseValidator.validateSigninResponse"),this._processSigninParams(t,e).then(function(e){return o.default.debug("state processed"),n._validateTokens(t,e).then(function(t){return o.default.debug("tokens validated"),n._processClaims(t).then(function(t){return o.default.debug("claims processed"),t})})})},t.prototype.validateSignoutResponse=function(t,e){return o.default.debug("ResponseValidator.validateSignoutResponse"),t.id!==e.state?(o.default.error("State does not match"),Promise.reject(new Error("State does not match"))):(o.default.debug("state validated"),e.state=t.data,e.error?(o.default.warn("Response was error",e.error),Promise.reject(new l.default(e))):Promise.resolve(e))},t.prototype._processSigninParams=function(t,e){if(o.default.debug("ResponseValidator._processSigninParams"),t.id!==e.state)return o.default.error("State does not match"),Promise.reject(new Error("State does not match"));if(!t.client_id)return o.default.error("No client_id on state"),Promise.reject(new Error("No client_id on state"));if(!t.authority)return o.default.error("No authority on state"),Promise.reject(new Error("No authority on state"));if(this._settings.authority){if(this._settings.authority&&this._settings.authority!==t.authority)return o.default.error("authority mismatch on settings vs. signin state"),Promise.reject(new Error("authority mismatch on settings vs. signin state"))}else this._settings.authority=t.authority;if(this._settings.client_id){if(this._settings.client_id&&this._settings.client_id!==t.client_id)return o.default.error("client_id mismatch on settings vs. signin state"),Promise.reject(new Error("client_id mismatch on settings vs. signin state"))}else this._settings.client_id=t.client_id;return o.default.debug("state validated"),e.state=t.data,e.error?(o.default.warn("Response was error",e.error),Promise.reject(new l.default(e))):t.nonce&&!e.id_token?(o.default.error("Expecting id_token in response"),Promise.reject(new Error("No id_token in response"))):!t.nonce&&e.id_token?(o.default.error("Not expecting id_token in response"),Promise.reject(new Error("Unexpected id_token in response"))):Promise.resolve(e)},t.prototype._processClaims=function(t){var e=this;if(o.default.debug("ResponseValidator._processClaims"),t.isOpenIdConnect){if(o.default.debug("response is OIDC, processing claims"),t.profile=this._filterProtocolClaims(t.profile),this._settings.loadUserInfo&&t.access_token)return o.default.debug("loading user info"),this._userInfoService.getClaims(t.access_token).then(function(n){return o.default.debug("user info claims received from user info endpoint"),n.sub!==t.profile.sub?(o.default.error("sub from user info endpoint does not match sub in access_token"),Promise.reject(new Error("sub from user info endpoint does not match sub in access_token"))):(t.profile=e._mergeClaims(t.profile,n),o.default.debug("user info claims received, updated profile:",t.profile),t)});o.default.debug("not loading user info")}else o.default.debug("response is not OIDC, not processing claims");return Promise.resolve(t)},t.prototype._mergeClaims=function(t,e){var n=Object.assign({},t);for(var r in e){var i=e[r];Array.isArray(i)||(i=[i]);for(var s=0;s1)return o.default.error("No kid found in id_token and more than one key found in metadata"),Promise.reject(new Error("No kid found in id_token and more than one key found in metadata"));u=a[0]}if(!u)return o.default.error("No key matching kid or alg found in signing keys"),Promise.reject(new Error("No key matching kid or alg found in signing keys"));var c=t.client_id,h=n._settings.clockSkew;return o.default.debug("Validaing JWT; using clock skew (in seconds) of: ",h),n._joseUtil.validateJwt(e.id_token,u,s,c,h).then(function(){return o.default.debug("JWT validation successful"),r.payload.sub?(e.profile=r.payload,e):(o.default.error("No sub present in id_token"),Promise.reject(new Error("No sub present in id_token")))})})})},t.prototype._filterByAlg=function(t,e){o.default.debug("ResponseValidator._filterByAlg",e);var n=null;if(e.startsWith("RS"))n="RSA";else if(e.startsWith("PS"))n="PS";else{if(!e.startsWith("ES"))return o.default.debug("alg not supported: ",e),[];n="EC"}return o.default.debug("Looking for keys that match kty: ",n),t=t.filter(function(t){return t.kty===n}),o.default.debug("Number of keys that match kty: ",n,t.length),t},t.prototype._validateAccessToken=function(t){if(o.default.debug("ResponseValidator._validateAccessToken"),!t.profile)return o.default.error("No profile loaded from id_token"),Promise.reject(new Error("No profile loaded from id_token"));if(!t.profile.at_hash)return o.default.error("No at_hash in id_token"),Promise.reject(new Error("No at_hash in id_token"));if(!t.id_token)return o.default.error("No id_token"),Promise.reject(new Error("No id_token"));var e=this._joseUtil.parseJwt(t.id_token);if(!e||!e.header)return o.default.error("Failed to parse id_token",e),Promise.reject(new Error("Failed to parse id_token"));var n=e.header.alg;if(!n||5!==n.length)return o.default.error("Unsupported alg:",n),Promise.reject(new Error("Unsupported alg: "+n));var r=n.substr(2,3);if(!r)return o.default.error("Unsupported alg:",n,r),Promise.reject(new Error("Unsupported alg: "+n));if(r=parseInt(r),256!==r&&384!==r&&512!==r)return o.default.error("Unsupported alg:",n,r),Promise.reject(new Error("Unsupported alg: "+n));var i="sha"+r,s=this._joseUtil.hashString(t.access_token,i);if(!s)return o.default.error("access_token hash failed:",i),Promise.reject(new Error("Failed to validate at_hash"));var a=s.substr(0,s.length/2),u=this._joseUtil.hexToBase64Url(a);return u!==t.profile.at_hash?(o.default.error("Failed to validate at_hash",u,t.profile.at_hash),Promise.reject(new Error("Failed to validate at_hash"))):Promise.resolve(t)},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.MetadataService=void 0;var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:c.default;if(i(this,t),!e)throw a.default.error("No settings passed to MetadataService"),new Error("settings");this._settings=e,this._jsonService=new n}return t.prototype.getMetadata=function(){var t=this;return a.default.debug("MetadataService.getMetadata"),this._settings.metadata?(a.default.debug("Returning metadata from settings"),Promise.resolve(this._settings.metadata)):this.metadataUrl?(a.default.debug("getting metadata from",this.metadataUrl),this._jsonService.getJson(this.metadataUrl).then(function(e){return a.default.debug("json received"),t._settings.metadata=e,e})):(a.default.error("No authority or metadataUrl configured on settings"),Promise.reject(new Error("No authority or metadataUrl configured on settings")))},t.prototype.getIssuer=function(){return a.default.debug("MetadataService.getIssuer"),this._getMetadataProperty("issuer")},t.prototype.getAuthorizationEndpoint=function(){return a.default.debug("MetadataService.getAuthorizationEndpoint"),this._getMetadataProperty("authorization_endpoint")},t.prototype.getUserInfoEndpoint=function(){return a.default.debug("MetadataService.getUserInfoEndpoint"),this._getMetadataProperty("userinfo_endpoint")},t.prototype.getTokenEndpoint=function(){return a.default.debug("MetadataService.getTokenEndpoint"),this._getMetadataProperty("token_endpoint",!0)},t.prototype.getCheckSessionIframe=function(){return a.default.debug("MetadataService.getCheckSessionIframe"),this._getMetadataProperty("check_session_iframe",!0)},t.prototype.getEndSessionEndpoint=function(){return a.default.debug("MetadataService.getEndSessionEndpoint"),this._getMetadataProperty("end_session_endpoint",!0)},t.prototype.getRevocationEndpoint=function(){return a.default.debug("MetadataService.getRevocationEndpoint"),this._getMetadataProperty("revocation_endpoint",!0)},t.prototype._getMetadataProperty=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return a.default.debug("MetadataService._getMetadataProperty",t),this.getMetadata().then(function(n){if(a.default.debug("metadata recieved"),void 0===n[t]){if(e===!0)return void a.default.warn("Metadata does not contain optional property "+t);throw a.default.error("Metadata does not contain property "+t),new Error("Metadata does not contain property "+t)}return n[t]})},t.prototype.getSigningKeys=function(){var t=this;return a.default.debug("MetadataService.getSigningKeys"),this._settings.signingKeys?(a.default.debug("Returning signingKeys from settings"),Promise.resolve(this._settings.signingKeys)):this._getMetadataProperty("jwks_uri").then(function(e){return a.default.debug("jwks_uri received",e),t._jsonService.getJson(e).then(function(e){if(a.default.debug("key set received",e),!e.keys)throw a.default.error("Missing keys on keyset"),new Error("Missing keys on keyset");return t._settings.signingKeys=e.keys,t._settings.signingKeys})})},s(t,[{key:"metadataUrl",get:function(){return this._metadataUrl||(this._settings.metadataUrl?this._metadataUrl=this._settings.metadataUrl:(this._metadataUrl=this._settings.authority,this._metadataUrl&&this._metadataUrl.indexOf(h)<0&&("/"!==this._metadataUrl[this._metadataUrl.length-1]&&(this._metadataUrl+="/"),this._metadataUrl+=h))),this._metadataUrl}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.JsonService=void 0;var s=n(1),o=r(s),a=n(5),u=r(a);e.JsonService=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:u.default.XMLHttpRequest;i(this,t),this._XMLHttpRequest=e}return t.prototype.getJson=function(t,e){var n=this;if(o.default.debug("JsonService.getJson",t),!t)throw o.default.error("No url passed"),new Error("url");return new Promise(function(r,i){var s=new n._XMLHttpRequest;s.open("GET",t),s.onload=function(){if(o.default.debug("HTTP response received, status",s.status),200===s.status)try{r(JSON.parse(s.responseText))}catch(t){o.default.error("Error parsing JSON response",t.message),i(t)}else i(Error(s.statusText+" ("+s.status+")"))},s.onerror=function(){o.default.error("network error"),i(Error("Network Error"))},e&&(o.default.debug("token passed, setting Authorization header"),s.setRequestHeader("Authorization","Bearer "+e)),s.send()})},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.UserInfoService=void 0;var s=n(8),o=r(s),a=n(7),u=r(a),c=n(1),h=r(c);e.UserInfoService=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:o.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;if(i(this,t),!e)throw h.default.error("No settings passed to UserInfoService"),new Error("settings");this._settings=e,this._jsonService=new n,this._metadataService=new r(this._settings)}return t.prototype.getClaims=function(t){var e=this;return h.default.debug("UserInfoService.getClaims"),t?this._metadataService.getUserInfoEndpoint().then(function(n){return h.default.debug("received userinfo url",n),e._jsonService.getJson(n,t).then(function(t){return h.default.debug("claims received",t),t})}):(h.default.error("No token passed"),Promise.reject(new Error("A token is required")))},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.ErrorResponse=void 0;var a=n(1),u=r(a);e.ErrorResponse=function(t){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.error,o=n.error_description,a=n.error_uri,c=n.state;if(i(this,e),!r)throw u.default.error("No error passed to ErrorResponse"),new Error("error");var h=s(this,t.call(this,o||r));return h.name="ErrorResponse",h.error=r,h.error_description=o,h.error_uri=a,h.state=c,h}return o(e,t),e}(Error)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.JoseUtil=void 0;var s=n(12),o=n(1),a=r(o),u=["RS256","RS384","RS512","PS256","PS384","PS512","ES256","ES384","ES512"];e.JoseUtil=function(){function t(){i(this,t)}return t.parseJwt=function(t){a.default.debug("JoseUtil.parseJwt");try{var e=s.jws.JWS.parse(t);return{header:e.headerObj,payload:e.payloadObj}}catch(t){a.default.error(t)}},t.validateJwt=function(e,n,r,i,o,u){a.default.debug("JoseUtil.validateJwt");try{if("RSA"===n.kty)if(n.e&&n.n)n=s.KEYUTIL.getKey(n);else{if(!n.x5c||!n.x5c.length)return a.default.error("RSA key missing key material",n),Promise.reject(new Error("RSA key missing key material"));n=s.KEYUTIL.getKey(s.X509.getPublicKeyFromCertPEM(n.x5c[0]))}else{if("EC"!==n.kty)return a.default.error("Unsupported key type",n&&n.kty),Promise.reject(new Error("Unsupported key type: "+n&&n.kty));if(!(n.crv&&n.x&&n.y))return a.default.error("EC key missing key material",n),Promise.reject(new Error("EC key missing key material"));n=s.KEYUTIL.getKey(n)}return t._validateJwt(e,n,r,i,o,u)}catch(t){return a.default.error(t&&t.message||t),Promise.reject("JWT validation failed")}},t._validateJwt=function(e,n,r,i,o,c){a.default.debug("JoseUtil._validateJwt"),o||(o=0),c||(c=parseInt(Date.now()/1e3));var h=t.parseJwt(e).payload;if(!h.iss)return a.default.error("issuer was not provided"),Promise.reject(new Error("issuer was not provided"));if(h.iss!==r)return a.default.error("Invalid issuer in token",h.iss),Promise.reject(new Error("Invalid issuer in token: "+h.iss)); +if(!h.aud)return a.default.error("aud was not provided"),Promise.reject(new Error("aud was not provided"));var f=h.aud===i||Array.isArray(h.aud)&&h.aud.indexOf(i)>=0;if(!f)return a.default.error("Invalid audience in token",h.aud),Promise.reject(new Error("Invalid audience in token: "+h.aud));var l=c+o,d=c-o;if(!h.iat)return a.default.error("iat was not provided"),Promise.reject(new Error("iat was not provided"));if(l>6)+ur.charAt(63&n);if(e+1==t.length?(n=parseInt(t.substring(e,e+1),16),r+=ur.charAt(n<<2)):e+2==t.length&&(n=parseInt(t.substring(e,e+2),16),r+=ur.charAt(n>>2)+ur.charAt((3&n)<<4)),cr)for(;(3&r.length)>0;)r+=cr;return r}function i(t){var e,n,r,i="",s=0;for(e=0;e>2),n=3&r,s=1):1==s?(i+=f(n<<2|r>>4),n=15&r,s=2):2==s?(i+=f(n),i+=f(r>>2),n=3&r,s=3):(i+=f(n<<2|r>>4),i+=f(15&r),s=0));return 1==s&&(i+=f(n<<2)),i}function s(t){var e,n=i(t),r=new Array;for(e=0;2*e=0;){var o=e*this[t++]+n[r]+i;i=Math.floor(o/67108864),n[r++]=67108863&o}return i}function c(t,e,n,r,i,s){for(var o=32767&e,a=e>>15;--s>=0;){var u=32767&this[t],c=this[t++]>>15,h=a*u+c*o;u=o*u+((32767&h)<<15)+n[r]+(1073741823&i),i=(u>>>30)+(h>>>15)+a*c+(i>>>30),n[r++]=1073741823&u}return i}function h(t,e,n,r,i,s){for(var o=16383&e,a=e>>14;--s>=0;){var u=16383&this[t],c=this[t++]>>14,h=a*u+c*o;u=o*u+((16383&h)<<14)+n[r]+i,i=(u>>28)+(h>>14)+a*c,n[r++]=268435455&u}return i}function f(t){return pr.charAt(t)}function l(t,e){var n=yr[t.charCodeAt(e)];return null==n?-1:n}function d(t){for(var e=this.t-1;e>=0;--e)t[e]=this[e];t.t=this.t,t.s=this.s}function g(t){this.t=1,this.s=t<0?-1:0,t>0?this[0]=t:t<-1?this[0]=t+this.DV:this.t=0}function p(t){var e=a();return e.fromInt(t),e}function y(t,e){var n;if(16==e)n=4;else if(8==e)n=3;else if(256==e)n=8;else if(2==e)n=1;else if(32==e)n=5;else{if(4!=e)return void this.fromRadix(t,e);n=2}this.t=0,this.s=0;for(var r=t.length,i=!1,s=0;--r>=0;){var a=8==n?255&t[r]:l(t,r);a<0?"-"==t.charAt(r)&&(i=!0):(i=!1,0==s?this[this.t++]=a:s+n>this.DB?(this[this.t-1]|=(a&(1<>this.DB-s):this[this.t-1]|=a<=this.DB&&(s-=this.DB))}8==n&&0!=(128&t[0])&&(this.s=-1,s>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==t;)--this.t}function m(t){if(this.s<0)return"-"+this.negate().toString(t);var e;if(16==t)e=4;else if(8==t)e=3;else if(2==t)e=1;else if(32==t)e=5;else{if(4!=t)return this.toRadix(t);e=2}var n,r=(1<0)for(a>a)>0&&(i=!0,s=f(n));o>=0;)a>(a+=this.DB-e)):(n=this[o]>>(a-=e)&r,a<=0&&(a+=this.DB,--o)),n>0&&(i=!0),i&&(s+=f(n));return i?s:"0"}function S(){var t=a();return o.ZERO.subTo(this,t),t}function b(){return this.s<0?this.negate():this}function w(t){var e=this.s-t.s;if(0!=e)return e;var n=this.t;if(e=n-t.t,0!=e)return this.s<0?-e:e;for(;--n>=0;)if(0!=(e=this[n]-t[n]))return e;return 0}function E(t){var e,n=1;return 0!=(e=t>>>16)&&(t=e,n+=16),0!=(e=t>>8)&&(t=e,n+=8),0!=(e=t>>4)&&(t=e,n+=4),0!=(e=t>>2)&&(t=e,n+=2),0!=(e=t>>1)&&(t=e,n+=1),n}function x(){return this.t<=0?0:this.DB*(this.t-1)+E(this[this.t-1]^this.s&this.DM)}function _(t,e){var n;for(n=this.t-1;n>=0;--n)e[n+t]=this[n];for(n=t-1;n>=0;--n)e[n]=0;e.t=this.t+t,e.s=this.s}function F(t,e){for(var n=t;n=0;--n)e[n+o+1]=this[n]>>i|a,a=(this[n]&s)<=0;--n)e[n]=0;e[o]=a,e.t=this.t+o+1,e.s=this.s,e.clamp()}function P(t,e){e.s=this.s;var n=Math.floor(t/this.DB);if(n>=this.t)return void(e.t=0);var r=t%this.DB,i=this.DB-r,s=(1<>r;for(var o=n+1;o>r;r>0&&(e[this.t-n-1]|=(this.s&s)<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r-=t.s}e.s=r<0?-1:0,r<-1?e[n++]=this.DV+r:r>0&&(e[n++]=r),e.t=n,e.clamp()}function C(t,e){var n=this.abs(),r=t.abs(),i=n.t;for(e.t=i+r.t;--i>=0;)e[i]=0;for(i=0;i=0;)t[n]=0;for(n=0;n=e.DV&&(t[n+e.t]-=e.DV,t[n+e.t+1]=1)}t.t>0&&(t[t.t-1]+=e.am(n,e[n],t,2*n,0,1)),t.s=0,t.clamp()}function j(t,e,n){var r=t.abs();if(!(r.t<=0)){var i=this.abs();if(i.t0?(r.lShiftTo(h,s),i.lShiftTo(h,n)):(r.copyTo(s),i.copyTo(n));var f=s.t,l=s[f-1];if(0!=l){var d=l*(1<1?s[f-2]>>this.F2:0),g=this.FV/d,p=(1<=0&&(n[n.t++]=1,n.subTo(S,n)),o.ONE.dlShiftTo(f,S),S.subTo(s,s);s.t=0;){var b=n[--v]==l?this.DM:Math.floor(n[v]*g+(n[v-1]+y)*p);if((n[v]+=s.am(0,b,n,m,0,f))0&&n.rShiftTo(h,n),u<0&&o.ZERO.subTo(n,n)}}}function T(t){var e=a();return this.abs().divRemTo(t,null,e),this.s<0&&e.compareTo(o.ZERO)>0&&t.subTo(e,e),e}function D(t){this.m=t}function I(t){return t.s<0||t.compareTo(this.m)>=0?t.mod(this.m):t}function R(t){return t}function k(t){t.divRemTo(this.m,null,t)}function N(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function B(t,e){t.squareTo(e),this.reduce(e)}function V(){if(this.t<1)return 0;var t=this[0];if(0==(1&t))return 0;var e=3&t;return e=e*(2-(15&t)*e)&15,e=e*(2-(255&t)*e)&255,e=e*(2-((65535&t)*e&65535))&65535,e=e*(2-t*e%this.DV)%this.DV,e>0?this.DV-e:-e}function M(t){this.m=t,this.mp=t.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(e,e),e}function L(t){var e=a();return t.copyTo(e),this.reduce(e),e}function U(t){for(;t.t<=this.mt2;)t[t.t++]=0;for(var e=0;e>15)*this.mpl&this.um)<<15)&t.DM;for(n=e+this.m.t,t[n]+=this.m.am(0,r,t,e,0,this.m.t);t[n]>=t.DV;)t[n]-=t.DV,t[++n]++}t.clamp(),t.drShiftTo(this.m.t,t),t.compareTo(this.m)>=0&&t.subTo(this.m,t)}function q(t,e){t.squareTo(e),this.reduce(e)}function W(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function J(){return 0==(this.t>0?1&this[0]:this.s)}function z(t,e){if(t>4294967295||t<1)return o.ONE;var n=a(),r=a(),i=e.convert(this),s=E(t)-1;for(i.copyTo(n);--s>=0;)if(e.sqrTo(n,r),(t&1<0)e.mulTo(r,i,n);else{var u=n;n=r,r=u}return e.revert(n)}function G(t,e){var n;return n=t<256||e.isEven()?new D(e):new M(e),this.exp(t,n)}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ -function G(){var t=a();return this.copyTo(t),t}function X(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>24}function Q(){return 0==this.t?this.s:this[0]<<16>>16}function Z(t){return Math.floor(Math.LN2*this.DB/Math.log(t))}function tt(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function et(t){if(null==t&&(t=10),0==this.signum()||t<2||t>36)return"0";var e=this.chunkSize(t),n=Math.pow(t,e),r=p(n),i=a(),s=a(),o="";for(this.divRemTo(r,i,s);i.signum()>0;)o=(n+s.intValue()).toString(t).substr(1)+o,i.divRemTo(r,i,s);return s.intValue().toString(t)+o}function nt(t,e){this.fromInt(0),null==e&&(e=10);for(var n=this.chunkSize(e),r=Math.pow(e,n),i=!1,s=0,a=0,u=0;u=n&&(this.dMultiply(r),this.dAddOffset(a,0),s=0,a=0))}s>0&&(this.dMultiply(Math.pow(e,s)),this.dAddOffset(a,0)),i&&o.ZERO.subTo(this,this)}function rt(t,e,n){if("number"==typeof e)if(t<2)this.fromInt(1);else for(this.fromNumber(t,n),this.testBit(t-1)||this.bitwiseTo(o.ONE.shiftLeft(t-1),ft,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(e);)this.dAddOffset(2,0),this.bitLength()>t&&this.subTo(o.ONE.shiftLeft(t-1),this);else{var r=new Array,i=7&t;r.length=(t>>3)+1,e.nextBytes(r),i>0?r[0]&=(1<0)for(r>r)!=(this.s&this.DM)>>r&&(e[i++]=n|this.s<=0;)r<8?(n=(this[t]&(1<>(r+=this.DB-8)):(n=this[t]>>(r-=8)&255,r<=0&&(r+=this.DB,--t)),0!=(128&n)&&(n|=-256),0==i&&(128&this.s)!=(128&n)&&++i,(i>0||n!=this.s)&&(e[i++]=n);return e}function st(t){return 0==this.compareTo(t)}function ot(t){return this.compareTo(t)<0?this:t}function at(t){return this.compareTo(t)>0?this:t}function ut(t,e,n){var r,i,s=Math.min(t.t,this.t);for(r=0;r>=16,e+=16),0==(255&t)&&(t>>=8,e+=8),0==(15&t)&&(t>>=4,e+=4),0==(3&t)&&(t>>=2,e+=2),0==(1&t)&&++e,e}function wt(){for(var t=0;t=this.t?0!=this.s:0!=(this[e]&1<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r+=t.s}e.s=r<0?-1:0,r>0?e[n++]=r:r<-1&&(e[n++]=this.DV+r),e.t=n,e.clamp()}function Tt(t){var e=a();return this.addTo(t,e),e}function Dt(t){var e=a();return this.subTo(t,e),e}function Rt(t){var e=a();return this.multiplyTo(t,e),e}function jt(){var t=a();return this.squareTo(t),t}function Ht(t){var e=a();return this.divRemTo(t,e,null),e}function It(t){var e=a();return this.divRemTo(t,null,e),e}function kt(t){var e=a(),n=a();return this.divRemTo(t,e,n),new Array(e,n)}function Bt(t){this[this.t]=this.am(0,t-1,this,0,0,this.t),++this.t,this.clamp()}function Nt(t,e){if(0!=t){for(;this.t<=e;)this[this.t++]=0;for(this[e]+=t;this[e]>=this.DV;)this[e]-=this.DV,++e>=this.t&&(this[this.t++]=0),++this[e]}}function Vt(){}function Mt(t){return t}function Kt(t,e,n){t.multiplyTo(e,n)}function Lt(t,e){t.squareTo(e)}function Ut(t){return this.exp(t,new Vt)}function qt(t,e,n){var r=Math.min(this.t+t.t,e);for(n.s=0,n.t=r;r>0;)n[--r]=0;var i;for(i=n.t-this.t;r=0;)n[r]=0;for(r=Math.max(e-this.t,0);r2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var e=a();return t.copyTo(e),this.reduce(e),e}function Yt(t){return t}function Gt(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);t.compareTo(this.m)>=0;)t.subTo(this.m,t)}function Xt(t,e){t.squareTo(e),this.reduce(e)}function $t(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function Qt(t,e){var n,r,i=t.bitLength(),s=p(1);if(i<=0)return s;n=i<18?1:i<48?3:i<144?4:i<768?5:6,r=i<8?new j(e):e.isEven()?new Jt(e):new M(e);var o=new Array,u=3,h=n-1,c=(1<1){var f=a();for(r.sqrTo(o[1],f);u<=c;)o[u]=a(),r.mulTo(f,o[u-2],o[u]),u+=2}var l,d,g=t.t-1,y=!0,v=a();for(i=E(t[g])-1;g>=0;){for(i>=h?l=t[g]>>i-h&c:(l=(t[g]&(1<0&&(l|=t[g-1]>>this.DB+i-h)),u=n;0==(1&l);)l>>=1,--u;if((i-=u)<0&&(i+=this.DB,--g),y)o[l].copyTo(s),y=!1;else{for(;u>1;)r.sqrTo(s,v),r.sqrTo(v,s),u-=2;u>0?r.sqrTo(s,v):(d=s,s=v,v=d),r.mulTo(v,o[l],s)}for(;g>=0&&0==(t[g]&1<0&&(e.rShiftTo(s,e),n.rShiftTo(s,n));e.signum()>0;)(i=e.getLowestSetBit())>0&&e.rShiftTo(i,e),(i=n.getLowestSetBit())>0&&n.rShiftTo(i,n),e.compareTo(n)>=0?(e.subTo(n,e),e.rShiftTo(1,e)):(n.subTo(e,n),n.rShiftTo(1,n));return s>0&&n.lShiftTo(s,n),n}function te(t){if(t<=0)return 0;var e=this.DV%t,n=this.s<0?t-1:0;if(this.t>0)if(0==e)n=this[0]%t;else for(var r=this.t-1;r>=0;--r)n=(e*n+this[r])%t;return n}function ee(t){var e=t.isEven();if(this.isEven()&&e||0==t.signum())return o.ZERO;for(var n=t.clone(),r=this.clone(),i=p(1),s=p(0),a=p(0),u=p(1);0!=n.signum();){for(;n.isEven();)n.rShiftTo(1,n),e?(i.isEven()&&s.isEven()||(i.addTo(this,i),s.subTo(t,s)),i.rShiftTo(1,i)):s.isEven()||s.subTo(t,s),s.rShiftTo(1,s);for(;r.isEven();)r.rShiftTo(1,r),e?(a.isEven()&&u.isEven()||(a.addTo(this,a),u.subTo(t,u)),a.rShiftTo(1,a)):u.isEven()||u.subTo(t,u),u.rShiftTo(1,u);n.compareTo(r)>=0?(n.subTo(r,n),e&&i.subTo(a,i),s.subTo(u,s)):(r.subTo(n,r),e&&a.subTo(i,a),u.subTo(s,u))}return 0!=r.compareTo(o.ONE)?o.ZERO:u.compareTo(t)>=0?u.subtract(t):u.signum()<0?(u.addTo(t,u),u.signum()<0?u.add(t):u):u}function ne(t){var e,n=this.abs();if(1==n.t&&n[0]<=vr[vr.length-1]){for(e=0;e>1,t>vr.length&&(t=vr.length);for(var i=a(),s=0;s>24}function Q(){return 0==this.t?this.s:this[0]<<16>>16}function Z(t){return Math.floor(Math.LN2*this.DB/Math.log(t))}function tt(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function et(t){if(null==t&&(t=10),0==this.signum()||t<2||t>36)return"0";var e=this.chunkSize(t),n=Math.pow(t,e),r=p(n),i=a(),s=a(),o="";for(this.divRemTo(r,i,s);i.signum()>0;)o=(n+s.intValue()).toString(t).substr(1)+o,i.divRemTo(r,i,s);return s.intValue().toString(t)+o}function nt(t,e){this.fromInt(0),null==e&&(e=10);for(var n=this.chunkSize(e),r=Math.pow(e,n),i=!1,s=0,a=0,u=0;u=n&&(this.dMultiply(r),this.dAddOffset(a,0),s=0,a=0))}s>0&&(this.dMultiply(Math.pow(e,s)),this.dAddOffset(a,0)),i&&o.ZERO.subTo(this,this)}function rt(t,e,n){if("number"==typeof e)if(t<2)this.fromInt(1);else for(this.fromNumber(t,n),this.testBit(t-1)||this.bitwiseTo(o.ONE.shiftLeft(t-1),ft,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(e);)this.dAddOffset(2,0),this.bitLength()>t&&this.subTo(o.ONE.shiftLeft(t-1),this);else{var r=new Array,i=7&t;r.length=(t>>3)+1,e.nextBytes(r),i>0?r[0]&=(1<0)for(r>r)!=(this.s&this.DM)>>r&&(e[i++]=n|this.s<=0;)r<8?(n=(this[t]&(1<>(r+=this.DB-8)):(n=this[t]>>(r-=8)&255,r<=0&&(r+=this.DB,--t)),0!=(128&n)&&(n|=-256),0==i&&(128&this.s)!=(128&n)&&++i,(i>0||n!=this.s)&&(e[i++]=n);return e}function st(t){return 0==this.compareTo(t)}function ot(t){return this.compareTo(t)<0?this:t}function at(t){return this.compareTo(t)>0?this:t}function ut(t,e,n){var r,i,s=Math.min(t.t,this.t);for(r=0;r>=16,e+=16),0==(255&t)&&(t>>=8,e+=8),0==(15&t)&&(t>>=4,e+=4),0==(3&t)&&(t>>=2,e+=2),0==(1&t)&&++e,e}function wt(){for(var t=0;t=this.t?0!=this.s:0!=(this[e]&1<>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;n>=this.DB;r+=t.s}e.s=r<0?-1:0,r>0?e[n++]=r:r<-1&&(e[n++]=this.DV+r),e.t=n,e.clamp()}function Ht(t){var e=a();return this.addTo(t,e),e}function jt(t){var e=a();return this.subTo(t,e),e}function Tt(t){var e=a();return this.multiplyTo(t,e),e}function Dt(){var t=a();return this.squareTo(t),t}function It(t){var e=a();return this.divRemTo(t,e,null),e}function Rt(t){var e=a();return this.divRemTo(t,null,e),e}function kt(t){var e=a(),n=a();return this.divRemTo(t,e,n),new Array(e,n)}function Nt(t){this[this.t]=this.am(0,t-1,this,0,0,this.t),++this.t,this.clamp()}function Bt(t,e){if(0!=t){for(;this.t<=e;)this[this.t++]=0;for(this[e]+=t;this[e]>=this.DV;)this[e]-=this.DV,++e>=this.t&&(this[this.t++]=0),++this[e]}}function Vt(){}function Mt(t){return t}function Kt(t,e,n){t.multiplyTo(e,n)}function Lt(t,e){t.squareTo(e)}function Ut(t){return this.exp(t,new Vt)}function qt(t,e,n){var r=Math.min(this.t+t.t,e);for(n.s=0,n.t=r;r>0;)n[--r]=0;var i;for(i=n.t-this.t;r=0;)n[r]=0;for(r=Math.max(e-this.t,0);r2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var e=a();return t.copyTo(e),this.reduce(e),e}function Gt(t){return t}function Yt(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);t.compareTo(this.m)>=0;)t.subTo(this.m,t)}function Xt(t,e){t.squareTo(e),this.reduce(e)}function $t(t,e,n){t.multiplyTo(e,n),this.reduce(n)}function Qt(t,e){var n,r,i=t.bitLength(),s=p(1);if(i<=0)return s;n=i<18?1:i<48?3:i<144?4:i<768?5:6,r=i<8?new D(e):e.isEven()?new Jt(e):new M(e);var o=new Array,u=3,c=n-1,h=(1<1){var f=a();for(r.sqrTo(o[1],f);u<=h;)o[u]=a(),r.mulTo(f,o[u-2],o[u]),u+=2}var l,d,g=t.t-1,y=!0,v=a();for(i=E(t[g])-1;g>=0;){for(i>=c?l=t[g]>>i-c&h:(l=(t[g]&(1<0&&(l|=t[g-1]>>this.DB+i-c)),u=n;0==(1&l);)l>>=1,--u;if((i-=u)<0&&(i+=this.DB,--g),y)o[l].copyTo(s),y=!1;else{for(;u>1;)r.sqrTo(s,v),r.sqrTo(v,s),u-=2;u>0?r.sqrTo(s,v):(d=s,s=v,v=d),r.mulTo(v,o[l],s)}for(;g>=0&&0==(t[g]&1<0&&(e.rShiftTo(s,e),n.rShiftTo(s,n));e.signum()>0;)(i=e.getLowestSetBit())>0&&e.rShiftTo(i,e),(i=n.getLowestSetBit())>0&&n.rShiftTo(i,n),e.compareTo(n)>=0?(e.subTo(n,e),e.rShiftTo(1,e)):(n.subTo(e,n),n.rShiftTo(1,n));return s>0&&n.lShiftTo(s,n),n}function te(t){if(t<=0)return 0;var e=this.DV%t,n=this.s<0?t-1:0;if(this.t>0)if(0==e)n=this[0]%t;else for(var r=this.t-1;r>=0;--r)n=(e*n+this[r])%t;return n}function ee(t){var e=t.isEven();if(this.isEven()&&e||0==t.signum())return o.ZERO;for(var n=t.clone(),r=this.clone(),i=p(1),s=p(0),a=p(0),u=p(1);0!=n.signum();){for(;n.isEven();)n.rShiftTo(1,n),e?(i.isEven()&&s.isEven()||(i.addTo(this,i),s.subTo(t,s)),i.rShiftTo(1,i)):s.isEven()||s.subTo(t,s),s.rShiftTo(1,s);for(;r.isEven();)r.rShiftTo(1,r),e?(a.isEven()&&u.isEven()||(a.addTo(this,a),u.subTo(t,u)),a.rShiftTo(1,a)):u.isEven()||u.subTo(t,u),u.rShiftTo(1,u);n.compareTo(r)>=0?(n.subTo(r,n),e&&i.subTo(a,i),s.subTo(u,s)):(r.subTo(n,r),e&&a.subTo(i,a),u.subTo(s,u))}return 0!=r.compareTo(o.ONE)?o.ZERO:u.compareTo(t)>=0?u.subtract(t):u.signum()<0?(u.addTo(t,u),u.signum()<0?u.add(t):u):u}function ne(t){var e,n=this.abs();if(1==n.t&&n[0]<=vr[vr.length-1]){for(e=0;e>1,t>vr.length&&(t=vr.length);for(var i=a(),s=0;s>8&255,br[wr++]^=t>>16&255,br[wr++]^=t>>24&255,wr>=Er&&(wr-=Er)}function he(){ue((new Date).getTime())}function ce(){if(null==Sr){for(he(),Sr=ae(),Sr.init(br),wr=0;wr>8&255,br[wr++]^=t>>16&255,br[wr++]^=t>>24&255,wr>=Er&&(wr-=Er)}function ce(){ue((new Date).getTime())}function he(){if(null==Sr){for(ce(),Sr=ae(),Sr.init(br),wr=0;wr=0&&e>0;){var i=t.charCodeAt(r--);i<128?n[--e]=i:i>127&&i<2048?(n[--e]=63&i|128,n[--e]=i>>6|192):(n[--e]=63&i|128,n[--e]=i>>6&63|128,n[--e]=i>>12|224)}n[--e]=0;for(var s=new le,a=new Array;e>2;){for(a[0]=0;0==a[0];)s.nextBytes(a);n[--e]=a[0]}return n[--e]=2,n[--e]=0,new o(n)}function pe(t,e,n){for(var r="",i=0;r.length>24,(16711680&i)>>16,(65280&i)>>8,255&i]))),i+=1;return r}function ye(t,e,n){if(t.length+2*Fr+2>e)throw"Message too long for RSA";var r,i="";for(r=0;r0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16)):alert("Invalid RSA public key")}function Se(t){return t.modPowInt(this.e,this.n)}function be(t){var e=ge(t,this.n.bitLength()+7>>3);if(null==e)return null;var n=this.doPublic(e);if(null==n)return null;var r=n.toString(16);return 0==(1&r.length)?r:"0"+r}function we(t,e){var n=ye(t,this.n.bitLength()+7>>3,e);if(null==n)return null;var r=this.doPublic(n);if(null==r)return null;var i=r.toString(16);return 0==(1&i.length)?i:"0"+i}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ +function de(t,e){return new o(t,e)}function ge(t,e){if(e=0&&e>0;){var i=t.charCodeAt(r--);i<128?n[--e]=i:i>127&&i<2048?(n[--e]=63&i|128,n[--e]=i>>6|192):(n[--e]=63&i|128,n[--e]=i>>6&63|128,n[--e]=i>>12|224)}n[--e]=0;for(var s=new le,a=new Array;e>2;){for(a[0]=0;0==a[0];)s.nextBytes(a);n[--e]=a[0]}return n[--e]=2,n[--e]=0,new o(n)}function pe(t,e,n){for(var r="",i=0;r.length>24,(16711680&i)>>16,(65280&i)>>8,255&i]))),i+=1;return r}function ye(t,e,n){if(t.length+2*Ar+2>e)throw"Message too long for RSA";var r,i="";for(r=0;r0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16)):alert("Invalid RSA public key")}function Se(t){return t.modPowInt(this.e,this.n)}function be(t){var e=ge(t,this.n.bitLength()+7>>3);if(null==e)return null;var n=this.doPublic(e);if(null==n)return null;var r=n.toString(16);return 0==(1&r.length)?r:"0"+r}function we(t,e){var n=ye(t,this.n.bitLength()+7>>3,e);if(null==n)return null;var r=this.doPublic(n);if(null==r)return null;var i=r.toString(16);return 0==(1&i.length)?i:"0"+i}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ -function Ee(t,e){for(var n=t.toByteArray(),r=0;r=n.length)return null;for(var i="";++r191&&s<224?(i+=String.fromCharCode((31&s)<<6|63&n[r+1]),++r):(i+=String.fromCharCode((15&s)<<12|(63&n[r+1])<<6|63&n[r+2]),r+=2)}return i}function _e(t,e,n){for(var r="",i=0;r.length>24,(16711680&i)>>16,(65280&i)>>8,255&i])),i+=1;return r}function xe(t,e,n){t=t.toByteArray();var r;for(r=0;r0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16),this.d=de(n,16)):alert("Invalid RSA private key")}function Fe(t,e,n,r,i,s,o,a){if(this.isPrivate=!0,null==t)throw"RSASetPrivateEx N == null";if(null==e)throw"RSASetPrivateEx E == null";if(0==t.length)throw"RSASetPrivateEx N.length == 0";if(0==e.length)throw"RSASetPrivateEx E.length == 0";null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16),this.d=de(n,16),this.p=de(r,16),this.q=de(i,16),this.dmp1=de(s,16),this.dmq1=de(o,16),this.coeff=de(a,16)):alert("Invalid RSA private key in RSASetPrivateEx")}function Pe(t,e){var n=new le,r=t>>1;this.e=parseInt(e,16);for(var i=new o(e,16);;){for(;this.p=new o(t-r,1,n),0!=this.p.subtract(o.ONE).gcd(i).compareTo(o.ONE)||!this.p.isProbablePrime(10););for(;this.q=new o(r,1,n),0!=this.q.subtract(o.ONE).gcd(i).compareTo(o.ONE)||!this.q.isProbablePrime(10););if(this.p.compareTo(this.q)<=0){var s=this.p;this.p=this.q,this.q=s}var a=this.p.subtract(o.ONE),u=this.q.subtract(o.ONE),h=a.multiply(u);if(0==h.gcd(i).compareTo(o.ONE)){this.n=this.p.multiply(this.q),this.d=i.modInverse(h),this.dmp1=this.d.mod(a),this.dmq1=this.d.mod(u),this.coeff=this.q.modInverse(this.p);break}}}function Oe(t){if(null==this.p||null==this.q)return t.modPow(this.d,this.n);for(var e=t.mod(this.p).modPow(this.dmp1,this.p),n=t.mod(this.q).modPow(this.dmq1,this.q);e.compareTo(n)<0;)e=e.add(this.p);return e.subtract(n).multiply(this.coeff).mod(this.p).multiply(this.q).add(n)}function Ce(t){var e=de(t,16),n=this.doPrivate(e);return null==n?null:Ee(n,this.n.bitLength()+7>>3)}function Te(t,e){var n=de(t,16),r=this.doPrivate(n);return null==r?null:xe(r,this.n.bitLength()+7>>3,e)}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ +function Ee(t,e){for(var n=t.toByteArray(),r=0;r=n.length)return null;for(var i="";++r191&&s<224?(i+=String.fromCharCode((31&s)<<6|63&n[r+1]),++r):(i+=String.fromCharCode((15&s)<<12|(63&n[r+1])<<6|63&n[r+2]),r+=2)}return i}function xe(t,e,n){for(var r="",i=0;r.length>24,(16711680&i)>>16,(65280&i)>>8,255&i])),i+=1;return r}function _e(t,e,n){t=t.toByteArray();var r;for(r=0;r0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16),this.d=de(n,16)):alert("Invalid RSA private key")}function Ae(t,e,n,r,i,s,o,a){if(this.isPrivate=!0,null==t)throw"RSASetPrivateEx N == null";if(null==e)throw"RSASetPrivateEx E == null";if(0==t.length)throw"RSASetPrivateEx N.length == 0";if(0==e.length)throw"RSASetPrivateEx E.length == 0";null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=de(t,16),this.e=parseInt(e,16),this.d=de(n,16),this.p=de(r,16),this.q=de(i,16),this.dmp1=de(s,16),this.dmq1=de(o,16),this.coeff=de(a,16)):alert("Invalid RSA private key in RSASetPrivateEx")}function Pe(t,e){var n=new le,r=t>>1;this.e=parseInt(e,16);for(var i=new o(e,16);;){for(;this.p=new o(t-r,1,n),0!=this.p.subtract(o.ONE).gcd(i).compareTo(o.ONE)||!this.p.isProbablePrime(10););for(;this.q=new o(r,1,n),0!=this.q.subtract(o.ONE).gcd(i).compareTo(o.ONE)||!this.q.isProbablePrime(10););if(this.p.compareTo(this.q)<=0){var s=this.p;this.p=this.q,this.q=s}var a=this.p.subtract(o.ONE),u=this.q.subtract(o.ONE),c=a.multiply(u);if(0==c.gcd(i).compareTo(o.ONE)){this.n=this.p.multiply(this.q),this.d=i.modInverse(c),this.dmp1=this.d.mod(a),this.dmq1=this.d.mod(u),this.coeff=this.q.modInverse(this.p);break}}}function Oe(t){if(null==this.p||null==this.q)return t.modPow(this.d,this.n);for(var e=t.mod(this.p).modPow(this.dmp1,this.p),n=t.mod(this.q).modPow(this.dmq1,this.q);e.compareTo(n)<0;)e=e.add(this.p);return e.subtract(n).multiply(this.coeff).mod(this.p).multiply(this.q).add(n)}function Ce(t){var e=de(t,16),n=this.doPrivate(e);return null==n?null:Ee(n,this.n.bitLength()+7>>3)}function He(t,e){var n=de(t,16),r=this.doPrivate(n);return null==r?null:_e(r,this.n.bitLength()+7>>3,e)}/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/ */ -function De(t,e){this.x=e,this.q=t}function Re(t){return t==this||this.q.equals(t.q)&&this.x.equals(t.x)}function je(){return this.x}function He(){return new De(this.q,this.x.negate().mod(this.q))}function Ie(t){return new De(this.q,this.x.add(t.toBigInteger()).mod(this.q))}function ke(t){return new De(this.q,this.x.subtract(t.toBigInteger()).mod(this.q))}function Be(t){return new De(this.q,this.x.multiply(t.toBigInteger()).mod(this.q))}function Ne(){return new De(this.q,this.x.square().mod(this.q))}function Ve(t){return new De(this.q,this.x.multiply(t.toBigInteger().modInverse(this.q)).mod(this.q))}function Me(t,e,n,r){this.curve=t,this.x=e,this.y=n,null==r?this.z=o.ONE:this.z=r,this.zinv=null}function Ke(){return null==this.zinv&&(this.zinv=this.z.modInverse(this.curve.q)),this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function Le(){return null==this.zinv&&(this.zinv=this.z.modInverse(this.curve.q)),this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function Ue(t){if(t==this)return!0;if(this.isInfinity())return t.isInfinity();if(t.isInfinity())return this.isInfinity();var e,n;return e=t.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(t.z)).mod(this.curve.q),!!e.equals(o.ZERO)&&(n=t.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(t.z)).mod(this.curve.q),n.equals(o.ZERO))}function qe(){return null==this.x&&null==this.y||this.z.equals(o.ZERO)&&!this.y.toBigInteger().equals(o.ZERO)}function We(){return new Me(this.curve,this.x,this.y.negate(),this.z)}function Je(t){if(this.isInfinity())return t;if(t.isInfinity())return this;var e=t.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(t.z)).mod(this.curve.q),n=t.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(t.z)).mod(this.curve.q);if(o.ZERO.equals(n))return o.ZERO.equals(e)?this.twice():this.curve.getInfinity();var r=new o("3"),i=this.x.toBigInteger(),s=this.y.toBigInteger(),a=(t.x.toBigInteger(),t.y.toBigInteger(),n.square()),u=a.multiply(n),h=i.multiply(a),c=e.square().multiply(this.z),f=c.subtract(h.shiftLeft(1)).multiply(t.z).subtract(u).multiply(n).mod(this.curve.q),l=h.multiply(r).multiply(e).subtract(s.multiply(u)).subtract(c.multiply(e)).multiply(t.z).add(e.multiply(u)).mod(this.curve.q),d=u.multiply(this.z).multiply(t.z).mod(this.curve.q);return new Me(this.curve,this.curve.fromBigInteger(f),this.curve.fromBigInteger(l),d)}function ze(){if(this.isInfinity())return this;if(0==this.y.toBigInteger().signum())return this.curve.getInfinity();var t=new o("3"),e=this.x.toBigInteger(),n=this.y.toBigInteger(),r=n.multiply(this.z),i=r.multiply(n).mod(this.curve.q),s=this.curve.a.toBigInteger(),a=e.square().multiply(t);o.ZERO.equals(s)||(a=a.add(this.z.square().multiply(s))),a=a.mod(this.curve.q);var u=a.square().subtract(e.shiftLeft(3).multiply(i)).shiftLeft(1).multiply(r).mod(this.curve.q),h=a.multiply(t).multiply(e).subtract(i.shiftLeft(1)).shiftLeft(2).multiply(i).subtract(a.square().multiply(a)).mod(this.curve.q),c=r.square().multiply(r).shiftLeft(3).mod(this.curve.q);return new Me(this.curve,this.curve.fromBigInteger(u),this.curve.fromBigInteger(h),c)}function Ye(t){if(this.isInfinity())return this;if(0==t.signum())return this.curve.getInfinity();var e,n=t,r=n.multiply(new o("3")),i=this.negate(),s=this;for(e=r.bitLength()-2;e>0;--e){s=s.twice();var a=r.testBit(e),u=n.testBit(e);a!=u&&(s=s.add(a?this:i))}return s}function Ge(t,e,n){var r;r=t.bitLength()>n.bitLength()?t.bitLength()-1:n.bitLength()-1;for(var i=this.curve.getInfinity(),s=this.add(e);r>=0;)i=i.twice(),t.testBit(r)?i=n.testBit(r)?i.add(s):i.add(this):n.testBit(r)&&(i=i.add(e)),--r;return i}function Xe(t,e,n){this.q=t,this.a=this.fromBigInteger(e),this.b=this.fromBigInteger(n),this.infinity=new Me(this,null,null)}function $e(){return this.q}function Qe(){return this.a}function Ze(){return this.b}function tn(t){return t==this||this.q.equals(t.q)&&this.a.equals(t.a)&&this.b.equals(t.b)}function en(){return this.infinity}function nn(t){return new De(this.q,t)}function rn(t){switch(parseInt(t.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var e=(t.length-2)/2,n=t.substr(2,e),r=t.substr(e+2,e);return new Me(this,this.fromBigInteger(new o(n,16)),this.fromBigInteger(new o(r,16)));default:return null}}function sn(t){for(var e=new Array,n=0;n0;--e){s=s.twice();var a=r.testBit(e),u=n.testBit(e);a!=u&&(s=s.add(a?this:i))}return s}function Ye(t,e,n){var r;r=t.bitLength()>n.bitLength()?t.bitLength()-1:n.bitLength()-1;for(var i=this.curve.getInfinity(),s=this.add(e);r>=0;)i=i.twice(),t.testBit(r)?i=n.testBit(r)?i.add(s):i.add(this):n.testBit(r)&&(i=i.add(e)),--r;return i}function Xe(t,e,n){this.q=t,this.a=this.fromBigInteger(e),this.b=this.fromBigInteger(n),this.infinity=new Me(this,null,null)}function $e(){return this.q}function Qe(){return this.a}function Ze(){return this.b}function tn(t){return t==this||this.q.equals(t.q)&&this.a.equals(t.a)&&this.b.equals(t.b)}function en(){return this.infinity}function nn(t){return new je(this.q,t)}function rn(t){switch(parseInt(t.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var e=(t.length-2)/2,n=t.substr(2,e),r=t.substr(e+2,e);return new Me(this,this.fromBigInteger(new o(n,16)),this.fromBigInteger(new o(r,16)));default:return null}}function sn(t){for(var e=new Array,n=0;n>24,(16711680&i)>>16,(65280&i)>>8,255&i])))),i+=1;return r}function Mn(t,e,n){var r=function(t){return Cr.crypto.Util.hashHex(t,e)},i=r(wn(t));return void 0===n&&(n=-1),this.signWithMessageHashPSS(i,e,n)}function Kn(t,e,n){var r,i=bn(t),s=i.length,a=this.n.bitLength()-1,u=Math.ceil(a/8),h=function(t){return Cr.crypto.Util.hashHex(t,e)};if(n===-1||void 0===n)n=s;else if(n===-2)n=u-s-2;else if(n<-2)throw"invalid salt length";if(u0&&(c=new Array(n),(new le).nextBytes(c),c=String.fromCharCode.apply(String,c));var f=bn(h(wn("\0\0\0\0\0\0\0\0"+i+c))),l=[];for(r=0;r>8*u-a&255;for(p[0]&=~y,r=0;rthis.n.bitLength())return 0;var r=this.doPublic(n),i=r.toString(16).replace(/^1f+00/,""),s=qn(i);if(0==s.length)return!1;var o=s[0],a=s[1],u=function(t){return Cr.crypto.Util.hashString(t,o)},h=u(t);return a==h}function Yn(t,e){e=e.replace(Ir,""),e=e.replace(/[ \n]+/g,"");var n=de(e,16);if(n.bitLength()>this.n.bitLength())return 0;var r=this.doPublic(n),i=r.toString(16).replace(/^1f+00/,""),s=qn(i);if(0==s.length)return!1;var o=(s[0],s[1]);return o==t}function Gn(t,e,n,r){var i=function(t){return Cr.crypto.Util.hashHex(t,n)},s=i(wn(t));return void 0===r&&(r=-1),this.verifyWithMessageHashPSS(s,e,n,r)}function Xn(t,e,n,r){var i=new o(e,16);if(i.bitLength()>this.n.bitLength())return!1;var s,a=function(t){return Cr.crypto.Util.hashHex(t,n)},u=bn(t),h=u.length,c=this.n.bitLength()-1,f=Math.ceil(c/8);if(r===-1||void 0===r)r=h;else if(r===-2)r=f-h-2;else if(r<-2)throw"invalid salt length";if(f>8*f-c&255;if(0!==(d.charCodeAt(0)&p))throw"bits beyond keysize not zero";var y=Vn(g,d.length,a),v=[];for(s=0;s>24,(16711680&i)>>16,(65280&i)>>8,255&i])))),i+=1;return r}function Mn(t,e,n){var r=function(t){return Cr.crypto.Util.hashHex(t,e)},i=r(wn(t));return void 0===n&&(n=-1),this.signWithMessageHashPSS(i,e,n)}function Kn(t,e,n){var r,i=bn(t),s=i.length,a=this.n.bitLength()-1,u=Math.ceil(a/8),c=function(t){return Cr.crypto.Util.hashHex(t,e)};if(n===-1||void 0===n)n=s;else if(n===-2)n=u-s-2;else if(n<-2)throw"invalid salt length";if(u0&&(h=new Array(n),(new le).nextBytes(h),h=String.fromCharCode.apply(String,h));var f=bn(c(wn("\0\0\0\0\0\0\0\0"+i+h))),l=[];for(r=0;r>8*u-a&255;for(p[0]&=~y,r=0;rthis.n.bitLength())return 0;var r=this.doPublic(n),i=r.toString(16).replace(/^1f+00/,""),s=qn(i);if(0==s.length)return!1;var o=s[0],a=s[1],u=function(t){return Cr.crypto.Util.hashString(t,o)},c=u(t);return a==c}function Gn(t,e){e=e.replace(Rr,""),e=e.replace(/[ \n]+/g,"");var n=de(e,16);if(n.bitLength()>this.n.bitLength())return 0;var r=this.doPublic(n),i=r.toString(16).replace(/^1f+00/,""),s=qn(i);if(0==s.length)return!1;var o=(s[0],s[1]);return o==t}function Yn(t,e,n,r){var i=function(t){return Cr.crypto.Util.hashHex(t,n)},s=i(wn(t));return void 0===r&&(r=-1),this.verifyWithMessageHashPSS(s,e,n,r)}function Xn(t,e,n,r){var i=new o(e,16);if(i.bitLength()>this.n.bitLength())return!1;var s,a=function(t){return Cr.crypto.Util.hashHex(t,n)},u=bn(t),c=u.length,h=this.n.bitLength()-1,f=Math.ceil(h/8);if(r===-1||void 0===r)r=c;else if(r===-2)r=f-c-2;else if(r<-2)throw"invalid salt length";if(f>8*f-h&255;if(0!==(d.charCodeAt(0)&p))throw"bits beyond keysize not zero";var y=Vn(g,d.length,a),v=[];for(s=0;s":">",'"':""","'":"'","/":"/","`":"`"},a=["toString","valueOf"],u={isArray:function(t){return e.toString.apply(t)===n},isBoolean:function(t){return"boolean"==typeof t},isFunction:function(t){return"function"==typeof t||e.toString.apply(t)===r},isNull:function(t){return null===t},isNumber:function(t){return"number"==typeof t&&isFinite(t)},isObject:function(e){return e&&("object"==typeof e||t.isFunction(e))||!1},isString:function(t){return"string"==typeof t},isUndefined:function(t){return"undefined"==typeof t},_IEEnumFix:sr.env.ua.ie?function(n,r){var i,s,o;for(i=0;i"'\/`]/g,function(t){return o[t]})},extend:function(n,r,i){if(!r||!n)throw new Error("extend failed, please check that all dependencies are included.");var s,o=function(){};if(o.prototype=r.prototype,n.prototype=new o,n.prototype.constructor=n,n.superclass=r.prototype,r.prototype.constructor==e.constructor&&(r.prototype.constructor=r),i){for(s in i)t.hasOwnProperty(i,s)&&(n.prototype[s]=i[s]);t._IEEnumFix(n.prototype,i)}},augmentObject:function(e,n){if(!n||!e)throw new Error("Absorb failed, verify dependencies.");var r,i,s=arguments,o=s[2];if(o&&o!==!0)for(r=2;r0?t.dump(e[r],n-1):o):s.push(e[r]),s.push(u);s.length>1&&s.pop(),s.push("]")}else{s.push("{");for(r in e)t.hasOwnProperty(e,r)&&(s.push(r+h),t.isObject(e[r])?s.push(n>0?t.dump(e[r],n-1):o):s.push(e[r]),s.push(u));s.length>1&&s.pop(),s.push("}")}return s.join("")},substitute:function(e,n,r,s){for(var o,a,u,h,c,f,l,d,g,p=[],y=e.length,v="dump",m=" ",S="{",b="}";(o=e.lastIndexOf(S,y),!(o<0))&&(a=e.indexOf(b,o),!(o+1>a));)l=e.substring(o+1,a),h=l,f=null,u=h.indexOf(m),u>-1&&(f=h.substring(u+1),h=h.substring(0,u)),c=n[h],r&&(c=r(h,c,f)),t.isObject(c)?t.isArray(c)?c=t.dump(c,parseInt(f,10)):(f=f||"",d=f.indexOf(v),d>-1&&(f=f.substring(4)),g=c.toString(),c=g===i||d>-1?t.dump(c,parseInt(f,10)):g):t.isString(c)||t.isNumber(c)||(c="~-"+p.length+"-~",p[p.length]=l),e=e.substring(0,o)+c+e.substring(a+1),s===!1&&(y=o-1);for(o=p.length-1;o>=0;o-=1)e=e.replace(new RegExp("~-"+o+"-~"),"{"+p[o]+"}","g");return e},trim:function(t){try{return t.replace(/^\s+|\s+$/g,"")}catch(e){return t}},merge:function(){var e,n={},r=arguments,i=r.length;for(e=0;e":">",'"':""","'":"'","/":"/","`":"`"},a=["toString","valueOf"],u={isArray:function(t){return e.toString.apply(t)===n},isBoolean:function(t){return"boolean"==typeof t},isFunction:function(t){return"function"==typeof t||e.toString.apply(t)===r},isNull:function(t){return null===t},isNumber:function(t){return"number"==typeof t&&isFinite(t)},isObject:function(e){return e&&("object"==typeof e||t.isFunction(e))||!1},isString:function(t){return"string"==typeof t},isUndefined:function(t){return"undefined"==typeof t},_IEEnumFix:sr.env.ua.ie?function(n,r){var i,s,o;for(i=0;i"'\/`]/g,function(t){return o[t]})},extend:function(n,r,i){if(!r||!n)throw new Error("extend failed, please check that all dependencies are included.");var s,o=function(){};if(o.prototype=r.prototype,n.prototype=new o,n.prototype.constructor=n,n.superclass=r.prototype,r.prototype.constructor==e.constructor&&(r.prototype.constructor=r),i){for(s in i)t.hasOwnProperty(i,s)&&(n.prototype[s]=i[s]);t._IEEnumFix(n.prototype,i)}},augmentObject:function(e,n){if(!n||!e)throw new Error("Absorb failed, verify dependencies.");var r,i,s=arguments,o=s[2];if(o&&o!==!0)for(r=2;r0?t.dump(e[r],n-1):o):s.push(e[r]),s.push(u);s.length>1&&s.pop(),s.push("]")}else{s.push("{");for(r in e)t.hasOwnProperty(e,r)&&(s.push(r+c),t.isObject(e[r])?s.push(n>0?t.dump(e[r],n-1):o):s.push(e[r]),s.push(u));s.length>1&&s.pop(),s.push("}")}return s.join("")},substitute:function(e,n,r,s){for(var o,a,u,c,h,f,l,d,g,p=[],y=e.length,v="dump",m=" ",S="{",b="}";(o=e.lastIndexOf(S,y),!(o<0))&&(a=e.indexOf(b,o),!(o+1>a));)l=e.substring(o+1,a),c=l,f=null,u=c.indexOf(m),u>-1&&(f=c.substring(u+1),c=c.substring(0,u)),h=n[c],r&&(h=r(c,h,f)),t.isObject(h)?t.isArray(h)?h=t.dump(h,parseInt(f,10)):(f=f||"",d=f.indexOf(v),d>-1&&(f=f.substring(4)),g=h.toString(),h=g===i||d>-1?t.dump(h,parseInt(f,10)):g):t.isString(h)||t.isNumber(h)||(h="~-"+p.length+"-~",p[p.length]=l),e=e.substring(0,o)+h+e.substring(a+1),s===!1&&(y=o-1);for(o=p.length-1;o>=0;o-=1)e=e.replace(new RegExp("~-"+o+"-~"),"{"+p[o]+"}","g");return e},trim:function(t){try{return t.replace(/^\s+|\s+$/g,"")}catch(e){return t}},merge:function(){var e,n={},r=arguments,i=r.length;for(e=0;e>>2]>>>24-s%4*8&255;e[r+s>>>2]|=o<<24-(r+s)%4*8}else for(var s=0;s>>2]=n[s>>>2];return this.sigBytes+=i,this},clamp:function(){var e=this.words,n=this.sigBytes;e[n>>>2]&=4294967295<<32-n%4*8,e.length=t.ceil(n/4)},clone:function(){var t=i.clone.call(this);return t.words=this.words.slice(0),t},random:function(e){for(var n=[],r=0;r>>2]>>>24-i%4*8&255;r.push((s>>>4).toString(16)),r.push((15&s).toString(16))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r>>3]|=parseInt(t.substr(r,2),16)<<24-r%8*4;return new s.init(n,e/2)}},u=o.Latin1={stringify:function(t){for(var e=t.words,n=t.sigBytes,r=[],i=0;i>>2]>>>24-i%4*8&255;r.push(String.fromCharCode(s))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r>>2]|=(255&t.charCodeAt(r))<<24-r%4*8;return new s.init(n,e)}},h=o.Utf8={stringify:function(t){try{return decodeURIComponent(escape(u.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return u.parse(unescape(encodeURIComponent(t)))}},c=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=h.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,a=4*o,u=i/a;u=e?t.ceil(u):t.max((0|u)-this._minBufferSize,0);var h=u*o,c=t.min(4*h,i);if(h){for(var f=0;f>>2]}},n.BlockCipher=u.extend({cfg:u.cfg.extend({mode:h,padding:f}),reset:function(){u.reset.call(this);var t=this.cfg,e=t.iv,t=t.mode;if(this._xformMode==this._ENC_XFORM_MODE)var n=t.createEncryptor;else n=t.createDecryptor,this._minBufferSize=1;this._mode=n.call(t,this,e&&e.words)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){t.pad(this._data,this.blockSize);var e=this._process(!0)}else e=this._process(!0),t.unpad(e);return e},blockSize:4});var l=n.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}}),h=(e.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext;return t=t.salt,(t?i.create([1398893684,1701076831]).concat(t).concat(e):e).toString(o)},parse:function(t){t=o.parse(t);var e=t.words;if(1398893684==e[0]&&1701076831==e[1]){var n=i.create(e.slice(2,4));e.splice(0,4),t.sigBytes-=16}return l.create({ciphertext:t,salt:n})}},d=n.SerializableCipher=r.extend({cfg:r.extend({format:h}),encrypt:function(t,e,n,r){r=this.cfg.extend(r);var i=t.createEncryptor(n,r);return e=i.finalize(e),i=i.cfg,l.create({ciphertext:e,key:n,iv:i.iv,algorithm:t,mode:i.mode,padding:i.padding,blockSize:t.blockSize,formatter:r.format})},decrypt:function(t,e,n,r){return r=this.cfg.extend(r),e=this._parse(e,r.format),t.createDecryptor(n,r).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),e=(e.kdf={}).OpenSSL={execute:function(t,e,n,r){return r||(r=i.random(8)),t=a.create({keySize:e+n}).compute(t,r),n=i.create(t.words.slice(e),4*n),t.sigBytes=4*e,l.create({key:t,iv:n,salt:r})}},g=n.PasswordBasedCipher=d.extend({cfg:d.cfg.extend({kdf:e}),encrypt:function(t,e,n,r){return r=this.cfg.extend(r),n=r.kdf.execute(n,t.keySize,t.ivSize),r.iv=n.iv,t=d.encrypt.call(this,t,e,n.key,r),t.mixIn(n),t},decrypt:function(t,e,n,r){return r=this.cfg.extend(r),e=this._parse(e,r.format),n=r.kdf.execute(n,t.keySize,t.ivSize,e.salt),r.iv=n.iv,d.decrypt.call(this,t,e,n.key,r)}})}(),function(){for(var t=or,e=t.lib.BlockCipher,n=t.algo,r=[],i=[],s=[],o=[],a=[],u=[],h=[],c=[],f=[],l=[],d=[],g=0;256>g;g++)d[g]=128>g?g<<1:g<<1^283;for(var p=0,y=0,g=0;256>g;g++){var v=y^y<<1^y<<2^y<<3^y<<4,v=v>>>8^255&v^99;r[p]=v,i[v]=p;var m=d[p],S=d[m],b=d[S],w=257*d[v]^16843008*v;s[p]=w<<24|w>>>8,o[p]=w<<16|w>>>16,a[p]=w<<8|w>>>24,u[p]=w,w=16843009*b^65537*S^257*m^16843008*p,h[v]=w<<24|w>>>8,c[v]=w<<16|w>>>16,f[v]=w<<8|w>>>24,l[v]=w,p?(p=m^d[d[d[b^m]]],y^=d[d[y]]):p=y=1}var E=[0,1,2,4,8,16,32,64,128,27,54],n=n.AES=e.extend({_doReset:function(){for(var t=this._key,e=t.words,n=t.sigBytes/4,t=4*((this._nRounds=n+6)+1),i=this._keySchedule=[],s=0;s>>24]<<24|r[o>>>16&255]<<16|r[o>>>8&255]<<8|r[255&o]):(o=o<<8|o>>>24,o=r[o>>>24]<<24|r[o>>>16&255]<<16|r[o>>>8&255]<<8|r[255&o],o^=E[s/n|0]<<24),i[s]=i[s-n]^o}for(e=this._invKeySchedule=[],n=0;nn||4>=s?o:h[r[o>>>24]]^c[r[o>>>16&255]]^f[r[o>>>8&255]]^l[r[255&o]]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,s,o,a,u,r)},decryptBlock:function(t,e){var n=t[e+1];t[e+1]=t[e+3],t[e+3]=n,this._doCryptBlock(t,e,this._invKeySchedule,h,c,f,l,i),n=t[e+1],t[e+1]=t[e+3],t[e+3]=n},_doCryptBlock:function(t,e,n,r,i,s,o,a){for(var u=this._nRounds,h=t[e]^n[0],c=t[e+1]^n[1],f=t[e+2]^n[2],l=t[e+3]^n[3],d=4,g=1;g>>24]^i[c>>>16&255]^s[f>>>8&255]^o[255&l]^n[d++],y=r[c>>>24]^i[f>>>16&255]^s[l>>>8&255]^o[255&h]^n[d++],v=r[f>>>24]^i[l>>>16&255]^s[h>>>8&255]^o[255&c]^n[d++],l=r[l>>>24]^i[h>>>16&255]^s[c>>>8&255]^o[255&f]^n[d++],h=p,c=y,f=v;p=(a[h>>>24]<<24|a[c>>>16&255]<<16|a[f>>>8&255]<<8|a[255&l])^n[d++],y=(a[c>>>24]<<24|a[f>>>16&255]<<16|a[l>>>8&255]<<8|a[255&h])^n[d++],v=(a[f>>>24]<<24|a[l>>>16&255]<<16|a[h>>>8&255]<<8|a[255&c])^n[d++],l=(a[l>>>24]<<24|a[h>>>16&255]<<16|a[c>>>8&255]<<8|a[255&f])^n[d++],t[e]=p,t[e+1]=y,t[e+2]=v,t[e+3]=l},keySize:8});t.AES=e._createHelper(n)}(),function(){function t(t,e){var n=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=n,this._lBlock^=n<>>t^this._lBlock)&e;this._lBlock^=n,this._rBlock^=n<n;n++){var r=o[n]-1;e[n]=t[r>>>5]>>>31-r%32&1}for(t=this._subKeys=[],r=0;16>r;r++){for(var i=t[r]=[],s=u[r],n=0;24>n;n++)i[n/6|0]|=e[(a[n]-1+s)%28]<<31-n%6,i[4+(n/6|0)]|=e[28+(a[n+24]-1+s)%28]<<31-n%6;for(i[0]=i[0]<<1|i[0]>>>31,n=1;7>n;n++)i[n]>>>=4*(n-1)+3;i[7]=i[7]<<5|i[7]>>>27}for(e=this._invSubKeys=[],n=0;16>n;n++)e[n]=t[15-n]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(n,r,i){this._lBlock=n[r],this._rBlock=n[r+1],t.call(this,4,252645135),t.call(this,16,65535),e.call(this,2,858993459),e.call(this,8,16711935),t.call(this,1,1431655765);for(var s=0;16>s;s++){for(var o=i[s],a=this._lBlock,u=this._rBlock,f=0,l=0;8>l;l++)f|=h[l][((u^o[l])&c[l])>>>0];this._lBlock=u,this._rBlock=a^f}i=this._lBlock,this._lBlock=this._rBlock,this._rBlock=i,t.call(this,1,1431655765),e.call(this,8,16711935),e.call(this,2,858993459),t.call(this,16,65535),t.call(this,4,252645135),n[r]=this._lBlock,n[r+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});n.DES=r._createHelper(f),s=s.TripleDES=r.extend({_doReset:function(){var t=this._key.words;this._des1=f.createEncryptor(i.create(t.slice(0,2))),this._des2=f.createEncryptor(i.create(t.slice(2,4))),this._des3=f.createEncryptor(i.create(t.slice(4,6)))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2}),n.TripleDES=r._createHelper(s)}(),function(){var t=or,e=t.lib.WordArray;t.enc.Base64={stringify:function(t){var e=t.words,n=t.sigBytes,r=this._map;t.clamp(),t=[];for(var i=0;i>>2]>>>24-8*(i%4)&255)<<16|(e[i+1>>>2]>>>24-8*((i+1)%4)&255)<<8|e[i+2>>>2]>>>24-8*((i+2)%4)&255,o=0;4>o&&i+.75*o>>6*(3-o)&63));if(e=r.charAt(64))for(;t.length%4;)t.push(e);return t.join("")},parse:function(t){var n=t.length,r=this._map,i=r.charAt(64);i&&(i=t.indexOf(i),-1!=i&&(n=i));for(var i=[],s=0,o=0;o>>6-2*(o%4);i[s>>>2]|=(a|u)<<24-8*(s%4),s++}return e.create(i,s)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),function(t){function e(t,e,n,r,i,s,o){return t=t+(e&n|~e&r)+i+o,(t<>>32-s)+e}function n(t,e,n,r,i,s,o){return t=t+(e&r|n&~r)+i+o,(t<>>32-s)+e}function r(t,e,n,r,i,s,o){return t=t+(e^n^r)+i+o,(t<>>32-s)+e}function i(t,e,n,r,i,s,o){return t=t+(n^(e|~r))+i+o,(t<>>32-s)+e}for(var s=or,o=s.lib,a=o.WordArray,u=o.Hasher,o=s.algo,h=[],c=0;64>c;c++)h[c]=4294967296*t.abs(t.sin(c+1))|0;o=o.MD5=u.extend({_doReset:function(){this._hash=new a.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,s){for(var o=0;16>o;o++){var a=s+o,u=t[a];t[a]=16711935&(u<<8|u>>>24)|4278255360&(u<<24|u>>>8)}var o=this._hash.words,a=t[s+0],u=t[s+1],c=t[s+2],f=t[s+3],l=t[s+4],d=t[s+5],g=t[s+6],p=t[s+7],y=t[s+8],v=t[s+9],m=t[s+10],S=t[s+11],b=t[s+12],w=t[s+13],E=t[s+14],_=t[s+15],x=o[0],A=o[1],F=o[2],P=o[3],x=e(x,A,F,P,a,7,h[0]),P=e(P,x,A,F,u,12,h[1]),F=e(F,P,x,A,c,17,h[2]),A=e(A,F,P,x,f,22,h[3]),x=e(x,A,F,P,l,7,h[4]),P=e(P,x,A,F,d,12,h[5]),F=e(F,P,x,A,g,17,h[6]),A=e(A,F,P,x,p,22,h[7]),x=e(x,A,F,P,y,7,h[8]),P=e(P,x,A,F,v,12,h[9]),F=e(F,P,x,A,m,17,h[10]),A=e(A,F,P,x,S,22,h[11]),x=e(x,A,F,P,b,7,h[12]),P=e(P,x,A,F,w,12,h[13]),F=e(F,P,x,A,E,17,h[14]),A=e(A,F,P,x,_,22,h[15]),x=n(x,A,F,P,u,5,h[16]),P=n(P,x,A,F,g,9,h[17]),F=n(F,P,x,A,S,14,h[18]),A=n(A,F,P,x,a,20,h[19]),x=n(x,A,F,P,d,5,h[20]),P=n(P,x,A,F,m,9,h[21]),F=n(F,P,x,A,_,14,h[22]),A=n(A,F,P,x,l,20,h[23]),x=n(x,A,F,P,v,5,h[24]),P=n(P,x,A,F,E,9,h[25]),F=n(F,P,x,A,f,14,h[26]),A=n(A,F,P,x,y,20,h[27]),x=n(x,A,F,P,w,5,h[28]),P=n(P,x,A,F,c,9,h[29]),F=n(F,P,x,A,p,14,h[30]),A=n(A,F,P,x,b,20,h[31]),x=r(x,A,F,P,d,4,h[32]),P=r(P,x,A,F,y,11,h[33]),F=r(F,P,x,A,S,16,h[34]),A=r(A,F,P,x,E,23,h[35]),x=r(x,A,F,P,u,4,h[36]),P=r(P,x,A,F,l,11,h[37]),F=r(F,P,x,A,p,16,h[38]),A=r(A,F,P,x,m,23,h[39]),x=r(x,A,F,P,w,4,h[40]),P=r(P,x,A,F,a,11,h[41]),F=r(F,P,x,A,f,16,h[42]),A=r(A,F,P,x,g,23,h[43]),x=r(x,A,F,P,v,4,h[44]),P=r(P,x,A,F,b,11,h[45]),F=r(F,P,x,A,_,16,h[46]),A=r(A,F,P,x,c,23,h[47]),x=i(x,A,F,P,a,6,h[48]),P=i(P,x,A,F,p,10,h[49]),F=i(F,P,x,A,E,15,h[50]),A=i(A,F,P,x,d,21,h[51]),x=i(x,A,F,P,b,6,h[52]),P=i(P,x,A,F,f,10,h[53]),F=i(F,P,x,A,m,15,h[54]),A=i(A,F,P,x,u,21,h[55]),x=i(x,A,F,P,y,6,h[56]),P=i(P,x,A,F,_,10,h[57]),F=i(F,P,x,A,g,15,h[58]),A=i(A,F,P,x,w,21,h[59]),x=i(x,A,F,P,l,6,h[60]),P=i(P,x,A,F,S,10,h[61]),F=i(F,P,x,A,c,15,h[62]),A=i(A,F,P,x,v,21,h[63]);o[0]=o[0]+x|0,o[1]=o[1]+A|0,o[2]=o[2]+F|0,o[3]=o[3]+P|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;n[i>>>5]|=128<<24-i%32;var s=t.floor(r/4294967296);for(n[(i+64>>>9<<4)+15]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),n[(i+64>>>9<<4)+14]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),e.sigBytes=4*(n.length+1),this._process(),e=this._hash,n=e.words,r=0;4>r;r++)i=n[r],n[r]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8);return e},clone:function(){var t=u.clone.call(this);return t._hash=this._hash.clone(),t}}),s.MD5=u._createHelper(o),s.HmacMD5=u._createHmacHelper(o)}(Math),function(){var t=or,e=t.lib,n=e.WordArray,r=e.Hasher,i=[],e=t.algo.SHA1=r.extend({_doReset:function(){this._hash=new n.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],s=n[1],o=n[2],a=n[3],u=n[4],h=0;80>h;h++){if(16>h)i[h]=0|t[e+h];else{var c=i[h-3]^i[h-8]^i[h-14]^i[h-16];i[h]=c<<1|c>>>31}c=(r<<5|r>>>27)+u+i[h],c=20>h?c+((s&o|~s&a)+1518500249):40>h?c+((s^o^a)+1859775393):60>h?c+((s&o|s&a|o&a)-1894007588):c+((s^o^a)-899497514),u=a,a=o,o=s<<30|s>>>2,s=r,r=c}n[0]=n[0]+r|0,n[1]=n[1]+s|0,n[2]=n[2]+o|0,n[3]=n[3]+a|0,n[4]=n[4]+u|0},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;return e[r>>>5]|=128<<24-r%32,e[(r+64>>>9<<4)+14]=Math.floor(n/4294967296),e[(r+64>>>9<<4)+15]=n,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=r.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA1=r._createHelper(e),t.HmacSHA1=r._createHmacHelper(e)}(),function(t){for(var e=or,n=e.lib,r=n.WordArray,i=n.Hasher,n=e.algo,s=[],o=[],a=function(t){return 4294967296*(t-(0|t))|0},u=2,h=0;64>h;){var c;t:{c=u;for(var f=t.sqrt(c),l=2;l<=f;l++)if(!(c%l)){c=!1;break t}c=!0}c&&(8>h&&(s[h]=a(t.pow(u,.5))),o[h]=a(t.pow(u,1/3)),h++),u++}var d=[],n=n.SHA256=i.extend({_doReset:function(){this._hash=new r.init(s.slice(0))},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],i=n[1],s=n[2],a=n[3],u=n[4],h=n[5],c=n[6],f=n[7],l=0;64>l;l++){if(16>l)d[l]=0|t[e+l];else{var g=d[l-15],p=d[l-2];d[l]=((g<<25|g>>>7)^(g<<14|g>>>18)^g>>>3)+d[l-7]+((p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10)+d[l-16]}g=f+((u<<26|u>>>6)^(u<<21|u>>>11)^(u<<7|u>>>25))+(u&h^~u&c)+o[l]+d[l],p=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&i^r&s^i&s),f=c,c=h,h=u,u=a+g|0,a=s,s=i,i=r,r=g+p|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+s|0,n[3]=n[3]+a|0,n[4]=n[4]+u|0,n[5]=n[5]+h|0,n[6]=n[6]+c|0,n[7]=n[7]+f|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;return n[i>>>5]|=128<<24-i%32,n[(i+64>>>9<<4)+14]=t.floor(r/4294967296),n[(i+64>>>9<<4)+15]=r,e.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});e.SHA256=i._createHelper(n),e.HmacSHA256=i._createHmacHelper(n)}(Math),function(){var t=or,e=t.lib.WordArray,n=t.algo,r=n.SHA256,n=n.SHA224=r.extend({_doReset:function(){this._hash=new e.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=r._doFinalize.call(this);return t.sigBytes-=4,t}});t.SHA224=r._createHelper(n),t.HmacSHA224=r._createHmacHelper(n)}(),function(){function t(){return i.create.apply(i,arguments)}for(var e=or,n=e.lib.Hasher,r=e.x64,i=r.Word,s=r.WordArray,r=e.algo,o=[t(1116352408,3609767458),t(1899447441,602891725),t(3049323471,3964484399),t(3921009573,2173295548),t(961987163,4081628472),t(1508970993,3053834265),t(2453635748,2937671579),t(2870763221,3664609560),t(3624381080,2734883394),t(310598401,1164996542),t(607225278,1323610764),t(1426881987,3590304994),t(1925078388,4068182383),t(2162078206,991336113),t(2614888103,633803317),t(3248222580,3479774868),t(3835390401,2666613458),t(4022224774,944711139),t(264347078,2341262773),t(604807628,2007800933),t(770255983,1495990901),t(1249150122,1856431235),t(1555081692,3175218132),t(1996064986,2198950837),t(2554220882,3999719339),t(2821834349,766784016),t(2952996808,2566594879),t(3210313671,3203337956),t(3336571891,1034457026),t(3584528711,2466948901),t(113926993,3758326383),t(338241895,168717936),t(666307205,1188179964),t(773529912,1546045734),t(1294757372,1522805485),t(1396182291,2643833823),t(1695183700,2343527390),t(1986661051,1014477480),t(2177026350,1206759142),t(2456956037,344077627),t(2730485921,1290863460),t(2820302411,3158454273),t(3259730800,3505952657),t(3345764771,106217008),t(3516065817,3606008344),t(3600352804,1432725776),t(4094571909,1467031594),t(275423344,851169720),t(430227734,3100823752),t(506948616,1363258195),t(659060556,3750685593),t(883997877,3785050280),t(958139571,3318307427),t(1322822218,3812723403),t(1537002063,2003034995),t(1747873779,3602036899),t(1955562222,1575990012),t(2024104815,1125592928),t(2227730452,2716904306),t(2361852424,442776044),t(2428436474,593698344),t(2756734187,3733110249),t(3204031479,2999351573),t(3329325298,3815920427),t(3391569614,3928383900),t(3515267271,566280711),t(3940187606,3454069534),t(4118630271,4000239992),t(116418474,1914138554),t(174292421,2731055270),t(289380356,3203993006),t(460393269,320620315),t(685471733,587496836),t(852142971,1086792851),t(1017036298,365543100),t(1126000580,2618297676),t(1288033470,3409855158),t(1501505948,4234509866),t(1607167915,987167468),t(1816402316,1246189591)],a=[],u=0;80>u;u++)a[u]=t();r=r.SHA512=n.extend({_doReset:function(){this._hash=new s.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],i=n[1],s=n[2],u=n[3],h=n[4],c=n[5],f=n[6],n=n[7],l=r.high,d=r.low,g=i.high,p=i.low,y=s.high,v=s.low,m=u.high,S=u.low,b=h.high,w=h.low,E=c.high,_=c.low,x=f.high,A=f.low,F=n.high,P=n.low,O=l,C=d,T=g,D=p,R=y,j=v,H=m,I=S,k=b,B=w,N=E,V=_,M=x,K=A,L=F,U=P,q=0;80>q;q++){var W=a[q];if(16>q)var J=W.high=0|t[e+2*q],z=W.low=0|t[e+2*q+1];else{var J=a[q-15],z=J.high,Y=J.low,J=(z>>>1|Y<<31)^(z>>>8|Y<<24)^z>>>7,Y=(Y>>>1|z<<31)^(Y>>>8|z<<24)^(Y>>>7|z<<25),G=a[q-2],z=G.high,X=G.low,G=(z>>>19|X<<13)^(z<<3|X>>>29)^z>>>6,X=(X>>>19|z<<13)^(X<<3|z>>>29)^(X>>>6|z<<26),z=a[q-7],$=z.high,Q=a[q-16],Z=Q.high,Q=Q.low,z=Y+z.low,J=J+$+(z>>>0>>0?1:0),z=z+X,J=J+G+(z>>>0>>0?1:0),z=z+Q,J=J+Z+(z>>>0>>0?1:0);W.high=J,W.low=z}var $=k&N^~k&M,Q=B&V^~B&K,W=O&T^O&R^T&R,tt=C&D^C&j^D&j,Y=(O>>>28|C<<4)^(O<<30|C>>>2)^(O<<25|C>>>7),G=(C>>>28|O<<4)^(C<<30|O>>>2)^(C<<25|O>>>7),X=o[q],et=X.high,nt=X.low,X=U+((B>>>14|k<<18)^(B>>>18|k<<14)^(B<<23|k>>>9)),Z=L+((k>>>14|B<<18)^(k>>>18|B<<14)^(k<<23|B>>>9))+(X>>>0>>0?1:0),X=X+Q,Z=Z+$+(X>>>0>>0?1:0),X=X+nt,Z=Z+et+(X>>>0>>0?1:0),X=X+z,Z=Z+J+(X>>>0>>0?1:0),z=G+tt,W=Y+W+(z>>>0>>0?1:0),L=M,U=K,M=N,K=V,N=k,V=B,B=I+X|0,k=H+Z+(B>>>0>>0?1:0)|0,H=R,I=j,R=T,j=D,T=O,D=C,C=X+z|0,O=Z+W+(C>>>0>>0?1:0)|0}d=r.low=d+C,r.high=l+O+(d>>>0>>0?1:0),p=i.low=p+D,i.high=g+T+(p>>>0>>0?1:0),v=s.low=v+j,s.high=y+R+(v>>>0>>0?1:0),S=u.low=S+I,u.high=m+H+(S>>>0>>0?1:0),w=h.low=w+B,h.high=b+k+(w>>>0>>0?1:0),_=c.low=_+V,c.high=E+N+(_>>>0>>0?1:0),A=f.low=A+K,f.high=x+M+(A>>>0>>0?1:0),P=n.low=P+U,n.high=F+L+(P>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;return e[r>>>5]|=128<<24-r%32,e[(r+128>>>10<<5)+30]=Math.floor(n/4294967296),e[(r+128>>>10<<5)+31]=n,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=n.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32}),e.SHA512=n._createHelper(r),e.HmacSHA512=n._createHmacHelper(r)}(),function(){var t=or,e=t.x64,n=e.Word,r=e.WordArray,e=t.algo,i=e.SHA512,e=e.SHA384=i.extend({_doReset:function(){this._hash=new r.init([new n.init(3418070365,3238371032),new n.init(1654270250,914150663),new n.init(2438529370,812702999),new n.init(355462360,4144912697),new n.init(1731405415,4290775857),new n.init(2394180231,1750603025),new n.init(3675008525,1694076839),new n.init(1203062813,3204075428)])},_doFinalize:function(){var t=i._doFinalize.call(this);return t.sigBytes-=16,t}});t.SHA384=i._createHelper(e),t.HmacSHA384=i._createHmacHelper(e)}(),function(){var t=or,e=t.lib,n=e.WordArray,r=e.Hasher,e=t.algo,i=n.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),s=n.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),o=n.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),a=n.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),u=n.create([0,1518500249,1859775393,2400959708,2840853838]),h=n.create([1352829926,1548603684,1836072691,2053994217,0]),e=e.RIPEMD160=r.extend({_doReset:function(){this._hash=n.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var n=0;16>n;n++){var r=e+n,c=t[r]; -t[r]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}var f,l,d,g,p,y,v,m,S,b,r=this._hash.words,c=u.words,w=h.words,E=i.words,_=s.words,x=o.words,A=a.words;y=f=r[0],v=l=r[1],m=d=r[2],S=g=r[3],b=p=r[4];for(var F,n=0;80>n;n+=1)F=f+t[e+E[n]]|0,F=16>n?F+((l^d^g)+c[0]):32>n?F+((l&d|~l&g)+c[1]):48>n?F+(((l|~d)^g)+c[2]):64>n?F+((l&g|d&~g)+c[3]):F+((l^(d|~g))+c[4]),F|=0,F=F<>>32-x[n],F=F+p|0,f=p,p=g,g=d<<10|d>>>22,d=l,l=F,F=y+t[e+_[n]]|0,F=16>n?F+((v^(m|~S))+w[0]):32>n?F+((v&S|m&~S)+w[1]):48>n?F+(((v|~m)^S)+w[2]):64>n?F+((v&m|~v&S)+w[3]):F+((v^m^S)+w[4]),F|=0,F=F<>>32-A[n],F=F+b|0,y=b,b=S,S=m<<10|m>>>22,m=v,v=F;F=r[1]+d+S|0,r[1]=r[2]+g+b|0,r[2]=r[3]+p+y|0,r[3]=r[4]+f+v|0,r[4]=r[0]+l+m|0,r[0]=F},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;for(e[r>>>5]|=128<<24-r%32,e[(r+64>>>9<<4)+14]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),t.sigBytes=4*(e.length+1),this._process(),t=this._hash,e=t.words,n=0;5>n;n++)r=e[n],e[n]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8);return t},clone:function(){var t=r.clone.call(this);return t._hash=this._hash.clone(),t}});t.RIPEMD160=r._createHelper(e),t.HmacRIPEMD160=r._createHmacHelper(e)}(Math),function(){var t=or,e=t.enc.Utf8;t.algo.HMAC=t.lib.Base.extend({init:function(t,n){t=this._hasher=new t.init,"string"==typeof n&&(n=e.parse(n));var r=t.blockSize,i=4*r;n.sigBytes>i&&(n=t.finalize(n)),n.clamp();for(var s=this._oKey=n.clone(),o=this._iKey=n.clone(),a=s.words,u=o.words,h=0;h>>2]>>>24-s%4*8&255;e[r+s>>>2]|=o<<24-(r+s)%4*8}else for(var s=0;s>>2]=n[s>>>2];return this.sigBytes+=i,this},clamp:function(){var e=this.words,n=this.sigBytes;e[n>>>2]&=4294967295<<32-n%4*8,e.length=t.ceil(n/4)},clone:function(){var t=i.clone.call(this);return t.words=this.words.slice(0),t},random:function(e){for(var n=[],r=0;r>>2]>>>24-i%4*8&255;r.push((s>>>4).toString(16)),r.push((15&s).toString(16))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r>>3]|=parseInt(t.substr(r,2),16)<<24-r%8*4;return new s.init(n,e/2)}},u=o.Latin1={stringify:function(t){for(var e=t.words,n=t.sigBytes,r=[],i=0;i>>2]>>>24-i%4*8&255;r.push(String.fromCharCode(s))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r>>2]|=(255&t.charCodeAt(r))<<24-r%4*8;return new s.init(n,e)}},c=o.Utf8={stringify:function(t){try{return decodeURIComponent(escape(u.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return u.parse(unescape(encodeURIComponent(t)))}},h=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=c.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,a=4*o,u=i/a;u=e?t.ceil(u):t.max((0|u)-this._minBufferSize,0);var c=u*o,h=t.min(4*c,i);if(c){for(var f=0;f>>2]}},n.BlockCipher=u.extend({cfg:u.cfg.extend({mode:c,padding:f}),reset:function(){u.reset.call(this);var t=this.cfg,e=t.iv,t=t.mode;if(this._xformMode==this._ENC_XFORM_MODE)var n=t.createEncryptor;else n=t.createDecryptor,this._minBufferSize=1;this._mode=n.call(t,this,e&&e.words)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){t.pad(this._data,this.blockSize);var e=this._process(!0)}else e=this._process(!0),t.unpad(e);return e},blockSize:4});var l=n.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}}),c=(e.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext;return t=t.salt,(t?i.create([1398893684,1701076831]).concat(t).concat(e):e).toString(o)},parse:function(t){t=o.parse(t);var e=t.words;if(1398893684==e[0]&&1701076831==e[1]){var n=i.create(e.slice(2,4));e.splice(0,4),t.sigBytes-=16}return l.create({ciphertext:t,salt:n})}},d=n.SerializableCipher=r.extend({cfg:r.extend({format:c}),encrypt:function(t,e,n,r){r=this.cfg.extend(r);var i=t.createEncryptor(n,r);return e=i.finalize(e),i=i.cfg,l.create({ciphertext:e,key:n,iv:i.iv,algorithm:t,mode:i.mode,padding:i.padding,blockSize:t.blockSize,formatter:r.format})},decrypt:function(t,e,n,r){return r=this.cfg.extend(r),e=this._parse(e,r.format),t.createDecryptor(n,r).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),e=(e.kdf={}).OpenSSL={execute:function(t,e,n,r){return r||(r=i.random(8)),t=a.create({keySize:e+n}).compute(t,r),n=i.create(t.words.slice(e),4*n),t.sigBytes=4*e,l.create({key:t,iv:n,salt:r})}},g=n.PasswordBasedCipher=d.extend({cfg:d.cfg.extend({kdf:e}),encrypt:function(t,e,n,r){return r=this.cfg.extend(r),n=r.kdf.execute(n,t.keySize,t.ivSize),r.iv=n.iv,t=d.encrypt.call(this,t,e,n.key,r),t.mixIn(n),t},decrypt:function(t,e,n,r){return r=this.cfg.extend(r),e=this._parse(e,r.format),n=r.kdf.execute(n,t.keySize,t.ivSize,e.salt),r.iv=n.iv,d.decrypt.call(this,t,e,n.key,r)}})}(),function(){for(var t=or,e=t.lib.BlockCipher,n=t.algo,r=[],i=[],s=[],o=[],a=[],u=[],c=[],h=[],f=[],l=[],d=[],g=0;256>g;g++)d[g]=128>g?g<<1:g<<1^283;for(var p=0,y=0,g=0;256>g;g++){var v=y^y<<1^y<<2^y<<3^y<<4,v=v>>>8^255&v^99;r[p]=v,i[v]=p;var m=d[p],S=d[m],b=d[S],w=257*d[v]^16843008*v;s[p]=w<<24|w>>>8,o[p]=w<<16|w>>>16,a[p]=w<<8|w>>>24,u[p]=w,w=16843009*b^65537*S^257*m^16843008*p,c[v]=w<<24|w>>>8,h[v]=w<<16|w>>>16,f[v]=w<<8|w>>>24,l[v]=w,p?(p=m^d[d[d[b^m]]],y^=d[d[y]]):p=y=1}var E=[0,1,2,4,8,16,32,64,128,27,54],n=n.AES=e.extend({_doReset:function(){for(var t=this._key,e=t.words,n=t.sigBytes/4,t=4*((this._nRounds=n+6)+1),i=this._keySchedule=[],s=0;s>>24]<<24|r[o>>>16&255]<<16|r[o>>>8&255]<<8|r[255&o]):(o=o<<8|o>>>24,o=r[o>>>24]<<24|r[o>>>16&255]<<16|r[o>>>8&255]<<8|r[255&o],o^=E[s/n|0]<<24),i[s]=i[s-n]^o}for(e=this._invKeySchedule=[],n=0;nn||4>=s?o:c[r[o>>>24]]^h[r[o>>>16&255]]^f[r[o>>>8&255]]^l[r[255&o]]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,s,o,a,u,r)},decryptBlock:function(t,e){var n=t[e+1];t[e+1]=t[e+3],t[e+3]=n,this._doCryptBlock(t,e,this._invKeySchedule,c,h,f,l,i),n=t[e+1],t[e+1]=t[e+3],t[e+3]=n},_doCryptBlock:function(t,e,n,r,i,s,o,a){for(var u=this._nRounds,c=t[e]^n[0],h=t[e+1]^n[1],f=t[e+2]^n[2],l=t[e+3]^n[3],d=4,g=1;g>>24]^i[h>>>16&255]^s[f>>>8&255]^o[255&l]^n[d++],y=r[h>>>24]^i[f>>>16&255]^s[l>>>8&255]^o[255&c]^n[d++],v=r[f>>>24]^i[l>>>16&255]^s[c>>>8&255]^o[255&h]^n[d++],l=r[l>>>24]^i[c>>>16&255]^s[h>>>8&255]^o[255&f]^n[d++],c=p,h=y,f=v;p=(a[c>>>24]<<24|a[h>>>16&255]<<16|a[f>>>8&255]<<8|a[255&l])^n[d++],y=(a[h>>>24]<<24|a[f>>>16&255]<<16|a[l>>>8&255]<<8|a[255&c])^n[d++],v=(a[f>>>24]<<24|a[l>>>16&255]<<16|a[c>>>8&255]<<8|a[255&h])^n[d++],l=(a[l>>>24]<<24|a[c>>>16&255]<<16|a[h>>>8&255]<<8|a[255&f])^n[d++],t[e]=p,t[e+1]=y,t[e+2]=v,t[e+3]=l},keySize:8});t.AES=e._createHelper(n)}(),function(){function t(t,e){var n=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=n,this._lBlock^=n<>>t^this._lBlock)&e;this._lBlock^=n,this._rBlock^=n<n;n++){var r=o[n]-1;e[n]=t[r>>>5]>>>31-r%32&1}for(t=this._subKeys=[],r=0;16>r;r++){for(var i=t[r]=[],s=u[r],n=0;24>n;n++)i[n/6|0]|=e[(a[n]-1+s)%28]<<31-n%6,i[4+(n/6|0)]|=e[28+(a[n+24]-1+s)%28]<<31-n%6;for(i[0]=i[0]<<1|i[0]>>>31,n=1;7>n;n++)i[n]>>>=4*(n-1)+3;i[7]=i[7]<<5|i[7]>>>27}for(e=this._invSubKeys=[],n=0;16>n;n++)e[n]=t[15-n]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(n,r,i){this._lBlock=n[r],this._rBlock=n[r+1],t.call(this,4,252645135),t.call(this,16,65535),e.call(this,2,858993459),e.call(this,8,16711935),t.call(this,1,1431655765);for(var s=0;16>s;s++){for(var o=i[s],a=this._lBlock,u=this._rBlock,f=0,l=0;8>l;l++)f|=c[l][((u^o[l])&h[l])>>>0];this._lBlock=u,this._rBlock=a^f}i=this._lBlock,this._lBlock=this._rBlock,this._rBlock=i,t.call(this,1,1431655765),e.call(this,8,16711935),e.call(this,2,858993459),t.call(this,16,65535),t.call(this,4,252645135),n[r]=this._lBlock,n[r+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});n.DES=r._createHelper(f),s=s.TripleDES=r.extend({_doReset:function(){var t=this._key.words;this._des1=f.createEncryptor(i.create(t.slice(0,2))),this._des2=f.createEncryptor(i.create(t.slice(2,4))),this._des3=f.createEncryptor(i.create(t.slice(4,6)))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2}),n.TripleDES=r._createHelper(s)}(),function(){var t=or,e=t.lib.WordArray;t.enc.Base64={stringify:function(t){var e=t.words,n=t.sigBytes,r=this._map;t.clamp(),t=[];for(var i=0;i>>2]>>>24-8*(i%4)&255)<<16|(e[i+1>>>2]>>>24-8*((i+1)%4)&255)<<8|e[i+2>>>2]>>>24-8*((i+2)%4)&255,o=0;4>o&&i+.75*o>>6*(3-o)&63));if(e=r.charAt(64))for(;t.length%4;)t.push(e);return t.join("")},parse:function(t){var n=t.length,r=this._map,i=r.charAt(64);i&&(i=t.indexOf(i),-1!=i&&(n=i));for(var i=[],s=0,o=0;o>>6-2*(o%4);i[s>>>2]|=(a|u)<<24-8*(s%4),s++}return e.create(i,s)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),function(t){function e(t,e,n,r,i,s,o){return t=t+(e&n|~e&r)+i+o,(t<>>32-s)+e}function n(t,e,n,r,i,s,o){return t=t+(e&r|n&~r)+i+o,(t<>>32-s)+e}function r(t,e,n,r,i,s,o){return t=t+(e^n^r)+i+o,(t<>>32-s)+e}function i(t,e,n,r,i,s,o){return t=t+(n^(e|~r))+i+o,(t<>>32-s)+e}for(var s=or,o=s.lib,a=o.WordArray,u=o.Hasher,o=s.algo,c=[],h=0;64>h;h++)c[h]=4294967296*t.abs(t.sin(h+1))|0;o=o.MD5=u.extend({_doReset:function(){this._hash=new a.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,s){for(var o=0;16>o;o++){var a=s+o,u=t[a];t[a]=16711935&(u<<8|u>>>24)|4278255360&(u<<24|u>>>8)}var o=this._hash.words,a=t[s+0],u=t[s+1],h=t[s+2],f=t[s+3],l=t[s+4],d=t[s+5],g=t[s+6],p=t[s+7],y=t[s+8],v=t[s+9],m=t[s+10],S=t[s+11],b=t[s+12],w=t[s+13],E=t[s+14],x=t[s+15],_=o[0],F=o[1],A=o[2],P=o[3],_=e(_,F,A,P,a,7,c[0]),P=e(P,_,F,A,u,12,c[1]),A=e(A,P,_,F,h,17,c[2]),F=e(F,A,P,_,f,22,c[3]),_=e(_,F,A,P,l,7,c[4]),P=e(P,_,F,A,d,12,c[5]),A=e(A,P,_,F,g,17,c[6]),F=e(F,A,P,_,p,22,c[7]),_=e(_,F,A,P,y,7,c[8]),P=e(P,_,F,A,v,12,c[9]),A=e(A,P,_,F,m,17,c[10]),F=e(F,A,P,_,S,22,c[11]),_=e(_,F,A,P,b,7,c[12]),P=e(P,_,F,A,w,12,c[13]),A=e(A,P,_,F,E,17,c[14]),F=e(F,A,P,_,x,22,c[15]),_=n(_,F,A,P,u,5,c[16]),P=n(P,_,F,A,g,9,c[17]),A=n(A,P,_,F,S,14,c[18]),F=n(F,A,P,_,a,20,c[19]),_=n(_,F,A,P,d,5,c[20]),P=n(P,_,F,A,m,9,c[21]),A=n(A,P,_,F,x,14,c[22]),F=n(F,A,P,_,l,20,c[23]),_=n(_,F,A,P,v,5,c[24]),P=n(P,_,F,A,E,9,c[25]),A=n(A,P,_,F,f,14,c[26]),F=n(F,A,P,_,y,20,c[27]),_=n(_,F,A,P,w,5,c[28]),P=n(P,_,F,A,h,9,c[29]),A=n(A,P,_,F,p,14,c[30]),F=n(F,A,P,_,b,20,c[31]),_=r(_,F,A,P,d,4,c[32]),P=r(P,_,F,A,y,11,c[33]),A=r(A,P,_,F,S,16,c[34]),F=r(F,A,P,_,E,23,c[35]),_=r(_,F,A,P,u,4,c[36]),P=r(P,_,F,A,l,11,c[37]),A=r(A,P,_,F,p,16,c[38]),F=r(F,A,P,_,m,23,c[39]),_=r(_,F,A,P,w,4,c[40]),P=r(P,_,F,A,a,11,c[41]),A=r(A,P,_,F,f,16,c[42]),F=r(F,A,P,_,g,23,c[43]),_=r(_,F,A,P,v,4,c[44]),P=r(P,_,F,A,b,11,c[45]),A=r(A,P,_,F,x,16,c[46]),F=r(F,A,P,_,h,23,c[47]),_=i(_,F,A,P,a,6,c[48]),P=i(P,_,F,A,p,10,c[49]),A=i(A,P,_,F,E,15,c[50]),F=i(F,A,P,_,d,21,c[51]),_=i(_,F,A,P,b,6,c[52]),P=i(P,_,F,A,f,10,c[53]),A=i(A,P,_,F,m,15,c[54]),F=i(F,A,P,_,u,21,c[55]),_=i(_,F,A,P,y,6,c[56]),P=i(P,_,F,A,x,10,c[57]),A=i(A,P,_,F,g,15,c[58]),F=i(F,A,P,_,w,21,c[59]),_=i(_,F,A,P,l,6,c[60]),P=i(P,_,F,A,S,10,c[61]),A=i(A,P,_,F,h,15,c[62]),F=i(F,A,P,_,v,21,c[63]);o[0]=o[0]+_|0,o[1]=o[1]+F|0,o[2]=o[2]+A|0,o[3]=o[3]+P|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;n[i>>>5]|=128<<24-i%32;var s=t.floor(r/4294967296);for(n[(i+64>>>9<<4)+15]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),n[(i+64>>>9<<4)+14]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),e.sigBytes=4*(n.length+1),this._process(),e=this._hash,n=e.words,r=0;4>r;r++)i=n[r],n[r]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8);return e},clone:function(){var t=u.clone.call(this);return t._hash=this._hash.clone(),t}}),s.MD5=u._createHelper(o),s.HmacMD5=u._createHmacHelper(o)}(Math),function(){var t=or,e=t.lib,n=e.WordArray,r=e.Hasher,i=[],e=t.algo.SHA1=r.extend({_doReset:function(){this._hash=new n.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],s=n[1],o=n[2],a=n[3],u=n[4],c=0;80>c;c++){if(16>c)i[c]=0|t[e+c];else{var h=i[c-3]^i[c-8]^i[c-14]^i[c-16];i[c]=h<<1|h>>>31}h=(r<<5|r>>>27)+u+i[c],h=20>c?h+((s&o|~s&a)+1518500249):40>c?h+((s^o^a)+1859775393):60>c?h+((s&o|s&a|o&a)-1894007588):h+((s^o^a)-899497514),u=a,a=o,o=s<<30|s>>>2,s=r,r=h}n[0]=n[0]+r|0,n[1]=n[1]+s|0,n[2]=n[2]+o|0,n[3]=n[3]+a|0,n[4]=n[4]+u|0},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;return e[r>>>5]|=128<<24-r%32,e[(r+64>>>9<<4)+14]=Math.floor(n/4294967296),e[(r+64>>>9<<4)+15]=n,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=r.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA1=r._createHelper(e),t.HmacSHA1=r._createHmacHelper(e)}(),function(t){for(var e=or,n=e.lib,r=n.WordArray,i=n.Hasher,n=e.algo,s=[],o=[],a=function(t){return 4294967296*(t-(0|t))|0},u=2,c=0;64>c;){var h;t:{h=u;for(var f=t.sqrt(h),l=2;l<=f;l++)if(!(h%l)){h=!1;break t}h=!0}h&&(8>c&&(s[c]=a(t.pow(u,.5))),o[c]=a(t.pow(u,1/3)),c++),u++}var d=[],n=n.SHA256=i.extend({_doReset:function(){this._hash=new r.init(s.slice(0))},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],i=n[1],s=n[2],a=n[3],u=n[4],c=n[5],h=n[6],f=n[7],l=0;64>l;l++){if(16>l)d[l]=0|t[e+l];else{var g=d[l-15],p=d[l-2];d[l]=((g<<25|g>>>7)^(g<<14|g>>>18)^g>>>3)+d[l-7]+((p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10)+d[l-16]}g=f+((u<<26|u>>>6)^(u<<21|u>>>11)^(u<<7|u>>>25))+(u&c^~u&h)+o[l]+d[l],p=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&i^r&s^i&s),f=h,h=c,c=u,u=a+g|0,a=s,s=i,i=r,r=g+p|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+s|0,n[3]=n[3]+a|0,n[4]=n[4]+u|0,n[5]=n[5]+c|0,n[6]=n[6]+h|0,n[7]=n[7]+f|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;return n[i>>>5]|=128<<24-i%32,n[(i+64>>>9<<4)+14]=t.floor(r/4294967296),n[(i+64>>>9<<4)+15]=r,e.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});e.SHA256=i._createHelper(n),e.HmacSHA256=i._createHmacHelper(n)}(Math),function(){var t=or,e=t.lib.WordArray,n=t.algo,r=n.SHA256,n=n.SHA224=r.extend({_doReset:function(){this._hash=new e.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=r._doFinalize.call(this);return t.sigBytes-=4,t}});t.SHA224=r._createHelper(n),t.HmacSHA224=r._createHmacHelper(n)}(),function(){function t(){return i.create.apply(i,arguments)}for(var e=or,n=e.lib.Hasher,r=e.x64,i=r.Word,s=r.WordArray,r=e.algo,o=[t(1116352408,3609767458),t(1899447441,602891725),t(3049323471,3964484399),t(3921009573,2173295548),t(961987163,4081628472),t(1508970993,3053834265),t(2453635748,2937671579),t(2870763221,3664609560),t(3624381080,2734883394),t(310598401,1164996542),t(607225278,1323610764),t(1426881987,3590304994),t(1925078388,4068182383),t(2162078206,991336113),t(2614888103,633803317),t(3248222580,3479774868),t(3835390401,2666613458),t(4022224774,944711139),t(264347078,2341262773),t(604807628,2007800933),t(770255983,1495990901),t(1249150122,1856431235),t(1555081692,3175218132),t(1996064986,2198950837),t(2554220882,3999719339),t(2821834349,766784016),t(2952996808,2566594879),t(3210313671,3203337956),t(3336571891,1034457026),t(3584528711,2466948901),t(113926993,3758326383),t(338241895,168717936),t(666307205,1188179964),t(773529912,1546045734),t(1294757372,1522805485),t(1396182291,2643833823),t(1695183700,2343527390),t(1986661051,1014477480),t(2177026350,1206759142),t(2456956037,344077627),t(2730485921,1290863460),t(2820302411,3158454273),t(3259730800,3505952657),t(3345764771,106217008),t(3516065817,3606008344),t(3600352804,1432725776),t(4094571909,1467031594),t(275423344,851169720),t(430227734,3100823752),t(506948616,1363258195),t(659060556,3750685593),t(883997877,3785050280),t(958139571,3318307427),t(1322822218,3812723403),t(1537002063,2003034995),t(1747873779,3602036899),t(1955562222,1575990012),t(2024104815,1125592928),t(2227730452,2716904306),t(2361852424,442776044),t(2428436474,593698344),t(2756734187,3733110249),t(3204031479,2999351573),t(3329325298,3815920427),t(3391569614,3928383900),t(3515267271,566280711),t(3940187606,3454069534),t(4118630271,4000239992),t(116418474,1914138554),t(174292421,2731055270),t(289380356,3203993006),t(460393269,320620315),t(685471733,587496836),t(852142971,1086792851),t(1017036298,365543100),t(1126000580,2618297676),t(1288033470,3409855158),t(1501505948,4234509866),t(1607167915,987167468),t(1816402316,1246189591)],a=[],u=0;80>u;u++)a[u]=t();r=r.SHA512=n.extend({_doReset:function(){this._hash=new s.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],i=n[1],s=n[2],u=n[3],c=n[4],h=n[5],f=n[6],n=n[7],l=r.high,d=r.low,g=i.high,p=i.low,y=s.high,v=s.low,m=u.high,S=u.low,b=c.high,w=c.low,E=h.high,x=h.low,_=f.high,F=f.low,A=n.high,P=n.low,O=l,C=d,H=g,j=p,T=y,D=v,I=m,R=S,k=b,N=w,B=E,V=x,M=_,K=F,L=A,U=P,q=0;80>q;q++){var W=a[q];if(16>q)var J=W.high=0|t[e+2*q],z=W.low=0|t[e+2*q+1];else{var J=a[q-15],z=J.high,G=J.low,J=(z>>>1|G<<31)^(z>>>8|G<<24)^z>>>7,G=(G>>>1|z<<31)^(G>>>8|z<<24)^(G>>>7|z<<25),Y=a[q-2],z=Y.high,X=Y.low,Y=(z>>>19|X<<13)^(z<<3|X>>>29)^z>>>6,X=(X>>>19|z<<13)^(X<<3|z>>>29)^(X>>>6|z<<26),z=a[q-7],$=z.high,Q=a[q-16],Z=Q.high,Q=Q.low,z=G+z.low,J=J+$+(z>>>0>>0?1:0),z=z+X,J=J+Y+(z>>>0>>0?1:0),z=z+Q,J=J+Z+(z>>>0>>0?1:0);W.high=J,W.low=z}var $=k&B^~k&M,Q=N&V^~N&K,W=O&H^O&T^H&T,tt=C&j^C&D^j&D,G=(O>>>28|C<<4)^(O<<30|C>>>2)^(O<<25|C>>>7),Y=(C>>>28|O<<4)^(C<<30|O>>>2)^(C<<25|O>>>7),X=o[q],et=X.high,nt=X.low,X=U+((N>>>14|k<<18)^(N>>>18|k<<14)^(N<<23|k>>>9)),Z=L+((k>>>14|N<<18)^(k>>>18|N<<14)^(k<<23|N>>>9))+(X>>>0>>0?1:0),X=X+Q,Z=Z+$+(X>>>0>>0?1:0),X=X+nt,Z=Z+et+(X>>>0>>0?1:0),X=X+z,Z=Z+J+(X>>>0>>0?1:0),z=Y+tt,W=G+W+(z>>>0>>0?1:0),L=M,U=K,M=B,K=V,B=k,V=N,N=R+X|0,k=I+Z+(N>>>0>>0?1:0)|0,I=T,R=D,T=H,D=j,H=O,j=C,C=X+z|0,O=Z+W+(C>>>0>>0?1:0)|0}d=r.low=d+C,r.high=l+O+(d>>>0>>0?1:0),p=i.low=p+j,i.high=g+H+(p>>>0>>0?1:0),v=s.low=v+D,s.high=y+T+(v>>>0>>0?1:0),S=u.low=S+R,u.high=m+I+(S>>>0>>0?1:0),w=c.low=w+N,c.high=b+k+(w>>>0>>0?1:0),x=h.low=x+V,h.high=E+B+(x>>>0>>0?1:0),F=f.low=F+K,f.high=_+M+(F>>>0>>0?1:0),P=n.low=P+U,n.high=A+L+(P>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;return e[r>>>5]|=128<<24-r%32,e[(r+128>>>10<<5)+30]=Math.floor(n/4294967296),e[(r+128>>>10<<5)+31]=n,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=n.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32}),e.SHA512=n._createHelper(r),e.HmacSHA512=n._createHmacHelper(r)}(),function(){var t=or,e=t.x64,n=e.Word,r=e.WordArray,e=t.algo,i=e.SHA512,e=e.SHA384=i.extend({_doReset:function(){this._hash=new r.init([new n.init(3418070365,3238371032),new n.init(1654270250,914150663),new n.init(2438529370,812702999),new n.init(355462360,4144912697),new n.init(1731405415,4290775857),new n.init(2394180231,1750603025),new n.init(3675008525,1694076839),new n.init(1203062813,3204075428)])},_doFinalize:function(){var t=i._doFinalize.call(this);return t.sigBytes-=16,t}});t.SHA384=i._createHelper(e),t.HmacSHA384=i._createHmacHelper(e)}(),function(){var t=or,e=t.lib,n=e.WordArray,r=e.Hasher,e=t.algo,i=n.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),s=n.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),o=n.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),a=n.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),u=n.create([0,1518500249,1859775393,2400959708,2840853838]),c=n.create([1352829926,1548603684,1836072691,2053994217,0]),e=e.RIPEMD160=r.extend({_doReset:function(){this._hash=n.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var n=0;16>n;n++){var r=e+n,h=t[r]; +t[r]=16711935&(h<<8|h>>>24)|4278255360&(h<<24|h>>>8)}var f,l,d,g,p,y,v,m,S,b,r=this._hash.words,h=u.words,w=c.words,E=i.words,x=s.words,_=o.words,F=a.words;y=f=r[0],v=l=r[1],m=d=r[2],S=g=r[3],b=p=r[4];for(var A,n=0;80>n;n+=1)A=f+t[e+E[n]]|0,A=16>n?A+((l^d^g)+h[0]):32>n?A+((l&d|~l&g)+h[1]):48>n?A+(((l|~d)^g)+h[2]):64>n?A+((l&g|d&~g)+h[3]):A+((l^(d|~g))+h[4]),A|=0,A=A<<_[n]|A>>>32-_[n],A=A+p|0,f=p,p=g,g=d<<10|d>>>22,d=l,l=A,A=y+t[e+x[n]]|0,A=16>n?A+((v^(m|~S))+w[0]):32>n?A+((v&S|m&~S)+w[1]):48>n?A+(((v|~m)^S)+w[2]):64>n?A+((v&m|~v&S)+w[3]):A+((v^m^S)+w[4]),A|=0,A=A<>>32-F[n],A=A+b|0,y=b,b=S,S=m<<10|m>>>22,m=v,v=A;A=r[1]+d+S|0,r[1]=r[2]+g+b|0,r[2]=r[3]+p+y|0,r[3]=r[4]+f+v|0,r[4]=r[0]+l+m|0,r[0]=A},_doFinalize:function(){var t=this._data,e=t.words,n=8*this._nDataBytes,r=8*t.sigBytes;for(e[r>>>5]|=128<<24-r%32,e[(r+64>>>9<<4)+14]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),t.sigBytes=4*(e.length+1),this._process(),t=this._hash,e=t.words,n=0;5>n;n++)r=e[n],e[n]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8);return t},clone:function(){var t=r.clone.call(this);return t._hash=this._hash.clone(),t}});t.RIPEMD160=r._createHelper(e),t.HmacRIPEMD160=r._createHmacHelper(e)}(Math),function(){var t=or,e=t.enc.Utf8;t.algo.HMAC=t.lib.Base.extend({init:function(t,n){t=this._hasher=new t.init,"string"==typeof n&&(n=e.parse(n));var r=t.blockSize,i=4*r;n.sigBytes>i&&(n=t.finalize(n)),n.clamp();for(var s=this._oKey=n.clone(),o=this._iKey=n.clone(),a=s.words,u=o.words,c=0;c>>8,br[wr++]=255&_r;wr=0,he()}le.prototype.nextBytes=fe;var Fr=20;ve.prototype.doPublic=Se,ve.prototype.setPublic=me,ve.prototype.encrypt=be,ve.prototype.encryptOAEP=we,ve.prototype.type="RSA";var Fr=20;ve.prototype.doPrivate=Oe,ve.prototype.setPrivate=Ae,ve.prototype.setPrivateEx=Fe,ve.prototype.generate=Pe,ve.prototype.decrypt=Ce,ve.prototype.decryptOAEP=Te,De.prototype.equals=Re,De.prototype.toBigInteger=je,De.prototype.negate=He,De.prototype.add=Ie,De.prototype.subtract=ke,De.prototype.multiply=Be,De.prototype.square=Ne,De.prototype.divide=Ve,Me.prototype.getX=Ke,Me.prototype.getY=Le,Me.prototype.equals=Ue,Me.prototype.isInfinity=qe,Me.prototype.negate=We,Me.prototype.add=Je,Me.prototype.twice=ze,Me.prototype.multiply=Ye,Me.prototype.multiplyTwo=Ge,Xe.prototype.getQ=$e,Xe.prototype.getA=Qe,Xe.prototype.getB=Ze,Xe.prototype.equals=tn,Xe.prototype.getInfinity=en,Xe.prototype.fromBigInteger=nn,Xe.prototype.decodePointHex=rn,/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib +var ar,ur="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",cr="=",hr=0xdeadbeefcafe,fr=15715070==(16777215&hr);fr&&"Microsoft Internet Explorer"==rr.appName?(o.prototype.am=c,ar=30):fr&&"Netscape"!=rr.appName?(o.prototype.am=u,ar=26):(o.prototype.am=h,ar=28),o.prototype.DB=ar,o.prototype.DM=(1<>>8,br[wr++]=255&xr;wr=0,ce()}le.prototype.nextBytes=fe;var Ar=20;ve.prototype.doPublic=Se,ve.prototype.setPublic=me,ve.prototype.encrypt=be,ve.prototype.encryptOAEP=we,ve.prototype.type="RSA";var Ar=20;ve.prototype.doPrivate=Oe,ve.prototype.setPrivate=Fe,ve.prototype.setPrivateEx=Ae,ve.prototype.generate=Pe,ve.prototype.decrypt=Ce,ve.prototype.decryptOAEP=He,je.prototype.equals=Te,je.prototype.toBigInteger=De,je.prototype.negate=Ie,je.prototype.add=Re,je.prototype.subtract=ke,je.prototype.multiply=Ne,je.prototype.square=Be,je.prototype.divide=Ve,Me.prototype.getX=Ke,Me.prototype.getY=Le,Me.prototype.equals=Ue,Me.prototype.isInfinity=qe,Me.prototype.negate=We,Me.prototype.add=Je,Me.prototype.twice=ze,Me.prototype.multiply=Ge,Me.prototype.multiplyTwo=Ye,Xe.prototype.getQ=$e,Xe.prototype.getA=Qe,Xe.prototype.getB=Ze,Xe.prototype.equals=tn,Xe.prototype.getInfinity=en,Xe.prototype.fromBigInteger=nn,Xe.prototype.decodePointHex=rn,/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib */ -De.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)},Me.prototype.getEncoded=function(t){var e=function(t,e){var n=t.toByteArrayUnsigned();if(en.length;)n.unshift(0);return n},n=this.getX().toBigInteger(),r=this.getY().toBigInteger(),i=e(n,32);return t?r.isEven()?i.unshift(2):i.unshift(3):(i.unshift(4),i=i.concat(e(r,32))),i},Me.decodeFrom=function(t,e){var n=(e[0],e.length-1),r=e.slice(1,1+n/2),i=e.slice(1+n/2,1+n);r.unshift(0),i.unshift(0);var s=new o(r),a=new o(i);return new Me(t,t.fromBigInteger(s),t.fromBigInteger(a))},Me.decodeFromHex=function(t,e){var n=(e.substr(0,2),e.length-2),r=e.substr(2,n/2),i=e.substr(2+n/2,n/2),s=new o(r,16),a=new o(i,16);return new Me(t,t.fromBigInteger(s),t.fromBigInteger(a))},Me.prototype.add2D=function(t){if(this.isInfinity())return t;if(t.isInfinity())return this;if(this.x.equals(t.x))return this.y.equals(t.y)?this.twice():this.curve.getInfinity();var e=t.x.subtract(this.x),n=t.y.subtract(this.y),r=n.divide(e),i=r.square().subtract(this.x).subtract(t.x),s=r.multiply(this.x.subtract(i)).subtract(this.y);return new Me(this.curve,i,s)},Me.prototype.twice2D=function(){if(this.isInfinity())return this;if(0==this.y.toBigInteger().signum())return this.curve.getInfinity();var t=this.curve.fromBigInteger(o.valueOf(2)),e=this.curve.fromBigInteger(o.valueOf(3)),n=this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(t)),r=n.square().subtract(this.x.multiply(t)),i=n.multiply(this.x.subtract(r)).subtract(this.y);return new Me(this.curve,r,i)},Me.prototype.multiply2D=function(t){if(this.isInfinity())return this;if(0==t.signum())return this.curve.getInfinity();var e,n=t,r=n.multiply(new o("3")),i=this.negate(),s=this;for(e=r.bitLength()-2;e>0;--e){s=s.twice();var a=r.testBit(e),u=n.testBit(e);a!=u&&(s=s.add2D(a?this:i))}return s},Me.prototype.isOnCurve=function(){var t=this.getX().toBigInteger(),e=this.getY().toBigInteger(),n=this.curve.getA().toBigInteger(),r=this.curve.getB().toBigInteger(),i=this.curve.getQ(),s=e.multiply(e).mod(i),o=t.multiply(t).multiply(t).add(n.multiply(t)).add(r).mod(i);return s.equals(o)},Me.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"},Me.prototype.validate=function(){var t=this.curve.getQ();if(this.isInfinity())throw new Error("Point is at infinity.");var e=this.getX().toBigInteger(),n=this.getY().toBigInteger();if(e.compareTo(o.ONE)<0||e.compareTo(t.subtract(o.ONE))>0)throw new Error("x coordinate out of bounds");if(n.compareTo(o.ONE)<0||n.compareTo(t.subtract(o.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(t).isInfinity())throw new Error("Point is not a scalar multiple of G.");return!0};/*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval +je.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)},Me.prototype.getEncoded=function(t){var e=function(t,e){var n=t.toByteArrayUnsigned();if(en.length;)n.unshift(0);return n},n=this.getX().toBigInteger(),r=this.getY().toBigInteger(),i=e(n,32);return t?r.isEven()?i.unshift(2):i.unshift(3):(i.unshift(4),i=i.concat(e(r,32))),i},Me.decodeFrom=function(t,e){var n=(e[0],e.length-1),r=e.slice(1,1+n/2),i=e.slice(1+n/2,1+n);r.unshift(0),i.unshift(0);var s=new o(r),a=new o(i);return new Me(t,t.fromBigInteger(s),t.fromBigInteger(a))},Me.decodeFromHex=function(t,e){var n=(e.substr(0,2),e.length-2),r=e.substr(2,n/2),i=e.substr(2+n/2,n/2),s=new o(r,16),a=new o(i,16);return new Me(t,t.fromBigInteger(s),t.fromBigInteger(a))},Me.prototype.add2D=function(t){if(this.isInfinity())return t;if(t.isInfinity())return this;if(this.x.equals(t.x))return this.y.equals(t.y)?this.twice():this.curve.getInfinity();var e=t.x.subtract(this.x),n=t.y.subtract(this.y),r=n.divide(e),i=r.square().subtract(this.x).subtract(t.x),s=r.multiply(this.x.subtract(i)).subtract(this.y);return new Me(this.curve,i,s)},Me.prototype.twice2D=function(){if(this.isInfinity())return this;if(0==this.y.toBigInteger().signum())return this.curve.getInfinity();var t=this.curve.fromBigInteger(o.valueOf(2)),e=this.curve.fromBigInteger(o.valueOf(3)),n=this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(t)),r=n.square().subtract(this.x.multiply(t)),i=n.multiply(this.x.subtract(r)).subtract(this.y);return new Me(this.curve,r,i)},Me.prototype.multiply2D=function(t){if(this.isInfinity())return this;if(0==t.signum())return this.curve.getInfinity();var e,n=t,r=n.multiply(new o("3")),i=this.negate(),s=this;for(e=r.bitLength()-2;e>0;--e){s=s.twice();var a=r.testBit(e),u=n.testBit(e);a!=u&&(s=s.add2D(a?this:i))}return s},Me.prototype.isOnCurve=function(){var t=this.getX().toBigInteger(),e=this.getY().toBigInteger(),n=this.curve.getA().toBigInteger(),r=this.curve.getB().toBigInteger(),i=this.curve.getQ(),s=e.multiply(e).mod(i),o=t.multiply(t).multiply(t).add(n.multiply(t)).add(r).mod(i);return s.equals(o)},Me.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"},Me.prototype.validate=function(){var t=this.curve.getQ();if(this.isInfinity())throw new Error("Point is at infinity.");var e=this.getX().toBigInteger(),n=this.getY().toBigInteger();if(e.compareTo(o.ONE)<0||e.compareTo(t.subtract(o.ONE))>0)throw new Error("x coordinate out of bounds");if(n.compareTo(o.ONE)<0||n.compareTo(t.subtract(o.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(t).isInfinity())throw new Error("Point is not a scalar multiple of G.");return!0};/*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval */ -var Pr=function(){function t(t,e,n){return e?o[e]:String.fromCharCode(parseInt(n,16))}var e="(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)",n='(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))',r='(?:"'+n+'*")',i=new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|"+e+"|"+r+")","g"),s=new RegExp("\\\\(?:([^u])|u(.{4}))","g"),o={'"':'"',"/":"/","\\":"\\",b:"\b",f:"\f",n:"\n",r:"\r",t:"\t"},a=new String(""),u="\\",h=({"{":Object,"[":Array},Object.hasOwnProperty);return function(e,n){var r,o=e.match(i),c=o[0],f=!1;"{"===c?r={}:"["===c?r=[]:(r=[],f=!0);for(var l,d=[r],g=1-f,p=o.length;g=0;)delete r[i[a]]}return n.call(t,e,r)};r=v({"":r},"")}return r}}();/*! asn1-1.0.10.js (c) 2013-2016 Kenji Urushima | kjur.github.com/jsrsasign/license +var Pr=function(){function t(t,e,n){return e?o[e]:String.fromCharCode(parseInt(n,16))}var e="(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)",n='(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))',r='(?:"'+n+'*")',i=new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|"+e+"|"+r+")","g"),s=new RegExp("\\\\(?:([^u])|u(.{4}))","g"),o={'"':'"',"/":"/","\\":"\\",b:"\b",f:"\f",n:"\n",r:"\r",t:"\t"},a=new String(""),u="\\",c=({"{":Object,"[":Array},Object.hasOwnProperty);return function(e,n){var r,o=e.match(i),h=o[0],f=!1;"{"===h?r={}:"["===h?r=[]:(r=[],f=!0);for(var l,d=[r],g=1-f,p=o.length;g=0;)delete r[i[a]]}return n.call(t,e,r)};r=v({"":r},"")}return r}}();/*! asn1-1.0.10.js (c) 2013-2016 Kenji Urushima | kjur.github.com/jsrsasign/license */ -"undefined"!=typeof Cr&&Cr||(Cr={}),"undefined"!=typeof Cr.asn1&&Cr.asn1||(Cr.asn1={}),Cr.asn1.ASN1Util=new function(){this.integerToByteHex=function(t){var e=t.toString(16);return e.length%2==1&&(e="0"+e),e},this.bigIntToMinTwosComplementsHex=function(t){var e=t.toString(16);if("-"!=e.substr(0,1))e.length%2==1?e="0"+e:e.match(/^[0-7]/)||(e="00"+e);else{var n=e.substr(1),r=n.length;r%2==1?r+=1:e.match(/^[0-7]/)||(r+=2);for(var i="",s=0;s15)throw"ASN.1 length too long to represent by 8x: n = "+e.toString(16);var i=128+r;return i.toString(16)+n},this.getEncodedHex=function(){return(null==this.hTLV||this.isModified)&&(this.hV=this.getFreshValueHex(),this.hL=this.getLengthHexFromValue(),this.hTLV=this.hT+this.hL+this.hV,this.isModified=!1),this.hTLV},this.getValueHex=function(){return this.getEncodedHex(),this.hV},this.getFreshValueHex=function(){return""}},Cr.asn1.DERAbstractString=function(t){Cr.asn1.DERAbstractString.superclass.constructor.call(this);this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=un(this.s)},this.setStringHex=function(t){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("string"==typeof t?this.setString(t):"undefined"!=typeof t.str?this.setString(t.str):"undefined"!=typeof t.hex&&this.setStringHex(t.hex))},sr.lang.extend(Cr.asn1.DERAbstractString,Cr.asn1.ASN1Object),Cr.asn1.DERAbstractTime=function(t){Cr.asn1.DERAbstractTime.superclass.constructor.call(this);this.localDateToUTC=function(t){utc=t.getTime()+6e4*t.getTimezoneOffset();var e=new Date(utc);return e},this.formatDate=function(t,e,n){var r=this.zeroPadding,i=this.localDateToUTC(t),s=String(i.getFullYear());"utc"==e&&(s=s.substr(2,2));var o=r(String(i.getMonth()+1),2),a=r(String(i.getDate()),2),u=r(String(i.getHours()),2),h=r(String(i.getMinutes()),2),c=r(String(i.getSeconds()),2),f=s+o+a+u+h+c;if(n===!0){var l=i.getMilliseconds();if(0!=l){var d=r(String(l),3);d=d.replace(/[0]+$/,""),f=f+"."+d}}return f+"Z"},this.zeroPadding=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=un(t)},this.setByDateValue=function(t,e,n,r,i,s){var o=new Date(Date.UTC(t,e-1,n,r,i,s,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},sr.lang.extend(Cr.asn1.DERAbstractTime,Cr.asn1.ASN1Object),Cr.asn1.DERAbstractStructured=function(t){Cr.asn1.DERAbstractString.superclass.constructor.call(this);this.setByASN1ObjectArray=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array=t},this.appendASN1Object=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array.push(t)},this.asn1Array=new Array,"undefined"!=typeof t&&"undefined"!=typeof t.array&&(this.asn1Array=t.array)},sr.lang.extend(Cr.asn1.DERAbstractStructured,Cr.asn1.ASN1Object),Cr.asn1.DERBoolean=function(){Cr.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},sr.lang.extend(Cr.asn1.DERBoolean,Cr.asn1.ASN1Object),Cr.asn1.DERInteger=function(t){Cr.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=Cr.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new o(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("undefined"!=typeof t.bigint?this.setByBigInteger(t.bigint):"undefined"!=typeof t.int?this.setByInteger(t.int):"number"==typeof t?this.setByInteger(t):"undefined"!=typeof t.hex&&this.setValueHex(t.hex))},sr.lang.extend(Cr.asn1.DERInteger,Cr.asn1.ASN1Object),Cr.asn1.DERBitString=function(t){Cr.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(t){this.hTLV=null,this.isModified=!0,this.hV=t},this.setUnusedBitsAndHexValue=function(t,e){if(t<0||715)throw"ASN.1 length too long to represent by 8x: n = "+e.toString(16);var i=128+r;return i.toString(16)+n},this.getEncodedHex=function(){return(null==this.hTLV||this.isModified)&&(this.hV=this.getFreshValueHex(),this.hL=this.getLengthHexFromValue(),this.hTLV=this.hT+this.hL+this.hV,this.isModified=!1),this.hTLV},this.getValueHex=function(){return this.getEncodedHex(),this.hV},this.getFreshValueHex=function(){return""}},Cr.asn1.DERAbstractString=function(t){Cr.asn1.DERAbstractString.superclass.constructor.call(this);this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=un(this.s)},this.setStringHex=function(t){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("string"==typeof t?this.setString(t):"undefined"!=typeof t.str?this.setString(t.str):"undefined"!=typeof t.hex&&this.setStringHex(t.hex))},sr.lang.extend(Cr.asn1.DERAbstractString,Cr.asn1.ASN1Object),Cr.asn1.DERAbstractTime=function(t){Cr.asn1.DERAbstractTime.superclass.constructor.call(this);this.localDateToUTC=function(t){utc=t.getTime()+6e4*t.getTimezoneOffset();var e=new Date(utc);return e},this.formatDate=function(t,e,n){var r=this.zeroPadding,i=this.localDateToUTC(t),s=String(i.getFullYear());"utc"==e&&(s=s.substr(2,2));var o=r(String(i.getMonth()+1),2),a=r(String(i.getDate()),2),u=r(String(i.getHours()),2),c=r(String(i.getMinutes()),2),h=r(String(i.getSeconds()),2),f=s+o+a+u+c+h;if(n===!0){var l=i.getMilliseconds();if(0!=l){var d=r(String(l),3);d=d.replace(/[0]+$/,""),f=f+"."+d}}return f+"Z"},this.zeroPadding=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=un(t)},this.setByDateValue=function(t,e,n,r,i,s){var o=new Date(Date.UTC(t,e-1,n,r,i,s,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},sr.lang.extend(Cr.asn1.DERAbstractTime,Cr.asn1.ASN1Object),Cr.asn1.DERAbstractStructured=function(t){Cr.asn1.DERAbstractString.superclass.constructor.call(this);this.setByASN1ObjectArray=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array=t},this.appendASN1Object=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array.push(t)},this.asn1Array=new Array,"undefined"!=typeof t&&"undefined"!=typeof t.array&&(this.asn1Array=t.array)},sr.lang.extend(Cr.asn1.DERAbstractStructured,Cr.asn1.ASN1Object),Cr.asn1.DERBoolean=function(){Cr.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},sr.lang.extend(Cr.asn1.DERBoolean,Cr.asn1.ASN1Object),Cr.asn1.DERInteger=function(t){Cr.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=Cr.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new o(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("undefined"!=typeof t.bigint?this.setByBigInteger(t.bigint):"undefined"!=typeof t.int?this.setByInteger(t.int):"number"==typeof t?this.setByInteger(t):"undefined"!=typeof t.hex&&this.setValueHex(t.hex))},sr.lang.extend(Cr.asn1.DERInteger,Cr.asn1.ASN1Object),Cr.asn1.DERBitString=function(t){Cr.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(t){this.hTLV=null,this.isModified=!0,this.hV=t},this.setUnusedBitsAndHexValue=function(t,e){if(t<0||7=2*i)break;if(o>=200)break;n.push(a),s=a,o++}return n},this.getNthChildIndex_AtObj=function(t,e,n){var r=this.getPosArrayOfChildren_AtObj(t,e);return r[n]},this.getDecendantIndexByNthList=function(t,e,n){if(0==n.length)return e;var r=n.shift(),i=this.getPosArrayOfChildren_AtObj(t,e);return this.getDecendantIndexByNthList(t,i[r],n)},this.getDecendantHexTLVByNthList=function(t,e,n){var r=this.getDecendantIndexByNthList(t,e,n);return this.getHexOfTLV_AtObj(t,r)},this.getDecendantHexVByNthList=function(t,e,n){var r=this.getDecendantIndexByNthList(t,e,n);return this.getHexOfV_AtObj(t,r)}};Or.getVbyList=function(t,e,n,r){var i=this.getDecendantIndexByNthList(t,e,n);if(void 0===i)throw"can't find nthList object";if(void 0!==r&&t.substr(i,2)!=r)throw"checking tag doesn't match: "+t.substr(i,2)+"!="+r;return this.getHexOfV_AtObj(t,i)},Or.hextooidstr=function(t){var e=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},n=[],r=t.substr(0,2),i=parseInt(r,16);n[0]=new String(Math.floor(i/40)),n[1]=new String(i%40);for(var s=t.substr(2),o=[],a=0;a0&&(c=c+"."+u.join(".")),c},Or.dump=function(t,e,n,r){var i=function(t,e){if(t.length<=2*e)return t;var n=t.substr(0,e)+"..(total "+t.length/2+"bytes).."+t.substr(t.length-e,e);return n};void 0===e&&(e={ommit_long_octet:32}),void 0===n&&(n=0),void 0===r&&(r="");var s=e.ommit_long_octet;if("01"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);return"00"==o?r+"BOOLEAN FALSE\n":r+"BOOLEAN TRUE\n"}if("02"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);return r+"INTEGER "+i(o,s)+"\n"}if("03"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);return r+"BITSTRING "+i(o,s)+"\n"}if("04"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);if(Or.isASN1HEX(o)){var a=r+"OCTETSTRING, encapsulates\n";return a+=Or.dump(o,e,0,r+" ")}return r+"OCTETSTRING "+i(o,s)+"\n"}if("05"==t.substr(n,2))return r+"NULL\n";if("06"==t.substr(n,2)){var u=Or.getHexOfV_AtObj(t,n),h=Cr.asn1.ASN1Util.oidHexToInt(u),c=Cr.asn1.x509.OID.oid2name(h),f=h.replace(/\./g," ");return""!=c?r+"ObjectIdentifier "+c+" ("+f+")\n":r+"ObjectIdentifier ("+f+")\n"}if("0c"==t.substr(n,2))return r+"UTF8String '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("13"==t.substr(n,2))return r+"PrintableString '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("14"==t.substr(n,2))return r+"TeletexString '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("16"==t.substr(n,2))return r+"IA5String '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("17"==t.substr(n,2))return r+"UTCTime "+Sn(Or.getHexOfV_AtObj(t,n))+"\n";if("18"==t.substr(n,2))return r+"GeneralizedTime "+Sn(Or.getHexOfV_AtObj(t,n))+"\n";if("30"==t.substr(n,2)){if("3000"==t.substr(n,4))return r+"SEQUENCE {}\n";var a=r+"SEQUENCE\n",l=Or.getPosArrayOfChildren_AtObj(t,n),d=e;if((2==l.length||3==l.length)&&"06"==t.substr(l[0],2)&&"04"==t.substr(l[l.length-1],2)){var g=Or.getHexOfV_AtObj(t,l[0]),h=Cr.asn1.ASN1Util.oidHexToInt(g),c=Cr.asn1.x509.OID.oid2name(h),p=JSON.parse(JSON.stringify(e));p.x509ExtName=c,d=p}for(var y=0;y=2*i)break;if(o>=200)break;n.push(a),s=a,o++}return n},this.getNthChildIndex_AtObj=function(t,e,n){var r=this.getPosArrayOfChildren_AtObj(t,e);return r[n]},this.getDecendantIndexByNthList=function(t,e,n){if(0==n.length)return e;var r=n.shift(),i=this.getPosArrayOfChildren_AtObj(t,e);return this.getDecendantIndexByNthList(t,i[r],n)},this.getDecendantHexTLVByNthList=function(t,e,n){var r=this.getDecendantIndexByNthList(t,e,n);return this.getHexOfTLV_AtObj(t,r)},this.getDecendantHexVByNthList=function(t,e,n){var r=this.getDecendantIndexByNthList(t,e,n);return this.getHexOfV_AtObj(t,r)}};Or.getVbyList=function(t,e,n,r){var i=this.getDecendantIndexByNthList(t,e,n);if(void 0===i)throw"can't find nthList object";if(void 0!==r&&t.substr(i,2)!=r)throw"checking tag doesn't match: "+t.substr(i,2)+"!="+r;return this.getHexOfV_AtObj(t,i)},Or.hextooidstr=function(t){var e=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},n=[],r=t.substr(0,2),i=parseInt(r,16);n[0]=new String(Math.floor(i/40)),n[1]=new String(i%40);for(var s=t.substr(2),o=[],a=0;a0&&(h=h+"."+u.join(".")),h},Or.dump=function(t,e,n,r){var i=function(t,e){if(t.length<=2*e)return t;var n=t.substr(0,e)+"..(total "+t.length/2+"bytes).."+t.substr(t.length-e,e);return n};void 0===e&&(e={ommit_long_octet:32}),void 0===n&&(n=0),void 0===r&&(r="");var s=e.ommit_long_octet;if("01"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);return"00"==o?r+"BOOLEAN FALSE\n":r+"BOOLEAN TRUE\n"}if("02"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);return r+"INTEGER "+i(o,s)+"\n"}if("03"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);return r+"BITSTRING "+i(o,s)+"\n"}if("04"==t.substr(n,2)){var o=Or.getHexOfV_AtObj(t,n);if(Or.isASN1HEX(o)){var a=r+"OCTETSTRING, encapsulates\n";return a+=Or.dump(o,e,0,r+" ")}return r+"OCTETSTRING "+i(o,s)+"\n"}if("05"==t.substr(n,2))return r+"NULL\n";if("06"==t.substr(n,2)){var u=Or.getHexOfV_AtObj(t,n),c=Cr.asn1.ASN1Util.oidHexToInt(u),h=Cr.asn1.x509.OID.oid2name(c),f=c.replace(/\./g," ");return""!=h?r+"ObjectIdentifier "+h+" ("+f+")\n":r+"ObjectIdentifier ("+f+")\n"}if("0c"==t.substr(n,2))return r+"UTF8String '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("13"==t.substr(n,2))return r+"PrintableString '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("14"==t.substr(n,2))return r+"TeletexString '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("16"==t.substr(n,2))return r+"IA5String '"+Sn(Or.getHexOfV_AtObj(t,n))+"'\n";if("17"==t.substr(n,2))return r+"UTCTime "+Sn(Or.getHexOfV_AtObj(t,n))+"\n";if("18"==t.substr(n,2))return r+"GeneralizedTime "+Sn(Or.getHexOfV_AtObj(t,n))+"\n";if("30"==t.substr(n,2)){if("3000"==t.substr(n,4))return r+"SEQUENCE {}\n";var a=r+"SEQUENCE\n",l=Or.getPosArrayOfChildren_AtObj(t,n),d=e;if((2==l.length||3==l.length)&&"06"==t.substr(l[0],2)&&"04"==t.substr(l[l.length-1],2)){var g=Or.getHexOfV_AtObj(t,l[0]),c=Cr.asn1.ASN1Util.oidHexToInt(g),h=Cr.asn1.x509.OID.oid2name(c),p=JSON.parse(JSON.stringify(e));p.x509ExtName=h,d=p}for(var y=0;y0){var e=new Cr.asn1.DERSequence({array:this.extensionsArray}),n=new Cr.asn1.DERTaggedObject({explicit:!0,tag:"a3",obj:e});this.asn1Array.push(n)}var r=new Cr.asn1.DERSequence({array:this.asn1Array});return this.hTLV=r.getEncodedHex(),this.isModified=!1,this.hTLV},this._initialize()},sr.lang.extend(Cr.asn1.x509.TBSCertificate,Cr.asn1.ASN1Object),Cr.asn1.x509.Extension=function(t){Cr.asn1.x509.Extension.superclass.constructor.call(this);this.getEncodedHex=function(){var t=new Cr.asn1.DERObjectIdentifier({oid:this.oid}),e=new Cr.asn1.DEROctetString({hex:this.getExtnValueHex()}),n=new Array;n.push(t),this.critical&&n.push(new Cr.asn1.DERBoolean),n.push(e);var r=new Cr.asn1.DERSequence({array:n});return r.getEncodedHex()},this.critical=!1,"undefined"!=typeof t&&"undefined"!=typeof t.critical&&(this.critical=t.critical)},sr.lang.extend(Cr.asn1.x509.Extension,Cr.asn1.ASN1Object),Cr.asn1.x509.KeyUsage=function(t){Cr.asn1.x509.KeyUsage.superclass.constructor.call(this,t),this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()},this.oid="2.5.29.15","undefined"!=typeof t&&"undefined"!=typeof t.bin&&(this.asn1ExtnValue=new Cr.asn1.DERBitString(t))},sr.lang.extend(Cr.asn1.x509.KeyUsage,Cr.asn1.x509.Extension),Cr.asn1.x509.BasicConstraints=function(t){Cr.asn1.x509.BasicConstraints.superclass.constructor.call(this,t);this.getExtnValueHex=function(){var t=new Array;this.cA&&t.push(new Cr.asn1.DERBoolean),this.pathLen>-1&&t.push(new Cr.asn1.DERInteger({int:this.pathLen}));var e=new Cr.asn1.DERSequence({array:t});return this.asn1ExtnValue=e,this.asn1ExtnValue.getEncodedHex()},this.oid="2.5.29.19",this.cA=!1,this.pathLen=-1,"undefined"!=typeof t&&("undefined"!=typeof t.cA&&(this.cA=t.cA),"undefined"!=typeof t.pathLen&&(this.pathLen=t.pathLen))},sr.lang.extend(Cr.asn1.x509.BasicConstraints,Cr.asn1.x509.Extension),Cr.asn1.x509.CRLDistributionPoints=function(t){Cr.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this,t),this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()},this.setByDPArray=function(t){this.asn1ExtnValue=new Cr.asn1.DERSequence({array:t})},this.setByOneURI=function(t){var e=new Cr.asn1.x509.GeneralNames([{uri:t}]),n=new Cr.asn1.x509.DistributionPointName(e),r=new Cr.asn1.x509.DistributionPoint({dpobj:n});this.setByDPArray([r])},this.oid="2.5.29.31","undefined"!=typeof t&&("undefined"!=typeof t.array?this.setByDPArray(t.array):"undefined"!=typeof t.uri&&this.setByOneURI(t.uri))},sr.lang.extend(Cr.asn1.x509.CRLDistributionPoints,Cr.asn1.x509.Extension),Cr.asn1.x509.ExtKeyUsage=function(t){Cr.asn1.x509.ExtKeyUsage.superclass.constructor.call(this,t),this.setPurposeArray=function(t){this.asn1ExtnValue=new Cr.asn1.DERSequence;for(var e=0;e0){var t=new Cr.asn1.DERSequence({array:this.aRevokedCert});this.asn1Array.push(t)}var e=new Cr.asn1.DERSequence({array:this.asn1Array});return this.hTLV=e.getEncodedHex(),this.isModified=!1,this.hTLV},this._initialize=function(){this.asn1Version=null,this.asn1SignatureAlg=null,this.asn1Issuer=null,this.asn1ThisUpdate=null,this.asn1NextUpdate=null,this.aRevokedCert=new Array},this._initialize()},sr.lang.extend(Cr.asn1.x509.TBSCertList,Cr.asn1.ASN1Object),Cr.asn1.x509.CRLEntry=function(t){Cr.asn1.x509.CRLEntry.superclass.constructor.call(this);this.setCertSerial=function(t){this.sn=new Cr.asn1.DERInteger(t)},this.setRevocationDate=function(t){this.time=new Cr.asn1.x509.Time(t)},this.getEncodedHex=function(){var t=new Cr.asn1.DERSequence({array:[this.sn,this.time]});return this.TLV=t.getEncodedHex(),this.TLV},"undefined"!=typeof t&&("undefined"!=typeof t.time&&this.setRevocationDate(t.time),"undefined"!=typeof t.sn&&this.setCertSerial(t.sn))},sr.lang.extend(Cr.asn1.x509.CRLEntry,Cr.asn1.ASN1Object),Cr.asn1.x509.X500Name=function(t){if(Cr.asn1.x509.X500Name.superclass.constructor.call(this),this.asn1Array=new Array,this.setByString=function(t){var e=t.split("/");e.shift();for(var n=0;n0){var e=new Cr.asn1.DERSequence({array:this.extensionsArray}),n=new Cr.asn1.DERTaggedObject({explicit:!0,tag:"a3",obj:e});this.asn1Array.push(n)}var r=new Cr.asn1.DERSequence({array:this.asn1Array});return this.hTLV=r.getEncodedHex(),this.isModified=!1,this.hTLV},this._initialize()},sr.lang.extend(Cr.asn1.x509.TBSCertificate,Cr.asn1.ASN1Object),Cr.asn1.x509.Extension=function(t){Cr.asn1.x509.Extension.superclass.constructor.call(this);this.getEncodedHex=function(){var t=new Cr.asn1.DERObjectIdentifier({oid:this.oid}),e=new Cr.asn1.DEROctetString({hex:this.getExtnValueHex()}),n=new Array;n.push(t),this.critical&&n.push(new Cr.asn1.DERBoolean),n.push(e);var r=new Cr.asn1.DERSequence({array:n});return r.getEncodedHex()},this.critical=!1,"undefined"!=typeof t&&"undefined"!=typeof t.critical&&(this.critical=t.critical)},sr.lang.extend(Cr.asn1.x509.Extension,Cr.asn1.ASN1Object),Cr.asn1.x509.KeyUsage=function(t){Cr.asn1.x509.KeyUsage.superclass.constructor.call(this,t),this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()},this.oid="2.5.29.15","undefined"!=typeof t&&"undefined"!=typeof t.bin&&(this.asn1ExtnValue=new Cr.asn1.DERBitString(t))},sr.lang.extend(Cr.asn1.x509.KeyUsage,Cr.asn1.x509.Extension),Cr.asn1.x509.BasicConstraints=function(t){Cr.asn1.x509.BasicConstraints.superclass.constructor.call(this,t);this.getExtnValueHex=function(){var t=new Array;this.cA&&t.push(new Cr.asn1.DERBoolean),this.pathLen>-1&&t.push(new Cr.asn1.DERInteger({int:this.pathLen}));var e=new Cr.asn1.DERSequence({array:t});return this.asn1ExtnValue=e,this.asn1ExtnValue.getEncodedHex()},this.oid="2.5.29.19",this.cA=!1,this.pathLen=-1,"undefined"!=typeof t&&("undefined"!=typeof t.cA&&(this.cA=t.cA),"undefined"!=typeof t.pathLen&&(this.pathLen=t.pathLen))},sr.lang.extend(Cr.asn1.x509.BasicConstraints,Cr.asn1.x509.Extension),Cr.asn1.x509.CRLDistributionPoints=function(t){Cr.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this,t),this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()},this.setByDPArray=function(t){this.asn1ExtnValue=new Cr.asn1.DERSequence({array:t})},this.setByOneURI=function(t){var e=new Cr.asn1.x509.GeneralNames([{uri:t}]),n=new Cr.asn1.x509.DistributionPointName(e),r=new Cr.asn1.x509.DistributionPoint({dpobj:n});this.setByDPArray([r])},this.oid="2.5.29.31","undefined"!=typeof t&&("undefined"!=typeof t.array?this.setByDPArray(t.array):"undefined"!=typeof t.uri&&this.setByOneURI(t.uri))},sr.lang.extend(Cr.asn1.x509.CRLDistributionPoints,Cr.asn1.x509.Extension),Cr.asn1.x509.ExtKeyUsage=function(t){Cr.asn1.x509.ExtKeyUsage.superclass.constructor.call(this,t),this.setPurposeArray=function(t){this.asn1ExtnValue=new Cr.asn1.DERSequence;for(var e=0;e0){var t=new Cr.asn1.DERSequence({array:this.aRevokedCert});this.asn1Array.push(t)}var e=new Cr.asn1.DERSequence({array:this.asn1Array});return this.hTLV=e.getEncodedHex(),this.isModified=!1,this.hTLV},this._initialize=function(){this.asn1Version=null,this.asn1SignatureAlg=null,this.asn1Issuer=null,this.asn1ThisUpdate=null,this.asn1NextUpdate=null,this.aRevokedCert=new Array},this._initialize()},sr.lang.extend(Cr.asn1.x509.TBSCertList,Cr.asn1.ASN1Object),Cr.asn1.x509.CRLEntry=function(t){Cr.asn1.x509.CRLEntry.superclass.constructor.call(this);this.setCertSerial=function(t){this.sn=new Cr.asn1.DERInteger(t)},this.setRevocationDate=function(t){this.time=new Cr.asn1.x509.Time(t)},this.getEncodedHex=function(){var t=new Cr.asn1.DERSequence({array:[this.sn,this.time]});return this.TLV=t.getEncodedHex(),this.TLV},"undefined"!=typeof t&&("undefined"!=typeof t.time&&this.setRevocationDate(t.time),"undefined"!=typeof t.sn&&this.setCertSerial(t.sn))},sr.lang.extend(Cr.asn1.x509.CRLEntry,Cr.asn1.ASN1Object),Cr.asn1.x509.X500Name=function(t){if(Cr.asn1.x509.X500Name.superclass.constructor.call(this),this.asn1Array=new Array,this.setByString=function(t){var e=t.split("/");e.shift();for(var n=0;n0&&(n=new e.DERTaggedObject({obj:this.dUnsignedAttrs,tag:"a1",explicit:!1}));var r=[this.dCMSVersion,this.dSignerIdentifier,this.dDigestAlgorithm,t,this.dSigAlg,this.dSig];null!=n&&r.push(n);var i=new e.DERSequence({array:r});return this.hTLV=i.getEncodedHex(),this.hTLV}},sr.lang.extend(Cr.asn1.cms.SignerInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.EncapsulatedContentInfo=function(t){Cr.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);var e=Cr.asn1;Cr.asn1.cms,Cr.asn1.x509;this.dEContentType=new e.DERObjectIdentifier({name:"data"}),this.dEContent=null,this.isDetached=!1,this.eContentValueHex=null,this.setContentType=function(t){t.match(/^[0-2][.][0-9.]+$/)?this.dEContentType=new e.DERObjectIdentifier({oid:t}):this.dEContentType=new e.DERObjectIdentifier({name:t})},this.setContentValue=function(t){"undefined"!=typeof t&&("string"==typeof t.hex?this.eContentValueHex=t.hex:"string"==typeof t.str&&(this.eContentValueHex=mn(t.str)))},this.setContentValueHex=function(t){this.eContentValueHex=t},this.setContentValueStr=function(t){this.eContentValueHex=mn(t)},this.getEncodedHex=function(){if("string"!=typeof this.eContentValueHex)throw"eContentValue not yet set";var t=new e.DEROctetString({hex:this.eContentValueHex});this.dEContent=new e.DERTaggedObject({obj:t,tag:"a0",explicit:!0});var n=[this.dEContentType];this.isDetached||n.push(this.dEContent);var r=new e.DERSequence({array:n});return this.hTLV=r.getEncodedHex(),this.hTLV}},sr.lang.extend(Cr.asn1.cms.EncapsulatedContentInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.ContentInfo=function(t){Cr.asn1.cms.ContentInfo.superclass.constructor.call(this);var e=Cr.asn1,n=(Cr.asn1.cms,Cr.asn1.x509);this.dContentType=null,this.dContent=null,this.setContentType=function(t){"string"==typeof t&&(this.dContentType=n.OID.name2obj(t))},this.getEncodedHex=function(){var t=new e.DERTaggedObject({obj:this.dContent,tag:"a0",explicit:!0}),n=new e.DERSequence({array:[this.dContentType,t]});return this.hTLV=n.getEncodedHex(),this.hTLV},"undefined"!=typeof t&&(t.type&&this.setContentType(t.type),t.obj&&t.obj instanceof e.ASN1Object&&(this.dContent=t.obj))},sr.lang.extend(Cr.asn1.cms.ContentInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.SignedData=function(t){Cr.asn1.cms.SignedData.superclass.constructor.call(this);var e=Cr.asn1,n=Cr.asn1.cms,r=Cr.asn1.x509;this.dCMSVersion=new e.DERInteger({int:1}),this.dDigestAlgs=null,this.digestAlgNameList=[],this.dEncapContentInfo=new n.EncapsulatedContentInfo,this.dCerts=null,this.certificateList=[],this.crlList=[],this.signerInfoList=[new n.SignerInfo],this.addCertificatesByPEM=function(t){var n=Hr.getHexFromPEM(t),r=new e.ASN1Object;r.hTLV=n,this.certificateList.push(r)},this.getEncodedHex=function(){if("string"==typeof this.hTLV)return this.hTLV;if(null==this.dDigestAlgs){for(var t=[],n=0;n0){var a=new e.DERSet({array:this.certificateList});this.dCerts=new e.DERTaggedObject({obj:a,tag:"a0",explicit:!1})}null!=this.dCerts&&o.push(this.dCerts);var u=new e.DERSet({array:this.signerInfoList});o.push(u);var h=new e.DERSequence({array:o});return this.hTLV=h.getEncodedHex(),this.hTLV},this.getContentInfo=function(){this.getEncodedHex();var t=new n.ContentInfo({type:"signed-data",obj:this});return t},this.getContentInfoEncodedHex=function(){var t=this.getContentInfo(),e=t.getEncodedHex();return e},this.getPEM=function(){var t=this.getContentInfoEncodedHex(),n=e.ASN1Util.getPEMStringFromHex(t,"CMS");return n}},sr.lang.extend(Cr.asn1.cms.SignedData,Cr.asn1.ASN1Object),Cr.asn1.cms.CMSUtil=new function(){},Cr.asn1.cms.CMSUtil.newSignedData=function(t){var e=Cr.asn1.cms,n=Cr.asn1.cades,r=new e.SignedData;if(r.dEncapContentInfo.setContentValue(t.content),"object"==typeof t.certs)for(var i=0;i0&&(n=new e.DERTaggedObject({obj:this.dUnsignedAttrs,tag:"a1",explicit:!1}));var r=[this.dCMSVersion,this.dSignerIdentifier,this.dDigestAlgorithm,t,this.dSigAlg,this.dSig];null!=n&&r.push(n);var i=new e.DERSequence({array:r});return this.hTLV=i.getEncodedHex(),this.hTLV}},sr.lang.extend(Cr.asn1.cms.SignerInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.EncapsulatedContentInfo=function(t){Cr.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);var e=Cr.asn1;Cr.asn1.cms,Cr.asn1.x509;this.dEContentType=new e.DERObjectIdentifier({name:"data"}),this.dEContent=null,this.isDetached=!1,this.eContentValueHex=null,this.setContentType=function(t){t.match(/^[0-2][.][0-9.]+$/)?this.dEContentType=new e.DERObjectIdentifier({oid:t}):this.dEContentType=new e.DERObjectIdentifier({name:t})},this.setContentValue=function(t){"undefined"!=typeof t&&("string"==typeof t.hex?this.eContentValueHex=t.hex:"string"==typeof t.str&&(this.eContentValueHex=mn(t.str)))},this.setContentValueHex=function(t){this.eContentValueHex=t},this.setContentValueStr=function(t){this.eContentValueHex=mn(t)},this.getEncodedHex=function(){if("string"!=typeof this.eContentValueHex)throw"eContentValue not yet set";var t=new e.DEROctetString({hex:this.eContentValueHex});this.dEContent=new e.DERTaggedObject({obj:t,tag:"a0",explicit:!0});var n=[this.dEContentType];this.isDetached||n.push(this.dEContent);var r=new e.DERSequence({array:n});return this.hTLV=r.getEncodedHex(),this.hTLV}},sr.lang.extend(Cr.asn1.cms.EncapsulatedContentInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.ContentInfo=function(t){Cr.asn1.cms.ContentInfo.superclass.constructor.call(this);var e=Cr.asn1,n=(Cr.asn1.cms,Cr.asn1.x509);this.dContentType=null,this.dContent=null,this.setContentType=function(t){"string"==typeof t&&(this.dContentType=n.OID.name2obj(t))},this.getEncodedHex=function(){var t=new e.DERTaggedObject({obj:this.dContent,tag:"a0",explicit:!0}),n=new e.DERSequence({array:[this.dContentType,t]});return this.hTLV=n.getEncodedHex(),this.hTLV},"undefined"!=typeof t&&(t.type&&this.setContentType(t.type),t.obj&&t.obj instanceof e.ASN1Object&&(this.dContent=t.obj))},sr.lang.extend(Cr.asn1.cms.ContentInfo,Cr.asn1.ASN1Object),Cr.asn1.cms.SignedData=function(t){Cr.asn1.cms.SignedData.superclass.constructor.call(this);var e=Cr.asn1,n=Cr.asn1.cms,r=Cr.asn1.x509;this.dCMSVersion=new e.DERInteger({int:1}),this.dDigestAlgs=null,this.digestAlgNameList=[],this.dEncapContentInfo=new n.EncapsulatedContentInfo,this.dCerts=null,this.certificateList=[],this.crlList=[],this.signerInfoList=[new n.SignerInfo],this.addCertificatesByPEM=function(t){var n=Ir.getHexFromPEM(t),r=new e.ASN1Object;r.hTLV=n,this.certificateList.push(r)},this.getEncodedHex=function(){if("string"==typeof this.hTLV)return this.hTLV;if(null==this.dDigestAlgs){for(var t=[],n=0;n0){var a=new e.DERSet({array:this.certificateList});this.dCerts=new e.DERTaggedObject({obj:a,tag:"a0",explicit:!1})}null!=this.dCerts&&o.push(this.dCerts);var u=new e.DERSet({array:this.signerInfoList});o.push(u);var c=new e.DERSequence({array:o});return this.hTLV=c.getEncodedHex(),this.hTLV},this.getContentInfo=function(){this.getEncodedHex();var t=new n.ContentInfo({type:"signed-data",obj:this});return t},this.getContentInfoEncodedHex=function(){var t=this.getContentInfo(),e=t.getEncodedHex();return e},this.getPEM=function(){var t=this.getContentInfoEncodedHex(),n=e.ASN1Util.getPEMStringFromHex(t,"CMS");return n}},sr.lang.extend(Cr.asn1.cms.SignedData,Cr.asn1.ASN1Object),Cr.asn1.cms.CMSUtil=new function(){},Cr.asn1.cms.CMSUtil.newSignedData=function(t){var e=Cr.asn1.cms,n=Cr.asn1.cades,r=new e.SignedData;if(r.dEncapContentInfo.setContentValue(t.content),"object"==typeof t.certs)for(var i=0;ie.length&&(n=e.length);for(var r=0;re.length&&(n=e.length);for(var r=0;ri)throw"key is too short for SigAlg: keylen="+n+","+e;for(var s="0001",o="00"+r,a="",u=i-s.length-o.length,h=0;hi)throw"key is too short for SigAlg: keylen="+n+","+e;for(var s="0001",o="00"+r,a="",u=i-s.length-o.length,c=0;c=0)return!1;if(n.compareTo(o.ONE)<0||n.compareTo(i)>=0)return!1;var a=n.modInverse(i),u=t.multiply(a).mod(i),h=e.multiply(a).mod(i),c=s.multiply(u).add(r.multiply(h)),f=c.getX().toBigInteger().mod(i);return f.equals(e)},this.serializeSig=function(t,e){var n=t.toByteArraySigned(),r=e.toByteArraySigned(),i=[];return i.push(2),i.push(n.length),i=i.concat(n),i.push(2),i.push(r.length),i=i.concat(r),i.unshift(i.length),i.unshift(48),i},this.parseSig=function(t){var e;if(48!=t[0])throw new Error("Signature not a valid DERSequence");if(e=2,2!=t[e])throw new Error("First element in signature must be a DERInteger");var n=t.slice(e+2,e+2+t[e+1]);if(e+=2+t[e+1],2!=t[e])throw new Error("Second element in signature must be a DERInteger");var r=t.slice(e+2,e+2+t[e+1]);e+=2+t[e+1];var i=o.fromByteArrayUnsigned(n),s=o.fromByteArrayUnsigned(r);return{r:i,s:s}},this.parseSigCompact=function(t){if(65!==t.length)throw"Signature has the wrong length";var e=t[0]-27;if(e<0||e>7)throw"Invalid signature type";var n=this.ecparams.n,r=o.fromByteArrayUnsigned(t.slice(1,33)).mod(n),i=o.fromByteArrayUnsigned(t.slice(33,65)).mod(n);return{r:r,s:i,i:e}},void 0!==t&&void 0!==t.curve&&(this.curveName=t.curve),void 0===this.curveName&&(this.curveName=e),this.setNamedCurve(this.curveName),void 0!==t&&(void 0!==t.prv&&this.setPrivateKeyHex(t.prv),void 0!==t.pub&&this.setPublicKeyHex(t.pub))},Cr.crypto.ECDSA.parseSigHex=function(t){var e=Cr.crypto.ECDSA.parseSigHexInHexRS(t),n=new o(e.r,16),r=new o(e.s,16);return{r:n,s:r}},Cr.crypto.ECDSA.parseSigHexInHexRS=function(t){if("30"!=t.substr(0,2))throw"signature is not a ASN.1 sequence";var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"number of signature ASN.1 sequence elements seem wrong";var n=e[0],r=e[1];if("02"!=t.substr(n,2))throw"1st item of sequene of signature is not ASN.1 integer";if("02"!=t.substr(r,2))throw"2nd item of sequene of signature is not ASN.1 integer";var i=Or.getHexOfV_AtObj(t,n),s=Or.getHexOfV_AtObj(t,r);return{r:i,s:s}},Cr.crypto.ECDSA.asn1SigToConcatSig=function(t){var e=Cr.crypto.ECDSA.parseSigHexInHexRS(t),n=e.r,r=e.s;if("00"==n.substr(0,2)&&n.length/2*8%128==8&&(n=n.substr(2)),"00"==r.substr(0,2)&&r.length/2*8%128==8&&(r=r.substr(2)),n.length/2*8%128!=0)throw"unknown ECDSA sig r length error";if(r.length/2*8%128!=0)throw"unknown ECDSA sig s length error";return n+r},Cr.crypto.ECDSA.concatSigToASN1Sig=function(t){if(t.length/2*8%128!=0)throw"unknown ECDSA concatinated r-s sig length error";var e=t.substr(0,t.length/2),n=t.substr(t.length/2);return Cr.crypto.ECDSA.hexRSSigToASN1Sig(e,n)},Cr.crypto.ECDSA.hexRSSigToASN1Sig=function(t,e){var n=new o(t,16),r=new o(e,16);return Cr.crypto.ECDSA.biRSSigToASN1Sig(n,r)},Cr.crypto.ECDSA.biRSSigToASN1Sig=function(t,e){var n=new Cr.asn1.DERInteger({bigint:t}),r=new Cr.asn1.DERInteger({bigint:e}),i=new Cr.asn1.DERSequence({array:[n,r]});return i.getEncodedHex()},/*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license +"undefined"!=typeof Cr&&Cr||(Cr={}),"undefined"!=typeof Cr.crypto&&Cr.crypto||(Cr.crypto={}),Cr.crypto.ECDSA=function(t){var e="secp256r1",n=new le;this.type="EC",this.getBigRandom=function(t){return new o(t.bitLength(),n).mod(t.subtract(o.ONE)).add(o.ONE)},this.setNamedCurve=function(t){this.ecparams=Cr.crypto.ECParameterDB.getByName(t),this.prvKeyHex=null,this.pubKeyHex=null,this.curveName=t},this.setPrivateKeyHex=function(t){this.isPrivate=!0,this.prvKeyHex=t},this.setPublicKeyHex=function(t){this.isPublic=!0,this.pubKeyHex=t},this.getPublicKeyXYHex=function(){var t=this.pubKeyHex;if("04"!==t.substr(0,2))throw"this method supports uncompressed format(04) only";var e=this.ecparams.keylen/4;if(t.length!==2+2*e)throw"malformed public key hex length";var n={};return n.x=t.substr(2,e),n.y=t.substr(2+e),n},this.getShortNISTPCurveName=function(){var t=this.curveName;return"secp256r1"===t||"NIST P-256"===t||"P-256"===t||"prime256v1"===t?"P-256":"secp384r1"===t||"NIST P-384"===t||"P-384"===t?"P-384":null},this.generateKeyPairHex=function(){var t=this.ecparams.n,e=this.getBigRandom(t),n=this.ecparams.G.multiply(e),r=n.getX().toBigInteger(),i=n.getY().toBigInteger(),s=this.ecparams.keylen/4,o=("0000000000"+e.toString(16)).slice(-s),a=("0000000000"+r.toString(16)).slice(-s),u=("0000000000"+i.toString(16)).slice(-s),c="04"+a+u;return this.setPrivateKeyHex(o),this.setPublicKeyHex(c),{ecprvhex:o,ecpubhex:c}},this.signWithMessageHash=function(t){return this.signHex(t,this.prvKeyHex)},this.signHex=function(t,e){var n=new o(e,16),r=this.ecparams.n,i=new o(t,16);do var s=this.getBigRandom(r),a=this.ecparams.G,u=a.multiply(s),c=u.getX().toBigInteger().mod(r);while(c.compareTo(o.ZERO)<=0);var h=s.modInverse(r).multiply(i.add(n.multiply(c))).mod(r);return Cr.crypto.ECDSA.biRSSigToASN1Sig(c,h)},this.sign=function(t,e){var n=e,r=this.ecparams.n,i=o.fromByteArrayUnsigned(t);do var s=this.getBigRandom(r),a=this.ecparams.G,u=a.multiply(s),c=u.getX().toBigInteger().mod(r);while(c.compareTo(o.ZERO)<=0);var h=s.modInverse(r).multiply(i.add(n.multiply(c))).mod(r);return this.serializeSig(c,h)},this.verifyWithMessageHash=function(t,e){return this.verifyHex(t,e,this.pubKeyHex)},this.verifyHex=function(t,e,n){var r,i,s=Cr.crypto.ECDSA.parseSigHex(e);r=s.r,i=s.s;var a;a=Me.decodeFromHex(this.ecparams.curve,n);var u=new o(t,16);return this.verifyRaw(u,r,i,a)},this.verify=function(t,e,n){var r,i;if(Bitcoin.Util.isArray(e)){var s=this.parseSig(e);r=s.r,i=s.s}else{if("object"!=typeof e||!e.r||!e.s)throw"Invalid value for signature";r=e.r,i=e.s}var a;if(n instanceof Me)a=n;else{if(!Bitcoin.Util.isArray(n))throw"Invalid format for pubkey value, must be byte array or ECPointFp";a=Me.decodeFrom(this.ecparams.curve,n)}var u=o.fromByteArrayUnsigned(t);return this.verifyRaw(u,r,i,a)},this.verifyRaw=function(t,e,n,r){var i=this.ecparams.n,s=this.ecparams.G;if(e.compareTo(o.ONE)<0||e.compareTo(i)>=0)return!1;if(n.compareTo(o.ONE)<0||n.compareTo(i)>=0)return!1;var a=n.modInverse(i),u=t.multiply(a).mod(i),c=e.multiply(a).mod(i),h=s.multiply(u).add(r.multiply(c)),f=h.getX().toBigInteger().mod(i);return f.equals(e)},this.serializeSig=function(t,e){var n=t.toByteArraySigned(),r=e.toByteArraySigned(),i=[];return i.push(2),i.push(n.length),i=i.concat(n),i.push(2),i.push(r.length),i=i.concat(r),i.unshift(i.length),i.unshift(48),i},this.parseSig=function(t){var e;if(48!=t[0])throw new Error("Signature not a valid DERSequence");if(e=2,2!=t[e])throw new Error("First element in signature must be a DERInteger");var n=t.slice(e+2,e+2+t[e+1]);if(e+=2+t[e+1],2!=t[e])throw new Error("Second element in signature must be a DERInteger");var r=t.slice(e+2,e+2+t[e+1]);e+=2+t[e+1];var i=o.fromByteArrayUnsigned(n),s=o.fromByteArrayUnsigned(r);return{r:i,s:s}},this.parseSigCompact=function(t){if(65!==t.length)throw"Signature has the wrong length";var e=t[0]-27;if(e<0||e>7)throw"Invalid signature type";var n=this.ecparams.n,r=o.fromByteArrayUnsigned(t.slice(1,33)).mod(n),i=o.fromByteArrayUnsigned(t.slice(33,65)).mod(n);return{r:r,s:i,i:e}},void 0!==t&&void 0!==t.curve&&(this.curveName=t.curve),void 0===this.curveName&&(this.curveName=e),this.setNamedCurve(this.curveName),void 0!==t&&(void 0!==t.prv&&this.setPrivateKeyHex(t.prv),void 0!==t.pub&&this.setPublicKeyHex(t.pub))},Cr.crypto.ECDSA.parseSigHex=function(t){var e=Cr.crypto.ECDSA.parseSigHexInHexRS(t),n=new o(e.r,16),r=new o(e.s,16);return{r:n,s:r}},Cr.crypto.ECDSA.parseSigHexInHexRS=function(t){if("30"!=t.substr(0,2))throw"signature is not a ASN.1 sequence";var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"number of signature ASN.1 sequence elements seem wrong";var n=e[0],r=e[1];if("02"!=t.substr(n,2))throw"1st item of sequene of signature is not ASN.1 integer";if("02"!=t.substr(r,2))throw"2nd item of sequene of signature is not ASN.1 integer";var i=Or.getHexOfV_AtObj(t,n),s=Or.getHexOfV_AtObj(t,r);return{r:i,s:s}},Cr.crypto.ECDSA.asn1SigToConcatSig=function(t){var e=Cr.crypto.ECDSA.parseSigHexInHexRS(t),n=e.r,r=e.s;if("00"==n.substr(0,2)&&n.length/2*8%128==8&&(n=n.substr(2)),"00"==r.substr(0,2)&&r.length/2*8%128==8&&(r=r.substr(2)),n.length/2*8%128!=0)throw"unknown ECDSA sig r length error";if(r.length/2*8%128!=0)throw"unknown ECDSA sig s length error";return n+r},Cr.crypto.ECDSA.concatSigToASN1Sig=function(t){if(t.length/2*8%128!=0)throw"unknown ECDSA concatinated r-s sig length error";var e=t.substr(0,t.length/2),n=t.substr(t.length/2);return Cr.crypto.ECDSA.hexRSSigToASN1Sig(e,n)},Cr.crypto.ECDSA.hexRSSigToASN1Sig=function(t,e){var n=new o(t,16),r=new o(e,16);return Cr.crypto.ECDSA.biRSSigToASN1Sig(n,r)},Cr.crypto.ECDSA.biRSSigToASN1Sig=function(t,e){var n=new Cr.asn1.DERInteger({bigint:t}),r=new Cr.asn1.DERInteger({bigint:e}),i=new Cr.asn1.DERSequence({array:[n,r]});return i.getEncodedHex()},/*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license */ -"undefined"!=typeof Cr&&Cr||(Cr={}),"undefined"!=typeof Cr.crypto&&Cr.crypto||(Cr.crypto={}),Cr.crypto.ECParameterDB=new function(){function t(t){return new o(t,16)}var e={},n={};this.getByName=function(t){var r=t;if("undefined"!=typeof n[r]&&(r=n[t]),"undefined"!=typeof e[r])return e[r];throw"unregistered EC curve name: "+r},this.regist=function(r,i,s,o,a,u,h,c,f,l,d,g){e[r]={};var p=t(s),y=t(o),v=t(a),m=t(u),S=t(h),b=new Xe(p,y,v),w=b.decodePointHex("04"+c+f);e[r].name=r,e[r].keylen=i,e[r].curve=b,e[r].G=w,e[r].n=m,e[r].h=S,e[r].oid=d,e[r].info=g;for(var E=0;E11&&10!=e&&e<8?2:e;case 28:return e>11&&e<8?11:e;case 32:return e>10&&e<8?8:e;default:return util.print_debug("DSA select hash algorithm: returning null for an unknown length of q"),null}}function n(t,e,n,r,i,s,a,u){var h=Cr.crypto.Util.hashString(r,t.toLowerCase()),h=h.substr(0,s.bitLength()/4),c=new o(h,16);if(o.ZERO.compareTo(e)>0||e.compareTo(s)>0||o.ZERO.compareTo(n)>0||n.compareTo(s)>0)return util.print_error("invalid DSA Signature"),null;var f=n.modInverse(s),l=c.multiply(f).mod(s),d=e.multiply(f).mod(s),g=a.modPow(l,i).multiply(u.modPow(d,i)).mod(i).mod(s);return 0==g.compareTo(e)}function r(t,e){if(!(e.compareTo(t)<=0)){for(var n=e.subtract(t),r=i(n.bitLength());r>n;)r=i(n.bitLength());return t.add(r)}}function i(t){if(t<0)return null;var e=Math.floor((t+7)/8),n=s(e);return t%8>0&&(n=String.fromCharCode(Math.pow(2,t%8)-1&n.charCodeAt(0))+n.substring(1)),new o(u(n),16)}function s(t){for(var e="",n=0;n0||u.compareTo(r)>0||o.ZERO.compareTo(h)>0||h.compareTo(r)>0)throw"invalid DSA signature";var f=h.modInverse(r),l=c.multiply(f).mod(r),d=u.multiply(f).mod(r),g=i.modPow(l,n).multiply(s.modPow(d,n)).mod(n).mod(r);return 0==g.compareTo(u)},this.parseASN1Signature=function(t){try{var e=new o(Or.getVbyList(t,0,[0],"02"),16),n=new o(Or.getVbyList(t,0,[1],"02"),16);return[e,n]}catch(t){throw"malformed DSA signature"}},this.select_hash_algorithm=e,this.sign=t,this.verify=n,this.getRandomBigIntegerInRange=r,this.getRandomBigInteger=i,this.getRandomBytes=s};/*! pkcs5pkey-1.0.6.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license +"undefined"!=typeof Cr&&Cr||(Cr={}),"undefined"!=typeof Cr.crypto&&Cr.crypto||(Cr.crypto={}),Cr.crypto.DSA=function(){function t(t,e,n,i,s,a){var u=Cr.crypto.Util.hashString(e,t.toLowerCase()),u=u.substr(0,s.bitLength()/4),c=new o(u,16),h=r(o.ONE.add(o.ONE),s.subtract(o.ONE)),f=n.modPow(h,i).mod(s),l=h.modInverse(s).multiply(c.add(a.multiply(f))).mod(s),d=new Array;return d[0]=f,d[1]=l,d}function e(t){var e=openpgp.config.config.prefer_hash_algorithm;switch(Math.round(t.bitLength()/8)){case 20:return 2!=e&&e>11&&10!=e&&e<8?2:e;case 28:return e>11&&e<8?11:e;case 32:return e>10&&e<8?8:e;default:return util.print_debug("DSA select hash algorithm: returning null for an unknown length of q"),null}}function n(t,e,n,r,i,s,a,u){var c=Cr.crypto.Util.hashString(r,t.toLowerCase()),c=c.substr(0,s.bitLength()/4),h=new o(c,16);if(o.ZERO.compareTo(e)>0||e.compareTo(s)>0||o.ZERO.compareTo(n)>0||n.compareTo(s)>0)return util.print_error("invalid DSA Signature"),null;var f=n.modInverse(s),l=h.multiply(f).mod(s),d=e.multiply(f).mod(s),g=a.modPow(l,i).multiply(u.modPow(d,i)).mod(i).mod(s);return 0==g.compareTo(e)}function r(t,e){if(!(e.compareTo(t)<=0)){for(var n=e.subtract(t),r=i(n.bitLength());r>n;)r=i(n.bitLength());return t.add(r)}}function i(t){if(t<0)return null;var e=Math.floor((t+7)/8),n=s(e);return t%8>0&&(n=String.fromCharCode(Math.pow(2,t%8)-1&n.charCodeAt(0))+n.substring(1)),new o(u(n),16)}function s(t){for(var e="",n=0;n0||u.compareTo(r)>0||o.ZERO.compareTo(c)>0||c.compareTo(r)>0)throw"invalid DSA signature";var f=c.modInverse(r),l=h.multiply(f).mod(r),d=u.multiply(f).mod(r),g=i.modPow(l,n).multiply(s.modPow(d,n)).mod(n).mod(r);return 0==g.compareTo(u)},this.parseASN1Signature=function(t){try{var e=new o(Or.getVbyList(t,0,[0],"02"),16),n=new o(Or.getVbyList(t,0,[1],"02"),16);return[e,n]}catch(t){throw"malformed DSA signature"}},this.select_hash_algorithm=e,this.sign=t,this.verify=n,this.getRandomBigIntegerInRange=r,this.getRandomBigInteger=i,this.getRandomBytes=s};/*! pkcs5pkey-1.0.6.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license */ -var jr=function(){var t=function(t,e,r){return n(or.AES,t,e,r)},e=function(t,e,r){return n(or.TripleDES,t,e,r)},n=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a={};a.key=s,a.iv=o,a.ciphertext=i;var u=t.decrypt(a,s,{iv:o});return or.enc.Hex.stringify(u)},r=function(t,e,n){return o(or.AES,t,e,n)},s=function(t,e,n){return o(or.TripleDES,t,e,n)},o=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a=t.encrypt(i,s,{iv:o}),u=or.enc.Hex.parse(a.toString()),h=or.enc.Base64.stringify(u);return h},a={"AES-256-CBC":{proc:t,eproc:r,keylen:32,ivlen:16},"AES-192-CBC":{proc:t,eproc:r,keylen:24,ivlen:16},"AES-128-CBC":{proc:t,eproc:r,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:s,keylen:24,ivlen:8}},u=function(t){return a[t].proc},h=function(t){var e=or.lib.WordArray.random(t),n=or.enc.Hex.stringify(e);return n},c=function(t){var e={};t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))&&(e.cipher=RegExp.$1,e.ivsalt=RegExp.$2),t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))&&(e.type=RegExp.$1);var n=-1,r=0;t.indexOf("\r\n\r\n")!=-1&&(n=t.indexOf("\r\n\r\n"),r=2),t.indexOf("\n\n")!=-1&&(n=t.indexOf("\n\n"),r=1);var i=t.indexOf("-----END");if(n!=-1&&i!=-1){var s=t.substring(n+2*r,i-r);s=s.replace(/\s+/g,""),e.data=s}return e},f=function(t,e,n){for(var r=n.substring(0,16),i=or.enc.Hex.parse(r),s=or.enc.Utf8.parse(e),o=a[t].keylen+a[t].ivlen,u="",h=null;;){var c=or.algo.MD5.create();if(null!=h&&c.update(h),c.update(s),c.update(i),h=c.finalize(),u+=or.enc.Hex.stringify(h),u.length>=2*o)break}var f={};return f.keyhex=u.substr(0,2*a[t].keylen),f.ivhex=u.substr(2*a[t].keylen,2*a[t].ivlen),f},l=function(t,e,n,r){var i=or.enc.Base64.parse(t),s=or.enc.Hex.stringify(i),o=a[e].proc,u=o(s,n,r);return u},d=function(t,e,n,r){var i=a[e].eproc,s=i(t,n,r);return s};return{version:"1.0.5",getHexFromPEM:function(t,e){var n=t;if(n.indexOf("BEGIN "+e)==-1)throw"can't find PEM header: "+e;n=n.replace("-----BEGIN "+e+"-----",""),n=n.replace("-----END "+e+"-----","");var r=n.replace(/\s+/g,""),s=i(r);return s},getDecryptedKeyHexByKeyIV:function(t,e,n,r){var i=u(e);return i(t,n,r)},parsePKCS5PEM:function(t){return c(t)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(t,e,n){return f(t,e,n)},decryptKeyB64:function(t,e,n,r){return l(t,e,n,r)},getDecryptedKeyHex:function(t,e){var n=c(t),r=(n.type,n.cipher),i=n.ivsalt,s=n.data,o=f(r,e,i),a=o.keyhex,u=l(s,r,a,i);return u},getRSAKeyFromEncryptedPKCS5PEM:function(t,e){var n=this.getDecryptedKeyHex(t,e),r=new ve;return r.readPrivateKeyFromASN1HexString(n),r},getEryptedPKCS5PEMFromPrvKeyHex:function(t,e,n,r){var i="";if("undefined"!=typeof n&&null!=n||(n="AES-256-CBC"),"undefined"==typeof a[n])throw"PKCS5PKEY unsupported algorithm: "+n;if("undefined"==typeof r||null==r){var s=a[n].ivlen,o=h(s);r=o.toUpperCase()}var u=f(n,e,r),c=u.keyhex,l=d(t,n,c,r),g=l.replace(/(.{64})/g,"$1\r\n"),i="-----BEGIN RSA PRIVATE KEY-----\r\n";return i+="Proc-Type: 4,ENCRYPTED\r\n",i+="DEK-Info: "+n+","+r+"\r\n",i+="\r\n",i+=g,i+="\r\n-----END RSA PRIVATE KEY-----\r\n"},getEryptedPKCS5PEMFromRSAKey:function(t,e,n,r){var i=new Cr.asn1.DERInteger({int:0}),s=new Cr.asn1.DERInteger({bigint:t.n}),o=new Cr.asn1.DERInteger({int:t.e}),a=new Cr.asn1.DERInteger({bigint:t.d}),u=new Cr.asn1.DERInteger({bigint:t.p}),h=new Cr.asn1.DERInteger({bigint:t.q}),c=new Cr.asn1.DERInteger({bigint:t.dmp1}),f=new Cr.asn1.DERInteger({bigint:t.dmq1}),l=new Cr.asn1.DERInteger({bigint:t.coeff}),d=new Cr.asn1.DERSequence({array:[i,s,o,a,u,h,c,f,l]}),g=d.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(g,e,n,r)},newEncryptedPKCS5PEM:function(t,e,n,r){"undefined"!=typeof e&&null!=e||(e=1024),"undefined"!=typeof n&&null!=n||(n="10001");var i=new ve;i.generate(e,n);var s=null;return s="undefined"==typeof r||null==r?this.getEncryptedPKCS5PEMFromRSAKey(pkey,t):this.getEncryptedPKCS5PEMFromRSAKey(pkey,t,r)},getRSAKeyFromPlainPKCS8PEM:function(t){if(t.match(/ENCRYPTED/))throw"pem shall be not ENCRYPTED";var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getRSAKeyFromPlainPKCS8Hex(e);return n},getRSAKeyFromPlainPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=e.length)throw"outer DERSequence shall have 3 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[1]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+n;var n=Or.getHexOfTLV_AtObj(t,e[1]),r=Or.getHexOfTLV_AtObj(t,e[2]),i=Or.getHexOfV_AtObj(r,0),s=new ve;return s.readPrivateKeyFromASN1HexString(i),s},parseHexOfEncryptedPKCS8:function(t){var e={},n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed format: SEQUENCE(0).items != 2: "+n.length;e.ciphertext=Or.getHexOfV_AtObj(t,n[1]);var r=Or.getPosArrayOfChildren_AtObj(t,n[0]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0).items != 2: "+r.length;if("2a864886f70d01050d"!=Or.getHexOfV_AtObj(t,r[0]))throw"this only supports pkcs5PBES2";var i=Or.getPosArrayOfChildren_AtObj(t,r[1]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0.1).items != 2: "+i.length;var s=Or.getPosArrayOfChildren_AtObj(t,i[1]);if(2!=s.length)throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+s.length;if("2a864886f70d0307"!=Or.getHexOfV_AtObj(t,s[0]))throw"this only supports TripleDES";e.encryptionSchemeAlg="TripleDES",e.encryptionSchemeIV=Or.getHexOfV_AtObj(t,s[1]);var o=Or.getPosArrayOfChildren_AtObj(t,i[0]);if(2!=o.length)throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+o.length;if("2a864886f70d01050c"!=Or.getHexOfV_AtObj(t,o[0]))throw"this only supports pkcs5PBKDF2";var a=Or.getPosArrayOfChildren_AtObj(t,o[1]);if(a.length<2)throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+a.length;e.pbkdf2Salt=Or.getHexOfV_AtObj(t,a[0]);var u=Or.getHexOfV_AtObj(t,a[1]);try{e.pbkdf2Iter=parseInt(u,16)}catch(t){throw"malformed format pbkdf2Iter: "+u}return e},getPBKDF2KeyHexFromParam:function(t,e){var n=or.enc.Hex.parse(t.pbkdf2Salt),r=t.pbkdf2Iter,i=or.PBKDF2(e,n,{keySize:6,iterations:r}),s=or.enc.Hex.stringify(i);return s},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(t,e){var n=this.getHexFromPEM(t,"ENCRYPTED PRIVATE KEY"),r=this.parseHexOfEncryptedPKCS8(n),i=jr.getPBKDF2KeyHexFromParam(r,e),s={};s.ciphertext=or.enc.Hex.parse(r.ciphertext);var o=or.enc.Hex.parse(i),a=or.enc.Hex.parse(r.encryptionSchemeIV),u=or.TripleDES.decrypt(s,o,{iv:a}),h=or.enc.Hex.stringify(u);return h},getRSAKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getRSAKeyFromPlainPKCS8Hex(n);return r},getKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getKeyFromPlainPrivatePKCS8Hex(n);return r},parsePlainPrivatePKCS8Hex:function(t){var e={};if(e.algparam=null,"30"!=t.substr(0,2))throw"malformed plain PKCS8 private key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=n.length)throw"malformed plain PKCS8 private key(code:002)";if("30"!=t.substr(n[1],2))throw"malformed PKCS8 private key(code:003)";var r=Or.getPosArrayOfChildren_AtObj(t,n[1]);if(2!=r.length)throw"malformed PKCS8 private key(code:004)";if("06"!=t.substr(r[0],2))throw"malformed PKCS8 private key(code:005)";if(e.algoid=Or.getHexOfV_AtObj(t,r[0]),"06"==t.substr(r[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,r[1])),"04"!=t.substr(n[2],2))throw"malformed PKCS8 private key(code:006)";return e.keyidx=Or.getStartPosOfV_AtObj(t,n[2]),e},getKeyFromPlainPrivatePKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getKeyFromPlainPrivatePKCS8Hex(e);return n},getKeyFromPlainPrivatePKCS8Hex:function(t){var e=this.parsePlainPrivatePKCS8Hex(t);if("2a864886f70d010101"==e.algoid){this.parsePrivateRawRSAKeyHexAtObj(t,e);var n=e.key,r=new ve;return r.setPrivateEx(n.n,n.e,n.d,n.p,n.q,n.dp,n.dq,n.co),r}if("2a8648ce3d0201"==e.algoid){if(this.parsePrivateRawECKeyHexAtObj(t,e),void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,prv:e.key});return r}throw"unsupported private key algorithm"},getRSAKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getRSAKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8Hex:function(t){var e=this.parsePublicPKCS8Hex(t);if("2a864886f70d010101"==e.algoid){var n=this.parsePublicRawRSAKeyHex(e.key),r=new ve;return r.setPublic(n.n,n.e),r}if("2a8648ce3d0201"==e.algoid){if(void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,pub:e.key});return r}throw"unsupported public key algorithm"},parsePublicRawRSAKeyHex:function(t){var e={};if("30"!=t.substr(0,2))throw"malformed RSA key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed RSA key(code:002)";if("02"!=t.substr(n[0],2))throw"malformed RSA key(code:003)";if(e.n=Or.getHexOfV_AtObj(t,n[0]),"02"!=t.substr(n[1],2))throw"malformed RSA key(code:004)";return e.e=Or.getHexOfV_AtObj(t,n[1]),e},parsePrivateRawRSAKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed RSA private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(9!=r.length)throw"malformed RSA private key(code:002)";e.key={},e.key.n=Or.getHexOfV_AtObj(t,r[1]),e.key.e=Or.getHexOfV_AtObj(t,r[2]),e.key.d=Or.getHexOfV_AtObj(t,r[3]),e.key.p=Or.getHexOfV_AtObj(t,r[4]),e.key.q=Or.getHexOfV_AtObj(t,r[5]),e.key.dp=Or.getHexOfV_AtObj(t,r[6]),e.key.dq=Or.getHexOfV_AtObj(t,r[7]),e.key.co=Or.getHexOfV_AtObj(t,r[8])},parsePrivateRawECKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed ECC private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(3!=r.length)throw"malformed ECC private key(code:002)";if("04"!=t.substr(r[1],2))throw"malformed ECC private key(code:003)";e.key=Or.getHexOfV_AtObj(t,r[1])},parsePublicPKCS8Hex:function(t){var e={};e.algparam=null;var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"outer DERSequence shall have 2 elements: "+n.length;var r=n[0];if("30"!=t.substr(r,2))throw"malformed PKCS8 public key(code:001)";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"malformed PKCS8 public key(code:002)";if("06"!=t.substr(i[0],2))throw"malformed PKCS8 public key(code:003)";if(e.algoid=Or.getHexOfV_AtObj(t,i[0]),"06"==t.substr(i[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,i[1])),"03"!=t.substr(n[1],2))throw"malformed PKCS8 public key(code:004)";return e.key=Or.getHexOfV_AtObj(t,n[1]).substr(2),e},getRSAKeyFromPublicPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"outer DERSequence shall have 2 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[0]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmId is not rsaEncryption";if("03"!=t.substr(e[1],2))throw"PKCS8 Public Key is not BITSTRING encapslated.";var r=Or.getStartPosOfV_AtObj(t,e[1])+2;if("30"!=t.substr(r,2))throw"PKCS8 Public Key is not SEQUENCE.";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"inner DERSequence shall have 2 elements: "+i.length;if("02"!=t.substr(i[0],2))throw"N is not ASN.1 INTEGER";if("02"!=t.substr(i[1],2))throw"E is not ASN.1 INTEGER";var s=Or.getHexOfV_AtObj(t,i[0]),o=Or.getHexOfV_AtObj(t,i[1]),a=new ve;return a.setPublic(s,o),a}}}(),Hr=function(){var t=function(t,e,n){return r(or.AES,t,e,n)},e=function(t,e,n){return r(or.TripleDES,t,e,n)},n=function(t,e,n){return r(or.DES,t,e,n)},r=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a={};a.key=s,a.iv=o,a.ciphertext=i;var u=t.decrypt(a,s,{iv:o});return or.enc.Hex.stringify(u)},s=function(t,e,n){return h(or.AES,t,e,n)},a=function(t,e,n){return h(or.TripleDES,t,e,n)},u=function(t,e,n){return h(or.DES,t,e,n)},h=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a=t.encrypt(i,s,{iv:o}),u=or.enc.Hex.parse(a.toString()),h=or.enc.Base64.stringify(u);return h},c={"AES-256-CBC":{proc:t,eproc:s,keylen:32,ivlen:16},"AES-192-CBC":{proc:t,eproc:s,keylen:24,ivlen:16},"AES-128-CBC":{proc:t,eproc:s,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:a,keylen:24,ivlen:8},"DES-CBC":{proc:n,eproc:u,keylen:8,ivlen:8}},f=function(t){return c[t].proc},l=function(t){var e=or.lib.WordArray.random(t),n=or.enc.Hex.stringify(e);return n},d=function(t){var e={};t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))&&(e.cipher=RegExp.$1,e.ivsalt=RegExp.$2),t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))&&(e.type=RegExp.$1);var n=-1,r=0;t.indexOf("\r\n\r\n")!=-1&&(n=t.indexOf("\r\n\r\n"),r=2),t.indexOf("\n\n")!=-1&&(n=t.indexOf("\n\n"),r=1);var i=t.indexOf("-----END");if(n!=-1&&i!=-1){var s=t.substring(n+2*r,i-r);s=s.replace(/\s+/g,""),e.data=s}return e},g=function(t,e,n){for(var r=n.substring(0,16),i=or.enc.Hex.parse(r),s=or.enc.Utf8.parse(e),o=c[t].keylen+c[t].ivlen,a="",u=null;;){var h=or.algo.MD5.create();if(null!=u&&h.update(u),h.update(s),h.update(i),u=h.finalize(),a+=or.enc.Hex.stringify(u),a.length>=2*o)break}var f={};return f.keyhex=a.substr(0,2*c[t].keylen),f.ivhex=a.substr(2*c[t].keylen,2*c[t].ivlen),f},p=function(t,e,n,r){var i=or.enc.Base64.parse(t),s=or.enc.Hex.stringify(i),o=c[e].proc,a=o(s,n,r);return a},y=function(t,e,n,r){var i=c[e].eproc,s=i(t,n,r);return s};return{version:"1.0.0",getHexFromPEM:function(t,e){var n=t;if(n.indexOf("-----BEGIN ")==-1)throw"can't find PEM header: "+e;"string"==typeof e&&""!=e?(n=n.replace("-----BEGIN "+e+"-----",""),n=n.replace("-----END "+e+"-----","")):(n=n.replace(/-----BEGIN [^-]+-----/,""),n=n.replace(/-----END [^-]+-----/,""));var r=n.replace(/\s+/g,""),s=i(r);return s},getDecryptedKeyHexByKeyIV:function(t,e,n,r){var i=f(e);return i(t,n,r)},parsePKCS5PEM:function(t){return d(t)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(t,e,n){return g(t,e,n)},decryptKeyB64:function(t,e,n,r){return p(t,e,n,r)},getDecryptedKeyHex:function(t,e){var n=d(t),r=(n.type,n.cipher),i=n.ivsalt,s=n.data,o=g(r,e,i),a=o.keyhex,u=p(s,r,a,i);return u},getRSAKeyFromEncryptedPKCS5PEM:function(t,e){var n=this.getDecryptedKeyHex(t,e),r=new ve;return r.readPrivateKeyFromASN1HexString(n),r},getEncryptedPKCS5PEMFromPrvKeyHex:function(t,e,n,r,i){var s="";if("undefined"!=typeof r&&null!=r||(r="AES-256-CBC"),"undefined"==typeof c[r])throw"KEYUTIL unsupported algorithm: "+r;if("undefined"==typeof i||null==i){var o=c[r].ivlen,a=l(o);i=a.toUpperCase()}var u=g(r,n,i),h=u.keyhex,f=y(e,r,h,i),d=f.replace(/(.{64})/g,"$1\r\n"),s="-----BEGIN "+t+" PRIVATE KEY-----\r\n";return s+="Proc-Type: 4,ENCRYPTED\r\n",s+="DEK-Info: "+r+","+i+"\r\n",s+="\r\n",s+=d,s+="\r\n-----END "+t+" PRIVATE KEY-----\r\n"},getEncryptedPKCS5PEMFromRSAKey:function(t,e,n,r){var i=new Cr.asn1.DERInteger({int:0}),s=new Cr.asn1.DERInteger({bigint:t.n}),o=new Cr.asn1.DERInteger({int:t.e}),a=new Cr.asn1.DERInteger({bigint:t.d}),u=new Cr.asn1.DERInteger({bigint:t.p}),h=new Cr.asn1.DERInteger({bigint:t.q}),c=new Cr.asn1.DERInteger({bigint:t.dmp1}),f=new Cr.asn1.DERInteger({bigint:t.dmq1}),l=new Cr.asn1.DERInteger({bigint:t.coeff}),d=new Cr.asn1.DERSequence({array:[i,s,o,a,u,h,c,f,l]}),g=d.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",g,e,n,r)},newEncryptedPKCS5PEM:function(t,e,n,r){"undefined"!=typeof e&&null!=e||(e=1024),"undefined"!=typeof n&&null!=n||(n="10001");var i=new ve;i.generate(e,n);var s=null;return s="undefined"==typeof r||null==r?this.getEncryptedPKCS5PEMFromRSAKey(i,t):this.getEncryptedPKCS5PEMFromRSAKey(i,t,r)},getRSAKeyFromPlainPKCS8PEM:function(t){if(t.match(/ENCRYPTED/))throw"pem shall be not ENCRYPTED";var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getRSAKeyFromPlainPKCS8Hex(e);return n},getRSAKeyFromPlainPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=e.length)throw"outer DERSequence shall have 3 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[1]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+n;var n=Or.getHexOfTLV_AtObj(t,e[1]),r=Or.getHexOfTLV_AtObj(t,e[2]),i=Or.getHexOfV_AtObj(r,0),s=new ve;return s.readPrivateKeyFromASN1HexString(i),s},parseHexOfEncryptedPKCS8:function(t){var e={},n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed format: SEQUENCE(0).items != 2: "+n.length;e.ciphertext=Or.getHexOfV_AtObj(t,n[1]);var r=Or.getPosArrayOfChildren_AtObj(t,n[0]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0).items != 2: "+r.length;if("2a864886f70d01050d"!=Or.getHexOfV_AtObj(t,r[0]))throw"this only supports pkcs5PBES2";var i=Or.getPosArrayOfChildren_AtObj(t,r[1]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0.1).items != 2: "+i.length;var s=Or.getPosArrayOfChildren_AtObj(t,i[1]);if(2!=s.length)throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+s.length;if("2a864886f70d0307"!=Or.getHexOfV_AtObj(t,s[0]))throw"this only supports TripleDES";e.encryptionSchemeAlg="TripleDES",e.encryptionSchemeIV=Or.getHexOfV_AtObj(t,s[1]);var o=Or.getPosArrayOfChildren_AtObj(t,i[0]);if(2!=o.length)throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+o.length;if("2a864886f70d01050c"!=Or.getHexOfV_AtObj(t,o[0]))throw"this only supports pkcs5PBKDF2";var a=Or.getPosArrayOfChildren_AtObj(t,o[1]);if(a.length<2)throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+a.length;e.pbkdf2Salt=Or.getHexOfV_AtObj(t,a[0]);var u=Or.getHexOfV_AtObj(t,a[1]);try{e.pbkdf2Iter=parseInt(u,16)}catch(t){throw"malformed format pbkdf2Iter: "+u}return e},getPBKDF2KeyHexFromParam:function(t,e){var n=or.enc.Hex.parse(t.pbkdf2Salt),r=t.pbkdf2Iter,i=or.PBKDF2(e,n,{keySize:6,iterations:r}),s=or.enc.Hex.stringify(i);return s},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(t,e){var n=this.getHexFromPEM(t,"ENCRYPTED PRIVATE KEY"),r=this.parseHexOfEncryptedPKCS8(n),i=Hr.getPBKDF2KeyHexFromParam(r,e),s={};s.ciphertext=or.enc.Hex.parse(r.ciphertext);var o=or.enc.Hex.parse(i),a=or.enc.Hex.parse(r.encryptionSchemeIV),u=or.TripleDES.decrypt(s,o,{iv:a}),h=or.enc.Hex.stringify(u);return h},getRSAKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getRSAKeyFromPlainPKCS8Hex(n);return r},getKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getKeyFromPlainPrivatePKCS8Hex(n);return r},parsePlainPrivatePKCS8Hex:function(t){var e={};if(e.algparam=null,"30"!=t.substr(0,2))throw"malformed plain PKCS8 private key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=n.length)throw"malformed plain PKCS8 private key(code:002)";if("30"!=t.substr(n[1],2))throw"malformed PKCS8 private key(code:003)";var r=Or.getPosArrayOfChildren_AtObj(t,n[1]);if(2!=r.length)throw"malformed PKCS8 private key(code:004)";if("06"!=t.substr(r[0],2))throw"malformed PKCS8 private key(code:005)";if(e.algoid=Or.getHexOfV_AtObj(t,r[0]),"06"==t.substr(r[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,r[1])),"04"!=t.substr(n[2],2))throw"malformed PKCS8 private key(code:006)";return e.keyidx=Or.getStartPosOfV_AtObj(t,n[2]),e},getKeyFromPlainPrivatePKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getKeyFromPlainPrivatePKCS8Hex(e);return n},getKeyFromPlainPrivatePKCS8Hex:function(t){var e=this.parsePlainPrivatePKCS8Hex(t);if("2a864886f70d010101"==e.algoid){this.parsePrivateRawRSAKeyHexAtObj(t,e);var n=e.key,r=new ve;return r.setPrivateEx(n.n,n.e,n.d,n.p,n.q,n.dp,n.dq,n.co),r}if("2a8648ce3d0201"==e.algoid){if(this.parsePrivateRawECKeyHexAtObj(t,e),void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i});return r.setPublicKeyHex(e.pubkey),r.setPrivateKeyHex(e.key),r.isPublic=!1,r}if("2a8648ce380401"==e.algoid){var s=Or.getVbyList(t,0,[1,1,0],"02"),a=Or.getVbyList(t,0,[1,1,1],"02"),u=Or.getVbyList(t,0,[1,1,2],"02"),h=Or.getVbyList(t,0,[2,0],"02"),c=new o(s,16),f=new o(a,16),l=new o(u,16),d=new o(h,16),r=new Cr.crypto.DSA;return r.setPrivate(c,f,l,null,d),r}throw"unsupported private key algorithm"},getRSAKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getRSAKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8Hex:function(t){var e=this.parsePublicPKCS8Hex(t);if("2a864886f70d010101"==e.algoid){var n=this.parsePublicRawRSAKeyHex(e.key),r=new ve;return r.setPublic(n.n,n.e),r}if("2a8648ce3d0201"==e.algoid){if(void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,pub:e.key});return r}if("2a8648ce380401"==e.algoid){var s=e.algparam,a=Or.getHexOfV_AtObj(e.key,0),r=new Cr.crypto.DSA;return r.setPublic(new o(s.p,16),new o(s.q,16),new o(s.g,16),new o(a,16)),r}throw"unsupported public key algorithm"},parsePublicRawRSAKeyHex:function(t){var e={};if("30"!=t.substr(0,2))throw"malformed RSA key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed RSA key(code:002)";if("02"!=t.substr(n[0],2))throw"malformed RSA key(code:003)";if(e.n=Or.getHexOfV_AtObj(t,n[0]),"02"!=t.substr(n[1],2))throw"malformed RSA key(code:004)";return e.e=Or.getHexOfV_AtObj(t,n[1]),e},parsePrivateRawRSAKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed RSA private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(9!=r.length)throw"malformed RSA private key(code:002)";e.key={},e.key.n=Or.getHexOfV_AtObj(t,r[1]),e.key.e=Or.getHexOfV_AtObj(t,r[2]),e.key.d=Or.getHexOfV_AtObj(t,r[3]),e.key.p=Or.getHexOfV_AtObj(t,r[4]),e.key.q=Or.getHexOfV_AtObj(t,r[5]),e.key.dp=Or.getHexOfV_AtObj(t,r[6]),e.key.dq=Or.getHexOfV_AtObj(t,r[7]),e.key.co=Or.getHexOfV_AtObj(t,r[8])},parsePrivateRawECKeyHexAtObj:function(t,e){var n=e.keyidx,r=Or.getVbyList(t,n,[1],"04"),i=Or.getVbyList(t,n,[2,0],"03").substr(2);e.key=r,e.pubkey=i},parsePublicPKCS8Hex:function(t){var e={};e.algparam=null;var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"outer DERSequence shall have 2 elements: "+n.length;var r=n[0];if("30"!=t.substr(r,2))throw"malformed PKCS8 public key(code:001)";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"malformed PKCS8 public key(code:002)";if("06"!=t.substr(i[0],2))throw"malformed PKCS8 public key(code:003)";if(e.algoid=Or.getHexOfV_AtObj(t,i[0]),"06"==t.substr(i[1],2)?e.algparam=Or.getHexOfV_AtObj(t,i[1]):"30"==t.substr(i[1],2)&&(e.algparam={},e.algparam.p=Or.getVbyList(t,i[1],[0],"02"),e.algparam.q=Or.getVbyList(t,i[1],[1],"02"),e.algparam.g=Or.getVbyList(t,i[1],[2],"02")),"03"!=t.substr(n[1],2))throw"malformed PKCS8 public key(code:004)";return e.key=Or.getHexOfV_AtObj(t,n[1]).substr(2),e},getRSAKeyFromPublicPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"outer DERSequence shall have 2 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[0]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmId is not rsaEncryption";if("03"!=t.substr(e[1],2))throw"PKCS8 Public Key is not BITSTRING encapslated.";var r=Or.getStartPosOfV_AtObj(t,e[1])+2;if("30"!=t.substr(r,2))throw"PKCS8 Public Key is not SEQUENCE.";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"inner DERSequence shall have 2 elements: "+i.length;if("02"!=t.substr(i[0],2))throw"N is not ASN.1 INTEGER";if("02"!=t.substr(i[1],2))throw"E is not ASN.1 INTEGER";var s=Or.getHexOfV_AtObj(t,i[0]),o=Or.getHexOfV_AtObj(t,i[1]),a=new ve;return a.setPublic(s,o),a}}}();Hr.getKey=function(t,e,n){if("undefined"!=typeof ve&&t instanceof ve)return t;if("undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA)return t;if("undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA)return t;if(void 0!==t.curve&&void 0!==t.xy&&void 0===t.d)return new Cr.crypto.ECDSA({pub:t.xy,curve:t.curve});if(void 0!==t.curve&&void 0!==t.d)return new Cr.crypto.ECDSA({prv:t.d,curve:t.curve});if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0===t.d){var r=new ve;return r.setPublic(t.n,t.e),r}if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0!==t.p&&void 0!==t.q&&void 0!==t.dp&&void 0!==t.dq&&void 0!==t.co&&void 0===t.qi){var r=new ve;return r.setPrivateEx(t.n,t.e,t.d,t.p,t.q,t.dp,t.dq,t.co),r}if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0===t.p){var r=new ve;return r.setPrivate(t.n,t.e,t.d),r}if(void 0!==t.p&&void 0!==t.q&&void 0!==t.g&&void 0!==t.y&&void 0===t.x){var r=new Cr.crypto.DSA;return r.setPublic(t.p,t.q,t.g,t.y),r}if(void 0!==t.p&&void 0!==t.q&&void 0!==t.g&&void 0!==t.y&&void 0!==t.x){var r=new Cr.crypto.DSA;return r.setPrivate(t.p,t.q,t.g,t.y,t.x),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0===t.d){var r=new ve;return r.setPublic(pn(t.n),pn(t.e)),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0!==t.p&&void 0!==t.q&&void 0!==t.dp&&void 0!==t.dq&&void 0!==t.qi){var r=new ve;return r.setPrivateEx(pn(t.n),pn(t.e),pn(t.d),pn(t.p),pn(t.q),pn(t.dp),pn(t.dq),pn(t.qi)),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d){var r=new ve;return r.setPrivate(pn(t.n),pn(t.e),pn(t.d)),r}if("EC"===t.kty&&void 0!==t.crv&&void 0!==t.x&&void 0!==t.y&&void 0===t.d){var i=new Cr.crypto.ECDSA({curve:t.crv}),s=i.ecparams.keylen/4,a=("0000000000"+pn(t.x)).slice(-s),u=("0000000000"+pn(t.y)).slice(-s),h="04"+a+u;return i.setPublicKeyHex(h),i}if("EC"===t.kty&&void 0!==t.crv&&void 0!==t.x&&void 0!==t.y&&void 0!==t.d){var i=new Cr.crypto.ECDSA({curve:t.crv}),s=i.ecparams.keylen/4,a=("0000000000"+pn(t.x)).slice(-s),u=("0000000000"+pn(t.y)).slice(-s),h="04"+a+u,c=("0000000000"+pn(t.d)).slice(-s);return i.setPublicKeyHex(h),i.setPrivateKeyHex(c),i}if(t.indexOf("-END CERTIFICATE-",0)!=-1||t.indexOf("-END X509 CERTIFICATE-",0)!=-1||t.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1)return $n.getPublicKeyFromCertPEM(t);if("pkcs8pub"===n)return Hr.getKeyFromPublicPKCS8Hex(t);if(t.indexOf("-END PUBLIC KEY-")!=-1)return Hr.getKeyFromPublicPKCS8PEM(t);if("pkcs5prv"===n){var r=new ve;return r.readPrivateKeyFromASN1HexString(t),r}if("pkcs5prv"===n){var r=new ve;return r.readPrivateKeyFromASN1HexString(t),r}if(t.indexOf("-END RSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")==-1){var f=Hr.getHexFromPEM(t,"RSA PRIVATE KEY");return Hr.getKey(f,null,"pkcs5prv")}if(t.indexOf("-END DSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")==-1){var l=this.getHexFromPEM(t,"DSA PRIVATE KEY"),d=Or.getVbyList(l,0,[1],"02"),g=Or.getVbyList(l,0,[2],"02"),p=Or.getVbyList(l,0,[3],"02"),y=Or.getVbyList(l,0,[4],"02"),v=Or.getVbyList(l,0,[5],"02"),r=new Cr.crypto.DSA;return r.setPrivate(new o(d,16),new o(g,16),new o(p,16),new o(y,16),new o(v,16)),r}if(t.indexOf("-END PRIVATE KEY-")!=-1)return Hr.getKeyFromPlainPrivatePKCS8PEM(t);if(t.indexOf("-END RSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1)return Hr.getRSAKeyFromEncryptedPKCS5PEM(t,e);if(t.indexOf("-END EC PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1){var l=Hr.getDecryptedKeyHex(t,e),r=Or.getVbyList(l,0,[1],"04"),m=Or.getVbyList(l,0,[2,0],"06"),S=Or.getVbyList(l,0,[3,0],"03").substr(2),b="";if(void 0===Cr.crypto.OID.oidhex2name[m])throw"undefined OID(hex) in KJUR.crypto.OID: "+m;b=Cr.crypto.OID.oidhex2name[m];var i=new Cr.crypto.ECDSA({name:b});return i.setPublicKeyHex(S),i.setPrivateKeyHex(r),i.isPublic=!1,i}if(t.indexOf("-END DSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1){var l=Hr.getDecryptedKeyHex(t,e),d=Or.getVbyList(l,0,[1],"02"),g=Or.getVbyList(l,0,[2],"02"),p=Or.getVbyList(l,0,[3],"02"),y=Or.getVbyList(l,0,[4],"02"),v=Or.getVbyList(l,0,[5],"02"),r=new Cr.crypto.DSA;return r.setPrivate(new o(d,16),new o(g,16),new o(p,16),new o(y,16),new o(v,16)),r}if(t.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1)return Hr.getKeyFromEncryptedPKCS8PEM(t,e);throw"not supported argument"},Hr.generateKeypair=function(t,e){if("RSA"==t){var n=e,r=new ve;r.generate(n,"10001"),r.isPrivate=!0,r.isPublic=!0;var i=new ve,s=r.n.toString(16),o=r.e.toString(16);i.setPublic(s,o),i.isPrivate=!1,i.isPublic=!0;var a={};return a.prvKeyObj=r,a.pubKeyObj=i,a}if("EC"==t){var u=e,h=new Cr.crypto.ECDSA({curve:u}),c=h.generateKeyPairHex(),r=new Cr.crypto.ECDSA({curve:u});r.setPublicKeyHex(c.ecpubhex),r.setPrivateKeyHex(c.ecprvhex),r.isPrivate=!0,r.isPublic=!1;var i=new Cr.crypto.ECDSA({curve:u});i.setPublicKeyHex(c.ecpubhex),i.isPrivate=!1,i.isPublic=!0;var a={};return a.prvKeyObj=r,a.pubKeyObj=i,a}throw"unknown algorithm: "+t},Hr.getPEM=function(t,e,n,r,i){function s(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{int:{bigint:t.n}},{int:t.e},{int:{bigint:t.d}},{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.dmp1}},{int:{bigint:t.dmq1}},{int:{bigint:t.coeff}}]});return e}function o(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:1},{octstr:{hex:t.prvKeyHex}},{tag:["a0",!0,{oid:{name:t.curveName}}]},{tag:["a1",!0,{bitstr:{hex:"00"+t.pubKeyHex}}]}]});return e}function a(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.g}},{int:{bigint:t.y}},{int:{bigint:t.x}}]});return e}var u=Cr.asn1,h=Cr.crypto;if(("undefined"!=typeof ve&&t instanceof ve||"undefined"!=typeof h.DSA&&t instanceof h.DSA||"undefined"!=typeof h.ECDSA&&t instanceof h.ECDSA)&&1==t.isPublic&&(void 0===e||"PKCS8PUB"==e)){var c=new Cr.asn1.x509.SubjectPublicKeyInfo(t),f=c.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(f,"PUBLIC KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&(void 0===n||null==n)&&1==t.isPrivate){var c=s(t),f=c.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(f,"RSA PRIVATE KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof ve&&t instanceof Cr.crypto.ECDSA&&(void 0===n||null==n)&&1==t.isPrivate){var l=new Cr.asn1.DERObjectIdentifier({name:t.curveName}),d=l.getEncodedHex(),g=o(t),p=g.getEncodedHex(),y="";return y+=u.ASN1Util.getPEMStringFromHex(d,"EC PARAMETERS"),y+=u.ASN1Util.getPEMStringFromHex(p,"EC PRIVATE KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&(void 0===n||null==n)&&1==t.isPrivate){var c=a(t),f=c.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(f,"DSA PRIVATE KEY")}if("PKCS5PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&void 0!==n&&null!=n&&1==t.isPrivate){var c=s(t),f=c.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",f,n,r)}if("PKCS5PRV"==e&&"undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA&&void 0!==n&&null!=n&&1==t.isPrivate){var c=o(t),f=c.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",f,n,r)}if("PKCS5PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&void 0!==n&&null!=n&&1==t.isPrivate){var c=a(t),f=c.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",f,n,r)}var v=function(t,e){var n=m(t,e),r=new Cr.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:n.pbkdf2Salt}},{int:n.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:n.encryptionSchemeIV}}]}]}]},{octstr:{hex:n.ciphertext}}]});return r.getEncodedHex()},m=function(t,e){var n=100,r=or.lib.WordArray.random(8),i="DES-EDE3-CBC",s=or.lib.WordArray.random(8),o=or.PBKDF2(e,r,{keySize:6,iterations:n}),a=or.enc.Hex.parse(t),u=or.TripleDES.encrypt(a,o,{iv:s})+"",h={};return h.ciphertext=u,h.pbkdf2Salt=or.enc.Hex.stringify(r),h.pbkdf2Iter=n,h.encryptionSchemeAlg=i,h.encryptionSchemeIV=or.enc.Hex.stringify(s),h};if("PKCS8PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&1==t.isPrivate){var S=s(t),b=S.getEncodedHex(),c=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"rsaEncryption"}},{null:!0}]},{octstr:{hex:b}}]}),f=c.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(f,"PRIVATE KEY");var p=v(f,n);return u.ASN1Util.getPEMStringFromHex(p,"ENCRYPTED PRIVATE KEY"); -}if("PKCS8PRV"==e&&"undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA&&1==t.isPrivate){var S=new Cr.asn1.ASN1Util.newObject({seq:[{int:1},{octstr:{hex:t.prvKeyHex}},{tag:["a1",!0,{bitstr:{hex:"00"+t.pubKeyHex}}]}]}),b=S.getEncodedHex(),c=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:t.curveName}}]},{octstr:{hex:b}}]}),f=c.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(f,"PRIVATE KEY");var p=v(f,n);return u.ASN1Util.getPEMStringFromHex(p,"ENCRYPTED PRIVATE KEY")}if("PKCS8PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&1==t.isPrivate){var S=new Cr.asn1.DERInteger({bigint:t.x}),b=S.getEncodedHex(),c=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"dsa"}},{seq:[{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.g}}]}]},{octstr:{hex:b}}]}),f=c.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(f,"PRIVATE KEY");var p=v(f,n);return u.ASN1Util.getPEMStringFromHex(p,"ENCRYPTED PRIVATE KEY")}throw"unsupported object nor format"},Hr.getKeyFromCSRPEM=function(t){var e=Hr.getHexFromPEM(t,"CERTIFICATE REQUEST"),n=Hr.getKeyFromCSRHex(e);return n},Hr.getKeyFromCSRHex=function(t){var e=Hr.parseCSRHex(t),n=Hr.getKey(e.p8pubkeyhex,null,"pkcs8pub");return n},Hr.parseCSRHex=function(t){var e={},n=t;if("30"!=n.substr(0,2))throw"malformed CSR(code:001)";var r=Or.getPosArrayOfChildren_AtObj(n,0);if(r.length<1)throw"malformed CSR(code:002)";if("30"!=n.substr(r[0],2))throw"malformed CSR(code:003)";var i=Or.getPosArrayOfChildren_AtObj(n,r[0]);if(i.length<3)throw"malformed CSR(code:004)";return e.p8pubkeyhex=Or.getHexOfTLV_AtObj(n,i[2]),e},Hr.getJWKFromKey=function(t){var e={};if(t instanceof ve&&t.isPrivate)return e.kty="RSA",e.n=gn(t.n.toString(16)),e.e=gn(t.e.toString(16)),e.d=gn(t.d.toString(16)),e.p=gn(t.p.toString(16)),e.q=gn(t.q.toString(16)),e.dp=gn(t.dmp1.toString(16)),e.dq=gn(t.dmq1.toString(16)),e.qi=gn(t.coeff.toString(16)),e;if(t instanceof ve&&t.isPublic)return e.kty="RSA",e.n=gn(t.n.toString(16)),e.e=gn(t.e.toString(16)),e;if(t instanceof Cr.crypto.ECDSA&&t.isPrivate){var n=t.getShortNISTPCurveName();if("P-256"!==n&&"P-384"!==n)throw"unsupported curve name for JWT: "+n;var r=t.getPublicKeyXYHex();return e.kty="EC",e.crv=n,e.x=gn(r.x),e.y=gn(r.y),e.d=gn(t.prvKeyHex),e}if(t instanceof Cr.crypto.ECDSA&&t.isPublic){var n=t.getShortNISTPCurveName();if("P-256"!==n&&"P-384"!==n)throw"unsupported curve name for JWT: "+n;var r=t.getPublicKeyXYHex();return e.kty="EC",e.crv=n,e.x=gn(r.x),e.y=gn(r.y),e}throw"not supported key object"},ve.prototype.readPrivateKeyFromPEMString=jn,ve.prototype.readPrivateKeyFromASN1HexString=Rn;/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license +var Dr=function(){var t=function(t,e,r){return n(or.AES,t,e,r)},e=function(t,e,r){return n(or.TripleDES,t,e,r)},n=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a={};a.key=s,a.iv=o,a.ciphertext=i;var u=t.decrypt(a,s,{iv:o});return or.enc.Hex.stringify(u)},r=function(t,e,n){return o(or.AES,t,e,n)},s=function(t,e,n){return o(or.TripleDES,t,e,n)},o=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a=t.encrypt(i,s,{iv:o}),u=or.enc.Hex.parse(a.toString()),c=or.enc.Base64.stringify(u);return c},a={"AES-256-CBC":{proc:t,eproc:r,keylen:32,ivlen:16},"AES-192-CBC":{proc:t,eproc:r,keylen:24,ivlen:16},"AES-128-CBC":{proc:t,eproc:r,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:s,keylen:24,ivlen:8}},u=function(t){return a[t].proc},c=function(t){var e=or.lib.WordArray.random(t),n=or.enc.Hex.stringify(e);return n},h=function(t){var e={};t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))&&(e.cipher=RegExp.$1,e.ivsalt=RegExp.$2),t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))&&(e.type=RegExp.$1);var n=-1,r=0;t.indexOf("\r\n\r\n")!=-1&&(n=t.indexOf("\r\n\r\n"),r=2),t.indexOf("\n\n")!=-1&&(n=t.indexOf("\n\n"),r=1);var i=t.indexOf("-----END");if(n!=-1&&i!=-1){var s=t.substring(n+2*r,i-r);s=s.replace(/\s+/g,""),e.data=s}return e},f=function(t,e,n){for(var r=n.substring(0,16),i=or.enc.Hex.parse(r),s=or.enc.Utf8.parse(e),o=a[t].keylen+a[t].ivlen,u="",c=null;;){var h=or.algo.MD5.create();if(null!=c&&h.update(c),h.update(s),h.update(i),c=h.finalize(),u+=or.enc.Hex.stringify(c),u.length>=2*o)break}var f={};return f.keyhex=u.substr(0,2*a[t].keylen),f.ivhex=u.substr(2*a[t].keylen,2*a[t].ivlen),f},l=function(t,e,n,r){var i=or.enc.Base64.parse(t),s=or.enc.Hex.stringify(i),o=a[e].proc,u=o(s,n,r);return u},d=function(t,e,n,r){var i=a[e].eproc,s=i(t,n,r);return s};return{version:"1.0.5",getHexFromPEM:function(t,e){var n=t;if(n.indexOf("BEGIN "+e)==-1)throw"can't find PEM header: "+e;n=n.replace("-----BEGIN "+e+"-----",""),n=n.replace("-----END "+e+"-----","");var r=n.replace(/\s+/g,""),s=i(r);return s},getDecryptedKeyHexByKeyIV:function(t,e,n,r){var i=u(e);return i(t,n,r)},parsePKCS5PEM:function(t){return h(t)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(t,e,n){return f(t,e,n)},decryptKeyB64:function(t,e,n,r){return l(t,e,n,r)},getDecryptedKeyHex:function(t,e){var n=h(t),r=(n.type,n.cipher),i=n.ivsalt,s=n.data,o=f(r,e,i),a=o.keyhex,u=l(s,r,a,i);return u},getRSAKeyFromEncryptedPKCS5PEM:function(t,e){var n=this.getDecryptedKeyHex(t,e),r=new ve;return r.readPrivateKeyFromASN1HexString(n),r},getEryptedPKCS5PEMFromPrvKeyHex:function(t,e,n,r){var i="";if("undefined"!=typeof n&&null!=n||(n="AES-256-CBC"),"undefined"==typeof a[n])throw"PKCS5PKEY unsupported algorithm: "+n;if("undefined"==typeof r||null==r){var s=a[n].ivlen,o=c(s);r=o.toUpperCase()}var u=f(n,e,r),h=u.keyhex,l=d(t,n,h,r),g=l.replace(/(.{64})/g,"$1\r\n"),i="-----BEGIN RSA PRIVATE KEY-----\r\n";return i+="Proc-Type: 4,ENCRYPTED\r\n",i+="DEK-Info: "+n+","+r+"\r\n",i+="\r\n",i+=g,i+="\r\n-----END RSA PRIVATE KEY-----\r\n"},getEryptedPKCS5PEMFromRSAKey:function(t,e,n,r){var i=new Cr.asn1.DERInteger({int:0}),s=new Cr.asn1.DERInteger({bigint:t.n}),o=new Cr.asn1.DERInteger({int:t.e}),a=new Cr.asn1.DERInteger({bigint:t.d}),u=new Cr.asn1.DERInteger({bigint:t.p}),c=new Cr.asn1.DERInteger({bigint:t.q}),h=new Cr.asn1.DERInteger({bigint:t.dmp1}),f=new Cr.asn1.DERInteger({bigint:t.dmq1}),l=new Cr.asn1.DERInteger({bigint:t.coeff}),d=new Cr.asn1.DERSequence({array:[i,s,o,a,u,c,h,f,l]}),g=d.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(g,e,n,r)},newEncryptedPKCS5PEM:function(t,e,n,r){"undefined"!=typeof e&&null!=e||(e=1024),"undefined"!=typeof n&&null!=n||(n="10001");var i=new ve;i.generate(e,n);var s=null;return s="undefined"==typeof r||null==r?this.getEncryptedPKCS5PEMFromRSAKey(pkey,t):this.getEncryptedPKCS5PEMFromRSAKey(pkey,t,r)},getRSAKeyFromPlainPKCS8PEM:function(t){if(t.match(/ENCRYPTED/))throw"pem shall be not ENCRYPTED";var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getRSAKeyFromPlainPKCS8Hex(e);return n},getRSAKeyFromPlainPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=e.length)throw"outer DERSequence shall have 3 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[1]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+n;var n=Or.getHexOfTLV_AtObj(t,e[1]),r=Or.getHexOfTLV_AtObj(t,e[2]),i=Or.getHexOfV_AtObj(r,0),s=new ve;return s.readPrivateKeyFromASN1HexString(i),s},parseHexOfEncryptedPKCS8:function(t){var e={},n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed format: SEQUENCE(0).items != 2: "+n.length;e.ciphertext=Or.getHexOfV_AtObj(t,n[1]);var r=Or.getPosArrayOfChildren_AtObj(t,n[0]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0).items != 2: "+r.length;if("2a864886f70d01050d"!=Or.getHexOfV_AtObj(t,r[0]))throw"this only supports pkcs5PBES2";var i=Or.getPosArrayOfChildren_AtObj(t,r[1]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0.1).items != 2: "+i.length;var s=Or.getPosArrayOfChildren_AtObj(t,i[1]);if(2!=s.length)throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+s.length;if("2a864886f70d0307"!=Or.getHexOfV_AtObj(t,s[0]))throw"this only supports TripleDES";e.encryptionSchemeAlg="TripleDES",e.encryptionSchemeIV=Or.getHexOfV_AtObj(t,s[1]);var o=Or.getPosArrayOfChildren_AtObj(t,i[0]);if(2!=o.length)throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+o.length;if("2a864886f70d01050c"!=Or.getHexOfV_AtObj(t,o[0]))throw"this only supports pkcs5PBKDF2";var a=Or.getPosArrayOfChildren_AtObj(t,o[1]);if(a.length<2)throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+a.length;e.pbkdf2Salt=Or.getHexOfV_AtObj(t,a[0]);var u=Or.getHexOfV_AtObj(t,a[1]);try{e.pbkdf2Iter=parseInt(u,16)}catch(t){throw"malformed format pbkdf2Iter: "+u}return e},getPBKDF2KeyHexFromParam:function(t,e){var n=or.enc.Hex.parse(t.pbkdf2Salt),r=t.pbkdf2Iter,i=or.PBKDF2(e,n,{keySize:6,iterations:r}),s=or.enc.Hex.stringify(i);return s},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(t,e){var n=this.getHexFromPEM(t,"ENCRYPTED PRIVATE KEY"),r=this.parseHexOfEncryptedPKCS8(n),i=Dr.getPBKDF2KeyHexFromParam(r,e),s={};s.ciphertext=or.enc.Hex.parse(r.ciphertext);var o=or.enc.Hex.parse(i),a=or.enc.Hex.parse(r.encryptionSchemeIV),u=or.TripleDES.decrypt(s,o,{iv:a}),c=or.enc.Hex.stringify(u);return c},getRSAKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getRSAKeyFromPlainPKCS8Hex(n);return r},getKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getKeyFromPlainPrivatePKCS8Hex(n);return r},parsePlainPrivatePKCS8Hex:function(t){var e={};if(e.algparam=null,"30"!=t.substr(0,2))throw"malformed plain PKCS8 private key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=n.length)throw"malformed plain PKCS8 private key(code:002)";if("30"!=t.substr(n[1],2))throw"malformed PKCS8 private key(code:003)";var r=Or.getPosArrayOfChildren_AtObj(t,n[1]);if(2!=r.length)throw"malformed PKCS8 private key(code:004)";if("06"!=t.substr(r[0],2))throw"malformed PKCS8 private key(code:005)";if(e.algoid=Or.getHexOfV_AtObj(t,r[0]),"06"==t.substr(r[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,r[1])),"04"!=t.substr(n[2],2))throw"malformed PKCS8 private key(code:006)";return e.keyidx=Or.getStartPosOfV_AtObj(t,n[2]),e},getKeyFromPlainPrivatePKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getKeyFromPlainPrivatePKCS8Hex(e);return n},getKeyFromPlainPrivatePKCS8Hex:function(t){var e=this.parsePlainPrivatePKCS8Hex(t);if("2a864886f70d010101"==e.algoid){this.parsePrivateRawRSAKeyHexAtObj(t,e);var n=e.key,r=new ve;return r.setPrivateEx(n.n,n.e,n.d,n.p,n.q,n.dp,n.dq,n.co),r}if("2a8648ce3d0201"==e.algoid){if(this.parsePrivateRawECKeyHexAtObj(t,e),void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,prv:e.key});return r}throw"unsupported private key algorithm"},getRSAKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getRSAKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8Hex:function(t){var e=this.parsePublicPKCS8Hex(t);if("2a864886f70d010101"==e.algoid){var n=this.parsePublicRawRSAKeyHex(e.key),r=new ve;return r.setPublic(n.n,n.e),r}if("2a8648ce3d0201"==e.algoid){if(void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,pub:e.key});return r}throw"unsupported public key algorithm"},parsePublicRawRSAKeyHex:function(t){var e={};if("30"!=t.substr(0,2))throw"malformed RSA key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed RSA key(code:002)";if("02"!=t.substr(n[0],2))throw"malformed RSA key(code:003)";if(e.n=Or.getHexOfV_AtObj(t,n[0]),"02"!=t.substr(n[1],2))throw"malformed RSA key(code:004)";return e.e=Or.getHexOfV_AtObj(t,n[1]),e},parsePrivateRawRSAKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed RSA private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(9!=r.length)throw"malformed RSA private key(code:002)";e.key={},e.key.n=Or.getHexOfV_AtObj(t,r[1]),e.key.e=Or.getHexOfV_AtObj(t,r[2]),e.key.d=Or.getHexOfV_AtObj(t,r[3]),e.key.p=Or.getHexOfV_AtObj(t,r[4]),e.key.q=Or.getHexOfV_AtObj(t,r[5]),e.key.dp=Or.getHexOfV_AtObj(t,r[6]),e.key.dq=Or.getHexOfV_AtObj(t,r[7]),e.key.co=Or.getHexOfV_AtObj(t,r[8])},parsePrivateRawECKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed ECC private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(3!=r.length)throw"malformed ECC private key(code:002)";if("04"!=t.substr(r[1],2))throw"malformed ECC private key(code:003)";e.key=Or.getHexOfV_AtObj(t,r[1])},parsePublicPKCS8Hex:function(t){var e={};e.algparam=null;var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"outer DERSequence shall have 2 elements: "+n.length;var r=n[0];if("30"!=t.substr(r,2))throw"malformed PKCS8 public key(code:001)";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"malformed PKCS8 public key(code:002)";if("06"!=t.substr(i[0],2))throw"malformed PKCS8 public key(code:003)";if(e.algoid=Or.getHexOfV_AtObj(t,i[0]),"06"==t.substr(i[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,i[1])),"03"!=t.substr(n[1],2))throw"malformed PKCS8 public key(code:004)";return e.key=Or.getHexOfV_AtObj(t,n[1]).substr(2),e},getRSAKeyFromPublicPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"outer DERSequence shall have 2 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[0]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmId is not rsaEncryption";if("03"!=t.substr(e[1],2))throw"PKCS8 Public Key is not BITSTRING encapslated.";var r=Or.getStartPosOfV_AtObj(t,e[1])+2;if("30"!=t.substr(r,2))throw"PKCS8 Public Key is not SEQUENCE.";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"inner DERSequence shall have 2 elements: "+i.length;if("02"!=t.substr(i[0],2))throw"N is not ASN.1 INTEGER";if("02"!=t.substr(i[1],2))throw"E is not ASN.1 INTEGER";var s=Or.getHexOfV_AtObj(t,i[0]),o=Or.getHexOfV_AtObj(t,i[1]),a=new ve;return a.setPublic(s,o),a}}}(),Ir=function(){var t=function(t,e,n){return r(or.AES,t,e,n)},e=function(t,e,n){return r(or.TripleDES,t,e,n)},n=function(t,e,n){return r(or.DES,t,e,n)},r=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a={};a.key=s,a.iv=o,a.ciphertext=i;var u=t.decrypt(a,s,{iv:o});return or.enc.Hex.stringify(u)},s=function(t,e,n){return c(or.AES,t,e,n)},a=function(t,e,n){return c(or.TripleDES,t,e,n)},u=function(t,e,n){return c(or.DES,t,e,n)},c=function(t,e,n,r){var i=or.enc.Hex.parse(e),s=or.enc.Hex.parse(n),o=or.enc.Hex.parse(r),a=t.encrypt(i,s,{iv:o}),u=or.enc.Hex.parse(a.toString()),c=or.enc.Base64.stringify(u);return c},h={"AES-256-CBC":{proc:t,eproc:s,keylen:32,ivlen:16},"AES-192-CBC":{proc:t,eproc:s,keylen:24,ivlen:16},"AES-128-CBC":{proc:t,eproc:s,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:a,keylen:24,ivlen:8},"DES-CBC":{proc:n,eproc:u,keylen:8,ivlen:8}},f=function(t){return h[t].proc},l=function(t){var e=or.lib.WordArray.random(t),n=or.enc.Hex.stringify(e);return n},d=function(t){var e={};t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))&&(e.cipher=RegExp.$1,e.ivsalt=RegExp.$2),t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))&&(e.type=RegExp.$1);var n=-1,r=0;t.indexOf("\r\n\r\n")!=-1&&(n=t.indexOf("\r\n\r\n"),r=2),t.indexOf("\n\n")!=-1&&(n=t.indexOf("\n\n"),r=1);var i=t.indexOf("-----END");if(n!=-1&&i!=-1){var s=t.substring(n+2*r,i-r);s=s.replace(/\s+/g,""),e.data=s}return e},g=function(t,e,n){for(var r=n.substring(0,16),i=or.enc.Hex.parse(r),s=or.enc.Utf8.parse(e),o=h[t].keylen+h[t].ivlen,a="",u=null;;){var c=or.algo.MD5.create();if(null!=u&&c.update(u),c.update(s),c.update(i),u=c.finalize(),a+=or.enc.Hex.stringify(u),a.length>=2*o)break}var f={};return f.keyhex=a.substr(0,2*h[t].keylen),f.ivhex=a.substr(2*h[t].keylen,2*h[t].ivlen),f},p=function(t,e,n,r){var i=or.enc.Base64.parse(t),s=or.enc.Hex.stringify(i),o=h[e].proc,a=o(s,n,r);return a},y=function(t,e,n,r){var i=h[e].eproc,s=i(t,n,r);return s};return{version:"1.0.0",getHexFromPEM:function(t,e){var n=t;if(n.indexOf("-----BEGIN ")==-1)throw"can't find PEM header: "+e;"string"==typeof e&&""!=e?(n=n.replace("-----BEGIN "+e+"-----",""),n=n.replace("-----END "+e+"-----","")):(n=n.replace(/-----BEGIN [^-]+-----/,""),n=n.replace(/-----END [^-]+-----/,""));var r=n.replace(/\s+/g,""),s=i(r);return s},getDecryptedKeyHexByKeyIV:function(t,e,n,r){var i=f(e);return i(t,n,r)},parsePKCS5PEM:function(t){return d(t)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(t,e,n){return g(t,e,n)},decryptKeyB64:function(t,e,n,r){return p(t,e,n,r)},getDecryptedKeyHex:function(t,e){var n=d(t),r=(n.type,n.cipher),i=n.ivsalt,s=n.data,o=g(r,e,i),a=o.keyhex,u=p(s,r,a,i);return u},getRSAKeyFromEncryptedPKCS5PEM:function(t,e){var n=this.getDecryptedKeyHex(t,e),r=new ve;return r.readPrivateKeyFromASN1HexString(n),r},getEncryptedPKCS5PEMFromPrvKeyHex:function(t,e,n,r,i){var s="";if("undefined"!=typeof r&&null!=r||(r="AES-256-CBC"),"undefined"==typeof h[r])throw"KEYUTIL unsupported algorithm: "+r;if("undefined"==typeof i||null==i){var o=h[r].ivlen,a=l(o);i=a.toUpperCase()}var u=g(r,n,i),c=u.keyhex,f=y(e,r,c,i),d=f.replace(/(.{64})/g,"$1\r\n"),s="-----BEGIN "+t+" PRIVATE KEY-----\r\n";return s+="Proc-Type: 4,ENCRYPTED\r\n",s+="DEK-Info: "+r+","+i+"\r\n",s+="\r\n",s+=d,s+="\r\n-----END "+t+" PRIVATE KEY-----\r\n"},getEncryptedPKCS5PEMFromRSAKey:function(t,e,n,r){var i=new Cr.asn1.DERInteger({int:0}),s=new Cr.asn1.DERInteger({bigint:t.n}),o=new Cr.asn1.DERInteger({int:t.e}),a=new Cr.asn1.DERInteger({bigint:t.d}),u=new Cr.asn1.DERInteger({bigint:t.p}),c=new Cr.asn1.DERInteger({bigint:t.q}),h=new Cr.asn1.DERInteger({bigint:t.dmp1}),f=new Cr.asn1.DERInteger({bigint:t.dmq1}),l=new Cr.asn1.DERInteger({bigint:t.coeff}),d=new Cr.asn1.DERSequence({array:[i,s,o,a,u,c,h,f,l]}),g=d.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",g,e,n,r)},newEncryptedPKCS5PEM:function(t,e,n,r){"undefined"!=typeof e&&null!=e||(e=1024),"undefined"!=typeof n&&null!=n||(n="10001");var i=new ve;i.generate(e,n);var s=null;return s="undefined"==typeof r||null==r?this.getEncryptedPKCS5PEMFromRSAKey(i,t):this.getEncryptedPKCS5PEMFromRSAKey(i,t,r)},getRSAKeyFromPlainPKCS8PEM:function(t){if(t.match(/ENCRYPTED/))throw"pem shall be not ENCRYPTED";var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getRSAKeyFromPlainPKCS8Hex(e);return n},getRSAKeyFromPlainPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=e.length)throw"outer DERSequence shall have 3 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[1]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+n;var n=Or.getHexOfTLV_AtObj(t,e[1]),r=Or.getHexOfTLV_AtObj(t,e[2]),i=Or.getHexOfV_AtObj(r,0),s=new ve;return s.readPrivateKeyFromASN1HexString(i),s},parseHexOfEncryptedPKCS8:function(t){var e={},n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed format: SEQUENCE(0).items != 2: "+n.length;e.ciphertext=Or.getHexOfV_AtObj(t,n[1]);var r=Or.getPosArrayOfChildren_AtObj(t,n[0]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0).items != 2: "+r.length;if("2a864886f70d01050d"!=Or.getHexOfV_AtObj(t,r[0]))throw"this only supports pkcs5PBES2";var i=Or.getPosArrayOfChildren_AtObj(t,r[1]);if(2!=r.length)throw"malformed format: SEQUENCE(0.0.1).items != 2: "+i.length;var s=Or.getPosArrayOfChildren_AtObj(t,i[1]);if(2!=s.length)throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+s.length;if("2a864886f70d0307"!=Or.getHexOfV_AtObj(t,s[0]))throw"this only supports TripleDES";e.encryptionSchemeAlg="TripleDES",e.encryptionSchemeIV=Or.getHexOfV_AtObj(t,s[1]);var o=Or.getPosArrayOfChildren_AtObj(t,i[0]);if(2!=o.length)throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+o.length;if("2a864886f70d01050c"!=Or.getHexOfV_AtObj(t,o[0]))throw"this only supports pkcs5PBKDF2";var a=Or.getPosArrayOfChildren_AtObj(t,o[1]);if(a.length<2)throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+a.length;e.pbkdf2Salt=Or.getHexOfV_AtObj(t,a[0]);var u=Or.getHexOfV_AtObj(t,a[1]);try{e.pbkdf2Iter=parseInt(u,16)}catch(t){throw"malformed format pbkdf2Iter: "+u}return e},getPBKDF2KeyHexFromParam:function(t,e){var n=or.enc.Hex.parse(t.pbkdf2Salt),r=t.pbkdf2Iter,i=or.PBKDF2(e,n,{keySize:6,iterations:r}),s=or.enc.Hex.stringify(i);return s},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(t,e){var n=this.getHexFromPEM(t,"ENCRYPTED PRIVATE KEY"),r=this.parseHexOfEncryptedPKCS8(n),i=Ir.getPBKDF2KeyHexFromParam(r,e),s={};s.ciphertext=or.enc.Hex.parse(r.ciphertext);var o=or.enc.Hex.parse(i),a=or.enc.Hex.parse(r.encryptionSchemeIV),u=or.TripleDES.decrypt(s,o,{iv:a}),c=or.enc.Hex.stringify(u);return c},getRSAKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getRSAKeyFromPlainPKCS8Hex(n);return r},getKeyFromEncryptedPKCS8PEM:function(t,e){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(t,e),r=this.getKeyFromPlainPrivatePKCS8Hex(n);return r},parsePlainPrivatePKCS8Hex:function(t){var e={};if(e.algparam=null,"30"!=t.substr(0,2))throw"malformed plain PKCS8 private key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(3!=n.length)throw"malformed plain PKCS8 private key(code:002)";if("30"!=t.substr(n[1],2))throw"malformed PKCS8 private key(code:003)";var r=Or.getPosArrayOfChildren_AtObj(t,n[1]);if(2!=r.length)throw"malformed PKCS8 private key(code:004)";if("06"!=t.substr(r[0],2))throw"malformed PKCS8 private key(code:005)";if(e.algoid=Or.getHexOfV_AtObj(t,r[0]),"06"==t.substr(r[1],2)&&(e.algparam=Or.getHexOfV_AtObj(t,r[1])),"04"!=t.substr(n[2],2))throw"malformed PKCS8 private key(code:006)";return e.keyidx=Or.getStartPosOfV_AtObj(t,n[2]),e},getKeyFromPlainPrivatePKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PRIVATE KEY"),n=this.getKeyFromPlainPrivatePKCS8Hex(e);return n},getKeyFromPlainPrivatePKCS8Hex:function(t){var e=this.parsePlainPrivatePKCS8Hex(t);if("2a864886f70d010101"==e.algoid){this.parsePrivateRawRSAKeyHexAtObj(t,e);var n=e.key,r=new ve;return r.setPrivateEx(n.n,n.e,n.d,n.p,n.q,n.dp,n.dq,n.co),r}if("2a8648ce3d0201"==e.algoid){if(this.parsePrivateRawECKeyHexAtObj(t,e),void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i});return r.setPublicKeyHex(e.pubkey),r.setPrivateKeyHex(e.key),r.isPublic=!1,r}if("2a8648ce380401"==e.algoid){var s=Or.getVbyList(t,0,[1,1,0],"02"),a=Or.getVbyList(t,0,[1,1,1],"02"),u=Or.getVbyList(t,0,[1,1,2],"02"),c=Or.getVbyList(t,0,[2,0],"02"),h=new o(s,16),f=new o(a,16),l=new o(u,16),d=new o(c,16),r=new Cr.crypto.DSA;return r.setPrivate(h,f,l,null,d),r}throw"unsupported private key algorithm"},getRSAKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getRSAKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8PEM:function(t){var e=this.getHexFromPEM(t,"PUBLIC KEY"),n=this.getKeyFromPublicPKCS8Hex(e);return n},getKeyFromPublicPKCS8Hex:function(t){var e=this.parsePublicPKCS8Hex(t);if("2a864886f70d010101"==e.algoid){var n=this.parsePublicRawRSAKeyHex(e.key),r=new ve;return r.setPublic(n.n,n.e),r}if("2a8648ce3d0201"==e.algoid){if(void 0===Cr.crypto.OID.oidhex2name[e.algparam])throw"KJUR.crypto.OID.oidhex2name undefined: "+e.algparam;var i=Cr.crypto.OID.oidhex2name[e.algparam],r=new Cr.crypto.ECDSA({curve:i,pub:e.key});return r}if("2a8648ce380401"==e.algoid){var s=e.algparam,a=Or.getHexOfV_AtObj(e.key,0),r=new Cr.crypto.DSA;return r.setPublic(new o(s.p,16),new o(s.q,16),new o(s.g,16),new o(a,16)),r}throw"unsupported public key algorithm"},parsePublicRawRSAKeyHex:function(t){var e={};if("30"!=t.substr(0,2))throw"malformed RSA key(code:001)";var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"malformed RSA key(code:002)";if("02"!=t.substr(n[0],2))throw"malformed RSA key(code:003)";if(e.n=Or.getHexOfV_AtObj(t,n[0]),"02"!=t.substr(n[1],2))throw"malformed RSA key(code:004)";return e.e=Or.getHexOfV_AtObj(t,n[1]),e},parsePrivateRawRSAKeyHexAtObj:function(t,e){var n=e.keyidx;if("30"!=t.substr(n,2))throw"malformed RSA private key(code:001)";var r=Or.getPosArrayOfChildren_AtObj(t,n);if(9!=r.length)throw"malformed RSA private key(code:002)";e.key={},e.key.n=Or.getHexOfV_AtObj(t,r[1]),e.key.e=Or.getHexOfV_AtObj(t,r[2]),e.key.d=Or.getHexOfV_AtObj(t,r[3]),e.key.p=Or.getHexOfV_AtObj(t,r[4]),e.key.q=Or.getHexOfV_AtObj(t,r[5]),e.key.dp=Or.getHexOfV_AtObj(t,r[6]),e.key.dq=Or.getHexOfV_AtObj(t,r[7]),e.key.co=Or.getHexOfV_AtObj(t,r[8])},parsePrivateRawECKeyHexAtObj:function(t,e){var n=e.keyidx,r=Or.getVbyList(t,n,[1],"04"),i=Or.getVbyList(t,n,[2,0],"03").substr(2);e.key=r,e.pubkey=i},parsePublicPKCS8Hex:function(t){var e={};e.algparam=null;var n=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=n.length)throw"outer DERSequence shall have 2 elements: "+n.length;var r=n[0];if("30"!=t.substr(r,2))throw"malformed PKCS8 public key(code:001)";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"malformed PKCS8 public key(code:002)";if("06"!=t.substr(i[0],2))throw"malformed PKCS8 public key(code:003)";if(e.algoid=Or.getHexOfV_AtObj(t,i[0]),"06"==t.substr(i[1],2)?e.algparam=Or.getHexOfV_AtObj(t,i[1]):"30"==t.substr(i[1],2)&&(e.algparam={},e.algparam.p=Or.getVbyList(t,i[1],[0],"02"),e.algparam.q=Or.getVbyList(t,i[1],[1],"02"),e.algparam.g=Or.getVbyList(t,i[1],[2],"02")),"03"!=t.substr(n[1],2))throw"malformed PKCS8 public key(code:004)";return e.key=Or.getHexOfV_AtObj(t,n[1]).substr(2),e},getRSAKeyFromPublicPKCS8Hex:function(t){var e=Or.getPosArrayOfChildren_AtObj(t,0);if(2!=e.length)throw"outer DERSequence shall have 2 elements: "+e.length;var n=Or.getHexOfTLV_AtObj(t,e[0]);if("300d06092a864886f70d0101010500"!=n)throw"PKCS8 AlgorithmId is not rsaEncryption";if("03"!=t.substr(e[1],2))throw"PKCS8 Public Key is not BITSTRING encapslated.";var r=Or.getStartPosOfV_AtObj(t,e[1])+2;if("30"!=t.substr(r,2))throw"PKCS8 Public Key is not SEQUENCE.";var i=Or.getPosArrayOfChildren_AtObj(t,r);if(2!=i.length)throw"inner DERSequence shall have 2 elements: "+i.length;if("02"!=t.substr(i[0],2))throw"N is not ASN.1 INTEGER";if("02"!=t.substr(i[1],2))throw"E is not ASN.1 INTEGER";var s=Or.getHexOfV_AtObj(t,i[0]),o=Or.getHexOfV_AtObj(t,i[1]),a=new ve;return a.setPublic(s,o),a}}}();Ir.getKey=function(t,e,n){if("undefined"!=typeof ve&&t instanceof ve)return t;if("undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA)return t;if("undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA)return t;if(void 0!==t.curve&&void 0!==t.xy&&void 0===t.d)return new Cr.crypto.ECDSA({pub:t.xy,curve:t.curve});if(void 0!==t.curve&&void 0!==t.d)return new Cr.crypto.ECDSA({prv:t.d,curve:t.curve});if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0===t.d){var r=new ve;return r.setPublic(t.n,t.e),r}if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0!==t.p&&void 0!==t.q&&void 0!==t.dp&&void 0!==t.dq&&void 0!==t.co&&void 0===t.qi){var r=new ve;return r.setPrivateEx(t.n,t.e,t.d,t.p,t.q,t.dp,t.dq,t.co),r}if(void 0===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0===t.p){var r=new ve;return r.setPrivate(t.n,t.e,t.d),r}if(void 0!==t.p&&void 0!==t.q&&void 0!==t.g&&void 0!==t.y&&void 0===t.x){var r=new Cr.crypto.DSA;return r.setPublic(t.p,t.q,t.g,t.y),r}if(void 0!==t.p&&void 0!==t.q&&void 0!==t.g&&void 0!==t.y&&void 0!==t.x){var r=new Cr.crypto.DSA;return r.setPrivate(t.p,t.q,t.g,t.y,t.x),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0===t.d){var r=new ve;return r.setPublic(pn(t.n),pn(t.e)),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d&&void 0!==t.p&&void 0!==t.q&&void 0!==t.dp&&void 0!==t.dq&&void 0!==t.qi){var r=new ve;return r.setPrivateEx(pn(t.n),pn(t.e),pn(t.d),pn(t.p),pn(t.q),pn(t.dp),pn(t.dq),pn(t.qi)),r}if("RSA"===t.kty&&void 0!==t.n&&void 0!==t.e&&void 0!==t.d){var r=new ve;return r.setPrivate(pn(t.n),pn(t.e),pn(t.d)),r}if("EC"===t.kty&&void 0!==t.crv&&void 0!==t.x&&void 0!==t.y&&void 0===t.d){var i=new Cr.crypto.ECDSA({curve:t.crv}),s=i.ecparams.keylen/4,a=("0000000000"+pn(t.x)).slice(-s),u=("0000000000"+pn(t.y)).slice(-s),c="04"+a+u;return i.setPublicKeyHex(c),i}if("EC"===t.kty&&void 0!==t.crv&&void 0!==t.x&&void 0!==t.y&&void 0!==t.d){var i=new Cr.crypto.ECDSA({curve:t.crv}),s=i.ecparams.keylen/4,a=("0000000000"+pn(t.x)).slice(-s),u=("0000000000"+pn(t.y)).slice(-s),c="04"+a+u,h=("0000000000"+pn(t.d)).slice(-s);return i.setPublicKeyHex(c),i.setPrivateKeyHex(h),i}if(t.indexOf("-END CERTIFICATE-",0)!=-1||t.indexOf("-END X509 CERTIFICATE-",0)!=-1||t.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1)return $n.getPublicKeyFromCertPEM(t);if("pkcs8pub"===n)return Ir.getKeyFromPublicPKCS8Hex(t);if(t.indexOf("-END PUBLIC KEY-")!=-1)return Ir.getKeyFromPublicPKCS8PEM(t);if("pkcs5prv"===n){var r=new ve;return r.readPrivateKeyFromASN1HexString(t),r}if("pkcs5prv"===n){var r=new ve;return r.readPrivateKeyFromASN1HexString(t),r}if(t.indexOf("-END RSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")==-1){var f=Ir.getHexFromPEM(t,"RSA PRIVATE KEY");return Ir.getKey(f,null,"pkcs5prv")}if(t.indexOf("-END DSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")==-1){var l=this.getHexFromPEM(t,"DSA PRIVATE KEY"),d=Or.getVbyList(l,0,[1],"02"),g=Or.getVbyList(l,0,[2],"02"),p=Or.getVbyList(l,0,[3],"02"),y=Or.getVbyList(l,0,[4],"02"),v=Or.getVbyList(l,0,[5],"02"),r=new Cr.crypto.DSA;return r.setPrivate(new o(d,16),new o(g,16),new o(p,16),new o(y,16),new o(v,16)),r}if(t.indexOf("-END PRIVATE KEY-")!=-1)return Ir.getKeyFromPlainPrivatePKCS8PEM(t);if(t.indexOf("-END RSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1)return Ir.getRSAKeyFromEncryptedPKCS5PEM(t,e);if(t.indexOf("-END EC PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1){var l=Ir.getDecryptedKeyHex(t,e),r=Or.getVbyList(l,0,[1],"04"),m=Or.getVbyList(l,0,[2,0],"06"),S=Or.getVbyList(l,0,[3,0],"03").substr(2),b="";if(void 0===Cr.crypto.OID.oidhex2name[m])throw"undefined OID(hex) in KJUR.crypto.OID: "+m;b=Cr.crypto.OID.oidhex2name[m];var i=new Cr.crypto.ECDSA({name:b});return i.setPublicKeyHex(S),i.setPrivateKeyHex(r),i.isPublic=!1,i}if(t.indexOf("-END DSA PRIVATE KEY-")!=-1&&t.indexOf("4,ENCRYPTED")!=-1){var l=Ir.getDecryptedKeyHex(t,e),d=Or.getVbyList(l,0,[1],"02"),g=Or.getVbyList(l,0,[2],"02"),p=Or.getVbyList(l,0,[3],"02"),y=Or.getVbyList(l,0,[4],"02"),v=Or.getVbyList(l,0,[5],"02"),r=new Cr.crypto.DSA;return r.setPrivate(new o(d,16),new o(g,16),new o(p,16),new o(y,16),new o(v,16)),r}if(t.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1)return Ir.getKeyFromEncryptedPKCS8PEM(t,e);throw"not supported argument"},Ir.generateKeypair=function(t,e){if("RSA"==t){var n=e,r=new ve;r.generate(n,"10001"),r.isPrivate=!0,r.isPublic=!0;var i=new ve,s=r.n.toString(16),o=r.e.toString(16);i.setPublic(s,o),i.isPrivate=!1,i.isPublic=!0;var a={};return a.prvKeyObj=r,a.pubKeyObj=i,a}if("EC"==t){var u=e,c=new Cr.crypto.ECDSA({curve:u}),h=c.generateKeyPairHex(),r=new Cr.crypto.ECDSA({curve:u});r.setPublicKeyHex(h.ecpubhex),r.setPrivateKeyHex(h.ecprvhex),r.isPrivate=!0,r.isPublic=!1;var i=new Cr.crypto.ECDSA({curve:u});i.setPublicKeyHex(h.ecpubhex),i.isPrivate=!1,i.isPublic=!0;var a={};return a.prvKeyObj=r,a.pubKeyObj=i,a}throw"unknown algorithm: "+t},Ir.getPEM=function(t,e,n,r,i){function s(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{int:{bigint:t.n}},{int:t.e},{int:{bigint:t.d}},{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.dmp1}},{int:{bigint:t.dmq1}},{int:{bigint:t.coeff}}]});return e}function o(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:1},{octstr:{hex:t.prvKeyHex}},{tag:["a0",!0,{oid:{name:t.curveName}}]},{tag:["a1",!0,{bitstr:{hex:"00"+t.pubKeyHex}}]}]});return e}function a(t){var e=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.g}},{int:{bigint:t.y}},{int:{bigint:t.x}}]});return e}var u=Cr.asn1,c=Cr.crypto;if(("undefined"!=typeof ve&&t instanceof ve||"undefined"!=typeof c.DSA&&t instanceof c.DSA||"undefined"!=typeof c.ECDSA&&t instanceof c.ECDSA)&&1==t.isPublic&&(void 0===e||"PKCS8PUB"==e)){var h=new Cr.asn1.x509.SubjectPublicKeyInfo(t),f=h.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(f,"PUBLIC KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&(void 0===n||null==n)&&1==t.isPrivate){var h=s(t),f=h.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(f,"RSA PRIVATE KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof ve&&t instanceof Cr.crypto.ECDSA&&(void 0===n||null==n)&&1==t.isPrivate){var l=new Cr.asn1.DERObjectIdentifier({name:t.curveName}),d=l.getEncodedHex(),g=o(t),p=g.getEncodedHex(),y="";return y+=u.ASN1Util.getPEMStringFromHex(d,"EC PARAMETERS"),y+=u.ASN1Util.getPEMStringFromHex(p,"EC PRIVATE KEY")}if("PKCS1PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&(void 0===n||null==n)&&1==t.isPrivate){var h=a(t),f=h.getEncodedHex();return u.ASN1Util.getPEMStringFromHex(f,"DSA PRIVATE KEY")}if("PKCS5PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&void 0!==n&&null!=n&&1==t.isPrivate){var h=s(t),f=h.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",f,n,r)}if("PKCS5PRV"==e&&"undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA&&void 0!==n&&null!=n&&1==t.isPrivate){var h=o(t),f=h.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",f,n,r)}if("PKCS5PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&void 0!==n&&null!=n&&1==t.isPrivate){var h=a(t),f=h.getEncodedHex();return void 0===r&&(r="DES-EDE3-CBC"),this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",f,n,r)}var v=function(t,e){var n=m(t,e),r=new Cr.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:n.pbkdf2Salt}},{int:n.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:n.encryptionSchemeIV}}]}]}]},{octstr:{hex:n.ciphertext}}]});return r.getEncodedHex()},m=function(t,e){var n=100,r=or.lib.WordArray.random(8),i="DES-EDE3-CBC",s=or.lib.WordArray.random(8),o=or.PBKDF2(e,r,{keySize:6,iterations:n}),a=or.enc.Hex.parse(t),u=or.TripleDES.encrypt(a,o,{iv:s})+"",c={};return c.ciphertext=u,c.pbkdf2Salt=or.enc.Hex.stringify(r),c.pbkdf2Iter=n,c.encryptionSchemeAlg=i,c.encryptionSchemeIV=or.enc.Hex.stringify(s),c};if("PKCS8PRV"==e&&"undefined"!=typeof ve&&t instanceof ve&&1==t.isPrivate){var S=s(t),b=S.getEncodedHex(),h=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"rsaEncryption"}},{null:!0}]},{octstr:{hex:b}}]}),f=h.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(f,"PRIVATE KEY");var p=v(f,n);return u.ASN1Util.getPEMStringFromHex(p,"ENCRYPTED PRIVATE KEY"); +}if("PKCS8PRV"==e&&"undefined"!=typeof Cr.crypto.ECDSA&&t instanceof Cr.crypto.ECDSA&&1==t.isPrivate){var S=new Cr.asn1.ASN1Util.newObject({seq:[{int:1},{octstr:{hex:t.prvKeyHex}},{tag:["a1",!0,{bitstr:{hex:"00"+t.pubKeyHex}}]}]}),b=S.getEncodedHex(),h=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:t.curveName}}]},{octstr:{hex:b}}]}),f=h.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(f,"PRIVATE KEY");var p=v(f,n);return u.ASN1Util.getPEMStringFromHex(p,"ENCRYPTED PRIVATE KEY")}if("PKCS8PRV"==e&&"undefined"!=typeof Cr.crypto.DSA&&t instanceof Cr.crypto.DSA&&1==t.isPrivate){var S=new Cr.asn1.DERInteger({bigint:t.x}),b=S.getEncodedHex(),h=Cr.asn1.ASN1Util.newObject({seq:[{int:0},{seq:[{oid:{name:"dsa"}},{seq:[{int:{bigint:t.p}},{int:{bigint:t.q}},{int:{bigint:t.g}}]}]},{octstr:{hex:b}}]}),f=h.getEncodedHex();if(void 0===n||null==n)return u.ASN1Util.getPEMStringFromHex(f,"PRIVATE KEY");var p=v(f,n);return u.ASN1Util.getPEMStringFromHex(p,"ENCRYPTED PRIVATE KEY")}throw"unsupported object nor format"},Ir.getKeyFromCSRPEM=function(t){var e=Ir.getHexFromPEM(t,"CERTIFICATE REQUEST"),n=Ir.getKeyFromCSRHex(e);return n},Ir.getKeyFromCSRHex=function(t){var e=Ir.parseCSRHex(t),n=Ir.getKey(e.p8pubkeyhex,null,"pkcs8pub");return n},Ir.parseCSRHex=function(t){var e={},n=t;if("30"!=n.substr(0,2))throw"malformed CSR(code:001)";var r=Or.getPosArrayOfChildren_AtObj(n,0);if(r.length<1)throw"malformed CSR(code:002)";if("30"!=n.substr(r[0],2))throw"malformed CSR(code:003)";var i=Or.getPosArrayOfChildren_AtObj(n,r[0]);if(i.length<3)throw"malformed CSR(code:004)";return e.p8pubkeyhex=Or.getHexOfTLV_AtObj(n,i[2]),e},Ir.getJWKFromKey=function(t){var e={};if(t instanceof ve&&t.isPrivate)return e.kty="RSA",e.n=gn(t.n.toString(16)),e.e=gn(t.e.toString(16)),e.d=gn(t.d.toString(16)),e.p=gn(t.p.toString(16)),e.q=gn(t.q.toString(16)),e.dp=gn(t.dmp1.toString(16)),e.dq=gn(t.dmq1.toString(16)),e.qi=gn(t.coeff.toString(16)),e;if(t instanceof ve&&t.isPublic)return e.kty="RSA",e.n=gn(t.n.toString(16)),e.e=gn(t.e.toString(16)),e;if(t instanceof Cr.crypto.ECDSA&&t.isPrivate){var n=t.getShortNISTPCurveName();if("P-256"!==n&&"P-384"!==n)throw"unsupported curve name for JWT: "+n;var r=t.getPublicKeyXYHex();return e.kty="EC",e.crv=n,e.x=gn(r.x),e.y=gn(r.y),e.d=gn(t.prvKeyHex),e}if(t instanceof Cr.crypto.ECDSA&&t.isPublic){var n=t.getShortNISTPCurveName();if("P-256"!==n&&"P-384"!==n)throw"unsupported curve name for JWT: "+n;var r=t.getPublicKeyXYHex();return e.kty="EC",e.crv=n,e.x=gn(r.x),e.y=gn(r.y),e}throw"not supported key object"},ve.prototype.readPrivateKeyFromPEMString=Dn,ve.prototype.readPrivateKeyFromASN1HexString=Tn;/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license */ -var Ir=new RegExp("");Ir.compile("[^0-9a-f]","gi"),ve.prototype.signWithMessageHash=kn,ve.prototype.signString=In,ve.prototype.signStringWithSHA1=Bn,ve.prototype.signStringWithSHA256=Nn,ve.prototype.sign=In,ve.prototype.signWithSHA1=Bn,ve.prototype.signWithSHA256=Nn,ve.prototype.signWithMessageHashPSS=Kn,ve.prototype.signStringPSS=Mn,ve.prototype.signPSS=Mn,ve.SALT_LEN_HLEN=-1,ve.SALT_LEN_MAX=-2,ve.prototype.verifyWithMessageHash=Yn,ve.prototype.verifyString=zn,ve.prototype.verifyHexSignatureForMessage=Jn,ve.prototype.verify=zn,ve.prototype.verifyHexSignatureForByteArrayMessage=Jn,ve.prototype.verifyWithMessageHashPSS=Xn,ve.prototype.verifyStringPSS=Gn,ve.prototype.verifyPSS=Gn,ve.SALT_LEN_RECOVER=-2,$n.pemToBase64=function(t){var e=t;return e=e.replace("-----BEGIN CERTIFICATE-----",""),e=e.replace("-----END CERTIFICATE-----",""),e=e.replace(/[ \n]+/g,"")},$n.pemToHex=function(t){var e=$n.pemToBase64(t),n=i(e);return n},$n.getSubjectPublicKeyPosFromCertHex=function(t){var e=$n.getSubjectPublicKeyInfoPosFromCertHex(t);if(e==-1)return-1;var n=Or.getPosArrayOfChildren_AtObj(t,e);if(2!=n.length)return-1;var r=n[1];if("03"!=t.substring(r,r+2))return-1;var i=Or.getStartPosOfV_AtObj(t,r);return"00"!=t.substring(i,i+2)?-1:i+2},$n.getSubjectPublicKeyInfoPosFromCertHex=function(t){var e=Or.getStartPosOfV_AtObj(t,0),n=Or.getPosArrayOfChildren_AtObj(t,e);return n.length<1?-1:"a003020102"==t.substring(n[0],n[0]+10)?n.length<6?-1:n[6]:n.length<5?-1:n[5]},$n.getPublicKeyHexArrayFromCertHex=function(t){var e=$n.getSubjectPublicKeyPosFromCertHex(t),n=Or.getPosArrayOfChildren_AtObj(t,e);if(2!=n.length)return[];var r=Or.getHexOfV_AtObj(t,n[0]),i=Or.getHexOfV_AtObj(t,n[1]);return null!=r&&null!=i?[r,i]:[]},$n.getHexTbsCertificateFromCert=function(t){var e=Or.getStartPosOfV_AtObj(t,0);return e},$n.getPublicKeyHexArrayFromCertPEM=function(t){var e=$n.pemToHex(t),n=$n.getPublicKeyHexArrayFromCertHex(e);return n},$n.hex2dn=function(t){for(var e="",n=Or.getPosArrayOfChildren_AtObj(t,0),r=0;r0){var l=":"+n.join(":")+":";if(l.indexOf(":"+c+":")==-1)throw"algorithm '"+c+"' not accepted in the list"}if("none"!=c&&null===e)throw"key shall be specified to verify.";if("string"==typeof e&&e.indexOf("-----BEGIN ")!=-1&&(e=Hr.getKey(e)),!("RS"!=f&&"PS"!=f||e instanceof ve))throw"key shall be a RSAKey obj for RS* and PS* algs";if("ES"==f&&!(e instanceof Cr.crypto.ECDSA))throw"key shall be a ECDSA obj for ES* algs";var d=null;if(void 0===r.jwsalg2sigalg[h.alg])throw"unsupported alg name: "+c;if(d=r.jwsalg2sigalg[c],"none"==d)throw"not supported";if("Hmac"==d.substr(0,4)){var g=null;if(void 0===e)throw"hexadecimal key shall be specified for HMAC";var p=new Cr.crypto.Mac({alg:d,pass:e});return p.updateString(a),g=p.doFinal(),u==g}if(d.indexOf("withECDSA")!=-1){var y=null;try{y=Cr.crypto.ECDSA.concatSigToASN1Sig(u)}catch(t){return!1}var v=new Cr.crypto.Signature({alg:d});return v.init(e),v.updateString(a),v.verify(y)}var v=new Cr.crypto.Signature({alg:d});return v.init(e),v.updateString(a),v.verify(u)},Cr.jws.JWS.parse=function(t){var e,n,r,i=t.split("."),s={};if(2!=i.length&&3!=i.length)throw"malformed sJWS: wrong number of '.' splitted elements";return e=i[0],n=i[1],3==i.length&&(r=i[2]),s.headerObj=Cr.jws.JWS.readSafeJSONString(Dr(e)),s.payloadObj=Cr.jws.JWS.readSafeJSONString(Dr(n)),s.headerPP=JSON.stringify(s.headerObj,null," "),null==s.payloadObj?s.payloadPP=Dr(n):s.payloadPP=JSON.stringify(s.payloadObj,null," "),void 0!==r&&(s.sigHex=pn(r)),s},Cr.jws.JWS.verifyJWT=function(t,e,n){var r=Cr.jws.JWS,i=t.split("."),s=i[0],o=i[1],a=(pn(i[2]),r.readSafeJSONString(Dr(s))),u=r.readSafeJSONString(Dr(o));if(void 0===a.alg)return!1;if(void 0===n.alg)throw"acceptField.alg shall be specified";if(!r.inArray(a.alg,n.alg))return!1;if(void 0!==u.iss&&"object"==typeof n.iss&&!r.inArray(u.iss,n.iss))return!1;if(void 0!==u.sub&&"object"==typeof n.sub&&!r.inArray(u.sub,n.sub))return!1;if(void 0!==u.aud&&"object"==typeof n.aud)if("string"==typeof u.aud){if(!r.inArray(u.aud,n.aud))return!1}else if("object"==typeof u.aud&&!r.includedArray(u.aud,n.aud))return!1;var h=Cr.jws.IntDate.getNow();return void 0!==n.verifyAt&&"number"==typeof n.verifyAt&&(h=n.verifyAt),void 0!==n.gracePeriod&&"number"==typeof n.gracePeriod||(n.gracePeriod=0),!(void 0!==u.exp&&"number"==typeof u.exp&&u.exp+n.gracePeriod0){var l=":"+n.join(":")+":";if(l.indexOf(":"+h+":")==-1)throw"algorithm '"+h+"' not accepted in the list"}if("none"!=h&&null===e)throw"key shall be specified to verify.";if("string"==typeof e&&e.indexOf("-----BEGIN ")!=-1&&(e=Ir.getKey(e)),!("RS"!=f&&"PS"!=f||e instanceof ve))throw"key shall be a RSAKey obj for RS* and PS* algs";if("ES"==f&&!(e instanceof Cr.crypto.ECDSA))throw"key shall be a ECDSA obj for ES* algs";var d=null;if(void 0===r.jwsalg2sigalg[c.alg])throw"unsupported alg name: "+h;if(d=r.jwsalg2sigalg[h],"none"==d)throw"not supported";if("Hmac"==d.substr(0,4)){var g=null;if(void 0===e)throw"hexadecimal key shall be specified for HMAC";var p=new Cr.crypto.Mac({alg:d,pass:e});return p.updateString(a),g=p.doFinal(),u==g}if(d.indexOf("withECDSA")!=-1){var y=null;try{y=Cr.crypto.ECDSA.concatSigToASN1Sig(u)}catch(t){return!1}var v=new Cr.crypto.Signature({alg:d});return v.init(e),v.updateString(a),v.verify(y)}var v=new Cr.crypto.Signature({alg:d});return v.init(e),v.updateString(a),v.verify(u)},Cr.jws.JWS.parse=function(t){var e,n,r,i=t.split("."),s={};if(2!=i.length&&3!=i.length)throw"malformed sJWS: wrong number of '.' splitted elements";return e=i[0],n=i[1],3==i.length&&(r=i[2]),s.headerObj=Cr.jws.JWS.readSafeJSONString(jr(e)),s.payloadObj=Cr.jws.JWS.readSafeJSONString(jr(n)),s.headerPP=JSON.stringify(s.headerObj,null," "),null==s.payloadObj?s.payloadPP=jr(n):s.payloadPP=JSON.stringify(s.payloadObj,null," "),void 0!==r&&(s.sigHex=pn(r)),s},Cr.jws.JWS.verifyJWT=function(t,e,n){var r=Cr.jws.JWS,i=t.split("."),s=i[0],o=i[1],a=(pn(i[2]),r.readSafeJSONString(jr(s))),u=r.readSafeJSONString(jr(o));if(void 0===a.alg)return!1;if(void 0===n.alg)throw"acceptField.alg shall be specified";if(!r.inArray(a.alg,n.alg))return!1;if(void 0!==u.iss&&"object"==typeof n.iss&&!r.inArray(u.iss,n.iss))return!1;if(void 0!==u.sub&&"object"==typeof n.sub&&!r.inArray(u.sub,n.sub))return!1;if(void 0!==u.aud&&"object"==typeof n.aud)if("string"==typeof u.aud){if(!r.inArray(u.aud,n.aud))return!1}else if("object"==typeof u.aud&&!r.includedArray(u.aud,n.aud))return!1;var c=Cr.jws.IntDate.getNow();return void 0!==n.verifyAt&&"number"==typeof n.verifyAt&&(c=n.verifyAt),void 0!==n.gracePeriod&&"number"==typeof n.gracePeriod||(n.gracePeriod=0),!(void 0!==u.exp&&"number"==typeof u.exp&&u.exp+n.gracePeriodi&&this.aHeader.pop(),this.aSignature.length>i&&this.aSignature.pop(),"addSignature failed: "+t}},this.addSignatureByHeaderKey=function(t,e){var n=Dr(this.sPayload),r=new Cr.jws.JWS;r.generateJWSByP1PrvKey(t,n,e);this.aHeader.push(r.parsedJWS.headB64U),this.aSignature.push(r.parsedJWS.sigvalB64U)},this.addSignatureByHeaderPayloadKey=function(t,e,n){var r=new Cr.jws.JWS;r.generateJWSByP1PrvKey(t,e,n);this.aHeader.push(r.parsedJWS.headB64U),this.sPayload=r.parsedJWS.payloadB64U,this.aSignature.push(r.parsedJWS.sigvalB64U)},this.verifyAll=function(t){if(this.aHeader.length!==t.length||this.aSignature.length!==t.length)return!1;for(var e=0;e0))throw"malformed header";if(this.aHeader=e.headers,"string"!=typeof e.payload)throw"malformed signatures";if(this.sPayload=e.payload,!(e.signatures.length>0))throw"malformed signatures";this.signatures=e.signatures}catch(t){throw"malformed JWS-JS JSON object: "+t}},this.getJSON=function(){return{headers:this.aHeader,payload:this.sPayload,signatures:this.aSignature}},this.isEmpty=function(){return 0==this.aHeader.length?1:0}},e.SecureRandom=le,e.rng_seed_time=he,e.BigInteger=o,e.RSAKey=ve,e.ECDSA=Cr.crypto.ECDSA,e.DSA=Cr.crypto.DSA,e.Signature=Cr.crypto.Signature,e.MessageDigest=Cr.crypto.MessageDigest,e.Mac=Cr.crypto.Mac,e.KEYUTIL=Hr,e.ASN1HEX=Or,e.X509=$n,e.CryptoJS=or,e.b64tohex=i,e.b64toBA=s,e.stoBA=sn,e.BAtos=on,e.BAtohex=an,e.stohex=un,e.stob64=hn,e.stob64u=cn,e.b64utos=fn,e.b64tob64u=ln,e.b64utob64=dn,e.hex2b64=r,e.hextob64u=gn,e.b64utohex=pn,e.b64tohex=i,e.utf8tob64u=Tr,e.b64utoutf8=Dr,e.utf8tob64=yn,e.b64toutf8=vn,e.utf8tohex=mn,e.hextoutf8=Sn,e.hextorstr=bn,e.rstrtohex=wn,e.newline_toUnix=Fn,e.newline_toDos=Pn,e.intarystrtohex=On,e.strdiffidx=Rr,e.KJUR=Cr,e.crypto=Cr.crypto,e.asn1=Cr.asn1,e.jws=Cr.jws,e.lang=Cr.lang,e.readFileUTF8=Qn,e.readFileHexByBin=Zn,e.readFile=tr,e.saveFile=er,e.saveFileBinByHex=nr}).call(e,n(13).Buffer)},function(t,e,n){(function(t){/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -"use strict";function r(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(t){return!1}}function i(){return o.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(t,e){if(i()=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|t}function y(t){return+t!=t&&(t=0),o.alloc(+t)}function v(t,e){if(o.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var n=t.length;if(0===n)return 0;for(var r=!1;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return W(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return Y(t).length;default:if(r)return W(t).length;e=(""+e).toLowerCase(),r=!0}}function m(t,e,n){var r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if(n>>>=0,e>>>=0,n<=e)return"";for(t||(t="utf8");;)switch(t){case"hex":return j(this,e,n);case"utf8":case"utf-8":return C(this,e,n);case"ascii":return D(this,e,n);case"latin1":case"binary":return R(this,e,n);case"base64":return O(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return H(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function S(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function b(t,e,n,r,i){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(i)return-1;n=t.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof e&&(e=o.from(e,r)),o.isBuffer(e))return 0===e.length?-1:w(t,e,n,r,i);if("number"==typeof e)return e&=255,o.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):w(t,[e],n,r,i);throw new TypeError("val must be string, number or Buffer")}function w(t,e,n,r,i){function s(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}var o=1,a=t.length,u=e.length;if(void 0!==r&&(r=String(r).toLowerCase(),"ucs2"===r||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;o=2,a/=2,u/=2,n/=2}var h;if(i){var c=-1;for(h=n;ha&&(n=a-u),h=n;h>=0;h--){for(var f=!0,l=0;li&&(r=i)):r=i;var s=e.length;if(s%2!==0)throw new TypeError("Invalid hex string");r>s/2&&(r=s/2);for(var o=0;o239?4:s>223?3:s>191?2:1;if(i+a<=n){var u,h,c,f;switch(a){case 1:s<128&&(o=s);break;case 2:u=t[i+1],128===(192&u)&&(f=(31&s)<<6|63&u,f>127&&(o=f));break;case 3:u=t[i+1],h=t[i+2],128===(192&u)&&128===(192&h)&&(f=(15&s)<<12|(63&u)<<6|63&h,f>2047&&(f<55296||f>57343)&&(o=f));break;case 4:u=t[i+1],h=t[i+2],c=t[i+3],128===(192&u)&&128===(192&h)&&128===(192&c)&&(f=(15&s)<<18|(63&u)<<12|(63&h)<<6|63&c,f>65535&&f<1114112&&(o=f))}}null===o?(o=65533,a=1):o>65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o),i+=a}return T(r)}function T(t){var e=t.length;if(e<=tt)return String.fromCharCode.apply(String,t);for(var n="",r=0;rr)&&(n=r);for(var i="",s=e;sn)throw new RangeError("Trying to access beyond buffer length")}function k(t,e,n,r,i,s){if(!o.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function B(t,e,n,r){e<0&&(e=65535+e+1);for(var i=0,s=Math.min(t.length-n,2);i>>8*(r?i:1-i)}function N(t,e,n,r){e<0&&(e=4294967295+e+1);for(var i=0,s=Math.min(t.length-n,4);i>>8*(r?i:3-i)&255}function V(t,e,n,r,i,s){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function M(t,e,n,r,i){return i||V(t,e,n,4,3.4028234663852886e38,-3.4028234663852886e38),Q.write(t,e,n,r,23,4),n+4}function K(t,e,n,r,i){return i||V(t,e,n,8,1.7976931348623157e308,-1.7976931348623157e308),Q.write(t,e,n,r,52,8),n+8}function L(t){if(t=U(t).replace(et,""),t.length<2)return"";for(;t.length%4!==0;)t+="=";return t}function U(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function q(t){return t<16?"0"+t.toString(16):t.toString(16)}function W(t,e){e=e||1/0;for(var n,r=t.length,i=null,s=[],o=0;o55295&&n<57344){if(!i){if(n>56319){(e-=3)>-1&&s.push(239,191,189);continue}if(o+1===r){(e-=3)>-1&&s.push(239,191,189);continue}i=n;continue}if(n<56320){(e-=3)>-1&&s.push(239,191,189),i=n;continue}n=(i-55296<<10|n-56320)+65536}else i&&(e-=3)>-1&&s.push(239,191,189);if(i=null,n<128){if((e-=1)<0)break;s.push(n)}else if(n<2048){if((e-=2)<0)break;s.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;s.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;s.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return s}function J(t){for(var e=[],n=0;n>8,i=n%256,s.push(i),s.push(r);return s}function Y(t){return $.toByteArray(L(t))}function G(t,e,n,r){for(var i=0;i=e.length||i>=t.length);++i)e[i+n]=t[i];return i}function X(t){return t!==t}var $=n(14),Q=n(15),Z=n(16);e.Buffer=o,e.SlowBuffer=y,e.INSPECT_MAX_BYTES=50,o.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:r(),e.kMaxLength=i(),o.poolSize=8192,o._augment=function(t){return t.__proto__=o.prototype,t},o.from=function(t,e,n){return a(null,t,e,n)},o.TYPED_ARRAY_SUPPORT&&(o.prototype.__proto__=Uint8Array.prototype,o.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&o[Symbol.species]===o&&Object.defineProperty(o,Symbol.species,{value:null,configurable:!0})),o.alloc=function(t,e,n){return h(null,t,e,n)},o.allocUnsafe=function(t){return c(null,t)},o.allocUnsafeSlow=function(t){return c(null,t)},o.isBuffer=function(t){return!(null==t||!t._isBuffer)},o.compare=function(t,e){if(!o.isBuffer(t)||!o.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var n=t.length,r=e.length,i=0,s=Math.min(n,r);i0&&(t=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(t+=" ... ")),""},o.prototype.compare=function(t,e,n,r,i){if(!o.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),e<0||n>t.length||r<0||i>this.length)throw new RangeError("out of range index");if(r>=i&&e>=n)return 0;if(r>=i)return-1;if(e>=n)return 1;if(e>>>=0,n>>>=0,r>>>=0,i>>>=0,this===t)return 0;for(var s=i-r,a=n-e,u=Math.min(s,a),h=this.slice(r,i),c=t.slice(e,n),f=0;fi)&&(n=i),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var s=!1;;)switch(r){case"hex":return E(this,t,e,n);case"utf8":case"utf-8":return _(this,t,e,n);case"ascii":return x(this,t,e,n);case"latin1":case"binary":return A(this,t,e,n);case"base64":return F(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,e,n);default:if(s)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),s=!0}},o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var tt=4096;o.prototype.slice=function(t,e){var n=this.length;t=~~t,e=void 0===e?n:~~e,t<0?(t+=n,t<0&&(t=0)):t>n&&(t=n),e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),e0&&(i*=256);)r+=this[t+--e]*i;return r},o.prototype.readUInt8=function(t,e){return e||I(t,1,this.length),this[t]},o.prototype.readUInt16LE=function(t,e){return e||I(t,2,this.length),this[t]|this[t+1]<<8},o.prototype.readUInt16BE=function(t,e){return e||I(t,2,this.length),this[t]<<8|this[t+1]},o.prototype.readUInt32LE=function(t,e){return e||I(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},o.prototype.readUInt32BE=function(t,e){return e||I(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},o.prototype.readIntLE=function(t,e,n){t|=0,e|=0,n||I(t,e,this.length);for(var r=this[t],i=1,s=0;++s=i&&(r-=Math.pow(2,8*e)),r},o.prototype.readIntBE=function(t,e,n){t|=0,e|=0,n||I(t,e,this.length);for(var r=e,i=1,s=this[t+--r];r>0&&(i*=256);)s+=this[t+--r]*i;return i*=128,s>=i&&(s-=Math.pow(2,8*e)),s},o.prototype.readInt8=function(t,e){return e||I(t,1,this.length),128&this[t]?(255-this[t]+1)*-1:this[t]},o.prototype.readInt16LE=function(t,e){e||I(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},o.prototype.readInt16BE=function(t,e){e||I(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},o.prototype.readInt32LE=function(t,e){return e||I(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},o.prototype.readInt32BE=function(t,e){return e||I(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},o.prototype.readFloatLE=function(t,e){return e||I(t,4,this.length),Q.read(this,t,!0,23,4)},o.prototype.readFloatBE=function(t,e){return e||I(t,4,this.length),Q.read(this,t,!1,23,4)},o.prototype.readDoubleLE=function(t,e){return e||I(t,8,this.length),Q.read(this,t,!0,52,8)},o.prototype.readDoubleBE=function(t,e){return e||I(t,8,this.length),Q.read(this,t,!1,52,8)},o.prototype.writeUIntLE=function(t,e,n,r){if(t=+t,e|=0,n|=0,!r){var i=Math.pow(2,8*n)-1;k(this,t,e,n,i,0)}var s=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+s]=t/o&255;return e+n},o.prototype.writeUInt8=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,1,255,0),o.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},o.prototype.writeUInt16LE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):B(this,t,e,!0),e+2},o.prototype.writeUInt16BE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):B(this,t,e,!1),e+2},o.prototype.writeUInt32LE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):N(this,t,e,!0),e+4},o.prototype.writeUInt32BE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):N(this,t,e,!1),e+4},o.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);k(this,t,e,n,i-1,-i)}var s=0,o=1,a=0;for(this[e]=255&t;++s>0)-a&255;return e+n},o.prototype.writeIntBE=function(t,e,n,r){if(t=+t,e|=0,!r){var i=Math.pow(2,8*n-1);k(this,t,e,n,i-1,-i)}var s=n-1,o=1,a=0;for(this[e+s]=255&t;--s>=0&&(o*=256);)t<0&&0===a&&0!==this[e+s+1]&&(a=1),this[e+s]=(t/o>>0)-a&255;return e+n},o.prototype.writeInt8=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,1,127,-128),o.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},o.prototype.writeInt16LE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):B(this,t,e,!0),e+2},o.prototype.writeInt16BE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):B(this,t,e,!1),e+2},o.prototype.writeInt32LE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,4,2147483647,-2147483648),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):N(this,t,e,!0),e+4},o.prototype.writeInt32BE=function(t,e,n){return t=+t,e|=0,n||k(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):N(this,t,e,!1),e+4},o.prototype.writeFloatLE=function(t,e,n){return M(this,t,e,!0,n)},o.prototype.writeFloatBE=function(t,e,n){return M(this,t,e,!1,n)},o.prototype.writeDoubleLE=function(t,e,n){return K(this,t,e,!0,n)},o.prototype.writeDoubleBE=function(t,e,n){return K(this,t,e,!1,n)},o.prototype.copy=function(t,e,n,r){if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e=0;--i)t[i+e]=this[i+n];else if(s<1e3||!o.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,n=void 0===n?this.length:n>>>0,t||(t=0);var s;if("number"==typeof t)for(s=e;s0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===t[e-2]?2:"="===t[e-1]?1:0}function r(t){return 3*t.length/4-n(t)}function i(t){var e,r,i,s,o,a=t.length;s=n(t),o=new c(3*a/4-s),r=s>0?a-4:a;var u=0;for(e=0;e>16&255,o[u++]=i>>8&255,o[u++]=255&i;return 2===s?(i=h[t.charCodeAt(e)]<<2|h[t.charCodeAt(e+1)]>>4,o[u++]=255&i):1===s&&(i=h[t.charCodeAt(e)]<<10|h[t.charCodeAt(e+1)]<<4|h[t.charCodeAt(e+2)]>>2,o[u++]=i>>8&255,o[u++]=255&i),o}function s(t){return u[t>>18&63]+u[t>>12&63]+u[t>>6&63]+u[63&t]}function o(t,e,n){for(var r,i=[],o=e;oc?c:h+a));return 1===r?(e=t[n-1],i+=u[e>>2],i+=u[e<<4&63],i+="=="):2===r&&(e=(t[n-2]<<8)+t[n-1],i+=u[e>>10],i+=u[e>>4&63],i+=u[e<<2&63],i+="="),s.push(i),s.join("")}e.byteLength=r,e.toByteArray=i,e.fromByteArray=a;for(var u=[],h=[],c="undefined"!=typeof Uint8Array?Uint8Array:Array,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l=0,d=f.length;l>1,c=-7,f=n?i-1:0,l=n?-1:1,d=t[e+f];for(f+=l,s=d&(1<<-c)-1,d>>=-c,c+=a;c>0;s=256*s+t[e+f],f+=l,c-=8);for(o=s&(1<<-c)-1,s>>=-c,c+=r;c>0;o=256*o+t[e+f],f+=l,c-=8);if(0===s)s=1-h;else{if(s===u)return o?NaN:(d?-1:1)*(1/0);o+=Math.pow(2,r),s-=h}return(d?-1:1)*o*Math.pow(2,s-r)},e.write=function(t,e,n,r,i,s){var o,a,u,h=8*s-i-1,c=(1<>1,l=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=r?0:s-1,g=r?1:-1,p=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,o=c):(o=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-o))<1&&(o--,u*=2),e+=o+f>=1?l/u:l*Math.pow(2,1-f),e*u>=2&&(o++,u/=2),o+f>=c?(a=0,o=c):o+f>=1?(a=(e*u-1)*Math.pow(2,i),o+=f):(a=e*Math.pow(2,f-1)*Math.pow(2,i),o=0));i>=8;t[n+d]=255&a,d+=g,a/=256,i-=8);for(o=o<0;t[n+d]=255&o,d+=g,o/=256,h-=8);t[n+d-g]|=128*p}},function(t,e){var n={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==n.call(t)}},function(t,e){},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=r(s),a=n(19),u=r(a),h=n(20),c=r(h),f=function(){function t(e){var n=e.url,r=e.client_id,s=e.redirect_uri,a=e.response_type,h=e.scope,f=e.authority,l=e.data,d=e.prompt,g=e.display,p=e.max_age,y=e.ui_locales,v=e.id_token_hint,m=e.login_hint,S=e.acr_values,b=e.resource,w=e.request,E=e.request_uri,_=e.extraQueryParams;if(i(this,t),!n)throw o.default.error("No url passed to SigninRequest"),new Error("url");if(!r)throw o.default.error("No client_id passed to SigninRequest"),new Error("client_id");if(!s)throw o.default.error("No redirect_uri passed to SigninRequest"),new Error("redirect_uri");if(!a)throw o.default.error("No response_type passed to SigninRequest"),new Error("response_type");if(!h)throw o.default.error("No scope passed to SigninRequest"),new Error("scope");if(!f)throw o.default.error("No authority passed to SigninRequest"),new Error("authority");var x=t.isOidc(a);this.state=new c.default({nonce:x,data:l,client_id:r,authority:f}),n=u.default.addQueryParam(n,"client_id",r),n=u.default.addQueryParam(n,"redirect_uri",s),n=u.default.addQueryParam(n,"response_type",a),n=u.default.addQueryParam(n,"scope",h),n=u.default.addQueryParam(n,"state",this.state.id),x&&(n=u.default.addQueryParam(n,"nonce",this.state.nonce));var A={prompt:d,display:g,max_age:p,ui_locales:y,id_token_hint:v,login_hint:m,acr_values:S,resource:b,request:w,request_uri:E};for(var F in A)A[F]&&(n=u.default.addQueryParam(n,F,A[F]));for(var P in _)n=u.default.addQueryParam(n,P,_[P]);this.url=n}return t.isOidc=function(t){var e=t.split(/\s+/g).filter(function(t){return"id_token"===t});return!!e[0]},t.isOAuth=function(t){var e=t.split(/\s+/g).filter(function(t){return"token"===t});return!!e[0]},t}();e.default=f,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=r(s),a=n(5),u=r(a),h=function(){function t(){i(this,t)}return t.addQueryParam=function(t,e,n){return t.indexOf("?")<0&&(t+="?"),"?"!==t[t.length-1]&&(t+="&"),t+=encodeURIComponent(e),t+="=",t+=encodeURIComponent(n)},t.parseUrlFragment=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"#",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;o.default.debug("UrlUtility.parseUrlFragment"),"string"!=typeof t&&(t=n.location.href);var r=t.lastIndexOf(e);r>=0&&(t=t.substr(r+1));for(var i,s={},a=/([^&=]+)=([^&]*)/g,h=0;i=a.exec(t);)if(s[decodeURIComponent(i[1])]=decodeURIComponent(i[2]),h++>50)return o.default.error("response exceeded expected number of parameters",t),{error:"Response exceeded expected number of parameters"};for(var c in s)return s;return{}},t}();e.default=h,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=n.nonce,o=n.authority,a=n.client_id;i(this,e);var u=s(this,t.call(this,arguments[0]));return r===!0?u._nonce=(0,d.default)():r&&(u._nonce=r),u._authority=o,u._client_id=a,u}return o(e,t),e.prototype.toStorageString=function(){return h.default.debug("SigninState.toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,nonce:this.nonce,authority:this.authority,client_id:this.client_id})},e.fromStorageString=function(t){h.default.debug("SigninState.fromStorageString");var n=JSON.parse(t);return new e(n)},a(e,[{key:"nonce",get:function(){return this._nonce}},{key:"authority",get:function(){return this._authority}},{key:"client_id",get:function(){return this._client_id}}]),e}(f.default);e.default=g,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=e.id,r=e.data,s=e.created;i(this,t),this._id=n||(0,h.default)(),this._data=r,"number"==typeof s&&s>0?this._created=s:this._created=parseInt(Date.now()/1e3)}return t.prototype.toStorageString=function(){return a.default.debug("State.toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created})},t.fromStorageString=function(e){return a.default.debug("State.fromStorageString"),new t(JSON.parse(e))},t.clearStaleState=function(e,n){a.default.debug("State.clearStaleState");var r=Date.now()/1e3-n;return e.getAllKeys().then(function(n){a.default.debug("got keys",n);var i=[],s=!0,o=!1,u=void 0;try{for(var h,c=function(){var n=h.value;l=e.get(n).then(function(i){var s=!1;if(i)try{var o=t.fromStorageString(i);a.default.debug("got item from key: ",n,o.created),o.created<=r&&(s=!0)}catch(t){a.default.error("Error parsing state for key",n,t.message),s=!0}else a.default.debug("no item in storage for key: ",n),s=!0;if(s)return a.default.debug("removed item for key: ",n),e.remove(n)}),i.push(l)},f=n[Symbol.iterator]();!(s=(h=f.next()).done);s=!0){var l;c()}}catch(t){o=!0,u=t}finally{try{!s&&f.return&&f.return()}finally{if(o)throw u}}return a.default.debug("waiting on promise count:",i.length),Promise.all(i)})},s(t,[{key:"id",get:function(){return this._id}},{key:"data",get:function(){return this._data}},{key:"created",get:function(){return this._created}}]),t}();e.default=c,t.exports=e.default},function(t,e){"use strict"; +"undefined"!=typeof Cr&&Cr||(Cr={}),"undefined"!=typeof Cr.jws&&Cr.jws||(Cr.jws={}),Cr.jws.JWSJS=function(){var t=Cr.jws.JWS,e=Cr.jws.JWS;this.aHeader=[],this.sPayload="",this.aSignature=[],this.init=function(){this.aHeader=[],this.sPayload=void 0,this.aSignature=[]},this.initWithJWS=function(t){this.init();var e=t.split(".");if(3!=e.length)throw"malformed input JWS";this.aHeader.push(e[0]),this.sPayload=e[1],this.aSignature.push(e[2])},this.addSignature=function(t,e,n,r){if(void 0===this.sPayload||null===this.sPayload)throw"there's no JSON-JS signature to add.";var i=this.aHeader.length;if(this.aHeader.length!=this.aSignature.length)throw"aHeader.length != aSignature.length";try{var s=Cr.jws.JWS.sign(t,e,this.sPayload,n,r),o=s.split(".");o[0],o[2];this.aHeader.push(o[0]),this.aSignature.push(o[2])}catch(t){throw this.aHeader.length>i&&this.aHeader.pop(),this.aSignature.length>i&&this.aSignature.pop(),"addSignature failed: "+t}},this.addSignatureByHeaderKey=function(t,e){var n=jr(this.sPayload),r=new Cr.jws.JWS;r.generateJWSByP1PrvKey(t,n,e);this.aHeader.push(r.parsedJWS.headB64U),this.aSignature.push(r.parsedJWS.sigvalB64U)},this.addSignatureByHeaderPayloadKey=function(t,e,n){var r=new Cr.jws.JWS;r.generateJWSByP1PrvKey(t,e,n);this.aHeader.push(r.parsedJWS.headB64U),this.sPayload=r.parsedJWS.payloadB64U,this.aSignature.push(r.parsedJWS.sigvalB64U)},this.verifyAll=function(t){if(this.aHeader.length!==t.length||this.aSignature.length!==t.length)return!1;for(var e=0;e0))throw"malformed header";if(this.aHeader=e.headers,"string"!=typeof e.payload)throw"malformed signatures";if(this.sPayload=e.payload,!(e.signatures.length>0))throw"malformed signatures";this.signatures=e.signatures}catch(t){throw"malformed JWS-JS JSON object: "+t}},this.getJSON=function(){return{headers:this.aHeader,payload:this.sPayload,signatures:this.aSignature}},this.isEmpty=function(){return 0==this.aHeader.length?1:0}},e.SecureRandom=le,e.rng_seed_time=ce,e.BigInteger=o,e.RSAKey=ve,e.ECDSA=Cr.crypto.ECDSA,e.DSA=Cr.crypto.DSA,e.Signature=Cr.crypto.Signature,e.MessageDigest=Cr.crypto.MessageDigest,e.Mac=Cr.crypto.Mac,e.KEYUTIL=Ir,e.ASN1HEX=Or,e.X509=$n,e.CryptoJS=or,e.b64tohex=i,e.b64toBA=s,e.stoBA=sn,e.BAtos=on,e.BAtohex=an,e.stohex=un,e.stob64=cn,e.stob64u=hn,e.b64utos=fn,e.b64tob64u=ln,e.b64utob64=dn,e.hex2b64=r,e.hextob64u=gn,e.b64utohex=pn,e.b64tohex=i,e.utf8tob64u=Hr,e.b64utoutf8=jr,e.utf8tob64=yn,e.b64toutf8=vn,e.utf8tohex=mn,e.hextoutf8=Sn,e.hextorstr=bn,e.rstrtohex=wn,e.newline_toUnix=An,e.newline_toDos=Pn,e.intarystrtohex=On,e.strdiffidx=Tr,e.KJUR=Cr,e.crypto=Cr.crypto,e.asn1=Cr.asn1,e.jws=Cr.jws,e.lang=Cr.lang,e.readFileUTF8=Qn,e.readFileHexByBin=Zn,e.readFile=tr,e.saveFile=er,e.saveFileBinByHex=nr}).call(e,n(13).Buffer)},function(t,e){},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.SigninRequest=void 0;var s=n(1),o=r(s),a=n(15),u=r(a),c=n(16),h=r(c);e.SigninRequest=function(){function t(e){var n=e.url,r=e.client_id,s=e.redirect_uri,a=e.response_type,c=e.scope,f=e.authority,l=e.data,d=e.prompt,g=e.display,p=e.max_age,y=e.ui_locales,v=e.id_token_hint,m=e.login_hint,S=e.acr_values,b=e.resource,w=e.request,E=e.request_uri,x=e.extraQueryParams;if(i(this,t),!n)throw o.default.error("No url passed to SigninRequest"),new Error("url");if(!r)throw o.default.error("No client_id passed to SigninRequest"),new Error("client_id");if(!s)throw o.default.error("No redirect_uri passed to SigninRequest"),new Error("redirect_uri");if(!a)throw o.default.error("No response_type passed to SigninRequest"),new Error("response_type");if(!c)throw o.default.error("No scope passed to SigninRequest"),new Error("scope");if(!f)throw o.default.error("No authority passed to SigninRequest"),new Error("authority");var _=t.isOidc(a);this.state=new h.default({nonce:_,data:l,client_id:r,authority:f}),n=u.default.addQueryParam(n,"client_id",r),n=u.default.addQueryParam(n,"redirect_uri",s),n=u.default.addQueryParam(n,"response_type",a),n=u.default.addQueryParam(n,"scope",c),n=u.default.addQueryParam(n,"state",this.state.id),_&&(n=u.default.addQueryParam(n,"nonce",this.state.nonce));var F={prompt:d,display:g,max_age:p,ui_locales:y,id_token_hint:v,login_hint:m,acr_values:S,resource:b,request:w,request_uri:E};for(var A in F)F[A]&&(n=u.default.addQueryParam(n,A,F[A]));for(var P in x)n=u.default.addQueryParam(n,P,x[P]);this.url=n}return t.isOidc=function(t){var e=t.split(/\s+/g).filter(function(t){return"id_token"===t});return!!e[0]},t.isOAuth=function(t){var e=t.split(/\s+/g).filter(function(t){return"token"===t});return!!e[0]},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.UrlUtility=void 0;var s=n(1),o=r(s),a=n(5),u=r(a);e.UrlUtility=function(){function t(){i(this,t)}return t.addQueryParam=function(t,e,n){return t.indexOf("?")<0&&(t+="?"),"?"!==t[t.length-1]&&(t+="&"),t+=encodeURIComponent(e),t+="=",t+=encodeURIComponent(n)},t.parseUrlFragment=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"#",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;o.default.debug("UrlUtility.parseUrlFragment"),"string"!=typeof t&&(t=n.location.href);var r=t.lastIndexOf(e);r>=0&&(t=t.substr(r+1));for(var i,s={},a=/([^&=]+)=([^&]*)/g,c=0;i=a.exec(t);)if(s[decodeURIComponent(i[1])]=decodeURIComponent(i[2]),c++>50)return o.default.error("response exceeded expected number of parameters",t),{error:"Response exceeded expected number of parameters"};for(var h in s)return s;return{}},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.SigninState=void 0;var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=n.nonce,o=n.authority,a=n.client_id;i(this,e);var u=s(this,t.call(this,arguments[0]));return r===!0?u._nonce=(0,d.default)():r&&(u._nonce=r),u._authority=o,u._client_id=a,u}return o(e,t),e.prototype.toStorageString=function(){return c.default.debug("SigninState.toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,nonce:this.nonce,authority:this.authority,client_id:this.client_id})},e.fromStorageString=function(t){c.default.debug("SigninState.fromStorageString");var n=JSON.parse(t);return new e(n)},a(e,[{key:"nonce",get:function(){return this._nonce}},{key:"authority",get:function(){return this._authority}},{key:"client_id",get:function(){return this._client_id}}]),e}(f.default)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.State=void 0;var s=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=e.id,r=e.data,s=e.created;i(this,t),this._id=n||(0,c.default)(),this._data=r,"number"==typeof s&&s>0?this._created=s:this._created=parseInt(Date.now()/1e3)}return t.prototype.toStorageString=function(){return a.default.debug("State.toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created})},t.fromStorageString=function(e){return a.default.debug("State.fromStorageString"),new t(JSON.parse(e))},t.clearStaleState=function(e,n){a.default.debug("State.clearStaleState");var r=Date.now()/1e3-n;return e.getAllKeys().then(function(n){a.default.debug("got keys",n);for(var i=[],s=function(s){var o=n[s];u=e.get(o).then(function(n){var i=!1;if(n)try{var s=t.fromStorageString(n);a.default.debug("got item from key: ",o,s.created),s.created<=r&&(i=!0)}catch(t){a.default.error("Error parsing state for key",o,t.message),i=!0}else a.default.debug("no item in storage for key: ",o),i=!0;if(i)return a.default.debug("removed item for key: ",o),e.remove(o)}),i.push(u)},o=0;o0){var s=parseInt(Date.now()/1e3);this.expires_at=s+r}}return s(t,[{key:"expires_in",get:function(){if(this.expires_at){var t=parseInt(Date.now()/1e3);return this.expires_at-t}}},{key:"expired",get:function(){var t=this.expires_in;if(void 0!==t)return t<=0}},{key:"scopes",get:function(){return(this.scope||"").split(" ")}},{key:"isOpenIdConnect",get:function(){return this.scopes.indexOf(u)>=0||!!this.id_token}}]),t}();e.default=h,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=r(s),a=n(19),u=r(a),h=n(21),c=r(h),f=function t(e){var n=e.url,r=e.id_token_hint,s=e.post_logout_redirect_uri,a=e.data;if(i(this,t),!n)throw o.default.error("No url passed to SignoutRequest"),new Error("url");r&&(n=u.default.addQueryParam(n,"id_token_hint",r)),s&&(n=u.default.addQueryParam(n,"post_logout_redirect_uri",s),a&&(this.state=new c.default({data:a}),n=u.default.addQueryParam(n,"state",this.state.id))),this.url=n};e.default=f,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(19),o=r(s),a=function t(e){i(this,t);var n=o.default.parseUrlFragment(e,"?");this.error=n.error,this.error_description=n.error_description,this.error_uri=n.error_uri,this.state=n.state};e.default=a,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S.default,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:w.default,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:_.default;i(this,e),n instanceof d.default||(n=new d.default(n));var u=s(this,t.call(this,n));return u._events=new v.default(n),u._silentRenewService=new r(u),u.settings.automaticSilentRenew&&(h.default.debug("automaticSilentRenew is configured, setting up silent renew"),u.startSilentRenew()),u.settings.monitorSession&&(h.default.debug("monitorSession is configured, setting up session monitor"),u._sessionMonitor=new o(u)),u._tokenRevocationClient=new a(u._settings),u}return o(e,t),e.prototype.getUser=function(){var t=this;return h.default.debug("UserManager.getUser"),this._loadUser().then(function(e){return e?(h.default.info("user loaded"),t._events.load(e,!1),e):(h.default.info("user not found in storage"),null)})},e.prototype.removeUser=function(){var t=this;return h.default.debug("UserManager.removeUser"),this.storeUser(null).then(function(){h.default.info("user removed from storage"),t._events.unload()})},e.prototype.signinRedirect=function(t){return h.default.debug("UserManager.signinRedirect"),this._signinStart(t,this._redirectNavigator).then(function(){h.default.info("signinRedirect successful")})},e.prototype.signinRedirectCallback=function(t){return h.default.debug("UserManager.signinRedirectCallback"),this._signinEnd(t||this._redirectNavigator.url).then(function(t){return t&&(t.profile&&t.profile.sub?h.default.info("signinRedirectCallback successful, signed in sub: ",t.profile.sub):h.default.info("signinRedirectCallback successful")),t})},e.prototype.signinPopup=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};h.default.debug("UserManager.signinPopup");var e=t.redirect_uri||this.settings.popup_redirect_uri||this.settings.redirect_uri;return e?(t.redirect_uri=e,t.display="popup",this._signin(t,this._popupNavigator,{startUrl:e,popupWindowFeatures:t.popupWindowFeatures||this.settings.popupWindowFeatures,popupWindowTarget:t.popupWindowTarget||this.settings.popupWindowTarget}).then(function(t){return t&&(t.profile&&t.profile.sub?h.default.info("signinPopup successful, signed in sub: ",t.profile.sub):h.default.info("signinPopup successful")),t})):(h.default.error("No popup_redirect_uri or redirect_uri configured"),Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured")))},e.prototype.signinPopupCallback=function(t){return h.default.debug("UserManager.signinPopupCallback"),this._signinCallback(t,this._popupNavigator).then(function(t){return t&&(t.profile&&t.profile.sub?h.default.info("signinPopupCallback successful, signed in sub: ",t.profile.sub):h.default.info("signinPopupCallback successful")),t})},e.prototype.signinSilent=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};h.default.debug("UserManager.signinSilent");var n=e.redirect_uri||this.settings.silent_redirect_uri;if(!n)return h.default.error("No silent_redirect_uri configured"),Promise.reject(new Error("No silent_redirect_uri configured"));e.redirect_uri=n,e.prompt="none";var r=void 0;return r=e.id_token_hint||!this.settings.includeIdTokenInSilentRenew?Promise.resolve():this._loadUser().then(function(t){e.id_token_hint=t&&t.id_token}),r.then(function(){return t._signin(e,t._iframeNavigator,{startUrl:n,silentRequestTimeout:e.silentRequestTimeout||t.settings.silentRequestTimeout})}).then(function(t){return t&&(t.profile&&t.profile.sub?h.default.info("signinSilent successful, signed in sub: ",t.profile.sub):h.default.info("signinSilent successful")),t})},e.prototype.signinSilentCallback=function(t){return h.default.debug("UserManager.signinSilentCallback"),this._signinCallback(t,this._iframeNavigator).then(function(t){return t&&(t.profile&&t.profile.sub?h.default.info("signinSilentCallback successful, signed in sub: ",t.profile.sub):h.default.info("signinSilentCallback successful")),t})},e.prototype.querySessionStatus=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};h.default.debug("UserManager.querySessionStatus");var n=e.redirect_uri||this.settings.silent_redirect_uri;return n?(e.redirect_uri=n,e.prompt="none",e.response_type="id_token",e.scope="openid",this._signinStart(e,this._iframeNavigator,{startUrl:n,silentRequestTimeout:e.silentRequestTimeout||this.settings.silentRequestTimeout}).then(function(e){return t.processSigninResponse(e.url).then(function(t){return h.default.debug("got signin response"),t.session_state&&t.profile.sub&&t.profile.sid?(h.default.info("querySessionStatus success for sub: ",t.profile.sub),{session_state:t.session_state,sub:t.profile.sub,sid:t.profile.sid}):void h.default.info("querySessionStatus successful, user not authenticated")})})):(h.default.error("No silent_redirect_uri configured"),Promise.reject(new Error("No silent_redirect_uri configured")))},e.prototype._signin=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return h.default.debug("_signin"),this._signinStart(t,e,r).then(function(t){return n._signinEnd(t.url)})},e.prototype._signinStart=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return h.default.debug("_signinStart"),e.prepare(r).then(function(e){return h.default.debug("got navigator window handle"),n.createSigninRequest(t).then(function(t){return h.default.debug("got signin request"),r.url=t.url,r.id=t.state.id,e.navigate(r)}).catch(function(t){throw e.close&&(h.default.debug("Error after preparing navigator, closing navigator window"),e.close()),t})})},e.prototype._signinEnd=function(t){var e=this;return h.default.debug("_signinEnd"),this.processSigninResponse(t).then(function(t){h.default.debug("got signin response");var n=new p.default(t);return e.storeUser(n).then(function(){return h.default.debug("user stored"),e._events.load(n),n})})},e.prototype._signinCallback=function(t,e){return h.default.debug("_signinCallback"),e.callback(t)},e.prototype.signoutRedirect=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};h.default.debug("UserManager.signoutRedirect");var e=t.post_logout_redirect_uri||this.settings.post_logout_redirect_uri;return e&&(t.post_logout_redirect_uri=e),this._signoutStart(t,this._redirectNavigator).then(function(){h.default.info("signoutRedirect successful")})},e.prototype.signoutRedirectCallback=function(t){return h.default.debug("UserManager.signoutRedirectCallback"),this._signoutEnd(t||this._redirectNavigator.url).then(function(t){return h.default.info("signoutRedirectCallback successful"),t})},e.prototype.signoutPopup=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};h.default.debug("UserManager.signinPopup");var e=t.post_logout_redirect_uri||this.settings.popup_post_logout_redirect_uri||this.settings.post_logout_redirect_uri;return t.post_logout_redirect_uri=e,t.display="popup",t.post_logout_redirect_uri&&(t.state=t.state||{}),this._signout(t,this._popupNavigator,{startUrl:e,popupWindowFeatures:t.popupWindowFeatures||this.settings.popupWindowFeatures,popupWindowTarget:t.popupWindowTarget||this.settings.popupWindowTarget}).then(function(){h.default.info("signoutPopup successful")})},e.prototype.signoutPopupCallback=function(t,e){"undefined"==typeof e&&"boolean"==typeof t&&(t=null,e=!0),h.default.debug("UserManager.signoutPopupCallback");var n="?";return this._popupNavigator.callback(t,e,n).then(function(){h.default.info("signoutPopupCallback successful")})},e.prototype._signout=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return h.default.debug("_signout"),this._signoutStart(t,e,r).then(function(t){return n._signoutEnd(t.url)})},e.prototype._signoutStart=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this,n=arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return h.default.debug("_signoutStart"),n.prepare(r).then(function(n){return h.default.debug("got navigator window handle"),e._loadUser().then(function(i){h.default.debug("loaded current user from storage");var s=e._settings.revokeAccessTokenOnSignout?e._revokeInternal(i):Promise.resolve();return s.then(function(){var s=t.id_token_hint||i&&i.id_token;return s&&(h.default.debug("Setting id_token into signout request"),t.id_token_hint=s),e.removeUser().then(function(){return h.default.debug("user removed, creating signout request"),e.createSignoutRequest(t).then(function(t){return h.default.debug("got signout request"),r.url=t.url,t.state&&(r.id=t.state.id),n.navigate(r)})})})}).catch(function(t){throw n.close&&(h.default.debug("Error after preparing navigator, closing navigator window"),n.close()),t})})},e.prototype._signoutEnd=function(t){return h.default.debug("_signoutEnd"),this.processSignoutResponse(t).then(function(t){return h.default.debug("got signout response"),t})},e.prototype.revokeAccessToken=function(){var t=this;return h.default.debug("UserManager.revokeAccessToken"),this._loadUser().then(function(e){return t._revokeInternal(e,!0).then(function(n){if(n)return h.default.debug("removing token properties from user and re-storing"),e.access_token=null,e.expires_at=null,e.token_type=null,t.storeUser(e).then(function(){h.default.debug("user stored"),t._events.load(e)})})}).then(function(){h.default.info("access token revoked successfully")})},e.prototype._revokeInternal=function(t,e){h.default.debug("checking if token revocation is necessary");var n=t&&t.access_token;return!n||n.indexOf(".")>=0?(h.default.debug("no need to revoke due to no user, token, or JWT format"),Promise.resolve(!1)):this._tokenRevocationClient.revoke(n,e).then(function(){return!0})},e.prototype.startSilentRenew=function(){this._silentRenewService.start()},e.prototype.stopSilentRenew=function(){this._silentRenewService.stop()},e.prototype._loadUser=function(){return h.default.debug("_loadUser"),this._userStore.get(this._userStoreKey).then(function(t){return t?(h.default.debug("user storageString loaded"),p.default.fromStorageString(t)):(h.default.debug("no user storageString"),null)})},e.prototype.storeUser=function(t){if(t){h.default.debug("storeUser storing user");var e=t.toStorageString();return this._userStore.set(this._userStoreKey,e)}return h.default.debug("storeUser removing user storage"),this._userStore.remove(this._userStoreKey)},a(e,[{key:"_redirectNavigator",get:function(){return this.settings.redirectNavigator}},{key:"_popupNavigator",get:function(){return this.settings.popupNavigator}},{key:"_iframeNavigator",get:function(){return this.settings.iframeNavigator}},{key:"_userStore",get:function(){return this.settings.userStore}},{key:"events",get:function(){return this._events}},{key:"_userStoreKey",get:function(){return"user:"+this.settings.authority+":"+this.settings.client_id}}]),e}(f.default);e.default=x,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=n.popup_redirect_uri,o=n.popup_post_logout_redirect_uri,a=n.popupWindowFeatures,u=n.popupWindowTarget,h=n.silent_redirect_uri,c=n.silentRequestTimeout,f=n.automaticSilentRenew,d=void 0!==f&&f,p=n.includeIdTokenInSilentRenew,v=void 0===p||p,S=n.monitorSession,_=void 0===S||S,x=n.checkSessionInterval,A=void 0===x?E:x,F=n.revokeAccessTokenOnSignout,P=void 0!==F&&F,O=n.accessTokenExpiringNotificationTime,C=void 0===O?w:O,T=n.redirectNavigator,D=void 0===T?new l.default:T,R=n.popupNavigator,j=void 0===R?new g.default:R,H=n.iframeNavigator,I=void 0===H?new y.default:H,k=n.userStore,B=void 0===k?new m.default({store:b.default.sessionStorage}):k;i(this,e);var N=s(this,t.call(this,arguments[0]));return N._popup_redirect_uri=r,N._popup_post_logout_redirect_uri=o,N._popupWindowFeatures=a,N._popupWindowTarget=u,N._silent_redirect_uri=h,N._silentRequestTimeout=c,N._automaticSilentRenew=!!d,N._includeIdTokenInSilentRenew=v,N._accessTokenExpiringNotificationTime=C,N._monitorSession=_,N._checkSessionInterval=A,N._revokeAccessTokenOnSignout=P,N._redirectNavigator=D,N._popupNavigator=j,N._iframeNavigator=I,N._userStore=B,N}return o(e,t),a(e,[{key:"popup_redirect_uri",get:function(){return this._popup_redirect_uri}},{key:"popup_post_logout_redirect_uri",get:function(){return this._popup_post_logout_redirect_uri}},{key:"popupWindowFeatures",get:function(){return this._popupWindowFeatures}},{key:"popupWindowTarget",get:function(){return this._popupWindowTarget}},{key:"silent_redirect_uri",get:function(){return this._silent_redirect_uri}},{key:"silentRequestTimeout",get:function(){return this._silentRequestTimeout}},{key:"automaticSilentRenew",get:function(){return!(!this.silent_redirect_uri||!this._automaticSilentRenew)}},{key:"includeIdTokenInSilentRenew",get:function(){return this._includeIdTokenInSilentRenew}},{key:"accessTokenExpiringNotificationTime",get:function(){return this._accessTokenExpiringNotificationTime}},{key:"monitorSession",get:function(){return this._monitorSession}},{key:"checkSessionInterval",get:function(){return this._checkSessionInterval}},{key:"revokeAccessTokenOnSignout",get:function(){return this._revokeAccessTokenOnSignout}},{key:"redirectNavigator",get:function(){return this._redirectNavigator}},{key:"popupNavigator",get:function(){return this._popupNavigator}},{key:"iframeNavigator",get:function(){return this._iframeNavigator}},{key:"userStore",get:function(){return this._userStore}}]),e}(c.default);e.default=_,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1])||arguments[1];u.default.debug("UserManagerEvents.load"),t.prototype.load.call(this,e),n&&this._userLoaded.raise(e)},e.prototype.unload=function(){u.default.debug("UserManagerEvents.unload"),t.prototype.unload.call(this),this._userUnloaded.raise()},e.prototype.addUserLoaded=function(t){this._userLoaded.addHandler(t)},e.prototype.removeUserLoaded=function(t){this._userLoaded.removeHandler(t)},e.prototype.addUserUnloaded=function(t){this._userUnloaded.addHandler(t)},e.prototype.removeUserUnloaded=function(t){this._userUnloaded.removeHandler(t)},e.prototype.addSilentRenewError=function(t){this._silentRenewError.addHandler(t)},e.prototype.removeSilentRenewError=function(t){this._silentRenewError.removeHandler(t)},e.prototype._raiseSilentRenewError=function(t){u.default.debug("UserManagerEvents._raiseSilentRenewError",t.message),this._silentRenewError.raise(t)},e.prototype.addUserSignedOut=function(t){this._userSignedOut.addHandler(t)},e.prototype.removeUserSignedOut=function(t){this._userSignedOut.removeHandler(t)},e.prototype._raiseUserSignedOut=function(t){u.default.debug("UserManagerEvents._raiseUserSignedOut"),this._userSignedOut.raise(t)},e.prototype.addUserSessionChanged=function(t){this._userSessionChanged.addHandler(t)},e.prototype.removeUserSessionChanged=function(t){this._userSessionChanged.removeHandler(t)},e.prototype._raiseUserSessionChanged=function(t){u.default.debug("UserManagerEvents._raiseUserSessionChanged"),this._userSessionChanged.raise(t)},e}(c.default);e.default=d,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=r(s),a=n(37),u=r(a),h=60,c=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.accessTokenExpiringNotificationTime,r=void 0===n?h:n,s=e.accessTokenExpiringTimer,o=void 0===s?new u.default("Access token expiring"):s,a=e.accessTokenExpiredTimer,c=void 0===a?new u.default("Access token expired"):a;i(this,t),this._accessTokenExpiringNotificationTime=r,this._accessTokenExpiring=o,this._accessTokenExpired=c}return t.prototype.load=function(t){if(o.default.debug("AccessTokenEvents.load"),this._cancelTimers(), -t.access_token){var e=t.expires_in;if(o.default.debug("access token present, remaining duration:",e),e>0){var n=e-this._accessTokenExpiringNotificationTime;n<=0&&(n=1),o.default.debug("registering expiring timer in:",n),this._accessTokenExpiring.init(n)}var r=e+1;o.default.debug("registering expired timer in:",r),this._accessTokenExpired.init(r)}},t.prototype.unload=function(){o.default.debug("AccessTokenEvents.unload"),this._cancelTimers()},t.prototype._cancelTimers=function(){o.default.debug("canceling existing access token timers"),this._accessTokenExpiring.cancel(),this._accessTokenExpired.cancel()},t.prototype.addAccessTokenExpiring=function(t){this._accessTokenExpiring.addHandler(t)},t.prototype.removeAccessTokenExpiring=function(t){this._accessTokenExpiring.removeHandler(t)},t.prototype.addAccessTokenExpired=function(t){this._accessTokenExpired.addHandler(t)},t.prototype.removeAccessTokenExpired=function(t){this._accessTokenExpired.removeHandler(t)},t}();e.default=c,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:f.default.timer;i(this,e);var o=s(this,t.call(this,n));return o._timer=r,o._nowFunc=function(){return Date.now()/1e3},o}return o(e,t),e.prototype.init=function(t){this.cancel(),t<=0&&(t=1),t=parseInt(t),h.default.debug("Timer.init timer "+this._name+" for duration:",t),this._expiration=this.now+t;var e=g;t=0&&this._callbacks.splice(e,1)},t.prototype.raise=function(){o.default.debug("Raising event: "+this._name);var t=!0,e=!1,n=void 0;try{for(var r,i=this._callbacks[Symbol.iterator]();!(t=(r=i.next()).done);t=!0){var s=r.value;s.apply(void 0,arguments)}}catch(t){e=!0,n=t}finally{try{!t&&i.return&&i.return()}finally{if(e)throw n}}},t}();e.default=a,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=r(s),a=function(){function t(e){i(this,t),this._userManager=e}return t.prototype.start=function(){this._callback||(this._callback=this._tokenExpiring.bind(this),this._userManager.events.addAccessTokenExpiring(this._callback),this._userManager.getUser().then(function(t){}).catch(function(t){o.default.error("Error from getUser:",t.message)}))},t.prototype.stop=function(){this._callback&&(this._userManager.events.removeAccessTokenExpiring(this._callback),delete this._callback)},t.prototype._tokenExpiring=function(){var t=this;o.default.debug("SilentRenewService automatically renewing access token"),this._userManager.signinSilent().then(function(t){o.default.debug("Silent token renewal successful")},function(e){o.default.error("Error from signinSilent:",e.message),t._userManager.events._raiseSilentRenewError(e)})},t}();e.default=a,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.default;if(i(this,t),!e)throw a.default.error("No user manager passed to SessionMonitor"),new Error("userManager");this._userManager=e,this._CheckSessionIFrameCtor=r,this._userManager.events.addUserLoaded(this._start.bind(this)),this._userManager.events.addUserUnloaded(this._stop.bind(this)),this._userManager.getUser().then(function(t){t&&n._start(t)}).catch(function(t){a.default.error("SessionMonitor ctor; error from getUser:",t.message)})}return t.prototype._start=function(t){var e=this,n=t.session_state;n&&(this._sub=t.profile.sub,this._sid=t.profile.sid,a.default.debug("SessionMonitor._start; session_state:",n,", sub:",this._sub),this._checkSessionIFrame?this._checkSessionIFrame.start(n):this._metadataService.getCheckSessionIframe().then(function(t){if(t){a.default.debug("Initializing check session iframe");var r=e._client_id,i=e._checkSessionInterval;e._checkSessionIFrame=new e._CheckSessionIFrameCtor(e._callback.bind(e),r,t,i),e._checkSessionIFrame.load().then(function(){e._checkSessionIFrame.start(n)})}else a.default.warn("No check session iframe found in the metadata")}).catch(function(t){a.default.error("Error from getCheckSessionIframe:",t.message)}))},t.prototype._stop=function(){a.default.debug("SessionMonitor._stop"),this._sub=null,this._sid=null,this._checkSessionIFrame&&this._checkSessionIFrame.stop()},t.prototype._callback=function(){var t=this;a.default.debug("SessionMonitor._callback"),this._userManager.querySessionStatus().then(function(e){var n=!0;e?e.sub===t._sub?(n=!1,t._checkSessionIFrame.start(e.session_state),e.sid===t._sid?a.default.debug("Same sub still logged in at OP, restarting check session iframe; session_state:",e.session_state):(a.default.debug("Same sub still logged in at OP, session state has changed, restarting check session iframe; session_state:",e.session_state),t._userManager.events._raiseUserSessionChanged())):a.default.debug("Different subject signed into OP:",e.sub):a.default.debug("Subject no longer signed into OP"),n&&(a.default.debug("SessionMonitor._callback; raising signed out event"),t._userManager.events._raiseUserSignedOut())}).catch(function(e){a.default.debug("Error calling queryCurrentSigninSession; raising signed out event",e.message),t._userManager.events._raiseUserSignedOut()})},s(t,[{key:"_settings",get:function(){return this._userManager.settings}},{key:"_metadataService",get:function(){return this._userManager.metadataService}},{key:"_client_id",get:function(){return this._settings.client_id}},{key:"_checkSessionInterval",get:function(){return this._settings.checkSessionInterval}}]),t}();e.default=c,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=r(s),a=2e3,u=function(){function t(e,n,r,s){i(this,t),this._callback=e,this._client_id=n,this._url=r,this._interval=s||a;var o=r.indexOf("/",r.indexOf("//")+2);this._frame_origin=r.substr(0,o),this._frame=window.document.createElement("iframe"),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=r}return t.prototype.load=function(){var t=this;return new Promise(function(e){t._frame.onload=function(){e()},window.document.body.appendChild(t._frame),t._boundMessageEvent=t._message.bind(t),window.addEventListener("message",t._boundMessageEvent,!1)})},t.prototype._message=function(t){t.origin===this._frame_origin&&t.source===this._frame.contentWindow&&("error"===t.data?(o.default.error("error message from check session op iframe"),this.stop()):"changed"===t.data?(o.default.debug("changed message from check session op iframe"),this.stop(),this._callback()):o.default.debug(t.data+" message from check session op iframe"))},t.prototype.start=function(t){var e=this;this._session_state!==t&&(o.default.debug("CheckSessionIFrame.start"),this.stop(),this._session_state=t,this._timer=window.setInterval(function(){e._frame.contentWindow.postMessage(e._client_id+" "+e._session_state,e._frame_origin)},this._interval))},t.prototype.stop=function(){o.default.debug("CheckSessionIFrame.stop"),this._session_state=null,this._timer&&(window.clearInterval(this._timer),this._timer=null)},t}();e.default=u,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=r(s),a=n(7),u=r(a),h=n(5),c=r(h),f="access_token",l=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:c.default.XMLHttpRequest,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;if(i(this,t),!e)throw o.default.error("No settings provided"),new Error("No settings provided.");this._settings=e,this._XMLHttpRequestCtor=n,this._metadataService=new r(this._settings)}return t.prototype.revoke=function(t,e){var n=this;if(o.default.debug("TokenRevocationClient.revoke"),!t)throw o.default.error("No accessToken provided"),new Error("No accessToken provided.");return this._metadataService.getRevocationEndpoint().then(function(r){if(r){var i=n._settings.client_id,s=n._settings.client_secret;return n._revoke(r,i,s,t)}if(e)throw o.default.error("Revocation not supported"),new Error("Revocation not supported")})},t.prototype._revoke=function(t,e,n,r){var i=this;return o.default.debug("Calling revocation endpoint"),new Promise(function(s,a){var u=new i._XMLHttpRequestCtor;u.open("POST",t),u.onload=function(){o.default.debug("HTTP response received, status",u.status),200===u.status?s():a(Error(u.statusText+" ("+u.status+")"))};var h="client_id="+encodeURIComponent(e);n&&(h+="&client_secret="+encodeURIComponent(n)),h+="&token_type_hint="+encodeURIComponent(f),h+="&token="+encodeURIComponent(r),u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(h)})},t}();e.default=l,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),o=(r(s),n(44)),a=r(o),u=function(){function t(){i(this,t)}return t.prototype.prepare=function(t){var e=new a.default(t);return Promise.resolve(e)},t}();e.default=u,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n0){var s=parseInt(Date.now()/1e3);this.expires_at=s+r}}return s(t,[{key:"expires_in",get:function(){if(this.expires_at){var t=parseInt(Date.now()/1e3);return this.expires_at-t}}},{key:"expired",get:function(){var t=this.expires_in;if(void 0!==t)return t<=0}},{key:"scopes",get:function(){return(this.scope||"").split(" ")}},{key:"isOpenIdConnect",get:function(){return this.scopes.indexOf(u)>=0||!!this.id_token}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.SignoutRequest=void 0;var s=n(1),o=r(s),a=n(15),u=r(a),c=n(17),h=r(c);e.SignoutRequest=function t(e){var n=e.url,r=e.id_token_hint,s=e.post_logout_redirect_uri,a=e.data;if(i(this,t),!n)throw o.default.error("No url passed to SignoutRequest"),new Error("url");r&&(n=u.default.addQueryParam(n,"id_token_hint",r)),s&&(n=u.default.addQueryParam(n,"post_logout_redirect_uri",s),a&&(this.state=new h.default({data:a}),n=u.default.addQueryParam(n,"state",this.state.id))),this.url=n}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.SignoutResponse=void 0;var s=n(15),o=r(s);e.SignoutResponse=function t(e){i(this,t);var n=o.default.parseUrlFragment(e,"?");this.error=n.error,this.error_description=n.error_description,this.error_uri=n.error_uri,this.state=n.state}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryWebStorage=void 0;var s=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S.default,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:w.default,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:x.default;i(this,e),n instanceof d.default||(n=new d.default(n));var u=s(this,t.call(this,n));return u._events=new v.default(n),u._silentRenewService=new r(u),u.settings.automaticSilentRenew&&(c.default.debug("automaticSilentRenew is configured, setting up silent renew"),u.startSilentRenew()),u.settings.monitorSession&&(c.default.debug("monitorSession is configured, setting up session monitor"),u._sessionMonitor=new o(u)),u._tokenRevocationClient=new a(u._settings),u}return o(e,t),e.prototype.getUser=function(){var t=this;return c.default.debug("UserManager.getUser"),this._loadUser().then(function(e){return e?(c.default.info("user loaded"),t._events.load(e,!1),e):(c.default.info("user not found in storage"),null)})},e.prototype.removeUser=function(){var t=this;return c.default.debug("UserManager.removeUser"),this.storeUser(null).then(function(){c.default.info("user removed from storage"),t._events.unload()})},e.prototype.signinRedirect=function(t){return c.default.debug("UserManager.signinRedirect"),this._signinStart(t,this._redirectNavigator).then(function(){c.default.info("signinRedirect successful")})},e.prototype.signinRedirectCallback=function(t){return c.default.debug("UserManager.signinRedirectCallback"),this._signinEnd(t||this._redirectNavigator.url).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinRedirectCallback successful, signed in sub: ",t.profile.sub):c.default.info("signinRedirectCallback successful")),t})},e.prototype.signinPopup=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signinPopup");var e=t.redirect_uri||this.settings.popup_redirect_uri||this.settings.redirect_uri;return e?(t.redirect_uri=e,t.display="popup",this._signin(t,this._popupNavigator,{startUrl:e,popupWindowFeatures:t.popupWindowFeatures||this.settings.popupWindowFeatures,popupWindowTarget:t.popupWindowTarget||this.settings.popupWindowTarget}).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinPopup successful, signed in sub: ",t.profile.sub):c.default.info("signinPopup successful")),t})):(c.default.error("No popup_redirect_uri or redirect_uri configured"),Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured")))},e.prototype.signinPopupCallback=function(t){return c.default.debug("UserManager.signinPopupCallback"),this._signinCallback(t,this._popupNavigator).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinPopupCallback successful, signed in sub: ",t.profile.sub):c.default.info("signinPopupCallback successful")),t})},e.prototype.signinSilent=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signinSilent");var n=e.redirect_uri||this.settings.silent_redirect_uri;if(!n)return c.default.error("No silent_redirect_uri configured"),Promise.reject(new Error("No silent_redirect_uri configured"));e.redirect_uri=n,e.prompt="none";var r=void 0;return r=e.id_token_hint||!this.settings.includeIdTokenInSilentRenew?Promise.resolve():this._loadUser().then(function(t){e.id_token_hint=t&&t.id_token}),r.then(function(){return t._signin(e,t._iframeNavigator,{startUrl:n,silentRequestTimeout:e.silentRequestTimeout||t.settings.silentRequestTimeout})}).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinSilent successful, signed in sub: ",t.profile.sub):c.default.info("signinSilent successful")),t})},e.prototype.signinSilentCallback=function(t){return c.default.debug("UserManager.signinSilentCallback"),this._signinCallback(t,this._iframeNavigator).then(function(t){return t&&(t.profile&&t.profile.sub?c.default.info("signinSilentCallback successful, signed in sub: ",t.profile.sub):c.default.info("signinSilentCallback successful")),t})},e.prototype.querySessionStatus=function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.querySessionStatus");var n=e.redirect_uri||this.settings.silent_redirect_uri;return n?(e.redirect_uri=n,e.prompt="none",e.response_type="id_token",e.scope="openid",this._signinStart(e,this._iframeNavigator,{startUrl:n,silentRequestTimeout:e.silentRequestTimeout||this.settings.silentRequestTimeout}).then(function(e){return t.processSigninResponse(e.url).then(function(t){return c.default.debug("got signin response"),t.session_state&&t.profile.sub&&t.profile.sid?(c.default.info("querySessionStatus success for sub: ",t.profile.sub),{session_state:t.session_state,sub:t.profile.sub,sid:t.profile.sid}):void c.default.info("querySessionStatus successful, user not authenticated")})})):(c.default.error("No silent_redirect_uri configured"),Promise.reject(new Error("No silent_redirect_uri configured")))},e.prototype._signin=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signin"),this._signinStart(t,e,r).then(function(t){return n._signinEnd(t.url)})},e.prototype._signinStart=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signinStart"),e.prepare(r).then(function(e){return c.default.debug("got navigator window handle"),n.createSigninRequest(t).then(function(t){return c.default.debug("got signin request"),r.url=t.url,r.id=t.state.id,e.navigate(r)}).catch(function(t){throw e.close&&(c.default.debug("Error after preparing navigator, closing navigator window"),e.close()),t})})},e.prototype._signinEnd=function(t){var e=this;return c.default.debug("_signinEnd"),this.processSigninResponse(t).then(function(t){c.default.debug("got signin response");var n=new p.default(t);return e.storeUser(n).then(function(){return c.default.debug("user stored"),e._events.load(n),n})})},e.prototype._signinCallback=function(t,e){return c.default.debug("_signinCallback"),e.callback(t)},e.prototype.signoutRedirect=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signoutRedirect");var e=t.post_logout_redirect_uri||this.settings.post_logout_redirect_uri;return e&&(t.post_logout_redirect_uri=e),this._signoutStart(t,this._redirectNavigator).then(function(){c.default.info("signoutRedirect successful")})},e.prototype.signoutRedirectCallback=function(t){return c.default.debug("UserManager.signoutRedirectCallback"),this._signoutEnd(t||this._redirectNavigator.url).then(function(t){return c.default.info("signoutRedirectCallback successful"),t})},e.prototype.signoutPopup=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};c.default.debug("UserManager.signinPopup");var e=t.post_logout_redirect_uri||this.settings.popup_post_logout_redirect_uri||this.settings.post_logout_redirect_uri;return t.post_logout_redirect_uri=e,t.display="popup",t.post_logout_redirect_uri&&(t.state=t.state||{}),this._signout(t,this._popupNavigator,{startUrl:e,popupWindowFeatures:t.popupWindowFeatures||this.settings.popupWindowFeatures,popupWindowTarget:t.popupWindowTarget||this.settings.popupWindowTarget}).then(function(){c.default.info("signoutPopup successful")})},e.prototype.signoutPopupCallback=function(t,e){"undefined"==typeof e&&"boolean"==typeof t&&(t=null,e=!0),c.default.debug("UserManager.signoutPopupCallback");var n="?";return this._popupNavigator.callback(t,e,n).then(function(){c.default.info("signoutPopupCallback successful")})},e.prototype._signout=function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signout"),this._signoutStart(t,e,r).then(function(t){return n._signoutEnd(t.url)})},e.prototype._signoutStart=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this,n=arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.debug("_signoutStart"),n.prepare(r).then(function(n){return c.default.debug("got navigator window handle"),e._loadUser().then(function(i){c.default.debug("loaded current user from storage");var s=e._settings.revokeAccessTokenOnSignout?e._revokeInternal(i):Promise.resolve();return s.then(function(){var s=t.id_token_hint||i&&i.id_token;return s&&(c.default.debug("Setting id_token into signout request"),t.id_token_hint=s),e.removeUser().then(function(){return c.default.debug("user removed, creating signout request"),e.createSignoutRequest(t).then(function(t){return c.default.debug("got signout request"),r.url=t.url,t.state&&(r.id=t.state.id),n.navigate(r)})})})}).catch(function(t){throw n.close&&(c.default.debug("Error after preparing navigator, closing navigator window"),n.close()),t})})},e.prototype._signoutEnd=function(t){return c.default.debug("_signoutEnd"),this.processSignoutResponse(t).then(function(t){return c.default.debug("got signout response"),t})},e.prototype.revokeAccessToken=function(){var t=this;return c.default.debug("UserManager.revokeAccessToken"),this._loadUser().then(function(e){return t._revokeInternal(e,!0).then(function(n){if(n)return c.default.debug("removing token properties from user and re-storing"),e.access_token=null,e.expires_at=null,e.token_type=null,t.storeUser(e).then(function(){c.default.debug("user stored"),t._events.load(e)})})}).then(function(){c.default.info("access token revoked successfully")})},e.prototype._revokeInternal=function(t,e){c.default.debug("checking if token revocation is necessary");var n=t&&t.access_token;return!n||n.indexOf(".")>=0?(c.default.debug("no need to revoke due to no user, token, or JWT format"),Promise.resolve(!1)):this._tokenRevocationClient.revoke(n,e).then(function(){return!0})},e.prototype.startSilentRenew=function(){this._silentRenewService.start()},e.prototype.stopSilentRenew=function(){this._silentRenewService.stop()},e.prototype._loadUser=function(){return c.default.debug("_loadUser"),this._userStore.get(this._userStoreKey).then(function(t){return t?(c.default.debug("user storageString loaded"),p.default.fromStorageString(t)):(c.default.debug("no user storageString"),null)})},e.prototype.storeUser=function(t){if(t){c.default.debug("storeUser storing user");var e=t.toStorageString();return this._userStore.set(this._userStoreKey,e)}return c.default.debug("storeUser removing user storage"),this._userStore.remove(this._userStoreKey)},a(e,[{key:"_redirectNavigator",get:function(){return this.settings.redirectNavigator}},{key:"_popupNavigator",get:function(){return this.settings.popupNavigator}},{key:"_iframeNavigator",get:function(){return this.settings.iframeNavigator}},{key:"_userStore",get:function(){return this.settings.userStore}},{key:"events",get:function(){return this._events}},{key:"_userStoreKey",get:function(){return"user:"+this.settings.authority+":"+this.settings.client_id}}]),e}(f.default)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.UserManagerSettings=void 0;var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=n.popup_redirect_uri,o=n.popup_post_logout_redirect_uri,a=n.popupWindowFeatures,u=n.popupWindowTarget,c=n.silent_redirect_uri,h=n.silentRequestTimeout,f=n.automaticSilentRenew,d=void 0!==f&&f,p=n.includeIdTokenInSilentRenew,v=void 0===p||p,S=n.monitorSession,x=void 0===S||S,_=n.checkSessionInterval,F=void 0===_?E:_,A=n.revokeAccessTokenOnSignout,P=void 0!==A&&A,O=n.accessTokenExpiringNotificationTime,C=void 0===O?w:O,H=n.redirectNavigator,j=void 0===H?new l.default:H,T=n.popupNavigator,D=void 0===T?new g.default:T,I=n.iframeNavigator,R=void 0===I?new y.default:I,k=n.userStore,N=void 0===k?new m.default({store:b.default.sessionStorage}):k;i(this,e);var B=s(this,t.call(this,arguments[0]));return B._popup_redirect_uri=r,B._popup_post_logout_redirect_uri=o,B._popupWindowFeatures=a,B._popupWindowTarget=u,B._silent_redirect_uri=c,B._silentRequestTimeout=h,B._automaticSilentRenew=!!d,B._includeIdTokenInSilentRenew=v,B._accessTokenExpiringNotificationTime=C,B._monitorSession=x,B._checkSessionInterval=F,B._revokeAccessTokenOnSignout=P,B._redirectNavigator=j,B._popupNavigator=D,B._iframeNavigator=R,B._userStore=N,B}return o(e,t),a(e,[{key:"popup_redirect_uri",get:function(){return this._popup_redirect_uri}},{key:"popup_post_logout_redirect_uri",get:function(){return this._popup_post_logout_redirect_uri}},{key:"popupWindowFeatures",get:function(){return this._popupWindowFeatures}},{key:"popupWindowTarget",get:function(){return this._popupWindowTarget}},{key:"silent_redirect_uri",get:function(){return this._silent_redirect_uri}},{key:"silentRequestTimeout",get:function(){return this._silentRequestTimeout}},{key:"automaticSilentRenew",get:function(){return!(!this.silent_redirect_uri||!this._automaticSilentRenew)}},{key:"includeIdTokenInSilentRenew",get:function(){return this._includeIdTokenInSilentRenew}},{key:"accessTokenExpiringNotificationTime",get:function(){return this._accessTokenExpiringNotificationTime}},{key:"monitorSession",get:function(){return this._monitorSession}},{key:"checkSessionInterval",get:function(){return this._checkSessionInterval}},{key:"revokeAccessTokenOnSignout",get:function(){return this._revokeAccessTokenOnSignout}},{key:"redirectNavigator",get:function(){return this._redirectNavigator}},{key:"popupNavigator",get:function(){return this._popupNavigator}},{key:"iframeNavigator",get:function(){return this._iframeNavigator}},{key:"userStore",get:function(){return this._userStore}}]),e}(h.default)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.RedirectNavigator=void 0;var s=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1])||arguments[1];u.default.debug("UserManagerEvents.load"),t.prototype.load.call(this,e),n&&this._userLoaded.raise(e)},e.prototype.unload=function(){u.default.debug("UserManagerEvents.unload"),t.prototype.unload.call(this),this._userUnloaded.raise()},e.prototype.addUserLoaded=function(t){this._userLoaded.addHandler(t)},e.prototype.removeUserLoaded=function(t){this._userLoaded.removeHandler(t)},e.prototype.addUserUnloaded=function(t){this._userUnloaded.addHandler(t)},e.prototype.removeUserUnloaded=function(t){this._userUnloaded.removeHandler(t)},e.prototype.addSilentRenewError=function(t){this._silentRenewError.addHandler(t)},e.prototype.removeSilentRenewError=function(t){this._silentRenewError.removeHandler(t)},e.prototype._raiseSilentRenewError=function(t){u.default.debug("UserManagerEvents._raiseSilentRenewError",t.message),this._silentRenewError.raise(t)},e.prototype.addUserSignedOut=function(t){this._userSignedOut.addHandler(t)},e.prototype.removeUserSignedOut=function(t){this._userSignedOut.removeHandler(t)},e.prototype._raiseUserSignedOut=function(t){u.default.debug("UserManagerEvents._raiseUserSignedOut"),this._userSignedOut.raise(t)},e.prototype.addUserSessionChanged=function(t){this._userSessionChanged.addHandler(t)},e.prototype.removeUserSessionChanged=function(t){this._userSessionChanged.removeHandler(t)},e.prototype._raiseUserSessionChanged=function(t){u.default.debug("UserManagerEvents._raiseUserSessionChanged"),this._userSessionChanged.raise(t)},e}(h.default)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.AccessTokenEvents=void 0;var s=n(1),o=r(s),a=n(33),u=r(a),c=60;e.AccessTokenEvents=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.accessTokenExpiringNotificationTime,r=void 0===n?c:n,s=e.accessTokenExpiringTimer,o=void 0===s?new u.default("Access token expiring"):s,a=e.accessTokenExpiredTimer,h=void 0===a?new u.default("Access token expired"):a;i(this,t),this._accessTokenExpiringNotificationTime=r,this._accessTokenExpiring=o, +this._accessTokenExpired=h}return t.prototype.load=function(t){if(o.default.debug("AccessTokenEvents.load"),this._cancelTimers(),t.access_token){var e=t.expires_in;if(o.default.debug("access token present, remaining duration:",e),e>0){var n=e-this._accessTokenExpiringNotificationTime;n<=0&&(n=1),o.default.debug("registering expiring timer in:",n),this._accessTokenExpiring.init(n)}var r=e+1;o.default.debug("registering expired timer in:",r),this._accessTokenExpired.init(r)}},t.prototype.unload=function(){o.default.debug("AccessTokenEvents.unload"),this._cancelTimers()},t.prototype._cancelTimers=function(){o.default.debug("canceling existing access token timers"),this._accessTokenExpiring.cancel(),this._accessTokenExpired.cancel()},t.prototype.addAccessTokenExpiring=function(t){this._accessTokenExpiring.addHandler(t)},t.prototype.removeAccessTokenExpiring=function(t){this._accessTokenExpiring.removeHandler(t)},t.prototype.addAccessTokenExpired=function(t){this._accessTokenExpired.addHandler(t)},t.prototype.removeAccessTokenExpired=function(t){this._accessTokenExpired.removeHandler(t)},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.Timer=void 0;var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:f.default.timer;i(this,e);var o=s(this,t.call(this,n));return o._timer=r,o._nowFunc=function(){return Date.now()/1e3},o}return o(e,t),e.prototype.init=function(t){this.cancel(),t<=0&&(t=1),t=parseInt(t),c.default.debug("Timer.init timer "+this._name+" for duration:",t),this._expiration=this.now+t;var e=g;t=0&&this._callbacks.splice(e,1)},t.prototype.raise=function(){o.default.debug("Raising event: "+this._name);for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:c.default;if(i(this,t),!e)throw a.default.error("No user manager passed to SessionMonitor"),new Error("userManager");this._userManager=e,this._CheckSessionIFrameCtor=r,this._userManager.events.addUserLoaded(this._start.bind(this)),this._userManager.events.addUserUnloaded(this._stop.bind(this)),this._userManager.getUser().then(function(t){t&&n._start(t)}).catch(function(t){a.default.error("SessionMonitor ctor; error from getUser:",t.message)})}return t.prototype._start=function(t){var e=this,n=t.session_state;n&&(this._sub=t.profile.sub,this._sid=t.profile.sid,a.default.debug("SessionMonitor._start; session_state:",n,", sub:",this._sub),this._checkSessionIFrame?this._checkSessionIFrame.start(n):this._metadataService.getCheckSessionIframe().then(function(t){if(t){a.default.debug("Initializing check session iframe");var r=e._client_id,i=e._checkSessionInterval;e._checkSessionIFrame=new e._CheckSessionIFrameCtor(e._callback.bind(e),r,t,i),e._checkSessionIFrame.load().then(function(){e._checkSessionIFrame.start(n)})}else a.default.warn("No check session iframe found in the metadata")}).catch(function(t){a.default.error("Error from getCheckSessionIframe:",t.message)}))},t.prototype._stop=function(){a.default.debug("SessionMonitor._stop"),this._sub=null,this._sid=null,this._checkSessionIFrame&&this._checkSessionIFrame.stop()},t.prototype._callback=function(){var t=this;a.default.debug("SessionMonitor._callback"),this._userManager.querySessionStatus().then(function(e){var n=!0;e?e.sub===t._sub?(n=!1,t._checkSessionIFrame.start(e.session_state),e.sid===t._sid?a.default.debug("Same sub still logged in at OP, restarting check session iframe; session_state:",e.session_state):(a.default.debug("Same sub still logged in at OP, session state has changed, restarting check session iframe; session_state:",e.session_state),t._userManager.events._raiseUserSessionChanged())):a.default.debug("Different subject signed into OP:",e.sub):a.default.debug("Subject no longer signed into OP"),n&&(a.default.debug("SessionMonitor._callback; raising signed out event"),t._userManager.events._raiseUserSignedOut())}).catch(function(e){a.default.debug("Error calling queryCurrentSigninSession; raising signed out event",e.message),t._userManager.events._raiseUserSignedOut()})},s(t,[{key:"_settings",get:function(){return this._userManager.settings}},{key:"_metadataService",get:function(){return this._userManager.metadataService}},{key:"_client_id",get:function(){return this._settings.client_id}},{key:"_checkSessionInterval",get:function(){return this._settings.checkSessionInterval}}]),t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.CheckSessionIFrame=void 0;var s=n(1),o=r(s),a=2e3;e.CheckSessionIFrame=function(){function t(e,n,r,s){i(this,t),this._callback=e,this._client_id=n,this._url=r,this._interval=s||a;var o=r.indexOf("/",r.indexOf("//")+2);this._frame_origin=r.substr(0,o),this._frame=window.document.createElement("iframe"),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=r}return t.prototype.load=function(){var t=this;return new Promise(function(e){t._frame.onload=function(){e()},window.document.body.appendChild(t._frame),t._boundMessageEvent=t._message.bind(t),window.addEventListener("message",t._boundMessageEvent,!1)})},t.prototype._message=function(t){t.origin===this._frame_origin&&t.source===this._frame.contentWindow&&("error"===t.data?(o.default.error("error message from check session op iframe"),this.stop()):"changed"===t.data?(o.default.debug("changed message from check session op iframe"),this.stop(),this._callback()):o.default.debug(t.data+" message from check session op iframe"))},t.prototype.start=function(t){var e=this;this._session_state!==t&&(o.default.debug("CheckSessionIFrame.start"),this.stop(),this._session_state=t,this._timer=window.setInterval(function(){e._frame.contentWindow.postMessage(e._client_id+" "+e._session_state,e._frame_origin)},this._interval))},t.prototype.stop=function(){o.default.debug("CheckSessionIFrame.stop"),this._session_state=null,this._timer&&(window.clearInterval(this._timer),this._timer=null)},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.TokenRevocationClient=void 0;var s=n(1),o=r(s),a=n(7),u=r(a),c=n(5),h=r(c),f="access_token";e.TokenRevocationClient=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:h.default.XMLHttpRequest,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.default;if(i(this,t),!e)throw o.default.error("No settings provided"),new Error("No settings provided.");this._settings=e,this._XMLHttpRequestCtor=n,this._metadataService=new r(this._settings)}return t.prototype.revoke=function(t,e){var n=this;if(o.default.debug("TokenRevocationClient.revoke"),!t)throw o.default.error("No accessToken provided"),new Error("No accessToken provided.");return this._metadataService.getRevocationEndpoint().then(function(r){if(r){var i=n._settings.client_id,s=n._settings.client_secret;return n._revoke(r,i,s,t)}if(e)throw o.default.error("Revocation not supported"),new Error("Revocation not supported")})},t.prototype._revoke=function(t,e,n,r){var i=this;return o.default.debug("Calling revocation endpoint"),new Promise(function(s,a){var u=new i._XMLHttpRequestCtor;u.open("POST",t),u.onload=function(){o.default.debug("HTTP response received, status",u.status),200===u.status?s():a(Error(u.statusText+" ("+u.status+")"))};var c="client_id="+encodeURIComponent(e);n&&(c+="&client_secret="+encodeURIComponent(n)),c+="&token_type_hint="+encodeURIComponent(f),c+="&token="+encodeURIComponent(r),u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(c)})},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.CordovaPopupNavigator=void 0;var s=n(1),o=(r(s),n(40)),a=r(o);e.CordovaPopupNavigator=function(){function t(){i(this,t)}return t.prototype.prepare=function(t){var e=new a.default(t);return Promise.resolve(e)},t}()},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.CordovaPopupWindow=void 0;var s=function(){function t(t,e){for(var n=0;n= 0); + var validAudience = payload.aud === audience || (Array.isArray(payload.aud) && payload.aud.indexOf(audience) >= 0); if (!validAudience) { Log.error("Invalid audience in token", payload.aud); return Promise.reject(new Error("Invalid audience in token: " + payload.aud)); diff --git a/src/JsonService.js b/src/JsonService.js index 36019b8d0..b4a3e0f32 100644 --- a/src/JsonService.js +++ b/src/JsonService.js @@ -1,30 +1,30 @@ // 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 Log from './Log'; -import Global from './Global'; +import { Log } from './Log'; +import { Global } from './Global'; -export default class JsonService { +export class JsonService { constructor(XMLHttpRequestCtor = Global.XMLHttpRequest) { this._XMLHttpRequest = XMLHttpRequestCtor; } - + getJson(url, token) { Log.debug("JsonService.getJson", url); - + if (!url){ Log.error("No url passed"); throw new Error("url"); } - + return new Promise((resolve, reject) => { - + var req = new this._XMLHttpRequest(); req.open('GET', url); req.onload = function() { Log.debug("HTTP response received, status", req.status); - + if (req.status === 200) { try { resolve(JSON.parse(req.responseText)); @@ -43,7 +43,7 @@ export default class JsonService { Log.error("network error"); reject(Error("Network Error")); }; - + if (token) { Log.debug("token passed, setting Authorization header"); req.setRequestHeader("Authorization", "Bearer " + token); @@ -52,4 +52,4 @@ export default class JsonService { req.send(); }); } -} \ No newline at end of file +} diff --git a/src/Log.js b/src/Log.js index 07207df4b..5f59db5f1 100644 --- a/src/Log.js +++ b/src/Log.js @@ -17,7 +17,7 @@ const DEBUG = 4; let logger; let level; -export default class Log { +export class Log { static get NONE() {return NONE}; static get ERROR() {return ERROR}; static get WARN() {return WARN}; @@ -80,4 +80,4 @@ export default class Log { } } -Log.reset(); \ No newline at end of file +Log.reset(); diff --git a/src/MetadataService.js b/src/MetadataService.js index 1f381e2e2..4bc5b23b9 100644 --- a/src/MetadataService.js +++ b/src/MetadataService.js @@ -1,12 +1,12 @@ // 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 Log from './Log'; -import JsonService from './JsonService'; +import { Log } from './Log'; +import { JsonService } from './JsonService'; const OidcMetadataUrlPath = '.well-known/openid-configuration'; -export default class MetadataService { +export class MetadataService { constructor(settings, JsonServiceCtor = JsonService) { if (!settings) { Log.error("No settings passed to MetadataService"); @@ -59,7 +59,7 @@ export default class MetadataService { return metadata; }); } - + getIssuer() { Log.debug("MetadataService.getIssuer"); return this._getMetadataProperty("issuer"); @@ -79,7 +79,7 @@ export default class MetadataService { Log.debug("MetadataService.getTokenEndpoint"); return this._getMetadataProperty("token_endpoint", true); } - + getCheckSessionIframe() { Log.debug("MetadataService.getCheckSessionIframe"); return this._getMetadataProperty("check_session_iframe", true); diff --git a/src/OidcClient.js b/src/OidcClient.js index 43fd05224..234e7a543 100644 --- a/src/OidcClient.js +++ b/src/OidcClient.js @@ -1,17 +1,17 @@ // 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 Log from './Log'; -import OidcClientSettings from './OidcClientSettings'; -import ErrorResponse from './ErrorResponse'; -import SigninRequest from './SigninRequest'; -import SigninResponse from './SigninResponse'; -import SignoutRequest from './SignoutRequest'; -import SignoutResponse from './SignoutResponse'; -import SigninState from './SigninState'; -import State from './State'; - -export default class OidcClient { +import { Log } from './Log'; +import { OidcClientSettings } from './OidcClientSettings'; +import { ErrorResponse } from './ErrorResponse'; +import { SigninRequest } from './SigninRequest'; +import { SigninResponse } from './SigninResponse'; +import { SignoutRequest } from './SignoutRequest'; +import { SignoutResponse } from './SignoutResponse'; +import { SigninState } from './SigninState'; +import { State } from './State'; + +export class OidcClient { constructor(settings = {}) { if (settings instanceof OidcClientSettings) { this._settings = settings; @@ -39,9 +39,9 @@ export default class OidcClient { } createSigninRequest({ - response_type, scope, redirect_uri, + response_type, scope, redirect_uri, // data was meant to be the place a caller could indicate the data to - // have round tripped, but people were getting confused, so i added state (since that matches the spec) + // have round tripped, but people were getting confused, so i added state (since that matches the spec) // and so now if data is not passed, but state is then state will be used data, state, prompt, display, max_age, ui_locales, id_token_hint, login_hint, acr_values, resource, request, request_uri, extraQueryParams } = {}, @@ -62,7 +62,7 @@ export default class OidcClient { acr_values = acr_values || this._settings.acr_values; resource = resource || this._settings.resource; extraQueryParams = extraQueryParams || this._settings.extraQueryParams; - + let authority = this._settings.authority; return this._metadataService.getAuthorizationEndpoint().then(url => { diff --git a/src/OidcClientSettings.js b/src/OidcClientSettings.js index ab968bf07..dff30d2b6 100644 --- a/src/OidcClientSettings.js +++ b/src/OidcClientSettings.js @@ -1,10 +1,10 @@ // 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 Log from './Log'; -import WebStorageStateStore from './WebStorageStateStore'; -import ResponseValidator from './ResponseValidator'; -import MetadataService from './MetadataService'; +import { Log } from './Log'; +import { WebStorageStateStore } from './WebStorageStateStore'; +import { ResponseValidator } from './ResponseValidator'; +import { MetadataService } from './MetadataService'; const OidcMetadataUrlPath = '.well-known/openid-configuration'; @@ -13,7 +13,7 @@ const DefaultScope = "openid"; const DefaultStaleStateAge = 60 * 5; // seconds const DefaultClockSkewInSeconds = 60 * 5; -export default class OidcClientSettings { +export class OidcClientSettings { constructor({ // metadata related authority, metadataUrl, metadata, signingKeys, diff --git a/src/PopupNavigator.js b/src/PopupNavigator.js index 909838232..615e37b1d 100644 --- a/src/PopupNavigator.js +++ b/src/PopupNavigator.js @@ -1,16 +1,16 @@ // 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 Log from './Log'; -import PopupWindow from './PopupWindow'; +import { Log } from './Log'; +import { PopupWindow } from './PopupWindow'; + +export class PopupNavigator { -export default class PopupNavigator { - prepare(params) { let popup = new PopupWindow(params); return Promise.resolve(popup); } - + callback(url, keepOpen, delimiter) { Log.debug("PopupNavigator.callback"); diff --git a/src/PopupWindow.js b/src/PopupWindow.js index 6848fc059..4cb2dbd31 100644 --- a/src/PopupWindow.js +++ b/src/PopupWindow.js @@ -1,8 +1,8 @@ // 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 Log from './Log'; -import UrlUtility from './UrlUtility'; +import { Log } from './Log'; +import { UrlUtility } from './UrlUtility'; const CheckForPopupClosedInterval = 500; const DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100;'; @@ -10,7 +10,7 @@ const DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=1 const DefaultPopupTarget = "_blank"; -export default class PopupWindow { +export class PopupWindow { constructor(params) { Log.debug("PopupWindow.ctor"); @@ -118,10 +118,10 @@ export default class PopupWindow { if (url) { var data = UrlUtility.parseUrlFragment(url, delimiter); - + if (data.state) { var name = "popupCallback_" + data.state; - var callback = window.opener[name]; + var callback = window.opener[name]; if (callback) { Log.debug("passing url message to opener"); callback(url, keepOpen); diff --git a/src/RedirectNavigator.js b/src/RedirectNavigator.js index 93070efb9..3d526f079 100644 --- a/src/RedirectNavigator.js +++ b/src/RedirectNavigator.js @@ -1,24 +1,24 @@ // 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 Log from './Log'; +import { Log } from './Log'; + +export class RedirectNavigator { -export default class RedirectNavigator { - prepare() { return Promise.resolve(this); } navigate(params) { Log.debug("RedirectNavigator.navigate"); - + if (!params || !params.url) { Log.error("No url provided"); return Promise.reject(new Error("No url provided")); } window.location = params.url; - + return Promise.resolve(); } diff --git a/src/ResponseValidator.js b/src/ResponseValidator.js index 2a9df0769..af3d6d951 100644 --- a/src/ResponseValidator.js +++ b/src/ResponseValidator.js @@ -1,15 +1,15 @@ // 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 Log from './Log'; -import MetadataService from './MetadataService'; -import UserInfoService from './UserInfoService'; -import ErrorResponse from './ErrorResponse'; -import JoseUtil from './JoseUtil'; +import { Log } from './Log'; +import { MetadataService } from './MetadataService'; +import { UserInfoService } from './UserInfoService'; +import { ErrorResponse } from './ErrorResponse'; +import { JoseUtil } from './JoseUtil'; const ProtocolClaims = ["nonce", "at_hash", "iat", "nbf", "exp", "aud", "iss", "c_hash"]; -export default class ResponseValidator { +export class ResponseValidator { constructor(settings, MetadataServiceCtor = MetadataService, UserInfoServiceCtor = UserInfoService, joseUtil = JoseUtil) { if (!settings) { @@ -67,17 +67,17 @@ export default class ResponseValidator { Log.error("State does not match"); return Promise.reject(new Error("State does not match")); } - + if (!state.client_id) { Log.error("No client_id on state"); return Promise.reject(new Error("No client_id on state")); } - + if (!state.authority) { Log.error("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; @@ -96,7 +96,7 @@ export default class ResponseValidator { Log.error("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 @@ -237,7 +237,7 @@ export default class ResponseValidator { Log.error("No nonce on state"); return Promise.reject(new Error("No nonce on state")); } - + let jwt = this._joseUtil.parseJwt(response.id_token); if (!jwt || !jwt.header || !jwt.payload) { Log.error("Failed to parse id_token", jwt); @@ -268,7 +268,7 @@ export default class ResponseValidator { if (keys.length > 1) { Log.error("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 @@ -287,20 +287,20 @@ export default class ResponseValidator { } let audience = state.client_id; - + let clockSkewInSeconds = this._settings.clockSkew; Log.debug("Validaing JWT; using clock skew (in seconds) of: ", clockSkewInSeconds); return this._joseUtil.validateJwt(response.id_token, key, issuer, audience, clockSkewInSeconds).then(()=>{ Log.debug("JWT validation successful"); - + if (!jwt.payload.sub) { Log.error("No sub present in id_token"); return Promise.reject(new Error("No sub present in id_token")); } response.profile = jwt.payload; - + return response; }); }); @@ -324,7 +324,7 @@ export default class ResponseValidator { Log.debug("alg not supported: ", alg); return []; } - + Log.debug("Looking for keys that match kty: ", kty); keys = keys.filter(key => { @@ -394,4 +394,4 @@ export default class ResponseValidator { return Promise.resolve(response); } -} \ No newline at end of file +} diff --git a/src/SessionMonitor.js b/src/SessionMonitor.js index c7a431654..20b99d1b5 100644 --- a/src/SessionMonitor.js +++ b/src/SessionMonitor.js @@ -1,10 +1,10 @@ // 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 Log from './Log'; -import CheckSessionIFrame from './CheckSessionIFrame'; +import { Log } from './Log'; +import { CheckSessionIFrame } from './CheckSessionIFrame'; -export default class SessionMonitor { +export class SessionMonitor { constructor(userManager, CheckSessionIFrameCtor = CheckSessionIFrame) { if (!userManager) { diff --git a/src/SigninRequest.js b/src/SigninRequest.js index 52fe7fe91..965f8c2a0 100644 --- a/src/SigninRequest.js +++ b/src/SigninRequest.js @@ -1,11 +1,11 @@ // 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 Log from './Log'; -import UrlUtility from './UrlUtility'; -import SigninState from './SigninState'; +import { Log } from './Log'; +import { UrlUtility } from './UrlUtility'; +import { SigninState } from './SigninState'; -export default class SigninRequest { +export class SigninRequest { constructor({ // mandatory url, client_id, redirect_uri, response_type, scope, authority, @@ -45,7 +45,7 @@ export default class SigninRequest { url = UrlUtility.addQueryParam(url, "redirect_uri", redirect_uri); url = UrlUtility.addQueryParam(url, "response_type", response_type); url = UrlUtility.addQueryParam(url, "scope", scope); - + url = UrlUtility.addQueryParam(url, "state", this.state.id); if (oidc) { url = UrlUtility.addQueryParam(url, "nonce", this.state.nonce); @@ -71,11 +71,11 @@ export default class SigninRequest { }); return !!(result[0]); } - + static isOAuth(response_type) { var result = response_type.split(/\s+/g).filter(function(item) { return item === "token"; }); return !!(result[0]); } -} \ No newline at end of file +} diff --git a/src/SigninResponse.js b/src/SigninResponse.js index d611cf6bd..e9f70f219 100644 --- a/src/SigninResponse.js +++ b/src/SigninResponse.js @@ -1,11 +1,11 @@ // 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 UrlUtility from './UrlUtility'; +import { UrlUtility } from './UrlUtility'; const OidcScope = "openid"; -export default class SigninResponse { +export class SigninResponse { constructor(url) { var values = UrlUtility.parseUrlFragment(url, "#"); @@ -13,7 +13,7 @@ export default class SigninResponse { this.error = values.error; this.error_description = values.error_description; this.error_uri = values.error_uri; - + this.state = values.state; this.id_token = values.id_token; this.session_state = values.session_state; @@ -48,7 +48,7 @@ export default class SigninResponse { get scopes() { return (this.scope || "").split(" "); } - + get isOpenIdConnect() { return this.scopes.indexOf(OidcScope) >= 0 || !!this.id_token; } diff --git a/src/SigninState.js b/src/SigninState.js index 048a8be38..37277fdea 100644 --- a/src/SigninState.js +++ b/src/SigninState.js @@ -1,21 +1,21 @@ // 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 Log from './Log'; -import State from './State'; +import { Log } from './Log'; +import { State } from './State'; import random from './random'; -export default class SigninState extends State { +export class SigninState extends State { constructor({nonce, authority, client_id} = {}) { super(arguments[0]); - + if (nonce === true) { this._nonce = random(); } else if (nonce) { this._nonce = nonce; } - + this._authority = authority; this._client_id = client_id; } @@ -29,7 +29,7 @@ export default class SigninState extends State { get client_id() { return this._client_id; } - + toStorageString() { Log.debug("SigninState.toStorageString"); return JSON.stringify({ diff --git a/src/SignoutRequest.js b/src/SignoutRequest.js index 0f2961731..427a9eb01 100644 --- a/src/SignoutRequest.js +++ b/src/SignoutRequest.js @@ -1,11 +1,11 @@ // 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 Log from './Log'; -import UrlUtility from './UrlUtility'; -import State from './State'; +import { Log } from './Log'; +import { UrlUtility } from './UrlUtility'; +import { State } from './State'; -export default class SignoutRequest { +export class SignoutRequest { constructor({url, id_token_hint, post_logout_redirect_uri, data}) { if (!url) { Log.error("No url passed to SignoutRequest"); @@ -15,17 +15,17 @@ export default class SignoutRequest { if (id_token_hint) { url = UrlUtility.addQueryParam(url, "id_token_hint", id_token_hint); } - + if (post_logout_redirect_uri) { url = UrlUtility.addQueryParam(url, "post_logout_redirect_uri", post_logout_redirect_uri); - + if (data) { this.state = new State({ data }); - + url = UrlUtility.addQueryParam(url, "state", this.state.id); } } - + this.url = url; } } diff --git a/src/SignoutResponse.js b/src/SignoutResponse.js index 4a618044e..cf7f6618a 100644 --- a/src/SignoutResponse.js +++ b/src/SignoutResponse.js @@ -1,9 +1,9 @@ // 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 UrlUtility from './UrlUtility'; +import { UrlUtility } from './UrlUtility'; -export default class SignoutResponse { +export class SignoutResponse { constructor(url) { var values = UrlUtility.parseUrlFragment(url, "?"); @@ -14,4 +14,4 @@ export default class SignoutResponse { this.state = values.state; } -} \ No newline at end of file +} diff --git a/src/SilentRenewService.js b/src/SilentRenewService.js index 10dd12569..153990954 100644 --- a/src/SilentRenewService.js +++ b/src/SilentRenewService.js @@ -1,9 +1,9 @@ // 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 Log from './Log'; +import { Log } from './Log'; -export default class SilentRenewService { +export class SilentRenewService { constructor(userManager) { this._userManager = userManager; @@ -13,7 +13,7 @@ export default class SilentRenewService { 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(user=>{ // deliberate nop @@ -33,7 +33,7 @@ export default class SilentRenewService { _tokenExpiring() { Log.debug("SilentRenewService automatically renewing access token"); - + this._userManager.signinSilent().then(user => { Log.debug("Silent token renewal successful"); }, err => { diff --git a/src/State.js b/src/State.js index d17751861..2aa6fd727 100644 --- a/src/State.js +++ b/src/State.js @@ -1,10 +1,10 @@ // 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 Log from './Log'; +import { Log } from './Log'; import random from './random'; -export default class State { +export class State { constructor({id, data, created} = {}) { this._id = id || random(); this._data = data; @@ -35,7 +35,7 @@ export default class State { created: this.created }); } - + static fromStorageString(storageString) { Log.debug("State.fromStorageString"); return new State(JSON.parse(storageString)); diff --git a/src/Timer.js b/src/Timer.js index f1261ef1f..9a6acbda1 100644 --- a/src/Timer.js +++ b/src/Timer.js @@ -1,13 +1,13 @@ // 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 Log from './Log'; -import Global from './Global'; -import Event from './Event'; +import { Log } from './Log'; +import { Global } from './Global'; +import { Event } from './Event'; const TimerDuration = 5; // seconds -export default class Timer extends Event { +export class Timer extends Event { constructor(name, timer = Global.timer) { super(name); @@ -30,8 +30,8 @@ export default class Timer extends Event { Log.debug("Timer.init timer " + this._name + " for duration:", duration); this._expiration = this.now + duration; - // 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 + // 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) { diff --git a/src/TokenRevocationClient.js b/src/TokenRevocationClient.js index b9839d4c5..3d783c593 100644 --- a/src/TokenRevocationClient.js +++ b/src/TokenRevocationClient.js @@ -1,19 +1,19 @@ // 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 Log from './Log'; -import MetadataService from './MetadataService'; -import Global from './Global'; +import { Log } from './Log'; +import { MetadataService } from './MetadataService'; +import { Global } from './Global'; const AccessTokenTypeHint = "access_token"; -export default class TokenRevocationClient { +export class TokenRevocationClient { constructor(settings, XMLHttpRequestCtor = Global.XMLHttpRequest, MetadataServiceCtor = MetadataService) { if (!settings) { Log.error("No settings provided"); throw new Error("No settings provided."); } - + this._settings = settings; this._XMLHttpRequestCtor = XMLHttpRequestCtor; this._metadataService = new MetadataServiceCtor(this._settings); @@ -51,10 +51,10 @@ export default class TokenRevocationClient { var xhr = new this._XMLHttpRequestCtor(); xhr.open("POST", url); - + xhr.onload = () => { Log.debug("HTTP response received, status", xhr.status); - + if (xhr.status === 200) { resolve(); } @@ -63,13 +63,13 @@ export default class TokenRevocationClient { } }; - var body = "client_id=" + encodeURIComponent(client_id); + var body = "client_id=" + encodeURIComponent(client_id); if (client_secret) { body += "&client_secret=" + encodeURIComponent(client_secret); } body += "&token_type_hint=" + encodeURIComponent(AccessTokenTypeHint); body += "&token=" + encodeURIComponent(accessToken); - + xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(body); }); diff --git a/src/UrlUtility.js b/src/UrlUtility.js index 15818253e..ea22c9975 100644 --- a/src/UrlUtility.js +++ b/src/UrlUtility.js @@ -1,10 +1,10 @@ // 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 Log from './Log'; -import Global from './Global'; +import { Log } from './Log'; +import { Global } from './Global'; -export default class UrlUtility { +export class UrlUtility { static addQueryParam(url, name, value) { if (url.indexOf('?') < 0) { url += "?"; @@ -51,7 +51,7 @@ export default class UrlUtility { for (var prop in params) { return params; } - + return {}; } -} \ No newline at end of file +} diff --git a/src/User.js b/src/User.js index 9510e7f72..509c94916 100644 --- a/src/User.js +++ b/src/User.js @@ -1,9 +1,9 @@ // 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 Log from './Log'; +import { Log } from './Log'; -export default class User { +export class User { constructor({id_token, session_state, access_token, token_type, scope, profile, expires_at, state}) { this.id_token = id_token; this.session_state = session_state; @@ -52,4 +52,4 @@ export default class User { Log.debug("User.fromStorageString"); return new User(JSON.parse(storageString)); } -} \ No newline at end of file +} diff --git a/src/UserInfoService.js b/src/UserInfoService.js index 7336cf96e..5033fe479 100644 --- a/src/UserInfoService.js +++ b/src/UserInfoService.js @@ -1,11 +1,11 @@ // 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 JsonService from './JsonService'; -import MetadataService from './MetadataService'; -import Log from './Log'; +import { JsonService } from './JsonService'; +import { MetadataService } from './MetadataService'; +import { Log } from './Log'; -export default class UserInfoService { +export class UserInfoService { constructor(settings, JsonServiceCtor = JsonService, MetadataServiceCtor = MetadataService) { if (!settings) { Log.error("No settings passed to UserInfoService"); diff --git a/src/UserManager.js b/src/UserManager.js index 3be2bb4a7..bbce89f87 100644 --- a/src/UserManager.js +++ b/src/UserManager.js @@ -1,16 +1,16 @@ // 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 Log from './Log'; -import OidcClient from './OidcClient'; -import UserManagerSettings from './UserManagerSettings'; -import User from './User'; -import UserManagerEvents from './UserManagerEvents'; -import SilentRenewService from './SilentRenewService'; -import SessionMonitor from './SessionMonitor'; -import TokenRevocationClient from './TokenRevocationClient'; - -export default class UserManager extends OidcClient { +import { Log } from './Log'; +import { OidcClient } from './OidcClient'; +import { UserManagerSettings } from './UserManagerSettings'; +import { User } from './User'; +import { UserManagerEvents } from './UserManagerEvents'; +import { SilentRenewService } from './SilentRenewService'; +import { SessionMonitor } from './SessionMonitor'; +import { TokenRevocationClient } from './TokenRevocationClient'; + +export class UserManager extends OidcClient { constructor(settings = {}, SilentRenewServiceCtor = SilentRenewService, SessionMonitorCtor = SessionMonitor, @@ -24,7 +24,7 @@ export default class UserManager extends OidcClient { this._events = new 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.debug("automaticSilentRenew is configured, setting up silent renew"); @@ -104,7 +104,7 @@ export default class UserManager extends OidcClient { return user; }); } - + signinPopup(args = {}) { Log.debug("UserManager.signinPopup"); @@ -259,7 +259,7 @@ export default class UserManager extends OidcClient { navigatorParams.url = signinRequest.url; navigatorParams.id = signinRequest.state.id; - + return handle.navigate(navigatorParams); }).catch(err => { if (handle.close) { @@ -317,7 +317,7 @@ export default class UserManager extends OidcClient { 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 + // 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 diff --git a/src/UserManagerEvents.js b/src/UserManagerEvents.js index de826eb93..a26aa7fe9 100644 --- a/src/UserManagerEvents.js +++ b/src/UserManagerEvents.js @@ -1,11 +1,11 @@ // 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 Log from './Log'; -import AccessTokenEvents from './AccessTokenEvents'; -import Event from './Event'; +import { Log } from './Log'; +import { AccessTokenEvents } from './AccessTokenEvents'; +import { Event } from './Event'; -export default class UserManagerEvents extends AccessTokenEvents { +export class UserManagerEvents extends AccessTokenEvents { constructor(settings) { super(settings); @@ -35,7 +35,7 @@ export default class UserManagerEvents extends AccessTokenEvents { removeUserLoaded(cb) { this._userLoaded.removeHandler(cb); } - + addUserUnloaded(cb) { this._userUnloaded.addHandler(cb); } diff --git a/src/UserManagerSettings.js b/src/UserManagerSettings.js index 210f2ecec..80559b04e 100644 --- a/src/UserManagerSettings.js +++ b/src/UserManagerSettings.js @@ -1,18 +1,18 @@ // 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 Log from './Log'; -import OidcClientSettings from './OidcClientSettings'; -import RedirectNavigator from './RedirectNavigator'; -import PopupNavigator from './PopupNavigator'; -import IFrameNavigator from './IFrameNavigator'; -import WebStorageStateStore from './WebStorageStateStore'; -import Global from './Global'; +import { Log } from './Log'; +import { OidcClientSettings } from './OidcClientSettings'; +import { RedirectNavigator } from './RedirectNavigator'; +import { PopupNavigator } from './PopupNavigator'; +import { IFrameNavigator } from './IFrameNavigator'; +import { WebStorageStateStore } from './WebStorageStateStore'; +import { Global } from './Global'; const DefaultAccessTokenExpiringNotificationTime = 60; const DefaultCheckSessionInterval = 2000; -export default class UserManagerSettings extends OidcClientSettings { +export class UserManagerSettings extends OidcClientSettings { constructor({ popup_redirect_uri, popup_post_logout_redirect_uri, @@ -37,7 +37,7 @@ export default class UserManagerSettings extends OidcClientSettings { 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; @@ -51,7 +51,7 @@ export default class UserManagerSettings extends OidcClientSettings { this._redirectNavigator = redirectNavigator; this._popupNavigator = popupNavigator; this._iframeNavigator = iframeNavigator; - + this._userStore = userStore; } @@ -103,7 +103,7 @@ export default class UserManagerSettings extends OidcClientSettings { get iframeNavigator() { return this._iframeNavigator; } - + get userStore() { return this._userStore; } diff --git a/src/WebStorageStateStore.js b/src/WebStorageStateStore.js index 017fbf7e3..eb3b535e2 100644 --- a/src/WebStorageStateStore.js +++ b/src/WebStorageStateStore.js @@ -1,10 +1,10 @@ // 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 Log from './Log'; -import Global from './Global'; +import { Log } from './Log'; +import { Global } from './Global'; -export default class WebStorageStateStore { +export class WebStorageStateStore { constructor({prefix = "oidc.", store = Global.localStorage} = {}) { this._store = store; this._prefix = prefix; @@ -16,7 +16,7 @@ export default class WebStorageStateStore { key = this._prefix + key; this._store.setItem(key, value); - + return Promise.resolve(); } @@ -26,7 +26,7 @@ export default class WebStorageStateStore { key = this._prefix + key; let item = this._store.getItem(key); - + return Promise.resolve(item); } @@ -37,7 +37,7 @@ export default class WebStorageStateStore { let item = this._store.getItem(key); this._store.removeItem(key); - + return Promise.resolve(item); } @@ -48,12 +48,12 @@ export default class WebStorageStateStore { for (let index = 0; index < this._store.length; index++) { let key = this._store.key(index); - + if (key.indexOf(this._prefix) === 0) { keys.push(key.substr(this._prefix.length)); } } - + return Promise.resolve(keys); } } diff --git a/test/unit/AccessTokenEvents.spec.js b/test/unit/AccessTokenEvents.spec.js index 834be893b..f11826cca 100644 --- a/test/unit/AccessTokenEvents.spec.js +++ b/test/unit/AccessTokenEvents.spec.js @@ -1,7 +1,7 @@ // 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 AccessTokenEvents from '../../src/AccessTokenEvents'; +import { AccessTokenEvents } from '../../src/AccessTokenEvents'; import chai from 'chai'; chai.should(); @@ -20,7 +20,7 @@ class StubTimer { cancel() { this.cancelWasCalled = true; } - + addHandler(){} removeHandler(){} } @@ -35,7 +35,7 @@ describe("AccessTokenEvents", function () { accessTokenExpiringTimer = new StubTimer(); accessTokenExpiredTimer = new StubTimer(); subject = new AccessTokenEvents({ - accessTokenExpiringTimer, accessTokenExpiredTimer + accessTokenExpiringTimer, accessTokenExpiredTimer }); }); @@ -51,36 +51,36 @@ describe("AccessTokenEvents", function () { it("should cancel existing timers", function () { subject.load({}); - + accessTokenExpiringTimer.cancelWasCalled.should.be.true; accessTokenExpiredTimer.cancelWasCalled.should.be.true; }); - + it("should initialize timers", function () { subject.load({ access_token:"token", expires_in : 70 }); - + accessTokenExpiringTimer.duration.should.equal(10); accessTokenExpiredTimer.duration.should.equal(71); }); - + it("should immediately schedule expiring timer if expiration is soon", function () { subject.load({ access_token:"token", expires_in : 10 }); - + accessTokenExpiringTimer.duration.should.equal(1); }); - + it("should not initialize expiring timer if already expired", function () { subject.load({ access_token:"token", expires_in : 0 }); - + assert.isUndefined(accessTokenExpiringTimer.duration); }); @@ -89,27 +89,27 @@ describe("AccessTokenEvents", function () { access_token:"token", expires_in : 0 }); - + accessTokenExpiredTimer.duration.should.equal(1); }); - + it("should not initialize timers if no access token", function () { subject.load({ expires_in : 70 }); - + assert.isUndefined(accessTokenExpiringTimer.duration); assert.isUndefined(accessTokenExpiredTimer.duration); }); }); - + describe("unload", function () { it("should cancel timers", function () { - + subject.unload(); - + accessTokenExpiringTimer.cancelWasCalled.should.be.true; accessTokenExpiredTimer.cancelWasCalled.should.be.true; }); diff --git a/test/unit/ErrorResponse.spec.js b/test/unit/ErrorResponse.spec.js index 038f2d24b..3ae611b8e 100644 --- a/test/unit/ErrorResponse.spec.js +++ b/test/unit/ErrorResponse.spec.js @@ -1,8 +1,8 @@ // 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 Log from '../../src/Log'; -import ErrorResponse from '../../src/ErrorResponse'; +import { Log } from '../../src/Log'; +import { ErrorResponse } from '../../src/ErrorResponse'; import chai from 'chai'; chai.should(); @@ -65,13 +65,13 @@ describe("ErrorResponse", function() { }); }); - + describe("stack", function() { - + it("should be set", function() { let subject = new ErrorResponse({error:"error"}); subject.stack.should.be.ok; }); }); -}); \ No newline at end of file +}); diff --git a/test/unit/Event.spec.js b/test/unit/Event.spec.js index b63658ab8..20bfa19a0 100644 --- a/test/unit/Event.spec.js +++ b/test/unit/Event.spec.js @@ -2,7 +2,7 @@ // 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 Event from '../../src/Event'; +import { Event } from '../../src/Event'; import chai from 'chai'; chai.should(); @@ -28,7 +28,7 @@ describe("Event", function () { cb.wasCalled.should.be.true; }); - + it("should allow multiple callbacks", function () { var count = 0; var cb = function () { @@ -53,14 +53,14 @@ describe("Event", function () { cb.wasCalled = true; }; cb.wasCalled = false; - + subject.addHandler(cb); subject.removeHandler(cb); subject.raise(); cb.wasCalled.should.be.false; }); - + it("should remove individual callback", function () { var count = 0; var cb1 = function () { @@ -75,7 +75,7 @@ describe("Event", function () { subject.addHandler(cb1); subject.removeHandler(cb1); subject.removeHandler(cb1); - + subject.raise(); count.should.equal(0); @@ -83,7 +83,7 @@ describe("Event", function () { }); }); - + describe("raise", function () { it("should pass params", function () { @@ -96,7 +96,7 @@ describe("Event", function () { subject.raise(1,2,3); }); - + it("should allow passing no params", function () { var cb = function (a,b,c) { assert.isUndefined(a); @@ -107,7 +107,7 @@ describe("Event", function () { subject.raise(); }); - + }); }); diff --git a/test/unit/JoseUtil.spec.js b/test/unit/JoseUtil.spec.js index 51b87f634..0d3c8a96e 100644 --- a/test/unit/JoseUtil.spec.js +++ b/test/unit/JoseUtil.spec.js @@ -1,8 +1,8 @@ // 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 JoseUtil from '../../src/JoseUtil'; -import Log from '../../src/Log'; +import { JoseUtil } from '../../src/JoseUtil'; +import { Log } from '../../src/Log'; import chai from 'chai'; chai.should(); @@ -122,7 +122,7 @@ describe("JoseUtil", function () { JoseUtil.validateJwt(jwtFromRsa, rsaKey, expectedIssuer, expectedAudience, 0, expectedNow).then(()=>{ done(); }) - + }); it("should fail for unsupported key types", function (done) { @@ -159,7 +159,7 @@ describe("JoseUtil", function () { var p1 = JoseUtil.validateJwt(jwtFromRsa, rsaKey, expectedIssuer, expectedAudience, 10, notBefore - 1); var p2 = JoseUtil.validateJwt(jwtFromRsa, rsaKey, expectedIssuer, expectedAudience, 10, notBefore - 10); Promise.all([p1, p2]).then(()=>{ - done(); + done(); }); }); @@ -213,7 +213,7 @@ describe("JoseUtil", function () { var p1 = JoseUtil.validateJwt(jwtFromRsa, rsaKey, expectedIssuer, expectedAudience, 10, expires + 1); var p2 = JoseUtil.validateJwt(jwtFromRsa, rsaKey, expectedIssuer, expectedAudience, 10, expires + 10) Promise.all([p1, p2]).then(()=>{ - done(); + done(); }); }); diff --git a/test/unit/JsonService.spec.js b/test/unit/JsonService.spec.js index 88cb5f301..fb60c30cc 100644 --- a/test/unit/JsonService.spec.js +++ b/test/unit/JsonService.spec.js @@ -1,7 +1,7 @@ // 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 JsonService from '../../src/JsonService'; +import { JsonService } from '../../src/JsonService'; import chai from 'chai'; chai.should(); @@ -9,16 +9,16 @@ let assert = chai.assert; describe("JsonService", function() { let subject; - + let stubHttpRequest; - + beforeEach(function(){ stubHttpRequest = new StubXMLHttpRequest(); - subject = new JsonService(()=>stubHttpRequest); + subject = new JsonService(()=>stubHttpRequest); }); - + describe("getJson", function() { - + it("should require a url parameter", function() { try { subject.getJson(); @@ -26,46 +26,46 @@ describe("JsonService", function() { catch(e) { return; } - + assert.fail(); }); - + it("should return a promise", function() { let p = subject.getJson("http://test"); p.should.be.instanceof(Promise); }); - + it("should make GET request to url", function() { let p = subject.getJson("http://test"); stubHttpRequest.method.should.be.equal('GET'); stubHttpRequest.url.should.be.equal('http://test'); }); - + it("should set token as authorization header", function() { let p = subject.getJson("http://test", "token"); stubHttpRequest.headers.has('Authorization').should.be.true; stubHttpRequest.headers.get('Authorization').should.be.equal('Bearer token'); }); - + it("should fulfill promise when http response is 200", function(done) { let p = subject.getJson("http://test"); - + p.then(result => { result.should.not.be.undefined; result.foo.should.be.equal(1); result.bar.should.be.equal('test'); - + done(); }); - + stubHttpRequest.status = 200; stubHttpRequest.responseText = JSON.stringify({foo:1, bar:'test'}); stubHttpRequest.onload(); }); - + it("should reject promise when http response is not 200", function(done) { let p = subject.getJson("http://test"); - + p.then(result => { assert.fail(); }, error => { @@ -74,15 +74,15 @@ describe("JsonService", function() { error.message.should.contain('server error'); done(); }); - + stubHttpRequest.status = 500; stubHttpRequest.statusText = "server error"; stubHttpRequest.onload(); }); - + it("should reject promise when http response is error", function(done) { let p = subject.getJson("http://test"); - + p.then(result => { assert.fail(); }, error => { @@ -90,7 +90,7 @@ describe("JsonService", function() { error.message.should.be.equal('Network Error'); done(); }); - + stubHttpRequest.onerror(); }); }); @@ -100,16 +100,16 @@ class StubXMLHttpRequest { constructor() { this.headers = new Map(); } - + open(method, url) { this.method = method; this.url = url; } - + setRequestHeader(header, value){ this.headers.set(header, value); } - + send() { } } diff --git a/test/unit/Log.spec.js b/test/unit/Log.spec.js index 9e17e40ae..d6c560a7f 100644 --- a/test/unit/Log.spec.js +++ b/test/unit/Log.spec.js @@ -1,7 +1,7 @@ // 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 Log from '../../src/Log'; +import { Log } from '../../src/Log'; import chai from 'chai'; chai.should(); @@ -137,4 +137,4 @@ class StubLog { this.errorParam = arg; this.errorWasCalled = true; } -} \ No newline at end of file +} diff --git a/test/unit/MetadataService.spec.js b/test/unit/MetadataService.spec.js index 8db007c39..6cbddffee 100644 --- a/test/unit/MetadataService.spec.js +++ b/test/unit/MetadataService.spec.js @@ -1,10 +1,10 @@ // 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 Log from '../../src/Log'; -import MetadataService from '../../src/MetadataService'; +import { Log } from '../../src/Log'; +import { MetadataService } from '../../src/MetadataService'; -import StubJsonService from './StubJsonService'; +import { StubJsonService } from './StubJsonService'; import chai from 'chai'; chai.should(); @@ -18,7 +18,7 @@ describe("MetadataService", function() { beforeEach(function() { Log.logger = console; Log.level = Log.NONE; - + settings = {}; stubJsonService = new StubJsonService(); subject = new MetadataService(settings, ()=>stubJsonService); @@ -126,7 +126,7 @@ describe("MetadataService", function() { }); }); - + describe("_getMetadataProperty", function() { it("should return a promise", function() { @@ -157,9 +157,9 @@ describe("MetadataService", function() { done(); }); }); - + it("should fail if json call to load metadata fails", function(done) { - + settings.metadataUrl = "http://sts/metadata"; stubJsonService.result = Promise.reject(new Error("test")); @@ -170,7 +170,7 @@ describe("MetadataService", function() { done(); }); }); - + }); describe("getAuthorizationEndpoint", function() { @@ -187,7 +187,7 @@ describe("MetadataService", function() { done(); }); }); - + }); describe("getUserInfoEndpoint", function() { @@ -235,7 +235,7 @@ describe("MetadataService", function() { }); }); - + describe("getCheckSessionIframe", function() { it("should return value from", function(done) { @@ -264,7 +264,7 @@ describe("MetadataService", function() { }); }); - + describe("getIssuer", function() { it("should return value from", function(done) { @@ -281,7 +281,7 @@ describe("MetadataService", function() { }); }); - + describe("getSigningKeys", function() { it("should return a promise", function() { @@ -342,7 +342,7 @@ describe("MetadataService", function() { }); it("should return keys from jwks_uri", function(done) { - + settings.metadata = { jwks_uri: "http://sts/metadata/keys" }; @@ -381,6 +381,6 @@ describe("MetadataService", function() { done(); }) }); - + }); }); diff --git a/test/unit/OidcClient.spec.js b/test/unit/OidcClient.spec.js index 1c21b495f..75b949b2a 100644 --- a/test/unit/OidcClient.spec.js +++ b/test/unit/OidcClient.spec.js @@ -1,23 +1,23 @@ // 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 Global from '../../src/Global'; -import OidcClient from '../../src/OidcClient'; -import SigninRequest from '../../src/SigninRequest'; -import SigninResponse from '../../src/SigninResponse'; -import ErrorResponse from '../../src/ErrorResponse'; -import SignoutRequest from '../../src/SignoutRequest'; -import SignoutResponse from '../../src/SignoutResponse'; -import State from '../../src/State'; -import SigninState from '../../src/SigninState'; -import OidcClientSettings from '../../src/OidcClientSettings'; -import MetadataService from '../../src/MetadataService'; - -import Log from '../../src/Log'; - -import StubMetadataService from './StubMetadataService'; -import StubStateStore from './StubStateStore'; -import StubResponseValidator from './StubResponseValidator'; +import { Global } from '../../src/Global'; +import { OidcClient } from '../../src/OidcClient'; +import { SigninRequest } from '../../src/SigninRequest'; +import { SigninResponse } from '../../src/SigninResponse'; +import { ErrorResponse } from '../../src/ErrorResponse'; +import { SignoutRequest } from '../../src/SignoutRequest'; +import { SignoutResponse } from '../../src/SignoutResponse'; +import { State } from '../../src/State'; +import { SigninState } from '../../src/SigninState'; +import { OidcClientSettings } from '../../src/OidcClientSettings'; +import { MetadataService } from '../../src/MetadataService'; + +import { Log } from '../../src/Log'; + +import { StubMetadataService } from './StubMetadataService'; +import { StubStateStore } from './StubStateStore'; +import { StubResponseValidator } from './StubResponseValidator'; import chai from 'chai'; chai.should(); @@ -31,16 +31,16 @@ describe("OidcClient", function () { let stubValidator; beforeEach(function () { - + Global._testing(); - + Log.logger = console; Log.level = Log.NONE; stubStore = new StubStateStore(); stubValidator = new StubResponseValidator(); stubMetadataService = new StubMetadataService(); - + settings = { authority: 'authority', client_id: 'client', @@ -410,9 +410,9 @@ describe("OidcClient", function () { done(); }); }); - + it("should call validator with state even if error in response", function (done) { - + stubStore.item = new State({ id: '1', data:"bar" }).toStorageString(); subject.processSignoutResponse("state=1&error=foo").then(response => { diff --git a/test/unit/OidcClientSettings.spec.js b/test/unit/OidcClientSettings.spec.js index 287018c1b..f63c9c058 100644 --- a/test/unit/OidcClientSettings.spec.js +++ b/test/unit/OidcClientSettings.spec.js @@ -1,9 +1,9 @@ // 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 Log from '../../src/Log'; -import OidcClientSettings from '../../src/OidcClientSettings'; -import Global from '../../src/Global'; +import { Log } from '../../src/Log'; +import { OidcClientSettings } from '../../src/OidcClientSettings'; +import { Global } from '../../src/Global'; import chai from 'chai'; chai.should(); @@ -24,7 +24,7 @@ describe("OidcClientSettings", function () { }); subject.client_id.should.equal("client"); }); - + it("should not allow setting if previously set", function () { let subject = new OidcClientSettings({ client_id: 'client', diff --git a/test/unit/ResponseValidator.spec.js b/test/unit/ResponseValidator.spec.js index acb2d1cd8..cabf4ffe0 100644 --- a/test/unit/ResponseValidator.spec.js +++ b/test/unit/ResponseValidator.spec.js @@ -1,11 +1,11 @@ // 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 ResponseValidator from '../../src/ResponseValidator'; -import Log from '../../src/Log'; -import JoseUtil from '../../src/JoseUtil'; +import { ResponseValidator } from '../../src/ResponseValidator'; +import { Log } from '../../src/Log'; +import { JoseUtil } from '../../src/JoseUtil'; -import StubMetadataService from './StubMetadataService'; +import { StubMetadataService } from './StubMetadataService'; import chai from 'chai'; chai.should(); @@ -296,7 +296,7 @@ describe("ResponseValidator", function () { done(); }); }); - + it("should fail if the authority on the state is not the same as the settings", function (done) { stubState.authority = "something different"; @@ -306,7 +306,7 @@ describe("ResponseValidator", function () { done(); }); }); - + it("should fail if the client_id on the state is not the same as the settings", function (done) { stubState.client_id = "something different"; @@ -316,9 +316,9 @@ describe("ResponseValidator", function () { done(); }); }); - + it("should assign the authority on the settings if not already assigned", function (done) { - + delete subject._settings.authority; stubState.authority = "something different"; @@ -329,9 +329,9 @@ describe("ResponseValidator", function () { done(); }); }); - + it("should assign the client_id on the settings if not already assigned", function (done) { - + delete subject._settings.client_id; stubState.client_id = "something different"; @@ -705,7 +705,7 @@ describe("ResponseValidator", function () { }); it("should fail if audience doesn't match id_token", function (done) { - + stubState.client_id = "invalid client_id"; stubResponse.id_token = id_token; stubMetadataService.getIssuerResult = Promise.resolve("test"); @@ -715,7 +715,7 @@ describe("ResponseValidator", function () { done(); }); }); - + it("should fail if nonce doesn't match id_token", function (done) { stubState.nonce = "invalid nonce"; diff --git a/test/unit/SigninRequest.spec.js b/test/unit/SigninRequest.spec.js index 5afc3c466..7788de391 100644 --- a/test/unit/SigninRequest.spec.js +++ b/test/unit/SigninRequest.spec.js @@ -1,8 +1,8 @@ // 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 Log from '../../src/Log'; -import SigninRequest from '../../src/SigninRequest'; +import { Log } from '../../src/Log'; +import { SigninRequest } from '../../src/SigninRequest'; import chai from 'chai'; chai.should(); @@ -15,10 +15,10 @@ describe("SigninRequest", function() { beforeEach(function() { settings = {url: "http://sts/signin", - client_id: "client", - redirect_uri: "http://app", - response_type: "id_token", - scope: "openid", + client_id: "client", + redirect_uri: "http://app", + response_type: "id_token", + scope: "openid", authority : "op", data: {data: "test"} }; @@ -38,7 +38,7 @@ describe("SigninRequest", function() { } assert.fail(); }); - + it("should require a client_id param", function() { try { delete settings.client_id; @@ -50,7 +50,7 @@ describe("SigninRequest", function() { } assert.fail(); }); - + it("should require a redirect_uri param", function() { try { delete settings.redirect_uri; @@ -62,7 +62,7 @@ describe("SigninRequest", function() { } assert.fail(); }); - + it("should require a response_type param", function() { try { delete settings.response_type; @@ -74,7 +74,7 @@ describe("SigninRequest", function() { } assert.fail(); }); - + it("should require a scope param", function() { try { delete settings.scope; @@ -86,7 +86,7 @@ describe("SigninRequest", function() { } assert.fail(); }); - + it("should require a authority param", function() { try { delete settings.authority; @@ -106,63 +106,63 @@ describe("SigninRequest", function() { it("should include url", function() { subject.url.indexOf("http://sts/signin").should.equal(0); }); - + it("should include client_id", function() { subject.url.should.contain("client_id=client"); }); - + it("should include redirect_uri", function() { subject.url.should.contain("redirect_uri=" + encodeURIComponent("http://app")); }); - + it("should include response_type", function() { subject.url.should.contain("response_type=id_token"); }); - + it("should include scope", function() { subject.url.should.contain("scope=openid"); }); - + it("should include state", function() { subject.url.should.contain("state=" + subject.state.id); }); - + it("should include prompt", function() { settings.prompt = "foo"; subject = new SigninRequest(settings); subject.url.should.contain("prompt=foo"); }); - + it("should include display", function() { settings.display = "foo"; subject = new SigninRequest(settings); subject.url.should.contain("display=foo"); }); - + it("should include max_age", function() { settings.max_age = "foo"; subject = new SigninRequest(settings); subject.url.should.contain("max_age=foo"); }); - + it("should include ui_locales", function() { settings.ui_locales = "foo"; subject = new SigninRequest(settings); subject.url.should.contain("ui_locales=foo"); }); - + it("should include id_token_hint", function() { settings.id_token_hint = "foo"; subject = new SigninRequest(settings); subject.url.should.contain("id_token_hint=foo"); }); - + it("should include login_hint", function() { settings.login_hint = "foo"; subject = new SigninRequest(settings); subject.url.should.contain("login_hint=foo"); }); - + it("should include acr_values", function() { settings.acr_values = "foo"; subject = new SigninRequest(settings); @@ -216,4 +216,4 @@ describe("SigninRequest", function() { }); }); -}); \ No newline at end of file +}); diff --git a/test/unit/SigninResponse.spec.js b/test/unit/SigninResponse.spec.js index 801a88592..23364537f 100644 --- a/test/unit/SigninResponse.spec.js +++ b/test/unit/SigninResponse.spec.js @@ -1,8 +1,8 @@ // 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 Log from '../../src/Log'; -import SigninResponse from '../../src/SigninResponse'; +import { Log } from '../../src/Log'; +import { SigninResponse } from '../../src/SigninResponse'; import chai from 'chai'; chai.should(); diff --git a/test/unit/SigninState.spec.js b/test/unit/SigninState.spec.js index 37b6fc57f..3df366c5e 100644 --- a/test/unit/SigninState.spec.js +++ b/test/unit/SigninState.spec.js @@ -1,18 +1,18 @@ // 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 Log from '../../src/Log'; -import SigninState from '../../src/SigninState'; +import { Log } from '../../src/Log'; +import { SigninState } from '../../src/SigninState'; import chai from 'chai'; chai.should(); let assert = chai.assert; describe("SigninState", function() { - + beforeEach(function(){ Log.level = Log.NONE; - Log.logger = console; + Log.logger = console; }); describe("constructor", function() { @@ -23,7 +23,7 @@ describe("SigninState", function() { subject.created.should.be.equal(6); subject.data.should.be.equal(7); }); - + it("should accept nonce", function() { var subject = new SigninState({ nonce: 5 }); subject.nonce.should.be.equal(5); diff --git a/test/unit/SignoutRequest.spec.js b/test/unit/SignoutRequest.spec.js index 73720b2c1..f4cf85bb1 100644 --- a/test/unit/SignoutRequest.spec.js +++ b/test/unit/SignoutRequest.spec.js @@ -1,8 +1,8 @@ // 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 Log from '../../src/Log'; -import SignoutRequest from '../../src/SignoutRequest'; +import { Log } from '../../src/Log'; +import { SignoutRequest } from '../../src/SignoutRequest'; import chai from 'chai'; chai.should(); @@ -52,7 +52,7 @@ describe("SignoutRequest", function() { it("should include post_logout_redirect_uri if id_token_hint also provided", function() { subject.url.should.contain("post_logout_redirect_uri=loggedout"); }); - + it("should include post_logout_redirect_uri if no id_token_hint provided", function() { delete settings.id_token_hint; @@ -60,7 +60,7 @@ describe("SignoutRequest", function() { subject.url.should.contain("post_logout_redirect_uri=loggedout"); }); - + it("should include state if post_logout_redirect_uri provided", function() { subject.url.should.contain("state=" + subject.state.id); }); diff --git a/test/unit/SignoutResponse.spec.js b/test/unit/SignoutResponse.spec.js index 8ba1cf6f3..10f0ea4b6 100644 --- a/test/unit/SignoutResponse.spec.js +++ b/test/unit/SignoutResponse.spec.js @@ -1,9 +1,9 @@ // 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 Log from '../../src/Log'; -import SignoutResponse from '../../src/SignoutResponse'; -import ErrorResponse from '../../src/ErrorResponse'; +import { Log } from '../../src/Log'; +import { SignoutResponse } from '../../src/SignoutResponse'; +import { ErrorResponse } from '../../src/ErrorResponse'; import chai from 'chai'; chai.should(); @@ -13,7 +13,7 @@ let expect = chai.expect; describe("SignoutResponse", function() { describe("constructor", function() { - + it("should read error", function () { let subject = new SignoutResponse("error=foo"); subject.error.should.equal("foo"); @@ -28,12 +28,12 @@ describe("SignoutResponse", function() { let subject = new SignoutResponse("error_uri=foo"); subject.error_uri.should.equal("foo"); }); - + it("should read state", function() { let subject = new SignoutResponse("state=foo"); subject.state.should.equal("foo"); }); - + }); }); diff --git a/test/unit/State.spec.js b/test/unit/State.spec.js index dd3296b04..f0dc2f314 100644 --- a/test/unit/State.spec.js +++ b/test/unit/State.spec.js @@ -1,21 +1,21 @@ // 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 Log from '../../src/Log'; -import State from '../../src/State'; +import { Log } from '../../src/Log'; +import { State } from '../../src/State'; -import InMemoryWebStorage from '../../src/InMemoryWebStorage'; -import WebStorageStateStore from '../../src/WebStorageStateStore'; +import { InMemoryWebStorage } from '../../src/InMemoryWebStorage'; +import { WebStorageStateStore } from '../../src/WebStorageStateStore'; import chai from 'chai'; chai.should(); let assert = chai.assert; describe("State", function() { - + beforeEach(function(){ Log.level = Log.NONE; - Log.logger = console; + Log.logger = console; }); describe("constructor", function() { @@ -68,7 +68,7 @@ describe("State", function() { describe("clearStaleState", function() { it("should remove old state entries", function(done) { - + let oldNow = Date.now; Date.now = function() { return 200 * 1000; // ms @@ -95,10 +95,10 @@ describe("State", function() { inMemStore.setItem("junk4", "junk"); inMemStore.setItem(prefix + s5.id, s5.toStorageString()); inMemStore.setItem("junk5", "junk"); - + State.clearStaleState(store, 100).then(() => { Log.debug("clearStaleState done"); - + inMemStore.length.should.equal(8); inMemStore.getItem(prefix + "s4").should.be.ok; inMemStore.getItem(prefix + "s5").should.be.ok; diff --git a/test/unit/StubJsonService.js b/test/unit/StubJsonService.js index 2e06a4345..51e79a1d3 100644 --- a/test/unit/StubJsonService.js +++ b/test/unit/StubJsonService.js @@ -1,12 +1,12 @@ // 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 Log from '../../src/Log'; +import { Log } from '../../src/Log'; -export default class StubJsonService { +export class StubJsonService { getJson(url, token) { Log.debug("StubJsonService.getJson", this.result); - + this.url = url; this.token = token; return this.result; diff --git a/test/unit/StubMetadataService.js b/test/unit/StubMetadataService.js index 2dd7c2baa..d03a3613c 100644 --- a/test/unit/StubMetadataService.js +++ b/test/unit/StubMetadataService.js @@ -1,7 +1,7 @@ // 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. -export default class StubMetadataService{ +export class StubMetadataService{ getMetadata(){ return this.getMetadataResult; } @@ -20,4 +20,4 @@ export default class StubMetadataService{ getSigningKeys(){ return this.getSigningKeysResult; } -} \ No newline at end of file +} diff --git a/test/unit/StubResponseValidator.js b/test/unit/StubResponseValidator.js index 679b90e46..7e8ad9e9a 100644 --- a/test/unit/StubResponseValidator.js +++ b/test/unit/StubResponseValidator.js @@ -1,7 +1,7 @@ // 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. -export default class StubResponseValidator { +export class StubResponseValidator { validateSigninResponse(state, response) { this.signinState = state; @@ -17,4 +17,4 @@ export default class StubResponseValidator { return Promise.resolve(response); } -} \ No newline at end of file +} diff --git a/test/unit/StubSilentRenewService.js b/test/unit/StubSilentRenewService.js index a3682052f..e85b85d3d 100644 --- a/test/unit/StubSilentRenewService.js +++ b/test/unit/StubSilentRenewService.js @@ -1,9 +1,9 @@ // 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. -export default class StubMetadataService{ +export class StubSilentRenewService { start(){ } stop(){ } -} \ No newline at end of file +} diff --git a/test/unit/StubStateStore.js b/test/unit/StubStateStore.js index ec9b331fe..db138a362 100644 --- a/test/unit/StubStateStore.js +++ b/test/unit/StubStateStore.js @@ -1,7 +1,7 @@ // 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. -export default class StubStateStore { +export class StubStateStore { set(key, value) { if (this.error) { return Promise.reject(new Error(this.error)); @@ -16,14 +16,14 @@ export default class StubStateStore { } return Promise.resolve(this.item); } - + remove(key) { if (this.error) { return Promise.reject(new Error(this.error)); } return Promise.resolve(this.item); } - + getAllKeys(){ if (this.item){ return Promise.resolve(["key"]); diff --git a/test/unit/StubTokenRevocationClient.js b/test/unit/StubTokenRevocationClient.js index 9f190206d..e14595837 100644 --- a/test/unit/StubTokenRevocationClient.js +++ b/test/unit/StubTokenRevocationClient.js @@ -1,7 +1,7 @@ // 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. -export default class StubTokenRevocationClient { +export class StubTokenRevocationClient { revoke(accessToken, required) { this.accessToken = accessToken; if (this.error) { @@ -9,4 +9,4 @@ export default class StubTokenRevocationClient { } return Promise.resolve(); } -} \ No newline at end of file +} diff --git a/test/unit/Timer.spec.js b/test/unit/Timer.spec.js index 14a8e905b..e060d352f 100644 --- a/test/unit/Timer.spec.js +++ b/test/unit/Timer.spec.js @@ -1,7 +1,7 @@ // 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 Timer from '../../src/Timer'; +import { Timer } from '../../src/Timer'; import chai from 'chai'; chai.should(); @@ -82,13 +82,13 @@ describe("Timer", function () { subject._nowFunc = () => 109; stubWindowTimer.callback(); cb.wasCalled.should.be.false; - + subject._nowFunc = () => 110; stubWindowTimer.callback(); cb.wasCalled.should.be.true; }); - - + + it("should fire if timer late", function () { var cb = function () { cb.wasCalled = true; @@ -102,7 +102,7 @@ describe("Timer", function () { subject._nowFunc = () => 109; stubWindowTimer.callback(); cb.wasCalled.should.be.false; - + subject._nowFunc = () => 111; stubWindowTimer.callback(); cb.wasCalled.should.be.true; @@ -114,7 +114,7 @@ describe("Timer", function () { subject._nowFunc = () => 110; stubWindowTimer.callback(); - + stubWindowTimer.clearTimeoutWasCalled.should.be.true; }); }); @@ -152,7 +152,7 @@ describe("Timer", function () { cb.wasCalled.should.be.true; }); - + it("should allow multiple callbacks", function () { var count = 0; var cb = function () { @@ -180,7 +180,7 @@ describe("Timer", function () { cb.wasCalled = true; }; cb.wasCalled = false; - + subject._nowFunc = () => 100; subject.addHandler(cb); subject.init(10); @@ -191,7 +191,7 @@ describe("Timer", function () { cb.wasCalled.should.be.false; }); - + it("should remove individual callback", function () { var count = 0; var cb1 = function () { diff --git a/test/unit/UrlUtility.spec.js b/test/unit/UrlUtility.spec.js index d67993e3b..1cb7a2c24 100644 --- a/test/unit/UrlUtility.spec.js +++ b/test/unit/UrlUtility.spec.js @@ -1,7 +1,7 @@ // 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 UrlUtility from '../../src/UrlUtility'; +import { UrlUtility } from '../../src/UrlUtility'; import chai from 'chai'; chai.should(); @@ -53,17 +53,17 @@ describe("UrlUtility", function() { it("should use Global.location when no value is passed", function() { let w = { location: { - href : "a=apple&b=banana&c=carrot" + href : "a=apple&b=banana&c=carrot" } }; let result = UrlUtility.parseUrlFragment(null, "#", w); result.should.deep.equal({ a: "apple", b: "banana", c: "carrot" }); }); - + it("should return empty object for empty string", function() { let result = UrlUtility.parseUrlFragment(""); result.should.deep.equal({}); }); }); -}); \ No newline at end of file +}); diff --git a/test/unit/UserInfoService.spec.js b/test/unit/UserInfoService.spec.js index c44f3d72f..fbdd06a29 100644 --- a/test/unit/UserInfoService.spec.js +++ b/test/unit/UserInfoService.spec.js @@ -1,11 +1,11 @@ // 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 Log from '../../src/Log'; -import UserInfoService from '../../src/UserInfoService'; +import { Log } from '../../src/Log'; +import { UserInfoService } from '../../src/UserInfoService'; -import StubJsonService from './StubJsonService'; -import StubMetadataService from './StubMetadataService'; +import { StubJsonService } from './StubJsonService'; +import { StubMetadataService } from './StubMetadataService'; import chai from 'chai'; chai.should(); @@ -80,20 +80,20 @@ describe("UserInfoService", function() { stubMetadataService.userInfoEndpointResult = Promise.resolve("http://sts/userinfo"); stubJsonService.result = Promise.resolve({ foo: 1, bar: 'test', - aud:'some_aud', iss:'issuer', + aud:'some_aud', iss:'issuer', sub:'123', email:'foo@gmail.com', role:['admin', 'dev'], - nonce:'nonce', at_hash:"athash", + nonce:'nonce', at_hash:"athash", iat:5, nbf:10, exp:20 }); subject.getClaims("token").then(claims => { claims.should.deep.equal({ foo: 1, bar: 'test', - aud:'some_aud', iss:'issuer', + aud:'some_aud', iss:'issuer', sub:'123', email:'foo@gmail.com', role:['admin', 'dev'], - nonce:'nonce', at_hash:"athash", + nonce:'nonce', at_hash:"athash", iat:5, nbf:10, exp:20 }); done(); diff --git a/test/unit/UserManager.spec.js b/test/unit/UserManager.spec.js index c75c8745d..b0efc062c 100644 --- a/test/unit/UserManager.spec.js +++ b/test/unit/UserManager.spec.js @@ -1,17 +1,17 @@ // 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 UserManager from '../../src/UserManager'; -import Log from '../../src/Log'; -import Global from '../../src/Global'; -import UserManagerSettings from '../../src/UserManagerSettings'; -import User from '../../src/User'; - -import StubMetadataService from './StubMetadataService'; -import StubSilentRenewService from './StubSilentRenewService'; -import StubStateStore from './StubStateStore'; -import StubResponseValidator from './StubResponseValidator'; -import StubTokenRevocationClient from './StubTokenRevocationClient'; +import { UserManager } from '../../src/UserManager'; +import { Log } from '../../src/Log'; +import { Global } from '../../src/Global'; +import { UserManagerSettings } from '../../src/UserManagerSettings'; +import { User } from '../../src/User'; + +import { StubMetadataService } from './StubMetadataService'; +import { StubSilentRenewService } from './StubSilentRenewService'; +import { StubStateStore } from './StubStateStore'; +import { StubResponseValidator } from './StubResponseValidator'; +import { StubTokenRevocationClient } from './StubTokenRevocationClient'; import chai from 'chai'; chai.should(); @@ -54,9 +54,9 @@ describe("UserManager", function () { MetadataServiceCtor: () => stubMetadataService }; - subject = new UserManager(settings, + subject = new UserManager(settings, () => stubSilentRenewService, - null, + null, () => stubTokenRevocationClient); }); @@ -81,13 +81,13 @@ describe("UserManager", function () { it("should be able to call getUser without recursion", function (done) { stubUserStore.item = new User({id_token:"id_token"}).toStorageString(); - + subject.events.addUserLoaded(user => { subject.getUser().then(user => { done(); }); }); - + subject.events.load({}); }); diff --git a/test/unit/UserManagerEvents.spec.js b/test/unit/UserManagerEvents.spec.js index fc339e909..72f0e2e0a 100644 --- a/test/unit/UserManagerEvents.spec.js +++ b/test/unit/UserManagerEvents.spec.js @@ -1,7 +1,7 @@ // 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 UserManagerEvents from '../../src/UserManagerEvents'; +import { UserManagerEvents } from '../../src/UserManagerEvents'; import chai from 'chai'; chai.should(); @@ -27,13 +27,13 @@ describe("UserManagerEvents", function () { cb.wasCalled.should.be.true; }); - + it("should allow unregistering callback", function () { var cb = function () { cb.wasCalled = true; }; cb.wasCalled = false; - + subject.addSilentRenewError(cb); subject.removeSilentRenewError(cb); diff --git a/test/unit/UserManagerSettings.spec.js b/test/unit/UserManagerSettings.spec.js index 4ce35ccce..180182a43 100644 --- a/test/unit/UserManagerSettings.spec.js +++ b/test/unit/UserManagerSettings.spec.js @@ -1,8 +1,8 @@ // 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 Log from '../../src/Log'; -import UserManagerSettings from '../../src/UserManagerSettings'; +import { Log } from '../../src/Log'; +import { UserManagerSettings } from '../../src/UserManagerSettings'; import chai from 'chai'; chai.should(); @@ -36,7 +36,7 @@ describe("UserManagerSettings", function () { }); }); - + describe("popupWindowFeatures", function () { it("should return value from initial settings", function () { @@ -45,7 +45,7 @@ describe("UserManagerSettings", function () { }); }); - + describe("popupWindowTarget", function () { it("should return value from initial settings", function () { @@ -157,7 +157,7 @@ describe("UserManagerSettings", function () { subject.popupNavigator.should.equal(temp); }); }); - + describe("iframeNavigator", function() { it("should return value from initial settings", function() { let temp = {}; diff --git a/test/unit/WebStorageStateStore.spec.js b/test/unit/WebStorageStateStore.spec.js index 04be53ef8..9c7afb451 100644 --- a/test/unit/WebStorageStateStore.spec.js +++ b/test/unit/WebStorageStateStore.spec.js @@ -1,9 +1,9 @@ // 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 Log from '../../src/Log'; -import WebStorageStateStore from '../../src/WebStorageStateStore'; -import InMemoryWebStorage from '../../src/InMemoryWebStorage'; +import { Log } from '../../src/Log'; +import { WebStorageStateStore } from '../../src/WebStorageStateStore'; +import { InMemoryWebStorage } from '../../src/InMemoryWebStorage'; import chai from 'chai'; chai.should(); @@ -142,7 +142,7 @@ describe("WebStorageStateStore", function() { done(); }); }); - + it("should return keys without prefix", function(done) { prefix = "foo."; subject = new WebStorageStateStore({ prefix: prefix, store: store }); @@ -155,7 +155,7 @@ describe("WebStorageStateStore", function() { done(); }); }); - + it("should return empty keys when empty", function(done) { subject.getAllKeys().then(keys => { keys.should.deep.equal([]);