UNPKG

graphql-query-compress

Version:
36 lines (32 loc) 44.8 kB
/* ** graphql-query-compress -- Compress a GraphQL Query String ** Copyright (c) 2017-2019 Dr. Ralf S. Engelschall <rse@engelschall.com> ** ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the ** "Software"), to deal in the Software without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Software, and to ** permit persons to whom the Software is furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.GraphQLQueryCompress = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(_dereq_,module,exports){ (function (global){ !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Tokenizr=t()}}(function(){return function(){return function t(n,e,i){function r(s,a){if(!e[s]){if(!n[s]){var u="function"==typeof _dereq_&&_dereq_;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var h=e[s]={exports:{}};n[s][0].call(h.exports,function(t){return r(n[s][1][t]||t)},h,h.exports,t,n,e,i)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s<i.length;s++)r(i[s]);return r}}()({1:[function(t,n,e){"use strict";function i(t){return(i="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})(t)}function r(t,n){return!n||"object"!==i(n)&&"function"!=typeof n?function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t):n}function o(t){var n="function"==typeof Map?new Map:void 0;return(o=function(t){if(null===t||!function(t){return-1!==Function.toString.call(t).indexOf("[native code]")}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==n){if(n.has(t))return n.get(t);n.set(t,e)}function e(){return function(t,n,e){return(function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}()?Reflect.construct:function(t,n,e){var i=[null];i.push.apply(i,n);var r=new(Function.bind.apply(t,i));return e&&s(r,e.prototype),r}).apply(null,arguments)}(t,arguments,a(this).constructor)}return e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),s(e,t)})(t)}function s(t,n){return(s=Object.setPrototypeOf||function(t,n){return t.__proto__=n,t})(t,n)}function a(t){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function u(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}function c(t,n){for(var e=0;e<n.length;e++){var i=n[e];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function h(t,n,e){return n&&c(t.prototype,n),e&&c(t,e),t}var l=function(t,n){var e=t.length,i=n-20;i<0&&(i=0);var r=n+20;r>e&&(r=e);var o=function(t){return t.charCodeAt(0).toString(16).toUpperCase()},s=function(t,n,e){return t.substr(n,e).replace(/\\/g,"\\\\").replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E\x0F]/g,function(t){return"\\x0"+o(t)}).replace(/[\x10-\x1F\x80-\xFF]/g,function(t){return"\\x"+o(t)}).replace(/[\u0100-\u0FFF]/g,function(t){return"\\u0"+o(t)}).replace(/[\u1000-\uFFFF]/g,function(t){return"\\u"+o(t)})};return{prologTrunc:i>0,prologText:s(t,i,n-i),tokenText:s(t,n,1),epilogText:s(t,n+1,r-(n+1)),epilogTrunc:r<e}},f=function(){function t(n,e,i){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;u(this,t),this.type=n,this.value=e,this.text=i,this.pos=r,this.line=o,this.column=s}return h(t,[{key:"toString",value:function(){return"<type: ".concat(this.type,", ")+"value: ".concat(JSON.stringify(this.value),", ")+"text: ".concat(JSON.stringify(this.text),", ")+"pos: ".concat(this.pos,", ")+"line: ".concat(this.line,", ")+"column: ".concat(this.column,">")}},{key:"isA",value:function(t,n){return t===this.type&&(2!==arguments.length||n===this.value)}}]),t}(),p=function(t){function n(t,e,i,o,s){var c;return u(this,n),(c=r(this,a(n).call(this,t))).name="ParsingError",c.message=t,c.pos=e,c.line=i,c.column=o,c.input=s,c}return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(n&&n.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),n&&s(t,n)}(n,o(Error)),h(n,[{key:"toString",value:function(){for(var t=l(this.input,this.pos),n="line ".concat(this.line," (column ").concat(this.column,"): "),e="",i=0;i<n.length+t.prologText.length;i++)e+=" ";return"Parsing Error: "+this.message+"\n"+n+t.prologText+t.tokenText+t.epilogText+"\n"+e+"^"}}]),n}(),_=function(){function t(n){u(this,t),this._tokenizr=n,this._data={},this._repeat=!1,this._reject=!1,this._ignore=!1,this._match=null}return h(t,[{key:"data",value:function(t,n){var e=this._data[t];return 2===arguments.length&&(this._data[t]=n),e}},{key:"info",value:function(){return{line:this._tokenizr._line,column:this._tokenizr._column,pos:this._tokenizr._pos,len:this._match[0].length}}},{key:"push",value:function(){var t;return(t=this._tokenizr).push.apply(t,arguments),this}},{key:"pop",value:function(){var t;return(t=this._tokenizr).pop.apply(t,arguments)}},{key:"state",value:function(){var t,n;return arguments.length>0?((n=this._tokenizr).state.apply(n,arguments),this):(t=this._tokenizr).state.apply(t,arguments)}},{key:"tag",value:function(){var t;return(t=this._tokenizr).tag.apply(t,arguments),this}},{key:"tagged",value:function(){var t;return(t=this._tokenizr).tagged.apply(t,arguments)}},{key:"untag",value:function(){var t;return(t=this._tokenizr).untag.apply(t,arguments),this}},{key:"repeat",value:function(){return this._tokenizr._log(" REPEAT"),this._repeat=!0,this}},{key:"reject",value:function(){return this._tokenizr._log(" REJECT"),this._reject=!0,this}},{key:"ignore",value:function(){return this._tokenizr._log(" IGNORE"),this._ignore=!0,this}},{key:"accept",value:function(t,n){return arguments.length<2&&(n=this._match[0]),this._tokenizr._log(" ACCEPT: type: ".concat(t,", value: ")+"".concat(JSON.stringify(n)," (").concat(i(n),'), text: "').concat(this._match[0],'"')),this._tokenizr._pending.push(new f(t,n,this._match[0],this._tokenizr._pos,this._tokenizr._line,this._tokenizr._column)),this}},{key:"stop",value:function(){return this._tokenizr._stopped=!0,this}}]),t}(),g=function(){function t(){u(this,t),this._before=null,this._after=null,this._finish=null,this._rules=[],this._debug=!1,this.reset()}return h(t,[{key:"reset",value:function(){return this._input="",this._len=0,this._eof=!1,this._pos=0,this._line=1,this._column=1,this._state=["default"],this._tag={},this._transaction=[],this._pending=[],this._stopped=!1,this._ctx=new _(this),this}},{key:"error",value:function(t){return new p(t,this._pos,this._line,this._column,this._input)}},{key:"debug",value:function(t){return this._debug=t,this}},{key:"_log",value:function(t){this._debug&&console.log("tokenizr: ".concat(t))}},{key:"input",value:function(t){if("string"!=typeof t)throw new Error('parameter "input" not a String');return this.reset(),this._input=t,this._len=t.length,this}},{key:"push",value:function(t){if(1!==arguments.length)throw new Error("invalid number of arguments");if("string"!=typeof t)throw new Error('parameter "state" not a String');return this._log(" STATE (PUSH): "+"old: <".concat(this._state[this._state.length-1],">, ")+"new: <".concat(t,">")),this._state.push(t),this}},{key:"pop",value:function(){if(0!==arguments.length)throw new Error("invalid number of arguments");if(this._state.length<2)throw new Error("no more custom states to pop");return this._log(" STATE (POP): "+"old: <".concat(this._state[this._state.length-1],">, ")+"new: <".concat(this._state[this._state.length-2],">")),this._state.pop()}},{key:"state",value:function(t){if(1===arguments.length){if("string"!=typeof t)throw new Error('parameter "state" not a String');return this._log(" STATE (SET): "+"old: <".concat(this._state[this._state.length-1],">, ")+"new: <".concat(t,">")),this._state[this._state.length-1]=t,this}if(0===arguments.length)return this._state[this._state.length-1];throw new Error("invalid number of arguments")}},{key:"tag",value:function(t){if(1!==arguments.length)throw new Error("invalid number of arguments");if("string"!=typeof t)throw new Error('parameter "tag" not a String');return this._log(" TAG (ADD): ".concat(t)),this._tag[t]=!0,this}},{key:"tagged",value:function(t){if(1!==arguments.length)throw new Error("invalid number of arguments");if("string"!=typeof t)throw new Error('parameter "tag" not a String');return!0===this._tag[t]}},{key:"untag",value:function(t){if(1!==arguments.length)throw new Error("invalid number of arguments");if("string"!=typeof t)throw new Error('parameter "tag" not a String');return this._log(" TAG (DEL): ".concat(t)),delete this._tag[t],this}},{key:"before",value:function(t){return this._before=t,this}},{key:"after",value:function(t){return this._after=t,this}},{key:"finish",value:function(t){return this._finish=t,this}},{key:"rule",value:function(t,n,e){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"unknown";if(2===arguments.length&&"function"==typeof n){var o=[t,n];n=o[0],e=o[1],t="*"}else if(3===arguments.length&&"function"==typeof n){var s=[t,n,e];n=s[0],e=s[1],r=s[2],t="*"}if("string"!=typeof t)throw new Error('parameter "state" not a String');if(!("object"===i(n)&&n instanceof RegExp))throw new Error('parameter "pattern" not a RegExp');if("function"!=typeof e)throw new Error('parameter "action" not a Function');if("string"!=typeof r)throw new Error('parameter "name" not a String');t=t.split(/\s*,\s*/g).map(function(t){var n=t.split(/\s+/g),e=n.filter(function(t){return null===t.match(/^#/)}),i=n.filter(function(t){return null!==t.match(/^#/)}).map(function(t){return t.replace(/^#/,"")});if(1!==e.length)throw new Error("exactly one state required");return{state:e[0],tags:i}});var a="g";try{"boolean"==typeof new RegExp("","y").sticky&&(a="y")}catch(t){}return"boolean"==typeof n.multiline&&n.multiline&&(a+="m"),"boolean"==typeof n.dotAll&&n.dotAll&&(a+="s"),"boolean"==typeof n.ignoreCase&&n.ignoreCase&&(a+="i"),"boolean"==typeof n.unicode&&n.unicode&&(a+="u"),n=new RegExp(n.source,a),this._log("rule: configure rule (state: ".concat(t,", pattern: ").concat(n.source,")")),this._rules.push({state:t,pattern:n,action:e,name:r}),this}},{key:"_progress",value:function(t,n){for(var e=this._line,i=this._column,r=this._input,o=t;o<n;o++){var s=r.charAt(o);"\r"===s?this._column=1:"\n"===s?(this._line++,this._column=1):"\t"===s?this._column+=8-this._column%8:this._column++}this._log(" PROGRESS: characters: ".concat(n-t,", ")+"from: <line ".concat(e,", column ").concat(i,">, ")+"to: <line ".concat(this._line,", column ").concat(this._column,">"))}},{key:"_tokenize",value:function(){var t=this,n=function(){t._eof||(null!==t._finish&&t._finish.call(t._ctx,t._ctx),t._eof=!0,t._pending.push(new f("EOF","","",t._pos,t._line,t._column)))};if(!(this._stopped||this._pos>=this._len)){for(var e=!0;e;){if(e=!1,this._debug){var i=l(this._input,this._pos),r=Object.keys(this._tag).map(function(t){return"#".concat(t)}).join(" ");this._log("INPUT: state: <".concat(this._state[this._state.length-1],">, tags: <").concat(r,">, text: ")+(i.prologTrunc?"...":'"')+"".concat(i.prologText,"<").concat(i.tokenText,">").concat(i.epilogText)+(i.epilogTrunc?"...":'"')+", at: <line ".concat(this._line,", column ").concat(this._column,">"))}for(var o=0;o<this._rules.length;o++){if(this._debug){var s=this._rules[o].state.map(function(t){var n=t.state;return t.tags.length>0&&(n+=" "+t.tags.map(function(t){return"#".concat(t)}).join(" ")),n}).join(", ");this._log(" RULE: state(s): <".concat(s,">, ")+"pattern: ".concat(this._rules[o].pattern.source))}var a=!1,u=this._rules[o].state.map(function(t){return t.state}),c=u.indexOf("*");if(c<0&&(c=u.indexOf(this._state[this._state.length-1])),c>=0){a=!0;var h=this._rules[o].state[c].tags;(h=h.filter(function(n){return!t._tag[n]})).length>0&&(a=!1)}if(a){this._rules[o].pattern.lastIndex=this._pos;var p=this._rules[o].pattern.exec(this._input);if(this._rules[o].pattern.lastIndex=this._pos,null!==(p=this._rules[o].pattern.exec(this._input))&&p.index===this._pos){if(this._debug&&this._log(" MATCHED: "+JSON.stringify(p)),this._ctx._match=p,this._ctx._repeat=!1,this._ctx._reject=!1,this._ctx._ignore=!1,null!==this._before&&this._before.call(this._ctx,this._ctx,p,this._rules[o]),this._rules[o].action.call(this._ctx,this._ctx,p),null!==this._after&&this._after.call(this._ctx,this._ctx,p,this._rules[o]),this._ctx._reject)continue;if(this._ctx._repeat){e=!0;break}if(this._ctx._ignore){if(this._progress(this._pos,this._rules[o].pattern.lastIndex),this._pos=this._rules[o].pattern.lastIndex,this._pos>=this._len)return void n();e=!0;break}if(this._pending.length>0)return this._progress(this._pos,this._rules[o].pattern.lastIndex),this._pos=this._rules[o].pattern.lastIndex,void(this._pos>=this._len&&n());throw new Error('action of pattern "'+this._rules[o].pattern.source+'" neither rejected nor accepted any token(s)')}}}}throw this.error("token not recognized")}n()}},{key:"token",value:function(){if(0===this._pending.length&&this._tokenize(),this._pending.length>0){var t=this._pending.shift();return this._transaction.length>0&&this._transaction[0].push(t),this._log("TOKEN: ".concat(t.toString())),t}return null}},{key:"tokens",value:function(){for(var t,n=[];null!==(t=this.token());)n.push(t);return n}},{key:"peek",value:function(t){void 0===t&&(t=0);for(var n=0;n<this._pending.length+t;n++)this._tokenize();if(t>=this._pending.length)throw new Error("not enough tokens available for peek operation");return this._log("PEEK: ".concat(this._pending[t].toString())),this._pending[t]}},{key:"skip",value:function(t){void 0===t&&(t=1);for(var n=0;n<this._pending.length+t;n++)this._tokenize();if(t>this._pending.length)throw new Error("not enough tokens available for skip operation");for(;t-- >0;)this.token();return this}},{key:"consume",value:function(t,n){for(var e=this,r=0;r<this._pending.length+1;r++)this._tokenize();if(0===this._pending.length)throw new Error("not enough tokens available for consume operation");var o=this.token();this._log("CONSUME: ".concat(o.toString()));var s=function(){throw new p("expected: <type: ".concat(t,", value: ").concat(JSON.stringify(n)," (").concat(i(n),")>, ")+"found: <type: ".concat(o.type,", value: ").concat(JSON.stringify(o.value)," (").concat(i(o.value),")>"),o.pos,o.line,o.column,e._input)};return 2!==arguments.length||o.isA(t,n)?o.isA(t)||s():s(JSON.stringify(n),i(n)),o}},{key:"begin",value:function(){return this._log("BEGIN: level ".concat(this._transaction.length)),this._transaction.unshift([]),this}},{key:"depth",value:function(){if(0===this._transaction.length)throw new Error("cannot determine depth -- no active transaction");return this._transaction[0].length}},{key:"commit",value:function(){if(0===this._transaction.length)throw new Error("cannot commit transaction -- no active transaction");return this._transaction.shift(),this._log("COMMIT: level ".concat(this._transaction.length)),this}},{key:"rollback",value:function(){if(0===this._transaction.length)throw new Error("cannot rollback transaction -- no active transaction");return this._pending=this._transaction[0].concat(this._pending),this._transaction.shift(),this._log("ROLLBACK: level ".concat(this._transaction.length)),this}},{key:"alternatives",value:function(){for(var t=null,n=[],e=arguments.length,i=new Array(e),r=0;r<e;r++)i[r]=arguments[r];for(var o=0;o<i.length;o++)try{this.begin(),t=i[o].call(this),this.commit();break}catch(t){this._log("EXCEPTION: ".concat(t.toString())),n.push({ex:t,depth:this.depth()}),this.rollback();continue}if(null===t&&n.length>0)throw(n=n.sort(function(t,n){return t.depth-n.depth}))[0].ex;return t}}]),t}();g.Token=f,g.ParsingError=p,g.ActionContext=_,n.exports=g},{}]},{},[1])(1)}); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],2:[function(_dereq_,module,exports){ "use strict";var _tokenizr=_interopRequireDefault(_dereq_("tokenizr"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function compactGraphQLQuery(e){var t=new _tokenizr.default;t.rule(/#[^\r\n]*(?=\r?\n)/,function(e,t){e.accept("comment")}),t.rule(/"(?:\\"|[^"])*"/,function(e,t){e.accept("string")}),t.rule(/$[a-zA-Z_][a-zA-Z0-9_]*/,function(e,t){e.accept("var")}),t.rule(/[a-zA-Z_][a-zA-Z0-9_]*/,function(e,t){e.accept("id")}),t.rule(/[+-]?[0-9]*\.?[0-9]+(?:[eE][+-]?[0-9]+)?/,function(e,t){e.accept("number")}),t.rule(/[ \t\r\n]+/,function(e,t){e.accept("ws"," ")}),t.rule(/[{}]/,function(e,t){e.accept("brace")}),t.rule(/[[\]]/,function(e,t){e.accept("bracket")}),t.rule(/[()]/,function(e,t){e.accept("parenthesis")}),t.rule(/,/,function(e,t){e.accept("comma")}),t.rule(/!/,function(e,t){e.accept("not")}),t.rule(/\.\.\./,function(e,t){e.accept("ellipsis")}),t.rule(/@/,function(e,t){e.accept("at")}),t.rule(/:/,function(e,t){e.accept("colon")}),t.rule(/./,function(e,t){e.accept("any")}),t.input(e),t.debug(!1);for(var c=t.tokens(),n="",r=/^(?:brace|bracket|parenthesis|comma|colon)$/,u=0;u<c.length;u++)("comment"===c[u].type||"ws"===c[u].type&&(u<c.length-1&&c[u+1].type.match(r)||u>0&&c[u-1].type.match(r)))&&(c.splice(u,1),u--);return c.forEach(function(e){n+=e.value}),n}module.exports=compactGraphQLQuery; },{"tokenizr":1}]},{},[2])(2) }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvdG9rZW5penIvbGliL3Rva2VuaXpyLmpzIiwic3JjL2dyYXBocWwtcXVlcnktY29tcHJlc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FDQUE7Ozs7QUNBQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIiFmdW5jdGlvbih0KXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz10KCk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtdLHQpO2Vsc2V7KFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcykuVG9rZW5penI9dCgpfX0oZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gdChuLGUsaSl7ZnVuY3Rpb24gcihzLGEpe2lmKCFlW3NdKXtpZighbltzXSl7dmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighYSYmdSlyZXR1cm4gdShzLCEwKTtpZihvKXJldHVybiBvKHMsITApO3ZhciBjPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrcytcIidcIik7dGhyb3cgYy5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGN9dmFyIGg9ZVtzXT17ZXhwb3J0czp7fX07bltzXVswXS5jYWxsKGguZXhwb3J0cyxmdW5jdGlvbih0KXtyZXR1cm4gcihuW3NdWzFdW3RdfHx0KX0saCxoLmV4cG9ydHMsdCxuLGUsaSl9cmV0dXJuIGVbc10uZXhwb3J0c31mb3IodmFyIG89XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxzPTA7czxpLmxlbmd0aDtzKyspcihpW3NdKTtyZXR1cm4gcn19KCkoezE6W2Z1bmN0aW9uKHQsbixlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpKHQpe3JldHVybihpPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiByKHQsbil7cmV0dXJuIW58fFwib2JqZWN0XCIhPT1pKG4pJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBuP2Z1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiB0fSh0KTpufWZ1bmN0aW9uIG8odCl7dmFyIG49XCJmdW5jdGlvblwiPT10eXBlb2YgTWFwP25ldyBNYXA6dm9pZCAwO3JldHVybihvPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10fHwhZnVuY3Rpb24odCl7cmV0dXJuLTEhPT1GdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpfSh0KSlyZXR1cm4gdDtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtpZih2b2lkIDAhPT1uKXtpZihuLmhhcyh0KSlyZXR1cm4gbi5nZXQodCk7bi5zZXQodCxlKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpP1JlZmxlY3QuY29uc3RydWN0OmZ1bmN0aW9uKHQsbixlKXt2YXIgaT1bbnVsbF07aS5wdXNoLmFwcGx5KGksbik7dmFyIHI9bmV3KEZ1bmN0aW9uLmJpbmQuYXBwbHkodCxpKSk7cmV0dXJuIGUmJnMocixlLnByb3RvdHlwZSkscn0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX0odCxhcmd1bWVudHMsYSh0aGlzKS5jb25zdHJ1Y3Rvcil9cmV0dXJuIGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHMoZSx0KX0pKHQpfWZ1bmN0aW9uIHModCxuKXtyZXR1cm4ocz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQuX19wcm90b19fPW4sdH0pKHQsbil9ZnVuY3Rpb24gYSh0KXtyZXR1cm4oYT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gdSh0LG4pe2lmKCEodCBpbnN0YW5jZW9mIG4pKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gYyh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7ZSsrKXt2YXIgaT1uW2VdO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExLGkuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gaCh0LG4sZSl7cmV0dXJuIG4mJmModC5wcm90b3R5cGUsbiksZSYmYyh0LGUpLHR9dmFyIGw9ZnVuY3Rpb24odCxuKXt2YXIgZT10Lmxlbmd0aCxpPW4tMjA7aTwwJiYoaT0wKTt2YXIgcj1uKzIwO3I+ZSYmKHI9ZSk7dmFyIG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0scz1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQuc3Vic3RyKG4sZSkucmVwbGFjZSgvXFxcXC9nLFwiXFxcXFxcXFxcIikucmVwbGFjZSgvXFx4MDgvZyxcIlxcXFxiXCIpLnJlcGxhY2UoL1xcdC9nLFwiXFxcXHRcIikucmVwbGFjZSgvXFxuL2csXCJcXFxcblwiKS5yZXBsYWNlKC9cXGYvZyxcIlxcXFxmXCIpLnJlcGxhY2UoL1xcci9nLFwiXFxcXHJcIikucmVwbGFjZSgvW1xceDAwLVxceDA3XFx4MEJcXHgwRVxceDBGXS9nLGZ1bmN0aW9uKHQpe3JldHVyblwiXFxcXHgwXCIrbyh0KX0pLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDgwLVxceEZGXS9nLGZ1bmN0aW9uKHQpe3JldHVyblwiXFxcXHhcIitvKHQpfSkucmVwbGFjZSgvW1xcdTAxMDAtXFx1MEZGRl0vZyxmdW5jdGlvbih0KXtyZXR1cm5cIlxcXFx1MFwiK28odCl9KS5yZXBsYWNlKC9bXFx1MTAwMC1cXHVGRkZGXS9nLGZ1bmN0aW9uKHQpe3JldHVyblwiXFxcXHVcIitvKHQpfSl9O3JldHVybntwcm9sb2dUcnVuYzppPjAscHJvbG9nVGV4dDpzKHQsaSxuLWkpLHRva2VuVGV4dDpzKHQsbiwxKSxlcGlsb2dUZXh0OnModCxuKzEsci0obisxKSksZXBpbG9nVHJ1bmM6cjxlfX0sZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobixlLGkpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLG89YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOjAscz1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06MDt1KHRoaXMsdCksdGhpcy50eXBlPW4sdGhpcy52YWx1ZT1lLHRoaXMudGV4dD1pLHRoaXMucG9zPXIsdGhpcy5saW5lPW8sdGhpcy5jb2x1bW49c31yZXR1cm4gaCh0LFt7a2V5OlwidG9TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwiPHR5cGU6IFwiLmNvbmNhdCh0aGlzLnR5cGUsXCIsIFwiKStcInZhbHVlOiBcIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZSksXCIsIFwiKStcInRleHQ6IFwiLmNvbmNhdChKU09OLnN0cmluZ2lmeSh0aGlzLnRleHQpLFwiLCBcIikrXCJwb3M6IFwiLmNvbmNhdCh0aGlzLnBvcyxcIiwgXCIpK1wibGluZTogXCIuY29uY2F0KHRoaXMubGluZSxcIiwgXCIpK1wiY29sdW1uOiBcIi5jb25jYXQodGhpcy5jb2x1bW4sXCI+XCIpfX0se2tleTpcImlzQVwiLHZhbHVlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9PT10aGlzLnR5cGUmJigyIT09YXJndW1lbnRzLmxlbmd0aHx8bj09PXRoaXMudmFsdWUpfX1dKSx0fSgpLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0LGUsaSxvLHMpe3ZhciBjO3JldHVybiB1KHRoaXMsbiksKGM9cih0aGlzLGEobikuY2FsbCh0aGlzLHQpKSkubmFtZT1cIlBhcnNpbmdFcnJvclwiLGMubWVzc2FnZT10LGMucG9zPWUsYy5saW5lPWksYy5jb2x1bW49byxjLmlucHV0PXMsY31yZXR1cm4gZnVuY3Rpb24odCxuKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBuJiZudWxsIT09bil0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuJiZuLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLG4mJnModCxuKX0obixvKEVycm9yKSksaChuLFt7a2V5OlwidG9TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1sKHRoaXMuaW5wdXQsdGhpcy5wb3MpLG49XCJsaW5lIFwiLmNvbmNhdCh0aGlzLmxpbmUsXCIgKGNvbHVtbiBcIikuY29uY2F0KHRoaXMuY29sdW1uLFwiKTogXCIpLGU9XCJcIixpPTA7aTxuLmxlbmd0aCt0LnByb2xvZ1RleHQubGVuZ3RoO2krKyllKz1cIiBcIjtyZXR1cm5cIlBhcnNpbmcgRXJyb3I6IFwiK3RoaXMubWVzc2FnZStcIlxcblwiK24rdC5wcm9sb2dUZXh0K3QudG9rZW5UZXh0K3QuZXBpbG9nVGV4dCtcIlxcblwiK2UrXCJeXCJ9fV0pLG59KCksXz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobil7dSh0aGlzLHQpLHRoaXMuX3Rva2VuaXpyPW4sdGhpcy5fZGF0YT17fSx0aGlzLl9yZXBlYXQ9ITEsdGhpcy5fcmVqZWN0PSExLHRoaXMuX2lnbm9yZT0hMSx0aGlzLl9tYXRjaD1udWxsfXJldHVybiBoKHQsW3trZXk6XCJkYXRhXCIsdmFsdWU6ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9kYXRhW3RdO3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX2RhdGFbdF09biksZX19LHtrZXk6XCJpbmZvXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57bGluZTp0aGlzLl90b2tlbml6ci5fbGluZSxjb2x1bW46dGhpcy5fdG9rZW5penIuX2NvbHVtbixwb3M6dGhpcy5fdG9rZW5penIuX3BvcyxsZW46dGhpcy5fbWF0Y2hbMF0ubGVuZ3RofX19LHtrZXk6XCJwdXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4odD10aGlzLl90b2tlbml6cikucHVzaC5hcHBseSh0LGFyZ3VtZW50cyksdGhpc319LHtrZXk6XCJwb3BcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybih0PXRoaXMuX3Rva2VuaXpyKS5wb3AuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleTpcInN0YXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxuO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/KChuPXRoaXMuX3Rva2VuaXpyKS5zdGF0ZS5hcHBseShuLGFyZ3VtZW50cyksdGhpcyk6KHQ9dGhpcy5fdG9rZW5penIpLnN0YXRlLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6XCJ0YWdcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybih0PXRoaXMuX3Rva2VuaXpyKS50YWcuYXBwbHkodCxhcmd1bWVudHMpLHRoaXN9fSx7a2V5OlwidGFnZ2VkXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4odD10aGlzLl90b2tlbml6cikudGFnZ2VkLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6XCJ1bnRhZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuKHQ9dGhpcy5fdG9rZW5penIpLnVudGFnLmFwcGx5KHQsYXJndW1lbnRzKSx0aGlzfX0se2tleTpcInJlcGVhdFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rva2VuaXpyLl9sb2coXCIgICAgUkVQRUFUXCIpLHRoaXMuX3JlcGVhdD0hMCx0aGlzfX0se2tleTpcInJlamVjdFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rva2VuaXpyLl9sb2coXCIgICAgUkVKRUNUXCIpLHRoaXMuX3JlamVjdD0hMCx0aGlzfX0se2tleTpcImlnbm9yZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rva2VuaXpyLl9sb2coXCIgICAgSUdOT1JFXCIpLHRoaXMuX2lnbm9yZT0hMCx0aGlzfX0se2tleTpcImFjY2VwdFwiLHZhbHVlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKG49dGhpcy5fbWF0Y2hbMF0pLHRoaXMuX3Rva2VuaXpyLl9sb2coXCIgICAgQUNDRVBUOiB0eXBlOiBcIi5jb25jYXQodCxcIiwgdmFsdWU6IFwiKStcIlwiLmNvbmNhdChKU09OLnN0cmluZ2lmeShuKSxcIiAoXCIpLmNvbmNhdChpKG4pLCcpLCB0ZXh0OiBcIicpLmNvbmNhdCh0aGlzLl9tYXRjaFswXSwnXCInKSksdGhpcy5fdG9rZW5penIuX3BlbmRpbmcucHVzaChuZXcgZih0LG4sdGhpcy5fbWF0Y2hbMF0sdGhpcy5fdG9rZW5penIuX3Bvcyx0aGlzLl90b2tlbml6ci5fbGluZSx0aGlzLl90b2tlbml6ci5fY29sdW1uKSksdGhpc319LHtrZXk6XCJzdG9wXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9rZW5penIuX3N0b3BwZWQ9ITAsdGhpc319XSksdH0oKSxnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3UodGhpcyx0KSx0aGlzLl9iZWZvcmU9bnVsbCx0aGlzLl9hZnRlcj1udWxsLHRoaXMuX2ZpbmlzaD1udWxsLHRoaXMuX3J1bGVzPVtdLHRoaXMuX2RlYnVnPSExLHRoaXMucmVzZXQoKX1yZXR1cm4gaCh0LFt7a2V5OlwicmVzZXRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnB1dD1cIlwiLHRoaXMuX2xlbj0wLHRoaXMuX2VvZj0hMSx0aGlzLl9wb3M9MCx0aGlzLl9saW5lPTEsdGhpcy5fY29sdW1uPTEsdGhpcy5fc3RhdGU9W1wiZGVmYXVsdFwiXSx0aGlzLl90YWc9e30sdGhpcy5fdHJhbnNhY3Rpb249W10sdGhpcy5fcGVuZGluZz1bXSx0aGlzLl9zdG9wcGVkPSExLHRoaXMuX2N0eD1uZXcgXyh0aGlzKSx0aGlzfX0se2tleTpcImVycm9yXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwKHQsdGhpcy5fcG9zLHRoaXMuX2xpbmUsdGhpcy5fY29sdW1uLHRoaXMuX2lucHV0KX19LHtrZXk6XCJkZWJ1Z1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kZWJ1Zz10LHRoaXN9fSx7a2V5OlwiX2xvZ1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuX2RlYnVnJiZjb25zb2xlLmxvZyhcInRva2VuaXpyOiBcIi5jb25jYXQodCkpfX0se2tleTpcImlucHV0XCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCdwYXJhbWV0ZXIgXCJpbnB1dFwiIG5vdCBhIFN0cmluZycpO3JldHVybiB0aGlzLnJlc2V0KCksdGhpcy5faW5wdXQ9dCx0aGlzLl9sZW49dC5sZW5ndGgsdGhpc319LHtrZXk6XCJwdXNoXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoMSE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzXCIpO2lmKFwic3RyaW5nXCIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigncGFyYW1ldGVyIFwic3RhdGVcIiBub3QgYSBTdHJpbmcnKTtyZXR1cm4gdGhpcy5fbG9nKFwiICAgIFNUQVRFIChQVVNIKTogXCIrXCJvbGQ6IDxcIi5jb25jYXQodGhpcy5fc3RhdGVbdGhpcy5fc3RhdGUubGVuZ3RoLTFdLFwiPiwgXCIpK1wibmV3OiA8XCIuY29uY2F0KHQsXCI+XCIpKSx0aGlzLl9zdGF0ZS5wdXNoKHQpLHRoaXN9fSx7a2V5OlwicG9wXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZigwIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHNcIik7aWYodGhpcy5fc3RhdGUubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKFwibm8gbW9yZSBjdXN0b20gc3RhdGVzIHRvIHBvcFwiKTtyZXR1cm4gdGhpcy5fbG9nKFwiICAgIFNUQVRFIChQT1ApOiBcIitcIm9sZDogPFwiLmNvbmNhdCh0aGlzLl9zdGF0ZVt0aGlzLl9zdGF0ZS5sZW5ndGgtMV0sXCI+LCBcIikrXCJuZXc6IDxcIi5jb25jYXQodGhpcy5fc3RhdGVbdGhpcy5fc3RhdGUubGVuZ3RoLTJdLFwiPlwiKSksdGhpcy5fc3RhdGUucG9wKCl9fSx7a2V5Olwic3RhdGVcIix2YWx1ZTpmdW5jdGlvbih0KXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCdwYXJhbWV0ZXIgXCJzdGF0ZVwiIG5vdCBhIFN0cmluZycpO3JldHVybiB0aGlzLl9sb2coXCIgICAgU1RBVEUgKFNFVCk6IFwiK1wib2xkOiA8XCIuY29uY2F0KHRoaXMuX3N0YXRlW3RoaXMuX3N0YXRlLmxlbmd0aC0xXSxcIj4sIFwiKStcIm5ldzogPFwiLmNvbmNhdCh0LFwiPlwiKSksdGhpcy5fc3RhdGVbdGhpcy5fc3RhdGUubGVuZ3RoLTFdPXQsdGhpc31pZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fc3RhdGVbdGhpcy5fc3RhdGUubGVuZ3RoLTFdO3Rocm93IG5ldyBFcnJvcihcImludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50c1wiKX19LHtrZXk6XCJ0YWdcIix2YWx1ZTpmdW5jdGlvbih0KXtpZigxIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHNcIik7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCdwYXJhbWV0ZXIgXCJ0YWdcIiBub3QgYSBTdHJpbmcnKTtyZXR1cm4gdGhpcy5fbG9nKFwiICAgIFRBRyAoQUREKTogXCIuY29uY2F0KHQpKSx0aGlzLl90YWdbdF09ITAsdGhpc319LHtrZXk6XCJ0YWdnZWRcIix2YWx1ZTpmdW5jdGlvbih0KXtpZigxIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHNcIik7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCdwYXJhbWV0ZXIgXCJ0YWdcIiBub3QgYSBTdHJpbmcnKTtyZXR1cm4hMD09PXRoaXMuX3RhZ1t0XX19LHtrZXk6XCJ1bnRhZ1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcImludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50c1wiKTtpZihcInN0cmluZ1wiIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoJ3BhcmFtZXRlciBcInRhZ1wiIG5vdCBhIFN0cmluZycpO3JldHVybiB0aGlzLl9sb2coXCIgICAgVEFHIChERUwpOiBcIi5jb25jYXQodCkpLGRlbGV0ZSB0aGlzLl90YWdbdF0sdGhpc319LHtrZXk6XCJiZWZvcmVcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYmVmb3JlPXQsdGhpc319LHtrZXk6XCJhZnRlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZnRlcj10LHRoaXN9fSx7a2V5OlwiZmluaXNoXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ZpbmlzaD10LHRoaXN9fSx7a2V5OlwicnVsZVwiLHZhbHVlOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106XCJ1bmtub3duXCI7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgmJlwiZnVuY3Rpb25cIj09dHlwZW9mIG4pe3ZhciBvPVt0LG5dO249b1swXSxlPW9bMV0sdD1cIipcIn1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBuKXt2YXIgcz1bdCxuLGVdO249c1swXSxlPXNbMV0scj1zWzJdLHQ9XCIqXCJ9aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCdwYXJhbWV0ZXIgXCJzdGF0ZVwiIG5vdCBhIFN0cmluZycpO2lmKCEoXCJvYmplY3RcIj09PWkobikmJm4gaW5zdGFuY2VvZiBSZWdFeHApKXRocm93IG5ldyBFcnJvcigncGFyYW1ldGVyIFwicGF0dGVyblwiIG5vdCBhIFJlZ0V4cCcpO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCdwYXJhbWV0ZXIgXCJhY3Rpb25cIiBub3QgYSBGdW5jdGlvbicpO2lmKFwic3RyaW5nXCIhPXR5cGVvZiByKXRocm93IG5ldyBFcnJvcigncGFyYW1ldGVyIFwibmFtZVwiIG5vdCBhIFN0cmluZycpO3Q9dC5zcGxpdCgvXFxzKixcXHMqL2cpLm1hcChmdW5jdGlvbih0KXt2YXIgbj10LnNwbGl0KC9cXHMrL2cpLGU9bi5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10Lm1hdGNoKC9eIy8pfSksaT1uLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQubWF0Y2goL14jLyl9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvXiMvLFwiXCIpfSk7aWYoMSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcImV4YWN0bHkgb25lIHN0YXRlIHJlcXVpcmVkXCIpO3JldHVybntzdGF0ZTplWzBdLHRhZ3M6aX19KTt2YXIgYT1cImdcIjt0cnl7XCJib29sZWFuXCI9PXR5cGVvZiBuZXcgUmVnRXhwKFwiXCIsXCJ5XCIpLnN0aWNreSYmKGE9XCJ5XCIpfWNhdGNoKHQpe31yZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIG4ubXVsdGlsaW5lJiZuLm11bHRpbGluZSYmKGErPVwibVwiKSxcImJvb2xlYW5cIj09dHlwZW9mIG4uZG90QWxsJiZuLmRvdEFsbCYmKGErPVwic1wiKSxcImJvb2xlYW5cIj09dHlwZW9mIG4uaWdub3JlQ2FzZSYmbi5pZ25vcmVDYXNlJiYoYSs9XCJpXCIpLFwiYm9vbGVhblwiPT10eXBlb2Ygbi51bmljb2RlJiZuLnVuaWNvZGUmJihhKz1cInVcIiksbj1uZXcgUmVnRXhwKG4uc291cmNlLGEpLHRoaXMuX2xvZyhcInJ1bGU6IGNvbmZpZ3VyZSBydWxlIChzdGF0ZTogXCIuY29uY2F0KHQsXCIsIHBhdHRlcm46IFwiKS5jb25jYXQobi5zb3VyY2UsXCIpXCIpKSx0aGlzLl9ydWxlcy5wdXNoKHtzdGF0ZTp0LHBhdHRlcm46bixhY3Rpb246ZSxuYW1lOnJ9KSx0aGlzfX0se2tleTpcIl9wcm9ncmVzc1wiLHZhbHVlOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXRoaXMuX2xpbmUsaT10aGlzLl9jb2x1bW4scj10aGlzLl9pbnB1dCxvPXQ7bzxuO28rKyl7dmFyIHM9ci5jaGFyQXQobyk7XCJcXHJcIj09PXM/dGhpcy5fY29sdW1uPTE6XCJcXG5cIj09PXM/KHRoaXMuX2xpbmUrKyx0aGlzLl9jb2x1bW49MSk6XCJcXHRcIj09PXM/dGhpcy5fY29sdW1uKz04LXRoaXMuX2NvbHVtbiU4OnRoaXMuX2NvbHVtbisrfXRoaXMuX2xvZyhcIiAgICBQUk9HUkVTUzogY2hhcmFjdGVyczogXCIuY29uY2F0KG4tdCxcIiwgXCIpK1wiZnJvbTogPGxpbmUgXCIuY29uY2F0KGUsXCIsIGNvbHVtbiBcIikuY29uY2F0KGksXCI+LCBcIikrXCJ0bzogPGxpbmUgXCIuY29uY2F0KHRoaXMuX2xpbmUsXCIsIGNvbHVtbiBcIikuY29uY2F0KHRoaXMuX2NvbHVtbixcIj5cIikpfX0se2tleTpcIl90b2tlbml6ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWZ1bmN0aW9uKCl7dC5fZW9mfHwobnVsbCE9PXQuX2ZpbmlzaCYmdC5fZmluaXNoLmNhbGwodC5fY3R4LHQuX2N0eCksdC5fZW9mPSEwLHQuX3BlbmRpbmcucHVzaChuZXcgZihcIkVPRlwiLFwiXCIsXCJcIix0Ll9wb3MsdC5fbGluZSx0Ll9jb2x1bW4pKSl9O2lmKCEodGhpcy5fc3RvcHBlZHx8dGhpcy5fcG9zPj10aGlzLl9sZW4pKXtmb3IodmFyIGU9ITA7ZTspe2lmKGU9ITEsdGhpcy5fZGVidWcpe3ZhciBpPWwodGhpcy5faW5wdXQsdGhpcy5fcG9zKSxyPU9iamVjdC5rZXlzKHRoaXMuX3RhZykubWFwKGZ1bmN0aW9uKHQpe3JldHVyblwiI1wiLmNvbmNhdCh0KX0pLmpvaW4oXCIgXCIpO3RoaXMuX2xvZyhcIklOUFVUOiBzdGF0ZTogPFwiLmNvbmNhdCh0aGlzLl9zdGF0ZVt0aGlzLl9zdGF0ZS5sZW5ndGgtMV0sXCI+LCB0YWdzOiA8XCIpLmNvbmNhdChyLFwiPiwgdGV4dDogXCIpKyhpLnByb2xvZ1RydW5jP1wiLi4uXCI6J1wiJykrXCJcIi5jb25jYXQoaS5wcm9sb2dUZXh0LFwiPFwiKS5jb25jYXQoaS50b2tlblRleHQsXCI+XCIpLmNvbmNhdChpLmVwaWxvZ1RleHQpKyhpLmVwaWxvZ1RydW5jP1wiLi4uXCI6J1wiJykrXCIsIGF0OiA8bGluZSBcIi5jb25jYXQodGhpcy5fbGluZSxcIiwgY29sdW1uIFwiKS5jb25jYXQodGhpcy5fY29sdW1uLFwiPlwiKSl9Zm9yKHZhciBvPTA7bzx0aGlzLl9ydWxlcy5sZW5ndGg7bysrKXtpZih0aGlzLl9kZWJ1Zyl7dmFyIHM9dGhpcy5fcnVsZXNbb10uc3RhdGUubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPXQuc3RhdGU7cmV0dXJuIHQudGFncy5sZW5ndGg+MCYmKG4rPVwiIFwiK3QudGFncy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuXCIjXCIuY29uY2F0KHQpfSkuam9pbihcIiBcIikpLG59KS5qb2luKFwiLCBcIik7dGhpcy5fbG9nKFwiICBSVUxFOiBzdGF0ZShzKTogPFwiLmNvbmNhdChzLFwiPiwgXCIpK1wicGF0dGVybjogXCIuY29uY2F0KHRoaXMuX3J1bGVzW29dLnBhdHRlcm4uc291cmNlKSl9dmFyIGE9ITEsdT10aGlzLl9ydWxlc1tvXS5zdGF0ZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc3RhdGV9KSxjPXUuaW5kZXhPZihcIipcIik7aWYoYzwwJiYoYz11LmluZGV4T2YodGhpcy5fc3RhdGVbdGhpcy5fc3RhdGUubGVuZ3RoLTFdKSksYz49MCl7YT0hMDt2YXIgaD10aGlzLl9ydWxlc1tvXS5zdGF0ZVtjXS50YWdzOyhoPWguZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiF0Ll90YWdbbl19KSkubGVuZ3RoPjAmJihhPSExKX1pZihhKXt0aGlzLl9ydWxlc1tvXS5wYXR0ZXJuLmxhc3RJbmRleD10aGlzLl9wb3M7dmFyIHA9dGhpcy5fcnVsZXNbb10ucGF0dGVybi5leGVjKHRoaXMuX2lucHV0KTtpZih0aGlzLl9ydWxlc1tvXS5wYXR0ZXJuLmxhc3RJbmRleD10aGlzLl9wb3MsbnVsbCE9PShwPXRoaXMuX3J1bGVzW29dLnBhdHRlcm4uZXhlYyh0aGlzLl9pbnB1dCkpJiZwLmluZGV4PT09dGhpcy5fcG9zKXtpZih0aGlzLl9kZWJ1ZyYmdGhpcy5fbG9nKFwiICAgIE1BVENIRUQ6IFwiK0pTT04uc3RyaW5naWZ5KHApKSx0aGlzLl9jdHguX21hdGNoPXAsdGhpcy5fY3R4Ll9yZXBlYXQ9ITEsdGhpcy5fY3R4Ll9yZWplY3Q9ITEsdGhpcy5fY3R4Ll9pZ25vcmU9ITEsbnVsbCE9PXRoaXMuX2JlZm9yZSYmdGhpcy5fYmVmb3JlLmNhbGwodGhpcy5fY3R4LHRoaXMuX2N0eCxwLHRoaXMuX3J1bGVzW29dKSx0aGlzLl9ydWxlc1tvXS5hY3Rpb24uY2FsbCh0aGlzLl9jdHgsdGhpcy5fY3R4LHApLG51bGwhPT10aGlzLl9hZnRlciYmdGhpcy5fYWZ0ZXIuY2FsbCh0aGlzLl9jdHgsdGhpcy5fY3R4LHAsdGhpcy5fcnVsZXNbb10pLHRoaXMuX2N0eC5fcmVqZWN0KWNvbnRpbnVlO2lmKHRoaXMuX2N0eC5fcmVwZWF0KXtlPSEwO2JyZWFrfWlmKHRoaXMuX2N0eC5faWdub3JlKXtpZih0aGlzLl9wcm9ncmVzcyh0aGlzLl9wb3MsdGhpcy5fcnVsZXNbb10ucGF0dGVybi5sYXN0SW5kZXgpLHRoaXMuX3Bvcz10aGlzLl9ydWxlc1tvXS5wYXR0ZXJuLmxhc3RJbmRleCx0aGlzLl9wb3M+PXRoaXMuX2xlbilyZXR1cm4gdm9pZCBuKCk7ZT0hMDticmVha31pZih0aGlzLl9wZW5kaW5nLmxlbmd0aD4wKXJldHVybiB0aGlzLl9wcm9ncmVzcyh0aGlzLl9wb3MsdGhpcy5fcnVsZXNbb10ucGF0dGVybi5sYXN0SW5kZXgpLHRoaXMuX3Bvcz10aGlzLl9ydWxlc1tvXS5wYXR0ZXJuLmxhc3RJbmRleCx2b2lkKHRoaXMuX3Bvcz49dGhpcy5fbGVuJiZuKCkpO3Rocm93IG5ldyBFcnJvcignYWN0aW9uIG9mIHBhdHRlcm4gXCInK3RoaXMuX3J1bGVzW29dLnBhdHRlcm4uc291cmNlKydcIiBuZWl0aGVyIHJlamVjdGVkIG5vciBhY2NlcHRlZCBhbnkgdG9rZW4ocyknKX19fX10aHJvdyB0aGlzLmVycm9yKFwidG9rZW4gbm90IHJlY29nbml6ZWRcIil9bigpfX0se2tleTpcInRva2VuXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5fcGVuZGluZy5sZW5ndGgmJnRoaXMuX3Rva2VuaXplKCksdGhpcy5fcGVuZGluZy5sZW5ndGg+MCl7dmFyIHQ9dGhpcy5fcGVuZGluZy5zaGlmdCgpO3JldHVybiB0aGlzLl90cmFuc2FjdGlvbi5sZW5ndGg+MCYmdGhpcy5fdHJhbnNhY3Rpb25bMF0ucHVzaCh0KSx0aGlzLl9sb2coXCJUT0tFTjogXCIuY29uY2F0KHQudG9TdHJpbmcoKSkpLHR9cmV0dXJuIG51bGx9fSx7a2V5OlwidG9rZW5zXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQsbj1bXTtudWxsIT09KHQ9dGhpcy50b2tlbigpKTspbi5wdXNoKHQpO3JldHVybiBufX0se2tleTpcInBlZWtcIix2YWx1ZTpmdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0wKTtmb3IodmFyIG49MDtuPHRoaXMuX3BlbmRpbmcubGVuZ3RoK3Q7bisrKXRoaXMuX3Rva2VuaXplKCk7aWYodD49dGhpcy5fcGVuZGluZy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwibm90IGVub3VnaCB0b2tlbnMgYXZhaWxhYmxlIGZvciBwZWVrIG9wZXJhdGlvblwiKTtyZXR1cm4gdGhpcy5fbG9nKFwiUEVFSzogXCIuY29uY2F0KHRoaXMuX3BlbmRpbmdbdF0udG9TdHJpbmcoKSkpLHRoaXMuX3BlbmRpbmdbdF19fSx7a2V5Olwic2tpcFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PTEpO2Zvcih2YXIgbj0wO248dGhpcy5fcGVuZGluZy5sZW5ndGgrdDtuKyspdGhpcy5fdG9rZW5pemUoKTtpZih0PnRoaXMuX3BlbmRpbmcubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIm5vdCBlbm91Z2ggdG9rZW5zIGF2YWlsYWJsZSBmb3Igc2tpcCBvcGVyYXRpb25cIik7Zm9yKDt0LS0gPjA7KXRoaXMudG9rZW4oKTtyZXR1cm4gdGhpc319LHtrZXk6XCJjb25zdW1lXCIsdmFsdWU6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dGhpcyxyPTA7cjx0aGlzLl9wZW5kaW5nLmxlbmd0aCsxO3IrKyl0aGlzLl90b2tlbml6ZSgpO2lmKDA9PT10aGlzLl9wZW5kaW5nLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJub3QgZW5vdWdoIHRva2VucyBhdmFpbGFibGUgZm9yIGNvbnN1bWUgb3BlcmF0aW9uXCIpO3ZhciBvPXRoaXMudG9rZW4oKTt0aGlzLl9sb2coXCJDT05TVU1FOiBcIi5jb25jYXQoby50b1N0cmluZygpKSk7dmFyIHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgcChcImV4cGVjdGVkOiA8dHlwZTogXCIuY29uY2F0KHQsXCIsIHZhbHVlOiBcIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KG4pLFwiIChcIikuY29uY2F0KGkobiksXCIpPiwgXCIpK1wiZm91bmQ6IDx0eXBlOiBcIi5jb25jYXQoby50eXBlLFwiLCB2YWx1ZTogXCIpLmNvbmNhdChKU09OLnN0cmluZ2lmeShvLnZhbHVlKSxcIiAoXCIpLmNvbmNhdChpKG8udmFsdWUpLFwiKT5cIiksby5wb3Msby5saW5lLG8uY29sdW1uLGUuX2lucHV0KX07cmV0dXJuIDIhPT1hcmd1bWVudHMubGVuZ3RofHxvLmlzQSh0LG4pP28uaXNBKHQpfHxzKCk6cyhKU09OLnN0cmluZ2lmeShuKSxpKG4pKSxvfX0se2tleTpcImJlZ2luXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9nKFwiQkVHSU46IGxldmVsIFwiLmNvbmNhdCh0aGlzLl90cmFuc2FjdGlvbi5sZW5ndGgpKSx0aGlzLl90cmFuc2FjdGlvbi51bnNoaWZ0KFtdKSx0aGlzfX0se2tleTpcImRlcHRoXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5fdHJhbnNhY3Rpb24ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCBkZXRlcm1pbmUgZGVwdGggLS0gbm8gYWN0aXZlIHRyYW5zYWN0aW9uXCIpO3JldHVybiB0aGlzLl90cmFuc2FjdGlvblswXS5sZW5ndGh9fSx7a2V5OlwiY29tbWl0XCIsdmFsdWU6ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5fdHJhbnNhY3Rpb24ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCBjb21taXQgdHJhbnNhY3Rpb24gLS0gbm8gYWN0aXZlIHRyYW5zYWN0aW9uXCIpO3JldHVybiB0aGlzLl90cmFuc2FjdGlvbi5zaGlmdCgpLHRoaXMuX2xvZyhcIkNPTU1JVDogbGV2ZWwgXCIuY29uY2F0KHRoaXMuX3RyYW5zYWN0aW9uLmxlbmd0aCkpLHRoaXN9fSx7a2V5Olwicm9sbGJhY2tcIix2YWx1ZTpmdW5jdGlvbigpe2lmKDA9PT10aGlzLl90cmFuc2FjdGlvbi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHJvbGxiYWNrIHRyYW5zYWN0aW9uIC0tIG5vIGFjdGl2ZSB0cmFuc2FjdGlvblwiKTtyZXR1cm4gdGhpcy5fcGVuZGluZz10aGlzLl90cmFuc2FjdGlvblswXS5jb25jYXQodGhpcy5fcGVuZGluZyksdGhpcy5fdHJhbnNhY3Rpb24uc2hpZnQoKSx0aGlzLl9sb2coXCJST0xMQkFDSzogbGV2ZWwgXCIuY29uY2F0KHRoaXMuX3RyYW5zYWN0aW9uLmxlbmd0aCkpLHRoaXN9fSx7a2V5OlwiYWx0ZXJuYXRpdmVzXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bnVsbCxuPVtdLGU9YXJndW1lbnRzLmxlbmd0aCxpPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKylpW3JdPWFyZ3VtZW50c1tyXTtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl0cnl7dGhpcy5iZWdpbigpLHQ9aVtvXS5jYWxsKHRoaXMpLHRoaXMuY29tbWl0KCk7YnJlYWt9Y2F0Y2godCl7dGhpcy5fbG9nKFwiRVhDRVBUSU9OOiBcIi5jb25jYXQodC50b1N0cmluZygpKSksbi5wdXNoKHtleDp0LGRlcHRoOnRoaXMuZGVwdGgoKX0pLHRoaXMucm9sbGJhY2soKTtjb250aW51ZX1pZihudWxsPT09dCYmbi5sZW5ndGg+MCl0aHJvdyhuPW4uc29ydChmdW5jdGlvbih0LG4pe3JldHVybiB0LmRlcHRoLW4uZGVwdGh9KSlbMF0uZXg7cmV0dXJuIHR9fV0pLHR9KCk7Zy5Ub2tlbj1mLGcuUGFyc2luZ0Vycm9yPXAsZy5BY3Rpb25Db250ZXh0PV8sbi5leHBvcnRzPWd9LHt9XX0se30sWzFdKSgxKX0pOyIsIlwidXNlIHN0cmljdFwiO3ZhciBfdG9rZW5penI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwidG9rZW5penJcIikpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fWZ1bmN0aW9uIGNvbXBhY3RHcmFwaFFMUXVlcnkoZSl7dmFyIHQ9bmV3IF90b2tlbml6ci5kZWZhdWx0O3QucnVsZSgvI1teXFxyXFxuXSooPz1cXHI/XFxuKS8sZnVuY3Rpb24oZSx0KXtlLmFjY2VwdChcImNvbW1lbnRcIil9KSx0LnJ1bGUoL1wiKD86XFxcXFwifFteXCJdKSpcIi8sZnVuY3Rpb24oZSx0KXtlLmFjY2VwdChcInN0cmluZ1wiKX0pLHQucnVsZSgvJFthLXpBLVpfXVthLXpBLVowLTlfXSovLGZ1bmN0aW9uKGUsdCl7ZS5hY2NlcHQoXCJ2YXJcIil9KSx0LnJ1bGUoL1thLXpBLVpfXVthLXpBLVowLTlfXSovLGZ1bmN0aW9uKGUsdCl7ZS5hY2NlcHQoXCJpZFwiKX0pLHQucnVsZSgvWystXT9bMC05XSpcXC4/WzAtOV0rKD86W2VFXVsrLV0/WzAtOV0rKT8vLGZ1bmN0aW9uKGUsdCl7ZS5hY2NlcHQoXCJudW1iZXJcIil9KSx0LnJ1bGUoL1sgXFx0XFxyXFxuXSsvLGZ1bmN0aW9uKGUsdCl7ZS5hY2NlcHQoXCJ3c1wiLFwiIFwiKX0pLHQucnVsZSgvW3t9XS8sZnVuY3Rpb24oZSx0KXtlLmFjY2VwdChcImJyYWNlXCIpfSksdC5ydWxlKC9bW1xcXV0vLGZ1bmN0aW9uKGUsdCl7ZS5hY2NlcHQoXCJicmFja2V0XCIpfSksdC5ydWxlKC9bKCldLyxmdW5jdGlvbihlLHQpe2UuYWNjZXB0KFwicGFyZW50aGVzaXNcIil9KSx0LnJ1bGUoLywvLGZ1bmN0aW9uKGUsdCl7ZS5hY2NlcHQoXCJjb21tYVwiKX0pLHQucnVsZSgvIS8sZnVuY3Rpb24oZSx0KXtlLmFjY2VwdChcIm5vdFwiKX0pLHQucnVsZSgvXFwuXFwuXFwuLyxmdW5jdGlvbihlLHQpe2UuYWNjZXB0KFwiZWxsaXBzaXNcIil9KSx0LnJ1bGUoL0AvLGZ1bmN0aW9uKGUsdCl7ZS5hY2NlcHQoXCJhdFwiKX0pLHQucnVsZSgvOi8sZnVuY3Rpb24oZSx0KXtlLmFjY2VwdChcImNvbG9uXCIpfSksdC5ydWxlKC8uLyxmdW5jdGlvbihlLHQpe2UuYWNjZXB0KFwiYW55XCIpfSksdC5pbnB1dChlKSx0LmRlYnVnKCExKTtmb3IodmFyIGM9dC50b2tlbnMoKSxuPVwiXCIscj0vXig/OmJyYWNlfGJyYWNrZXR8cGFyZW50aGVzaXN8Y29tbWF8Y29sb24pJC8sdT0wO3U8Yy5sZW5ndGg7dSsrKShcImNvbW1lbnRcIj09PWNbdV0udHlwZXx8XCJ3c1wiPT09Y1t1XS50eXBlJiYodTxjLmxlbmd0aC0xJiZjW3UrMV0udHlwZS5tYXRjaChyKXx8dT4wJiZjW3UtMV0udHlwZS5tYXRjaChyKSkpJiYoYy5zcGxpY2UodSwxKSx1LS0pO3JldHVybiBjLmZvckVhY2goZnVuY3Rpb24oZSl7bis9ZS52YWx1ZX0pLG59bW9kdWxlLmV4cG9ydHM9Y29tcGFjdEdyYXBoUUxRdWVyeTsiXX0=